【问题标题】:How to create a marquee that appears infinite using CSS or Javascript如何使用 CSS 或 Javascript 创建一个看起来无限的选取框
【发布时间】:2019-06-18 07:42:32
【问题描述】:

我需要创建跨越浏览器窗口的两个选取框(一个带有重复图像,一个带有重复链接),无论大小如何;选取框项目最初需要显示在屏幕的左侧,而不是花费几秒钟的时间来显示。它们中的每一个都需要相距大约 20px/30px。选框需要看起来是无限的;也就是说,项目需要始终填满窗口的整个宽度。选取框需要在悬停时暂停。

我已经确定了我想要使用 CSS 完成的基本工作。在此回复https://stackoverflow.com/a/56524853/11623961 的帮助下,我能够在悬停时获得我正在寻找的暂停。

不幸的是,我仍然不确定如何使动画看起来没有间隙,就好像从右到左有无数个单词一样。我正在尝试实现一个类似于本网站顶部https://www.at-elier.org/ 的选框,但如果可能的话,使用 CSS 或必要时使用最少的 Javascript。

body { 
  margin: 0;
  font-family: "UniversLTPro-Ex";
  font-size: 30px;
}

a {
    text-decoration: none;
    color: #000;
}

.marquee {
  height: 35px;
  width: 100%;

  overflow: hidden;
  position: relative;
  background-color: #e9e5fb;  
  border-top: 1px solid black;
  border-bottom: 1px solid black;
  padding: 8px 0 4px 0;
}

.marquee div {
  display: inline-block;
  width: 300%;
  height: 40px;

  position: absolute;
  overflow: hidden;

  animation: marquee 30s linear infinite;
}

.marquee span {
  float: left;
  width: 1100px;
}

.marquee:hover div {
  animation-play-state: paused;
}

@keyframes marquee {
  0% { left: 0%; }
  100% { left: -1100px; }
}

/* @import must be at top of file, otherwise CSS will not work */
@import url("//hello.myfonts.net/count/3909a7");

  
@font-face {font-family: 'UniversLTPro-Ex';src: url('webfonts/3909A7_0_0.eot');src: url('webfonts/3909A7_0_0.eot?#iefix') format('embedded-opentype'),url('webfonts/3909A7_0_0.woff2') format('woff2'),url('webfonts/3909A7_0_0.woff') format('woff'),url('webfonts/3909A7_0_0.ttf') format('truetype');}
 
<div class="marquee">
  <div>
    <span><a href="#">twitter</a>&nbsp;&nbsp;&nbsp;
                <a href="#">instagram</a>&nbsp;&nbsp;&nbsp; 
                <a href="#">pinterest</a>&nbsp;&nbsp;&nbsp;
                <a href="#">spotify</a>&nbsp;&nbsp;&nbsp; 
               <a href="#">magazine</a>&nbsp;&nbsp;&nbsp;</span>
    <span><a href="#">twitter</a>&nbsp;&nbsp;&nbsp;
                <a href="#">instagram</a>&nbsp;&nbsp;&nbsp; 
                <a href="#">pinterest</a>&nbsp;&nbsp;&nbsp;
                <a href="#">spotify</a>&nbsp;&nbsp;&nbsp; 
               <a href="#">magazine</a>&nbsp;&nbsp;&nbsp;</span>
  </div>
</div>

【问题讨论】:

  • &lt;marquee class="marquee"&gt;...&lt;/marquee&gt;
  • 您需要使用 javascript 来实现这一点。它涉及在文本行进后克隆文本,可能是其宽度的一半。然后在行进一半宽度后对克隆进行克隆,并删除原始文本以防止创建大量元素。然后冲洗并重复。
  • @LawrenceCherone 虽然是一个可靠的回归,但不建议使用 元素,因为大多数浏览器不再支持它。 (但它仍然可以通过一些 polyfills 工作)
  • @WizardCoder 非常感谢!老实说,我既期待又害怕这个答案。我在不同的网站上注意到了类似的想法,但我希望有一个使用 CSS 的解决方案。我对 Javascript 很陌生,所以我不太确定如何到达那里。
  • @lucygoosey 如果您是 javascript 新手,这有点棘手。如果你用谷歌搜索“用于 jQuery 的文本滚动插件 - Marquee”,第一个结果是我以前使用过的插件,它可以让你做你需要的。不过它现在可能有点老了,所以请四处寻找替代品。

标签: javascript html css


【解决方案1】:

你离得很近。希望下面的演示可以自我解释,但基本上你需要在 -100% 选取框的宽度处开始关键帧,然后在 100% 处结束,这样它在重新启动之前就在屏幕外。

希望这会有所帮助!

[edit]添加连续滚动

body { 
  margin: 0;
  font-family: "UniversLTPro-Ex";
  font-size: 30px;
}

a {
    text-decoration: none;
    color: #000;
}

.marquee {
  height: 35px;
  width: 100%;

  overflow: hidden;
  position: relative;
  background-color: #e9e5fb;  
  border-top: 1px solid black;
  border-bottom: 1px solid black;
  padding: 8px 0 4px 0;
}


/* would need to be adjusted depending on time */
.marquee .marqueeone{
  animation: marquee 10s linear infinite
}

.marquee .marqueetwo{
  animation: marquee 10s linear 2.5s infinite 
}

.marquee .marqueethree{
  animation: marquee 10s linear 5s infinite
}

.marquee .marqueefour{
  animation: marquee 10s linear 7.5s infinite
}

/* even out the elements */
.marquee div {
  position: absolute;
  width: 100%;
  left: 100%;
  height: 40px;
  display: flex;
  justify-content: space-between;
}

.marquee:hover div {
  animation-play-state: paused;
}

/* add delay at the end of animation so you dont start while another div is going */
@keyframes marquee {
  0% { left: 100%; }
  50% { left: -100%; }
  100% {left: -100%}
}

/* @import must be at top of file, otherwise CSS will not work */
@import url("//hello.myfonts.net/count/3909a7");

  
@font-face {font-family: 'UniversLTPro-Ex';src: url('webfonts/3909A7_0_0.eot');src: url('webfonts/3909A7_0_0.eot?#iefix') format('embedded-opentype'),url('webfonts/3909A7_0_0.woff2') format('woff2'),url('webfonts/3909A7_0_0.woff') format('woff'),url('webfonts/3909A7_0_0.ttf') format('truetype');}
<div class="marquee">
    <div class="marqueeone"><a href="#">twitter</a>&nbsp;&nbsp;&nbsp;
                <a href="#">instagram</a>&nbsp;&nbsp;&nbsp; 
                <a href="#">pinterest</a>&nbsp;&nbsp;&nbsp;
                <a href="#">spotify</a>&nbsp;&nbsp;&nbsp; 
               <a href="#">magazine</a>&nbsp;&nbsp;&nbsp;
               </div>
    <div class="marqueetwo"><a href="#">twitter</a>&nbsp;&nbsp;&nbsp;
                <a href="#">instagram</a>&nbsp;&nbsp;&nbsp; 
                <a href="#">pinterest</a>&nbsp;&nbsp;&nbsp;
                <a href="#">spotify</a>&nbsp;&nbsp;&nbsp; 
               <a href="#">magazine</a>&nbsp;&nbsp;&nbsp;</div>
         <div class="marqueethree"><a href="#">twitter</a>&nbsp;&nbsp;&nbsp;
                <a href="#">instagram</a>&nbsp;&nbsp;&nbsp; 
                <a href="#">pinterest</a>&nbsp;&nbsp;&nbsp;
                <a href="#">spotify</a>&nbsp;&nbsp;&nbsp; 
               <a href="#">magazine</a>&nbsp;&nbsp;&nbsp;</div>
                   <div class="marqueefour"><a href="#">twitter</a>&nbsp;&nbsp;&nbsp;
                <a href="#">instagram</a>&nbsp;&nbsp;&nbsp; 
                <a href="#">pinterest</a>&nbsp;&nbsp;&nbsp;
                <a href="#">spotify</a>&nbsp;&nbsp;&nbsp; 
               <a href="#">magazine</a>&nbsp;&nbsp;&nbsp;
      </div>
</div>

【讨论】:

  • 啊,太热了。虽然我认为他们希望文本始终可见。
  • 啊,你是对的。这就是我没有阅读整个答案的结果。我会看看我是否能想出另一个解决方案并在这里编辑它
  • 谢谢,非常感谢!但不幸的是,@WizardCoder 是正确的。我正在寻找始终可见的文本。
  • @lucygoosey 费了一番周折,但如果您想查看我的编辑,我确实想出了一个解决方案。您可能需要打开一个计算器或使用calc css 属性来使动画变慢。
  • @MichaelSorensen 哇!这太有帮助了!感谢您花时间为我创建这个!我仍然有一个问题(如果您有时间回答):我将如何将其调整为更小的断点?它几乎适用于我的所有断点,但当我达到移动/小型平板电脑尺寸时却不行。例如,如果您以 480 像素查看此内容,则会出现重叠。我会删除选取框以获得更小的宽度(假设我删除了 .marqueefour 和 .marqueethree),然后调整延迟还是全部在现有 div 的时间中,不管它们的宽度如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2014-04-07
  • 2017-12-19
相关资源
最近更新 更多