基于CSS3新属性Animation及transform实现类似翻书效果

注:本实例JS部分均以原生JS编写,不善用原生JS的,可用jQuery等对三方框架改写

先上效果图:(样式有点丑,可以忽略一下下,效果出来了就好,后期加到其他项目中方便更改0.0)

类似翻书效果,原本的意思是使用JS来控制的,点击一次之后使用setInterval去控制书页翻过去的动画,当书页翻转180°之后,清除掉setInterval,但当我连续点击,那之前没有翻转180°的书页将无法继续完成之前的动作,可以用清除setInterval的方式,但总感觉动画效果不好,当然还有其他解决办法,但突然想到,CSS3为我们提供了animation,我们为什么不去使用使用呢,只要为加上animation动画就可以直接避免这个问题,animation动画默认是每次都执行完动画,所以,当出现连点的时候,就会像图中看到的那样,每一页都自然翻页,下面贴上代码,及实现步骤:

html部分:(这部分真心·····,算了,丑就丑点吧~.~)

<body>
    <!-- 所展示的书的内容 -->
    <div class="book">
        <div class="page">
            <span>1</span>
            <span>2</span>
        </div>
        <div class="page">
            <span>3</span>
            <span>4</span>
        </div>
        <div class="page">
            <span>5</span>
            <span>6</span>
        </div>
        <div class="page">
            <span>7</span>
            <span>8</span>
        </div>
        <div class="page">
            <span>9</span>
            <span>10</span>
        </div>
        <div class="page">
            <span>11</span>
            <span>12</span>
        </div>
        <div class="page">
            <span>13</span>
            <span>14</span>
        </div>
        <div class="page">
            <span>15</span>
            <span>16</span>
        </div>
        <div class="page">
            <span>17</span>
            <span>18</span>
        </div>
        <div class="page">
            <span>19</span>
            <span>20</span>
        </div>
    </div>
    <!-- 用来控制上一页和下一页操作 -->
    <input type="button" value="上一页" id="before"/>
    <input type="button" value="下一页" id="after"/>
</body>

CSS部分:(通过改变transform中rotatey的值,来实现书页的翻转效果)

 1 <style>
 2         .book{
 3             width: 460px;
 4             height: 300px;
 5             position: relative;
 6             margin: 150px 400px;
 7             -webkit-transform-style: preserve-3d;
 8             -moz-transform-style: preserve-3d;
 9             -ms-transform-style: preserve-3d;
10             transform-style: preserve-3d;
11             transform: rotatex(30deg);
12         }
13         .page{
14             width: 230px;
15             height: 300px;
16
17             border: 1px solid #666;
18             position: absolute;
19             right: 0;
20             transform-origin: left;
21             transform-style: preserve-3d;
22             backface-visibility:hidden;
23             font-size: 60px;
24             text-align: center;
25             line-height: 300px;
26         }
27         .page span{
28             display: block;
29             width: 100%;
30             position: absolute;
31             background-color: #00FFFF;
32         }
33         .page span:nth-child(2){
34             transform: rotatey(-180deg);
35             backface-visibility:hidden;
36         }
37
38
39         /*以下两个动画可以只使用第一个,animation中有reverse,可以反向执行动画,
40             使用时需要在JS中点击上一页时添加改属性值*/
41         /*翻书下一页的动画*/
42         @keyframes page {
43             0%{
44                 transform: rotatey(0deg);
45             }
46             100%{
47                 transform: rotatey(-180deg);
48                 z-index: 10;
49             }
50         }
51         /*翻书上一页的动画*/
52         @keyframes page1 {
53             0%{
54                 transform: rotatey(-180deg);
55                 z-index: 10;
56             }
57             100%{
58                 transform: rotatey(0deg);
59             }
60         }
61
62     </style>

JS部分(JS部分主要实现点击上/下一页时,为相应的div添加animation属性)

 1 <script>
 2     var before = document.querySelector("#before");
 3     var after = document.querySelector("#after");
 4     var book = document.querySelector(".book");
 5     var page = document.getElementsByClassName("page"); 7     rotate();
 8
 9     function rotate(){
10         var middle = 0;12         for(var z=0;z<book.children.length;z++){
13             page[z].style.zIndex = book.children.length-z;
14         }
15         after.onclick = function(){
16             if(middle != book.children.length){
17                 page[middle].style.animation = "page 1.5s linear 1 forwards";
18                 middle++;
19             }else{
20                 middle = book.children.length;
21             }
22         };
23         before.onclick = function(){
24             if(middle != 0){
25                 page[middle-1].style.animation = "page1 1.5s linear 1 forwards";
26                 middle--;
27         }else{
28             middle = 0;
29             }
30         }
31     }
32 </script>

关于最后JS部分,主要作用在于,当点击上/下一页时,为相应的div添加animation属性,具体animation的详解,还是需要查看API。

介于兼容性的问题,这里比较好的解决办法是添加class,而不是去添加animation,为适应更多浏览器,需要添加前缀-webkit-、-moz-·······,所以在一个类中写好这些东西,直接添加类就可以了,或者写一个函数,封装好,能直接输出需要的字符串就好。

时间: 2024-10-19 08:38:19

基于CSS3新属性Animation及transform实现类似翻书效果的相关文章

基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转

基于css3新属性transform,实现3d立方体的旋转 通过原生JS,点击事件,鼠标按下.鼠标抬起和鼠标移动事件,实现3d立方体的拖动旋转,并将旋转角度实时的反应至界面上显示 实现原理:通过获取鼠标点击屏幕时的坐标和鼠标移动时的坐标,来获得鼠标在X轴.Y轴移动的距离,将距离实时赋值给transform属性 从而通过改变transform:rotate属性值来达到3d立方体旋转的效果 HTML代码块: <body> <input type="button" clas

css3新属性transform 3D的基础笔记.

研究了下css3中的 transform变换属性中的3D属性效果和看到的一篇好文章了解到了3D的学习;好文章地址:http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/ 下面只是自己能读懂自己写的代码例子: <style> #box{ -webkit-perspective:800px;//定义3D场景大小 -webkit-transform-origin:50%

两点补充——CSS3新属性以及弹性布局

CSS3 新属性 一.[ CSS3新增属性前缀 ] 1.-webkit-:chrome/safari 2.-moz-:火狐 3.-mo-:IE 4.-o-: Opera 欧朋 二 .[CSS 长度单位] 1.px:像素.长度固定,表示分辨率占几个像素点: 2.%:表示相对于默认值的百分比: 3.em:长度与元素的字号挂钩. rem:长度与根元素的字号挂钩. 即与html 的 font-size 挂钩,若不设置,默认16px . [ em与rem区别 ] em与当前元素自身的font-size挂钩

CSS3新属性:在网站中使用访客电脑里没有安装的字体

CSS的font-family属性使网页可以使用客户电脑里的字体,从而得到多姿多彩的WEB页面,但当客户端没有你想要使用的字体时怎么办呢?我们总不能让每个访问者都去安装一个字体吧?事实上,这是可以的!不过不是访客主动下载的,而是网站开发者帮访客下载安装的,具体怎么实现的,我们还要从字体文件的格式说起.字体格式类型主要有几个大分类:TrueType.Embedded Open Type .OpenType.WOFF .SVG.  TrueType Windows和Mac系统最常用的字体格式,其最大

CSS3动画属性animation的用法

转载: 赞生博客 高端订制web开发工作组 » CSS3动画属性animation的用法 CSS3提供了一个令人心动的动画属性:animation,尽管利用animation做出来的动画没有flash或者javascript做出的动画流畅绚丽,但是从代码量和开发时间上提供了便利. animation基本语法是: animation:name keeping-time animate-function delay times iteration final; 第一个参数:name: 动画的名字,即

css3新属性的总结

今天继续总结css3的一些css3新样式,先列一个简单的提纲,重要的还是圆角.阴影.渐变.文字缩略,最最重要的是过度transition,变换transform和animation圆角阴影渐变 圆形渐变 线性渐变 跳变 重复渐变蒙版倒影滤镜多背景文字方向文字缩略 过渡transition 变换transform动画animation: keyframes 一个一个来:1>圆角: border-radius:px %; border-radius: 一个值; 四个角 border-radius:

CSS3新属性注释及实例

这里把CSS3的新属性单独拿出来讲解一下: border-radius 属性用于创建圆角div{border:2px solid;border-radius:25px;-moz-border-radius:25px; /* Old Firefox */}border-shadow 用于向方框添加阴影div{width:300px;height:100px;background-color:#ff9900;-moz-box-shadow: 10px 10px 5px #888888; /* 老的

css3动画属性-animation

一:动画属性参数的详解 简介 CSS动画(Animations)简单说就是在一段固定的动画时间内暗中在某一频率内改变其CSS某个或某些值,从而达到视觉上的转换动画效果.Animations的很多方面都是可以控制的,包括动画运行时间,开始值和结束值,还有动画的暂停和延迟其开始时间等. 语法 <' animation-name '>:检索或设置对象所应用的动画名称 <' animation-duration '>:检索或设置对象动画的持续时间 <' animation-timin

总结CSS3新特性(Animation篇)

动画(Animation),是CSS3的亮点.//之一 通过animation属性指定@keyframe来完成关键帧动画; @keyframe用法: @keyframes name { 0% { top: 0; }/*0%可用from关键字替代*/ 50% { top: 10px; } 100% { top: 0; }/*100%可用to关键字替代*/ } 由于是CSS3,所以不出意外的各种前缀: --图片来自MDN,CSS中的关键帧 单个帧中可填写多个属性,而且不需要保证一致,如: @-web