zoukankan      html  css  js  c++  java
  • 《响应式web设计》读书笔记(五)CSS3过渡、变形和动画

             平时在浏览网页的时候经常会看到诸如“CSS 3D效果”、“css3动画”之类的字眼,看过效果后觉得很神奇,但也一直没机会研究一下原理。因为真正项目中还没用到这些东西。但这些新的技术在不久的将来必定是要大放异彩的,这是标准的一部分呀,一定有步入正轨的那一天。趁着阅读《响应式web设计》这本书,来把这部分知识学习一下。

    Javascript动画VS CSS动画

             用js写的动画大家都不陌生了,使用jQuery或者其他框架可以方便的制作出各种动画效果。那我们为什么还要用CSS来做动画呢?它有哪些优势呢?

             首要功绩便是效率。如果一个新手用js写了一个简单的动画效果(比如鼠标悬停),作为一个自称是完美主义者的前端工程师,当然是无法忍受的。如果winter大大在场,必会指着鼻子问:你要用脸盆来喝水吗。显然,调用javascript引擎来为元素渲染样式真是太浪费资源了。

             其次呢,其次。。。还有什么优势呢?我竟然想不来了,作者也没有提。真是尴尬,本来想好好捧一下CSS动画的。对不住你了。。。不过就单单提高效率这一点来说,也值得我们好好利用它了。因追逐高效率而造成一些产品或企业兴衰更迭并不少见。

    先说CSS3过渡

    过渡,可以理解为从一个状态缓缓变为另一个状态,包含整个变化过程。CSS3的过渡效果通过transition这个属性完成。它的取值是以下四个属性值的缩写:

    transition-property:要过渡的属性名称,如background-color。设为all时过渡会被应用在每一个可能的属性上。

    transition-duration:过渡的持续时间,单位为秒。

    transition-timing-function:定义过渡期间速度如何变化。取值有:ease,linear,ease-in,ease-out,ease-in-out,cubic-bezier。它们是一些贝塞尔曲线,具体可参考http://cubic-bezier.com

    transition-delay:定义过渡开始前的延迟时间。如设置为1s,则过渡效果在1秒后开始。也可以设为负值。此时过渡会立刻开始,不过过渡效果的起点为原效果的1s后。(就是说过渡在开始之前已经悄悄跑了1秒,你没看见)

             你可以像使用background一样简写这些属性,例如:transition:all 1s ease 0s。当然,也有拆开写的时候,比如你想指定过渡某几个属性,并且让它们步调不一致,可以这么写:

    transition-property:border,color,text-shadow;
    
    transition-duration:2s,3s,8s;

             好了,关于过渡的知识点就这些。我已经开始要迫不及待的试一试了。写个小例子来看看。CSS代码:

    #btn{
             background-color:#b01c20;
             font-size:3em;
             border-radius:8px;
             color:#FFF;
             padding:3%;
             background:linear-gradient(90deg,#b01c20 0%,#f15c60 100%);
             box-shadow:5px 5px 5px hsla(0,0%,26%,0.8);
             text-shadow:0 1px black;
             border:1px solid #bfbfbf;
             transition:all 1s ease 0s;/*就用在这里啦*/
             }
    #btn:hover{
             border:1px solid #000;
             color:#000;
             text-shadow:0 1px white;
             }

    Html代码:

    <a id="btn" href="#">CSS3过渡</a>

    CSS3过渡

          怎么样,效果不错吧?好吧,我承认我抄了书上的例子代码。。。不过,作为一个初学者我有一个疑问,不知你是否也会有。这个transition属性为什么放在#btn里面而不放在#btn:hover里面呢?既然是鼠标移上去之后才开始过渡效果,那应该放在#btn:hover里才对。

    那我就来放放看:

    #btn2{
             background-color:#b01c20;
             font-size:3em;
             border-radius:8px;
             color:#FFF;
             padding:3%;
             background:linear-gradient(90deg,#b01c20 0%,#f15c60 100%);
             box-shadow:5px 5px 5px hsla(0,0%,26%,0.8);
             text-shadow:0 1px black;
             border:1px solid #bfbfbf;
             }
    #btn2:hover{
             border:1px solid #000;
             color:#000;
             text-shadow:0 1px white;
             transition:all 1s ease 0s;/*过渡放在这里*/
             }

    效果如下:

    CSS3过渡

             看出细微的差别来了吧。当鼠标移走的时候,这个过渡效果没了。所以这个transition应该这么理解:定义元素的属性在发生变化时候的过渡效果。而不是:在变化的时候定义元素的过渡效果,所以从元素一生下来的时候就应该定义好了。

    加点小料

             如果你是响应式设计的爱好者,一定会有这个习惯,看到一个不错的网站时,会忍不住拖动浏览器窗口的大小,看看它到底是如何响应视口的变化的。来看这个站点http://css-tricks.com。试着调整你的浏览器窗口,你会发现当布局发生变化时,都不是硬生生的蹦过去的,而是如飞舞一般过渡完成。这时你会心一笑。请不要小看这一点,对于一个用户体验设计师来说,这种能触动到用户内心的会心一笑是十份宝贵的,哪怕只是一个瞬间。好了,你是不是已经猜到这是如何实现的了呢?很简单的一行代码:

    *{
    
             transition:all 1s;//所有元素的所有属性在发生变化时,都加1秒的过渡效果
    
    }

    2D变形

             变形要用到的属性是transform,会不会觉得跟过渡(transition)有点像呢?确实,它们俩的概念也有点容易混淆。变形是指从一种形状变为另一种形状,更强调变化前后的区别,而过渡是指变化的整个过程,更强调期间经历的过程。作者举了个例子,变形金刚擎天柱从汽车变形(transform)为机器人,中间要经过咔咔咔的过渡(transition)。

             来看看我们都能进行哪些变形呢?transform的取值有:

    scase:用来缩放元素,放大或缩小

    translate:移动元素,可沿上下左右四个方向

    rotate:旋转元素,单位为角度

    skew:沿X轴或Y轴对元素进行斜切

    matrix:以像素精度控制变形效果

             下面我就来挨个试一下,所用到的html代码为

    <a href="#" id="link">我要变形了</a>

             transform:scale(1.5);

    我要变形了

             transform:translate(40px,0);

    我要变形了

             transform:rotate(90deg);

    我要变形了

             transform:skew(10deg,2deg);

    我要变形了

             transform:matrix(1.678,-0.256,1.522,2.333,-51.533,-1.898);

    我要变形了

             如果你的浏览器支持2D变形,相信已经看到效果了。合理利用这些变形能够制造出很多意想不到的效果。

    把变形和上一节的过渡结合起来使用,可以产生柔和的变形效果,通过下面这段代码,你也将会更加清楚变形和过渡的区别。

    加了过渡的变形:

    #link6{
             font-size:3em;
             text-decoration:none;
             display:inline-block;
             transition:all 1s ease 0s;
             }
    #link6:hover{
             transform:skew(10deg,2deg);
             }

    我要变形了

             未加过渡的变形

    #link7{
             font-size:3em;
             text-decoration:none;
             display:inline-block;
             }
    #link7:hover{
             transform:skew(10deg,2deg);
             }

    我要变形了

            补充说明:a标签一定要display:inline-block;才可以行的通。不晓得为什么,郁闷。另外为了获得浏览器的兼容,请自行加前缀。

             另外还有一点需要说说,就是这个矩阵变形matrix,到底该怎么用呢?例子中那么多乱七八糟的数字是怎么得来的呢?事实是,它确实是有难度的,需要有数学知识才能计算出这些值了。作为初探css变形,我就不深究这个细枝末节了。如果有需要使用特殊一点的形变呢?有个现成的工具可以利用,http://www.useragentman.com/matrix/。可以让你通过傻瓜化的拖动操作,根据你拖动后的形状来为你生成公式。有兴趣可以试试哟。 

    3D变形

             越来越高级了哦。3D变形有着广阔的前景,但现在的支持度还不是很高,所以也不能做大规模推广,只能为网页增加渐进增强的效果。书上作者通过一个例子讲解了如何使用3D变形,我也打算亲手试一下这个例子,开始吧。

    Html代码如下:

    <div id="imgcontainer">
      <div id="imgcontent">
        <div id="imgfront">
          <img src="http://e.hiphotos.baidu.com/album/w%3D2048/sign=d2bdb329adaf2eddd4f14ee9b92800e9/bd315c6034a85edf2905330c48540923dd547510.jpg" width="100%" />
        </div>
        <div id="imgback">
         人物介绍:汤唯
        </div>
      </div>
    </div>

    CSS代码如下:

    #imgcontainer{
             width:200px;
             height:300px;
             position:relative;
             perspective:200;
             perspective:800;
             }
    #imgcontent{
             width:100%;
             height:300px;
             transform-style:preserve-3d;
             transition:1s;
             box-shadow:2px 2px 2px black,-2px -2px 2px black;
             }
    #imgcontainer:hover #imgcontent{
             transform:rotateY(180deg);
             }
    
    #imgcontainer:hover #imgback{
             visibility:visible;
             }
    #imgfront{
             width:100%;
             height:300px;
             position:absolute;
             backface-visibility:hidden;
             }
    #imgback{
             width:200px;
             height:280px;
             padding-top:20px;
             transform:rotateY(180deg);
             visibility:hidden;
             transition:all 0.5s ease 0.5s;
             }
    人物介绍:汤唯

           效果就是上面这个样子啦,所有用到的css属性都在代码中注释说明了。能否看到相应的效果就得看您的浏览器的能耐了。正如作者所说,3D变形尚未成熟。在视口宽度变化时也不能很好的展现正确的效果。未来的成熟以及稳点,让我们拭目以待。

    CSS3动画

             如果你有flash基础,那做起css动画来讲简直就太简单了,因为css动画也是基于关键帧技术。即无需定义整个动画过程,只需定义好关键点的样式,其他的工作都由浏览器完成。关键帧的定义语法如下:

    @keyframes shadowwords{
             0%{
                       text-shadow:0 0 4px red;
                       }
             50%{
                       text-shadow:0 0 20px red;
                       }
             100%{
                       text-shadow:0 0 4px red;
                       }
             }

             这里我定义了一个名为shadowwords的关键帧,这个名字是可以随便取的。通过百分比值来定义不同阶段的样式。这里我让它的文字阴影进行变化。定义好关键帧后,就可以在样式中使用它了。像这样:

    #shanshuo{
             font-size:4em;
             color:#F2050G;
             animation:shadowwords 1.5s infinite ease-in;
    }

             然后在html代码中就可以使用该类了:

    <div id="shanshuo">闪烁文字</div>

             效果如下:

    闪烁的文字

             上面的animation也是缩写的形式。完整的属性包括以下几个:

    animation-name:关键帧名称

    animation-duration:动画持续时间

    animation-timing-function:速度变化函数

    animation-iteration-cound:动画循环次数,设为infinite无限循环

    animation-play-state:控制动画的播放和暂停。取值为running和paused

    animation-delay:开始前的延时

    animate-fill-mode:设置对象的状态。取值为none | forwards | backwards | both

             书上的知识点就这些啦,基本可以算师傅领进门的级别了。如果有更好的创意,可以将过渡、变形结合起来,打造更加绚丽的效果。更多关于CSS3动画的内容,可以访问官网http://dev.w3.org/csswg/css3-animations

             所有关于CSS3过渡、变形、动画的内容就以上这些了。通过这一章的学习,算是了解了基本用法,更多好的效果和动画还需要多多实践才行。接下来,我要把我的博客应用上一些今天学到的东西,算是一个小小的练手吧。代码就不在这里展示了,用你的高端浏览器来发掘吧~

  • 相关阅读:
    023_带标签的break和continue
    5.利用for循环打印九九乘法表
    4.用while和for循环输出1到100之间能被5整除的数,且每行输出3个。
    Python字典由value查key
    python保存字典到文件
    python查找列表中某个元素所有下标的两个方法
    聚类算法评估指标:IoU, mPA, MoF
    二分图与匈牙利算法,Python实现
    行为检测和识别领域的一些研究人员的主页及文章代码的链接
    python 计时
  • 原文地址:https://www.cnblogs.com/lvdabao/p/3131377.html
Copyright © 2011-2022 走看看