以前就听说过有个库,叫animate.css,但是自己并没有在实际项目中使用过,这次正好要做个招聘页面,得以利用一下这个库,在经常会卡顿的UC浏览器中也能流畅执行。

扫描下面的二维码,可以看到在线的demo页面:

如果对CSS3动画的一些基础概念不是很熟悉,可以参考《CSS3中的动画效果记录》。

一、animate.css库中的相关知识点

从github上面下载下来是一个css文件,文件里面有3000多行代码,大部分的代码还是能看懂的。

但里面的代码还是有很多耐人寻味的地方。

1. 关键帧的选定,不仅有整数,还有小数,并且也不是说有规律的,几的倍数。

2. 速度曲线的选定,使用的是cubic-bezier函数,自定义贝塞尔曲线,这里有个在线制作贝塞尔曲线的工具

3. 全程使用transform属性来实现动画效果,使用了大量的translate3d、rotate3d、scale3d,这样还能开启硬件加速。

4. 使用perspective属性设置镜头到元素平面的距离。

1)内置的动画有多种

1. bounce(跳动)、flash(闪光)、pulse(脉冲)、rubber band(橡皮筋)、shake(抖动)、swing(摇摆)、wobble(摇摆不定)

2. fade(淡入或淡出)

3. flip(翻转)

4. rotate(旋转)

5. slide(滑动)

6. zoom(放大或缩小)

2)translate3d、rotate3d、scale3d

上图就是一个3D坐标,人眼的正对面是z轴的正方向。可以在线调试这三个属性的效果。

1. translate3d语法如下:

据说tz轴位移向量的长度不能设置为百分比值,如果取值为百分比值,将会认为无效值。

2. rotate3d语法如下:

x,y,z是一个0到1之间的数值,主要用来描述元素围绕X轴或Y轴或Z轴旋转的矢量值

a:是一个角度值,主要用来指定元素在3D空间旋转的角度,如果其值为正值,元素顺时针旋转,反之元素逆时针旋转。

下图中two到three是绕着X轴旋转,six到one是绕Y轴旋转。而绕Z轴就和2D的旋转效果类似。

3. scale3d语法如下:

二、页面开发过程

1)设计稿

踩到的第一个坑,我页面采用了flexible.js可伸缩布局,这样宽度就和设计稿一样了。设计稿的宽度是750px,也就是iPhone6的CSS像素。

我伸缩下也变成了750px,这样在设置边距的时候就可以直接用设计稿上面的了。关于屏幕适配可以参考《移动开发屏幕适配分析

宽度是搞好了,但是高度却不一样,手机上面是1198px,设计稿是1206px,chrome上的模拟器是1256px。

额,怪不得我按照设计稿的边距设置,在模拟器或手机上都达不到效果图的样子。

2)实现原理

在翻页的时候,将当前页面隐藏掉,给新页面加个样式,触发动画。

下图中的“li”就是在翻页后加一个样式“play”,触发整个动画开始执行。

“li”中的子元素就是img图片,发生动画的就是这些img标签:

CSS代码如下:

.img3 {
width: 4.666667rem;
height: 2.133333rem;
left: 2.8rem;
top: 4rem;
z-index:;
}
.play .img3 {
-webkit-animation: zoomInUp 1s 1.2s backwards;
animation: zoomInUp 1s 1.2s backwards;
}

下图中,这个箭头其实是两个动画的结合体,不过在IOS可以实现两个动画,而在Android中只能实现一种。

先放大然后再用脉冲效果。

.arrow {
animation: zoomIn 1s 5s backwards, pulse 1s 0s infinite;
}

3)animation-fill-mode的使用

一开始不太明白,这动画怎么才能触发,而且一开始各个元素是隐藏掉的,这咋做到的,后面参考了些页面,发现了下面这个属性。

animation-fill-mode:规定对象动画时间之外的状态。

将其设置为“backwards”:在 animation-delay 所指定的一段时间内,在动画显示之前,应用开始属性值(在第一个关键帧中定义)。

在第一帧中设置为透明,然后就能达到一个一个出现的效果了。

左图所示,这个时候就可以在第一帧中设置透明,注意不能用display:none,来隐藏,display不会出现动画。

如果不设置为“backwards”,那就会像右图所示,先显示然后隐藏,再开始动画。

  

4)rem与CSS自动前缀

我现在是用SASS来写CSS,上面代码中的rem都是在编译的时候动态计算出来的。

-webkit的那个前缀也是在编译的时候动态添加的。

现在开发会使用前端自动化构建工具gulp。具体配置可以参考《前端自动化构建工具gulp记录

三、JavaScript部分

1)slider绑定

给“ul”绑定touchstart、touchmove、touchend。touch的相关概念可以参考《触屏touch事件记录

在touchmove中计算偏移量,超过指定的偏移才在touchend触发滑动效果。

页面中动画很多,有的地方需要在动画结束后触发一些效果,所以要绑定“webkitTransitionEnd”事件。

 $slider.on("webkitTransitionEnd", 'li', function() {
isSlide = false; //slide动画结束 防止暴力切换
});
$slider.on('touchstart', function(e) {
var touch = e.touches[0];
startX = touch.clientX;
startY = touch.clientY;
if (isSlide) {
e.preventDefault();
}
}).on('touchmove', function(e) {
var touch = e.touches[0],
posY = touch.clientY,
posX = touch.clientX;
offsetY = posY - startY;
offsetX = posX - startX;
isMove = true;
e.preventDefault();
}).on("touchend", function(e) {
if (!offsetY || Math.abs(offsetY) < 30 || !isMove) {
return;
}
$this = $(e.target);
if ($this[0].tagName != 'LI') {
$this = $this.closest('li');
}
var current = $this.index();
$this.siblings('li').removeClass('play'); //防止出现重叠BUG
if (offsetY > 0) { //向下滑动
direction = "down";
$next = $this.prev();
} else { //向上滑动
direction = "up";
$next = $this.next();
} if (current == 0 && direction == 'down') {
return;
}
if (current == length - 1 && direction == 'up') {
return;
} if (direction == 'up') {
$this.addClass('move-up');
} else {
$this.addClass('move-down');
}
isSlide = true;
offsetY = 0;
offsetX = 0;
setTimeout(function() {
$this.removeClass('play move-up move-down');
$next.addClass('play').siblings('li').removeClass('play');
}, 300);
});

2)e.preventDefault

在“touchstart”和“touchmove”都调用了这个方法,这句话的意思是阻止默认行为。

第一个调用是为了防止在手指快速的上下滑动的时候触发“touchend”中的切换。

第二个是Android 4.0+的一个BUG,就是有时候不会触发“touchmove”事件,加了这个后就能触发。

不过加了这个后,相应位置的滚动就无效了,囧。

关于事件处理的相关概念可以参考《JavaScript中事件处理

参考资料:

CSS3 Transform的perspective属性

CSS3 3D Transform

用CSS3动画,让页面动起来的更多相关文章

  1. css3动画简介以及动画库animate.css的使用

    在这个年代,你要是不懂一点点css3的知识,你都不好意思说你是个美工.美你妹啊,请叫我前端工程师好不好.呃..好吧,攻城尸...呵呵,作为一个攻城尸,没有点高端大气上档次的东西怎么能行呢,那么css3 ...

  2. 转: css3动画简介以及动画库animate.css的使用

    ~~~ transition  animation 和 animate.css 在这个年代,你要是不懂一点点css3的知识,你都不好意思说你是个美工.美你妹啊,请叫我前端工程师好不好.呃..好吧,攻城 ...

  3. 【转载】css3动画简介以及动画库animate.css的使用

    原文地址:http://www.cnblogs.com/2050/p/3409129.html 在这个年代,你要是不懂一点点css3的知识,你都不好意思说你是个美工.美你妹啊,请叫我前端工程师好不好. ...

  4. 从零开始学习jQuery (七) jQuery动画-让页面动起来!

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 开发人员一直痛疼做动画. 但是有了jQuery你 ...

  5. css3动画和animate.css动画库使用

    CSS3动画 css3动画可以分为两种.transition过渡动画和keyframes关键帧动画 过渡动画 第一种叫过渡(transition)动画,就是从初始状态过渡到结束状态这个过程中所产生的动 ...

  6. 玩转HTML5移动页面(动效篇)

    原文:http://www.grycheng.com/?p=458 作为一名前端,在拿到设计稿时你有两种选择: 1.快速输出静态页面 2.加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有 ...

  7. 转:玩转HTML5移动页面(动效篇)

    作为一名前端,在拿到设计稿时你有两种选择: 1.快速输出静态页面 2.加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有志向的前端,当然是选2啦!可是需求时间又很短很短,怎么办呢? 这次就 ...

  8. 学习笔记 第十四章 使用CSS3动画

    第14章   使用CSS3动画 [学习重点] 设计2D动画 设计3D动画 设计过渡动画 设计帧动画 能够使用CSS3动画功能设计页面特效样式 14.1  设计2D动画 CSS2D Transform表 ...

  9. 【特效】页面滚动到相应位置运行css3动画

    请到我的个人博客网站上浏览此文章,欢迎评论和建议. 文章链接:http://www.xiaoxianworld.com/archives/87 现在css3动画很常见了,实际项目中经常应用,特别是那种 ...

随机推荐

  1. fasicon.js (无二维码版,如需要js创建二维码版本可联系我:770959294@qq.com)

    /*** Created by 张云山 on 2016/12/9.*/(function(wins,doct){wins.fasicon = function(){this.name = " ...

  2. Collections+Iterator 接口 | Map+HashMap+HashTable+TreeMap |

    Collections+Iterator 接口 1. Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了大量方法对集合元素进行排序.查询 ...

  3. Hbuilder开发HTML5 APP之侧滑菜单

    1.思路: 其时有2个WebView,一个main是用来装主页面,一个menu是用来装菜单(为提高性能,菜单项是采用了预加载方式的,预加载时为了避免和主页面争夺资源,采用延时加载,例如: //plus ...

  4. Zero Copy I: User-Mode Perspective

    By now almost everyone has heard of so-called zero-copy functionality under Linux, but I often run i ...

  5. Android应用安全开发之浅谈网页打开APP

    一.网页打开APP简介 Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布 ...

  6. 可在广域网部署运行的QQ高仿版 -- GGTalk总览

     (最新版本:V5.5,2016.12.06  增加对MySQL数据库的支持.) (android移动端:2015.09.24 最初发布 ,2016.11.25 最后更新) GGTalk(简称GG)是 ...

  7. Hadoop学习笔记—15.HBase框架学习(基础知识篇)

    HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是 ...

  8. TCP状态

    TCP状态 TCP连接中包含不同的状态,如何通过状态来判断程序问题尤为重要. 三次握手 图中的connection部分为三次握手. 四次握手 图中的close部分为四次握手. CLOSE_WAIT 服 ...

  9. 如何调试ANDROID下面黑屏问题

    最近很多朋友在问,为毛在WINDOWS下对了,跑ANDROID的虚拟机或者真机就黑屏了, 有的是只有FPS信息,有的是连FPS信息都没有.如果是程序能够正常启动,不会闪退,但显示不对. 那十有八九都是 ...

  10. 2013 duilib入门简明教程 -- 前言(1)

        关于duilib的介绍就不多讲了,一来不熟,二来小伙伴们想必已经对比了多个界面库,也无需赘述.下面进入正题:     不看广告看疗效! 已有众多知名公司采用duilib做为界面库,如华为网盘. ...