当前位置:首页 > 科技  > 软件

动画进阶 | CSS 也能实现完美的文字轮播与图片轮播效果

来源: 责编: 时间:2024-03-20 17:26:30 273观看
导读今天,分享一个实际业务中能够用得上的动画技巧。巧用逐帧动画,配合补间动画实现一个无限循环的轮播效果,像是这样:看到上述示意图,有同学不禁会发问,这不是个非常简单的位移动画么?我们来简单分析分析,从表面上看,确实好像只有

sqP28资讯网——每日最新资讯28at.com

今天,分享一个实际业务中能够用得上的动画技巧。sqP28资讯网——每日最新资讯28at.com

巧用逐帧动画,配合补间动画实现一个无限循环的轮播效果,像是这样:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

看到上述示意图,有同学不禁会发问,这不是个非常简单的位移动画么?sqP28资讯网——每日最新资讯28at.com

我们来简单分析分析,从表面上看,确实好像只有元素的 transform: translate() 在位移,但是注意,这里有两个难点:sqP28资讯网——每日最新资讯28at.com

  • 这是个无限轮播的效果,我们的动画需要支持任意多个元素的无限轮播切换。
  • 因为是轮播,所以,运行到最后一个的时候,需要动画切到第一个元素。

到这里,你可以暂停思考一下,如果有 20 个元素,需要进行类似的无限轮播播报,使用 CSS 实现,你会怎么去做呢?sqP28资讯网——每日最新资讯28at.com

逐帧动画控制整体切换

首先,我需要利用到逐帧动画效果,也被称为步骤缓动函数,利用的是 animation-timing-function 中,的 steps,语法如下:sqP28资讯网——每日最新资讯28at.com

{    /* Keyword values */    animation-timing-function: step-start;    animation-timing-function: step-end;    /* Function values */    animation-timing-function: steps(6, start)    animation-timing-function: steps(4, end);}

如果你对 steps 的语法还不是特别了解,强烈建议你先看看我的这篇文章 -- 深入浅出 CSS 动画[1],它对理解本文起着至关重要的作用。sqP28资讯网——每日最新资讯28at.com

好的,还是文章以开头的例子,假设我们存在这样 HTML 结构:sqP28资讯网——每日最新资讯28at.com

<div class="g-container">  <ul>    <li>Lorem ipsum 1111111</li>    <li>Lorem ipsum 2222222</li>    <li>Lorem ipsum 3333333</li>    <li>Lorem ipsum 4444444</li>    <li>Lorem ipsum 5555555</li>    <li>Lorem ipsum 6666666</li>  </ul></div>

首先,我们实现这样一个简单的布局:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

在这里,要实现轮播效果,并且是任意个数,我们可以借助 animation-timing-function: steps():sqP28资讯网——每日最新资讯28at.com

:root {  // 轮播的个数  --s: 6;  // 单个 li 容器的高度  --h: 36;  // 单次动画的时长  --speed: 1.5s;}.g-container {  width: 300px;  height: calc(var(--h) * 1px);}ul {  display: flex;  flex-direction: column;  animation: move calc(var(--speed) * var(--s)) steps(var(--s)) infinite;}ul li {  width: 100%;}@keyframes move {  0% {    transform: translate(0, 0);  }  100% {    transform: translate(0, calc(var(--s) * var(--h) * -1px));  }}

别看到上述有几个 CSS 变量就慌了,其实很好理解:sqP28资讯网——每日最新资讯28at.com

  • calc(var(--speed) * var(--s)):单次动画的耗时 * 轮播的个数,也就是总动画时长。
  • steps(var(--s)) 就是逐帧动画的帧数,这里也就是 steps(6),很好理解。
  • calc(var(--s) * var(--h) * -1px)) 单个 li 容器的高度 * 轮播的个数,其实就是 ul 的总体高度,用于设置逐帧动画的终点值。

上述的效果,实际如下:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

如果给容器添加上 overflow: hidden,就是这样的效果:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

这样,我们就得到了整体的结构,至少,整个效果是循环的。sqP28资讯网——每日最新资讯28at.com

但是由于只是逐帧动画,所以只能看到切换,但是每一帧之间,没有过渡动画效果。所以,接下来,我们还得引入补间动画。sqP28资讯网——每日最新资讯28at.com

利用补间动画实现两组数据间的切换

我们需要利用补间动画,实现动态的切换效果。sqP28资讯网——每日最新资讯28at.com

这一步,其实也非常简单,我们要做的,就是将一组数据,利用 transform,从状态 A 位移到 状态 B。sqP28资讯网——每日最新资讯28at.com

单独拿出一个来演示的话,大致的代码如下:sqP28资讯网——每日最新资讯28at.com

<div class="g-container">  <ul style="--s: 6">    <li>Lorem ipsum 1111111</li>    <li>Lorem ipsum 2222222</li>    <li>Lorem ipsum 3333333</li>    <li>Lorem ipsum 4444444</li>    <li>Lorem ipsum 5555555</li>    <li>Lorem ipsum 6666666</li>  </ul></div>
:root {  --h: 36;  --speed: 1.2s;}ul li {  height: 36px;  animation: liMove calc(var(--speed)) infinite;}@keyframes liMove {  0% {    transform: translate(0, 0);  }  80%,  100%  {    transform: translate(0, -36px);  }}

非常简单的一个动画:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

bgg1sqP28资讯网——每日最新资讯28at.com

基于上述效果,我们如果把一开始提到的 逐帧动画 和这里这个 补间动画 结合一下,ul 的整体移动,和 li 的 单个移动叠在在一起:sqP28资讯网——每日最新资讯28at.com

:root {  // 轮播的个数  --s: 6;  // 单个 li 容器的高度  --h: 36;  // 单次动画的时长  --speed: 1.5s;}.g-container {  width: 300px;  height: calc(var(--h) * 1px);}ul {  display: flex;  flex-direction: column;  animation: move calc(var(--speed) * var(--s)) steps(var(--s)) infinite;}ul li {  width: 100%;  animation: liMove calc(var(--speed)) infinite;}@keyframes move {  0% {    transform: translate(0, 0);  }  100% {    transform: translate(0, calc(var(--s) * var(--h) * -1px));  }}@keyframes liMove {  0% {    transform: translate(0, 0);  }  80%,  100%  {    transform: translate(0, calc(var(--h) * -1px));  }}

就能得到这样一个效果:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

Wow,神奇的化学反应产生了!基于 逐帧动画 和 补间动画 的结合,我们几乎实现了一个轮播效果。sqP28资讯网——每日最新资讯28at.com

当然,有一点瑕疵,可以看到,最后一组数据,是从第六组数据 transform 移动向了一组空数据:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

末尾填充头部第一组数据

实际开发过轮播的同学肯定知道,这里,其实也很好处理,我们只需要在末尾,补一组头部的第一个数据即可:sqP28资讯网——每日最新资讯28at.com

改造下我们的 HTML:sqP28资讯网——每日最新资讯28at.com

<div class="g-container">  <ul>    <li>Lorem ipsum 1111111</li>    <li>Lorem ipsum 2222222</li>    <li>Lorem ipsum 3333333</li>    <li>Lorem ipsum 4444444</li>    <li>Lorem ipsum 5555555</li>    <li>Lorem ipsum 6666666</li>    <!--末尾补一个首条数据-->    <li>Lorem ipsum 1111111</li>  </ul></div>

这样,我们再看看效果:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

Beautiful!如果你还有所疑惑,我们给容器加上 overflow: hidden,实际效果如下,通过额外添加的最后一组数据,我们的整个动画刚好完美的衔接上,一个完美的轮播效果:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

完整的代码,你可以戳这里:CodePen Demo -- Vertical Infinity Loop[2]sqP28资讯网——每日最新资讯28at.com

横向无限轮播

当然,实现了竖直方向的轮播,横向的效果也是一样的。sqP28资讯网——每日最新资讯28at.com

并且,我们可以通过在 HTML 结构中,通过 style 内填写 CSS 变量值,传入实际的 li 个数,以达到根据不同 li 个数适配不同动画:sqP28资讯网——每日最新资讯28at.com

<div class="g-container">  <ul style="--s: 6">    <li>Lorem ipsum 1111111</li>    <li>Lorem ipsum 2222222</li>    <li>Lorem ipsum 3333333</li>    <li>Lorem ipsum 4444444</li>    <li>Lorem ipsum 5555555</li>    <li>Lorem ipsum 6666666</li>    <!--末尾补一个首尾数据-->    <li>Lorem ipsum 1111111</li>  </ul></div>

整个动画的 CSS 代码基本是一致的,我们只需要改变两个动画的 transform 值,从竖直位移,改成水平位移即可:sqP28资讯网——每日最新资讯28at.com

:root {  --w: 300;  --speed: 1.5s;}.g-container {  width: calc(--w * 1px);  overflow: hidden;}ul {  display: flex;  flex-wrap: nowrap;   animation: move calc(var(--speed) * var(--s)) steps(var(--s)) infinite;}ul li {  flex-shrink: 0;  width: 100%;  height: 100%;  animation: liMove calc(var(--speed)) infinite;}@keyframes move {  0% {    transform: translate(0, 0);  }  100% {    transform: translate(calc(var(--s) * var(--w) * -1px), 0);  }}@keyframes liMove {  0% {    transform: translate(0, 0);  }  80%,  100%  {    transform: translate(calc(var(--w) * -1px), 0);  }}

这样,我们就轻松的转化为了横向的效果:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

完整的代码,你可以戳这里:CodePen Demo -- Horizontal Infinity Loop[3]sqP28资讯网——每日最新资讯28at.com

轮播图?不在话下

OK,上面的只是文字版的轮播,那如果是图片呢?sqP28资讯网——每日最新资讯28at.com

没问题,方法都是一样的。基于上述的代码,我们可以轻松地将它修改一下后得到图片版的轮播效果。sqP28资讯网——每日最新资讯28at.com

代码都是一样的,就不再列出来,直接看看效果:sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

sqP28资讯网——每日最新资讯28at.com

完整的代码,你可以戳这里:CodePen Demo -- Horizontal Image Infinity Loop[4]sqP28资讯网——每日最新资讯28at.com

掌握了这个技巧之后,你可以将它运用在非常多只需要简化版的轮播效果之上。sqP28资讯网——每日最新资讯28at.com

再简单总结一下,非常有意思的技巧:sqP28资讯网——每日最新资讯28at.com

  • 利用 逐帧动画,实现整体的轮播的循环效果。
  • 利用 补间动画,实现具体的 *状态A 向 状态B 的动画效果。
  • 逐帧动画 配合 补间动画 构成整体轮播的效果。
  • 通过向 HTML 结构末尾补充一组头部数据,实现整体动画的衔接。
  • 通过 HTML 元素的 style 标签,利用 CSS 变量,填入实际的参与循环的 DOM 个数,可以实现 JavaScript 与 CSS 的打通。

最后

OK,本文到此结束,希望本文对你有所帮助 :)sqP28资讯网——每日最新资讯28at.com

参考资料

[1]深入浅出 CSS 动画: https://github.com/chokcoco/iCSS/issues/141sqP28资讯网——每日最新资讯28at.com

[2]CodePen Demo -- Vertical Infinity Loop: https://codepen.io/Chokcoco/pen/RwQVByxsqP28资讯网——每日最新资讯28at.com

[3]CodePen Demo -- Horizontal Infinity Loop: https://codepen.io/Chokcoco/pen/JjpNBXYsqP28资讯网——每日最新资讯28at.com

[4]CodePen Demo -- Horizontal Image Infinity Loop: https://codepen.io/Chokcoco/pen/GRQvqgqsqP28资讯网——每日最新资讯28at.com

[5]Github -- iCSS: https://github.com/chokcoco/iCSSsqP28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-78144-0.html动画进阶 | CSS 也能实现完美的文字轮播与图片轮播效果

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 月之暗面技术重磅突破:Kimi200万字上下文窗口内测开启

下一篇: 10 天 996 写出的语言 - JavaScript

标签:
  • 热门焦点
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
Top