当前位置: 首页 > news >正文

给列表项目添加动画

本文由 伯乐在线 - J.c 翻译,进林 校稿。未经许可,禁止转载!
英文出处:cssanimation.rocks。欢迎加入翻译小组。

当网页某部分发生改变时,添加一些动画有利于让用户知道发生了什么事情。因为动画能预告新内容的到达,或者让用户知道信息被移除。在这篇文章里,将会看到如何运用动画帮助新内容的引进,例如显示或隐藏列表里的项目。

(可在原文查看效果)

引进内容

动画有个很好的用处,它能够让访客知道你的网站内容在何时发生了改动。当添加或删除内容而没有任何动画进行过渡时,内容的突然改变会让用户感到困惑。而通过添加细微的动画就能避免这种情况发生,并且有助于“宣布”有东西将要离开或引进页面。

以下是一个通过添加或删除操作来管理列表内容的例子。大多数动画能用于其它类型的内容。如果你发现它们是有用的,或有其它想法想添加进来,那么请 联系我们,我们很乐意听听你的想法。

编写HTML代码

在一开始,准备好一个已提前填充好的列表和一个可以为该列表添加新项目的按钮。

1
2
3
4
5
< ul id = "list" >
  < li class = "show" >List item</ li >
  < li class = "show" >List item</ li >
</ ul >
< button id = "add-to-list" >Add a list item</ button >

但有一些地方需要注意。首先,在HTML代码里有两个 ID。一般来说,我们不会用 ID 来设置样式,因为它们的唯一性会引入一些问题。然而,它们会在使用 JavaScript 时提供了便利性。

初始列表项目有类名 “show”,正因为这是类名,我们将会在后面通过它为元素添加动画效果。

一些 JavaScript 代码

为了实现演示里的动画,将会编写一些 JavaScript 代码来添加新列表项目,然后为新添加列表项目添加类名 “show”,以至动画能够发生。使用这两个步骤的理由是,如果列表项目直接以可见的状态添加进来,它们就没有任何过渡时间而直接发生了。

我们打算在 li 元素上使用动画效果,但这将会让通过覆盖样式来添加其它删除元素的动画效果,变得更加困难。

1
2
3
4
5
6
7
8
9
10
11
12
/*
  * Add items to a list - from cssanimation.rocks/list-items/
  */
document.getElementById( 'add-to-list' ).onclick = function () {
   var list = document.getElementById( 'list' );
   var newLI = document.createElement( 'li' );
   newLI.innerHTML = 'A new item' ;
   list.appendChild(newLI);
   setTimeout( function () {
     newLI.className = newLI.className + " show" ;
   }, 10);
}

无动画

在最基本的效果中,我们能写一些 CSS 代码显示列表项目。因为添加类名 show 让它们可见,所以删掉类名 show 也能导致它们消失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
li {
   list-style : none ;
   background : #d1703c ;
   color : #fff ;
   height : 0 ;
   line-height : 2em ;
   margin : 0 ;
   padding : 0 0.5em ;
   overflow : hidden ;
   width : 10em ;
}
 
li. show {
   height : 2em ;
   margin : 2px 0 ;
}

这些样式将 li 设置为一个没有项目符合、height 为 0、margin 为 0和 overflow 为 hidden 的矩形。这样做是为了直到添加类名 show,它们才会出现而变得可见。

类名 show 应用了 height 和 margin。因为我们至今还没使用动画,所以列表项目会直接出现在页面,像下面那样。当然你也可以点击列表项目,让它们消失。

(可在原文查看效果)

淡入淡出

作为第一个动画,我们将会添加一个简单的淡入淡出效果。相对之前的项目列表,该列表项目多了渐变效果。虽然在视觉上看起来仍然有一点笨重,但这有利于让浏览者有更长的时间去注意有东西正在变化。

(可在原文查看效果)

因为要在已创建 CSS 片段上添加效果。所以为了在列表上应用这个效果,需要在包围 li 的容器上添加类名 fade

1
2
3
4
5
6
7
8
.fade li {
   transition: all 0.4 s ease-out;
   opacity: 0 ;
   height : 2em ;
}
.fade li. show {
   opacity: 1 ;
}

滑下&淡入淡出

每次添加或删除一个项目列表都会很突然,这导致了不和谐的效果。那就让我们通过调整高度来创建一个更加流畅的滑动效果。

(可在原文查看效果)

这里与上面类名 fade 唯一不同的是 height:2em 被移除掉了。因为类名 show 已包含了一个高度(继承自第一个CSS片段),这样高度就会自动过渡了。

1
2
3
4
5
6
7
.slide-fade li {
   transition: all 0.4 s ease-out;
   opacity: 0 ;
}
.slide-fade li. show {
   opacity: 1 ;
}

旋转进来

除了淡入淡出和滑动效果,还能更进一步地添加一些 3D 效果。浏览器不止能在 X 或 Y 轴上变换元素,还具有深度的场景( Z 轴)。

(可在原文查看效果)

为了设置这个效果,需要定义一个 section 容器作为 3D 过渡的舞台。通过给 perspective 赋值就可以做到。

CSS 的 perspective 代表场景的深度。一个较低的数值意味着近视角,是一个极端的角度。所以这值得你通过设置不同的值来找到一个合适的值。

1
2
3
.swing {
   perspective: 100px ;
}

下一步是设置 li 元素在这个舞台里的变形。我们将会使用 opacity 创建淡入淡出效果作为前奏,然后为在舞台上的 li 添加 transform 进行旋转。

1
2
3
4
5
6
7
8
9
10
11
.swing li {
   opacity: 0 ;
   transform: rotateX( -90 deg);
   transition: all 0.5 s cubic-bezier(. 36 , -0.64 ,. 34 , 1.76 );
}
 
.swing li. show {
   opacity: 1 ;
   transform: none ;
   transition: all 0.5 s cubic-bezier(. 36 , -0.64 ,. 34 , 1.76 );
}

在这个例子中,让 li 绕X 轴向后旋转 90 度作为初始状态。当添加类名 show 时,它的 transform被设置为 none,这就能让它在舞台上进行过渡了。为了给它旋转效果,我使用了 cubic-bezier 时间函数。

侧面旋转

现在我们只要稍稍调整这个效果,就能十分容易地创建不同的设计。下面这个例子,是让项目列表在侧面旋转。

(可在原文查看效果)

要创建这个效果,我们只需改变旋转轴。

1
2
3
4
5
.swing li {
   opacity: 0 ;
   transform: rotateY( -90 deg);
   transition: all 0.5 s cubic-bezier(. 36 , -0.64 ,. 34 , 1.76 );
}

我们已经把 rotateX 改成 rotateY 了。

浏览器内核前缀和浏览器测试

为了可读性,上面那些代码都没有包含任何前缀。在这里,我强烈推荐添加前缀,以支持那些需要 -webkit 或其他前缀的浏览器。而我使用了 Autoprefixer 来解决这个问题。

正因为这些动画都是在基本的 show/hide 上构建的,所以它们在不支持这些动画的浏览器上优雅地回退。在各种各样的设备和浏览器上进行测试是重要的,但大多数现代浏览器都能支持这些动画。

关于作者: J.c

相关文章:

  • R(1)Mac OS 下安装R语言开发环境
  • PHP自动加载__autoload的工作机制
  • UISlide属性
  • 521Today
  • 谷歌浏览器的粗略使用方法
  • 不错的网站
  • android:persistent属性
  • centos 7.0运行docker出现内核报错解决方法
  • 团队项目—第二阶段第四天
  • Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • log4j一些配置说明
  • C#中锁定Word内容,样把人家的锁定内容破解了
  • 如何在Fedora或CentOS上使用Samba共享文件夹
  • VS2008集成PC-lint
  • 网络传输文件的问题
  • co模块的前端实现
  • HTTP--网络协议分层,http历史(二)
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 内存分配及垃圾回收机制初探
  • js如何打印object对象
  • Linux Process Manage
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Otto开发初探——微服务依赖管理新利器
  • PAT A1120
  • 对超线程几个不同角度的解释
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于组件的设计工作流与界面抽象
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 使用SAX解析XML
  • 算法之不定期更新(一)(2018-04-12)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微信小程序开发问题汇总
  • AI算硅基生命吗,为什么?
  • #1014 : Trie树
  • (02)vite环境变量配置
  • (C语言)fread与fwrite详解
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (蓝桥杯每日一题)love
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)elasticsearch 源码之启动流程分析
  • (十一)图像的罗伯特梯度锐化
  • (轉貼) UML中文FAQ (OO) (UML)
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net Core 中间件验签
  • .net core使用ef 6
  • .NET gRPC 和RESTful简单对比
  • .Net Redis的秒杀Dome和异步执行
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道