javascript - 如何根据段落中文字的长度来设置段落的动画时间?

标签 javascript jquery css css-animations

我目前使用纯 CSS3 动画从右向左滚动文本的选取框样式。

HTML:

<p class="marquee">
    <span>
        <a href="#">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in metus id urna mattis tempor. 
        </a>
    </span>
</p>

CSS:

.marquee {
    margin: 0 auto;
    white-space: nowrap;
    overflow: hidden;
    position: absolute;
}

.marquee span {
    display: inline-block;
    animation: marquee 45s linear infinite;
}

@keyframes marquee {
  0% {
    transform: translate(0, 0);
  } 100% {
    transform: translate(-100%, 0);    
  }
}

现在,段落滚动得很好,我对速度很满意,但我想扩展它的可用性,以便能够处理不同长度的文本,并让动画速度取决于文本的长度。

理想情况下,我想要做的是让动画速度足够慢以便阅读文本,当显示所有文本时,动画将再次恢复。

单靠 CSS 可能无法实现(或者可以吗?)所以我正在寻找一种方法来通过 JS 甚至 jQuery 实现它。我只是不知道如何以实用的方式做到这一点,JSwise。

提前感谢您的建议。

最佳答案

所以这是您的实际动画结果:

.marquee {
  margin: 0 auto;
  white-space: nowrap;
  overflow: hidden;
  //position: absolute;
}

.marquee span {
  display: inline-block;
  animation: marquee 45s linear infinite;
}

@keyframes marquee {
  0% {
    transform: translate(0, 0);
  } 100% {
    transform: translate(-100%, 0);    
  }
}
<p class="marquee">
  <span>
    <a href="#">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in metus id urna mattis tempor. 
    </a>
  </span>
</p>

那是视觉上注意到动画速度。

现在 «扩展其可用性,使其能够处理不同长度的文本,并使动画速度取决于文本的长度。»...

您会注意到我使用了 width 而不是 .length。那是因为 .length 返回了有多少个字符...而且所有字符不占用相同的空间。

现在这只是数学三规则,您可以在其中为“测试”宽度和延迟(您想要的速度)定义一些默认值:

// Establish the speed you want.
// This is based on what you had on your "test" string prior to any modification using a script.
var defaultDelay = 45; // Is the CSS defined delay.
var defaultWidth = 602; // Is the width for your tested 100 char string.

$(".marquee a").each(function(){

  var width = $(this).width();
  console.log("width: "+width);
  
  var newDelay = defaultDelay*(width/defaultWidth);
  console.log("newDelay: "+newDelay);

  $(this).closest("span").css("animation", "marquee " + newDelay + "s linear infinite");
});
.marquee {
  margin: 0 auto;
  white-space: nowrap;
  overflow: hidden;
  /*position: absolute;*/    /* Removed */
}

.marquee span {
  display: inline-block;
  animation: marquee 45s linear infinite;
}

@keyframes marquee {
  0% {
    transform: translate(0, 0);
  } 100% {
    transform: translate(-100%, 0);    
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p class="marquee">
  <span>
    <a href="#">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in metus id urna mattis tempor. 
    </a>
  </span>
</p>

<p class="marquee">
  <span>
    <a href="#">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in metus id urna mattis tempor. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in metus id urna mattis tempor. 
    </a>
  </span>
</p>

<p class="marquee">
  <span>
    <a href="#">Lorem ipsum dolor sit amet. 
    </a>
  </span>
</p>

上面的三个 .marquee 以相同的“速度”动画。

关于javascript - 如何根据段落中文字的长度来设置段落的动画时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51697419/

相关文章:

html - 覆盖 RefineryCMS 中的布局

HTML 为什么我的嵌套类是兄弟而不是 child

javascript - 无法在 Capybara 测试的拆卸方法中执行 localStorage.clear

javascript - 使用 Javascript 实现动态 ShuttleBox

javascript - 与 DOM 交互的 Firefox 扩展

javascript - 尝试部署 GitHub 页面但遇到 CSS 和 JS 未显示的问题?

javascript - 在预加载器文本中添加链接

JavaScript 对象 : 'addEventListener is not a function'

javascript - 更新定期重新上传的图像

jQuery ui,将参数传递给另一个函数