目录

  1. css3中的过渡
  2. css3中的2d变换
  3. css3中的渐变

1. css3中的过渡

css3中的过渡功能像是一种黄油,通过一些CSS的简单动作触发样式平滑过渡。W3C标准中描述的transition功能非常简单:CSS3的transition允许CSS的属性值在规定的时间区间内平滑的过渡。

1.1 CSS3的过渡属性

  • transition属性是一个复合属性,出于简洁性和便于维护考虑,过渡语法通常以简化的形式表达。

  • transition: <过渡属性><过渡所需的时间> <过渡动画函数> <过渡延迟时间>

  • transition 属性主要包含了四个属性:

  • transition-property: 指定过渡或动态模拟的CSS属性。

  • transition-duration: 指定完成过渡所需的时间。

  • transition-timeing-function: 指定过渡函数

  • transition-delay: 指定过渡开始出现的延迟时间。

1.2 指定过渡属性transition-property

我们是可以通过设置指定的属性,使元素发生相对应的变化。需要注意的是,并不是所有的css属性都可以过渡,一般情况下,我们会对以下的类型属性来处理。

  • 颜色属性

  • 具有长度值,百分比的属性

  • 真实的数值:如opacity,font-weight,font-size

  • 变形系类的属性:如rotate(),scale(),translate()等

  • visibility:在0-1的范围内。0表示隐藏,1表示完全显示

  • 阴影:例如text-shadow属性。

  • 渐变

1.3 指定过渡时间transition-duration

transition-duration:time

time为数值,单位为s(秒)或ms(毫秒)。可以作用与所有元素。默认值为0,也就是说变换是即时的。当你设置transition-duration为0时,指定的元素样式过渡时,看不到过渡过程,直接看结果。和transition-property属性一样,当你设置多个过渡属性的时候,也可以设置多个过渡时间,每个值之间需要用逗号隔开。

1.4 指定过渡函数transition-timing-function

transition-timing-function属性指定某种指代过渡”缓冲函数”的属性。此属性可指定浏览器的过渡速度,以及过渡期间的操作进展情况。可以将某个值指定为预定义函数,阶梯函数或者三次方贝塞尔曲线。(cubic-bezier(0.145,1.295,0,1.610))

1.5 指定过渡延迟时间transition-delay

过渡属性transition还有一个过渡延迟时间属性transition-delay,用来定义过渡延迟时间。transition-delay用来指定一个动画开始执行的时间,也就是说当改变元素属性值后多长时间开始执行过渡效果,它的取值可以是正整数和0,非0的时候必须设置单位s(秒)或者ms(毫秒)

练习

练习1:鼠标悬浮body上时,盒子的高度从100px过渡到50px,然后宽度从 50px过渡到300px,同时盒子的背景颜色从”#8ec63f”色过渡到”#f7941d”色。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>过度时间</title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            body{
                margin: 200px auto;
                border: 1px solid #666;
                height: 200px;
            }
            .wrap{
                width: 50px;
                height: 100px;
                background: #8ec63f;
                transition: 2s all;
            }
            body:hover .warp{
                height: 50px;
                width: 300px;
                background: #f7941d;
            }
        </style>
    </head>
    <body>
        <div class="wrap">

        </div>
    </body>
</html>

练习2:CSS3实现导航条下拉效果

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>下拉菜单</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            a{
                text-decoration: none;
                color: #666;
            }
            ul li{
                list-style: none;
            }
            .nav {
                width: 250px;
                margin: 20px auto;
            }
            .nav ul:nth-child(1){
                display: flex;
            }
            .nav ul:nth-child(1)>li{
                width: 120px;
                height: 40px;
                text-align: center;
                line-height: 40px;
                border: 1px solid #ddd;
                box-shadow: 2px 2px 4px #ddd;
                transition:1s all;
            }
            .nav ul:nth-child(2){
                height: 0;
            }
            .nav ul:nth-child(2)>li{
                height: 0;
                overflow: hidden;
                transition:0.7s;
            }
            ul:nth-child(1)>li:hover a .creat{
                border-top: 8px solid #ddd;
                border-bottom: 0px solid #ddd;
                border-left: 8px solid transparent;
                border-right: 8px solid transparent;
            }
            ul:nth-child(1)>li:hover ul:nth-child(2)>li{
                border: 1px solid #ddd;
                height: 40px;
            }

            .creat{
                display: inline-block;
                transition: 1s all;
                width: 0;
                height: 0;
                border-top: 8px solid transparent;
                border-bottom: 8px solid transparent;
                border-left: 8px solid #ddd;
                border-right: 0px solid;

            }
        </style>
    </head>
    <body>
        <div class="nav">
            <ul>
                <li>
                    <a href="javascript:;">下拉菜单 <span class="creat"></span></a>
                    <ul>
                        <li><a href="javascript:;">1</a></li>
                        <li><a href="javascript:;">2</a></li>
                        <li><a href="javascript:;">3</a></li>
                    </ul>
                </li>
                <li>
                    <a href="javascript:;">下拉菜单 <span class="creat"></span></a>
                    <ul>
                        <li><a href="javascript:;">1</a></li>
                        <li><a href="javascript:;">2</a></li>
                        <li><a href="javascript:;">3</a></li>
                    </ul>
                </li>
            </ul>
        </div>
        <script src="js/jquery-1.11.0.js"></script>
        <script type="text/javascript">

        </script>
    </body>
</html>

练习3:移入出现遮盖层

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>遮盖层</title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            .content{
                width: 520px;
                height: 520px;
                border: 1px solid #ddd;
                box-shadow: 2px 2px 4px #ddd;
                margin: 20px auto;
                display: flex;
                box-sizing: border-box;
                padding: 10px;
            }
            .item{
                width: 200px;
                height: 150px;
                border: 1px solid #666;
                position: relative;
                overflow: hidden;
                transition: 2s all;
            }
            .over{
                width: 200px;
                height: 150px;
                background: rgba(0,0,0,0.5);
                position: absolute;
                top: 150px;
                transition: 1s all;
                color: #fff;
                text-align: center;
            }
            .item:hover .over{
                top: 0;
            }
        </style>
    </head>
    <body>
        <div class="content">
            <div class="item">
                <h2>内容</h2>
                <div class="over">
                    遮盖层
                </div>
            </div>
        </div>
    </body>
</html>

2. css3中的2d变换

在css2.0中,如果需要我们对于某个元素进行一个倾斜,缩放,移动以及翻转元素,是非常困难的一件事。只能借助photoshop切图的方式来完成。但在css3中,为我们新增了变形的功能。

CSS3变形时一些效果的集合,比如平移,旋转,缩放和倾斜效果,每个效果都称为变形函数,它们可以操控元素发生旋转,缩放,平移等变化。不需要我们依赖图片,FLASH或javascript才能完成。而使用纯CSS来完成这些变形效果。

2.1 transform属性

transform属性让元素在一个坐标系统中变形,包含了一系列变形函数,可以移动,旋转和缩放元素。

transform:none|<transform-function>

可用于内联元素和块元素。其默认值为none,表示元素不进行变形。属性值transform-function,表示一个或多个变形函数,以空格分开。例如rotate,scale,translate等。需要注意的时,在transform中使用过多个transform-function时却需要用空格隔开。

练习1:图片列表带有旋转动画


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>旋转图片</title>
        <style>
            *{
                margin: 0;
            }
            .wrap{
                width: 600px;
                height: 400px;
                border: 1px solid black;
                padding: 10px 15px;
                box-sizing: border-box;

            }
            .wrap .item{
                width: 120px;
                height: 120px;
                border: 1px solid #ddd;
                background: url(img/1.jpg) no-repeat;
                background-size:100% 100%;
                position: relative;
                overflow: hidden;
                float: left;
            }
            .wrap .item .info{
                position: absolute;
                width: 100%;
                height: 120px;
                background:rgba(0,0,0,0.5);
                color: #fff;
                left: 0;
                transition: 0.75s all;
                -webkit-transform:rotate(60deg) translate(94px,52px);
            }
            .wrap .item:hover .info{
                -webkit-transform:rotate(360deg) translate(0px,0px);
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="item">
                <span class="info">斗破苍穹</span>
            </div>
            <div class="item">
                <span class="info">斗破苍穹</span>
            </div>
            <div class="item">
                <span class="info">斗破苍穹</span>
            </div>
            <div class="item">
                <span class="info">斗破苍穹</span>
            </div>
            <div class="item">
                <span class="info">斗破苍穹</span>
            </div>
            <div class="item">
                <span class="info">斗破苍穹</span>
            </div>
            <div class="item">
                <span class="info">斗破苍穹</span>
            </div>
        </div>
    </body>
</html>

练习2:扇形导航


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>扇形导航</title>
        <style>
            *{
                margin: 0;
            }
            .wrap{
                position: fixed;
                width: 50px;
                height: 50px;
                right: 20px;
                bottom: 20px;
            }
            .wrap img{
                position: absolute;
                transition: 1s all;
                left: 0;
                top: 0;
            }
            .home{
                width: 50px;
                height: 50px;
                background: url(img/home.png) no-repeat;
                position: absolute;
                left: 0;
                top: 0;
                transition: 1s all;
            }
        </style>
    </head>
    <body>
        <div class="wrap" id="wrap">
            <img src="img/clos.png" />
            <img src="img/full.png" />
            <img src="img/open.png" />
            <img src="img/prev.png" />
            <img src="img/refresh.png" />

            <div class="home" id="home">

            </div>

        </div>
        <script>
            var oHome = document.getElementById("home")
            var oImg = document.getElementById("wrap").getElementsByTagName("img")
            var onOff = true
            var iR = -150
            oHome.onclick = function(){
                if(onOff){
                    this.style.webkitTransform = "rotate(360deg)"
                    for (var i=0;i<oImg.length;i++) {
                        var iLt = toChage(iR,90/4*i)
                        oImg[i].style.left = iLt.left+"px"
                        oImg[i].style.top = iLt.top+"px"
                        oImg[i].style.webkitTransform = "rotate(-720deg)"
                    }
                    onOff = false
																										
                }else {
                    this.style.webkitTransform = "rotate(0deg)"
                    for (var i=0;i<oImg.length;i++) {
                        oImg[i].style.transition = "0.5s "+(oImg.length-1-i)*100+"ms"
                        oImg[i].style.left = 0+"px"
                        oImg[i].style.top = 0+"px"
                        oImg[i].style.webkitTransform = "rotate(-720deg)"
                    }
                    onOff = true
                }
            }

            function toChage(iR,iRotate){
                var l = Math.round(Math.sin(iRotate/180*Math.PI)*iR)
                var t = Math.round(Math.cos(iRotate/180*Math.PI)*iR)
                return {
                    left:l,
                    top:t
                }
            }
        </script>
    </body>
</html>

2.2 transform-orign属性

  • transform-orign属性的x轴和y轴的值可以重置元素变形原点的位置。
  • transform-orign:x,y
  • 属性值可以是百分比,em,px等具体的值,也可以是top,right,bottom,left和center这样的关键词。

3. css3中的渐变

一直以来,Web设计师都是通过图形软件设计这些渐变效果,然后以图片的形式或者背景图片的形式运用到页面中。Web页面上实现的效果,仅从页面的视觉效果上来看,与设计并无任何差异。
事实上这种方法比较麻烦,因为首先需要设计师进行设计,然后进行切图,在通过样式应用到页面中。另外,在实际应用中可扩展性差,还直接影响页面性能。
值得庆幸的是,W3C组织将渐变设计收入到CSS3标准中,可以直接通过CSS的渐变属性制作类似渐变图片的效果。

3.1 CSS3的线性渐变

在线性渐变过程中,颜色沿着一条直线过渡:从左侧到右侧,从右侧到左侧,从顶部到底部,从底部到顶部或沿任意轴。
在CSS3中制作线性效果,首先要指定一个渐变的方向,起始颜色,结束颜色。具有这三个参数就可以制作一个最简单,最普遍的渐变效果。

基本用法:

  • -webkit-linear-gradient(type,start,end,startColor,endColor)
  • -webkit-linear-gradient是webkit引擎对渐变的实现一共有5个参数。
  • 第一个参数type表示渐变类型,默认是线性渐变。
  • 第二个参数start表示渐变的起始值
  • 第三个参数end表示渐变的终点值
  • 第四个参数startColor表示起始的颜色
  • 第五个参数endColor表示结束的颜色

练习1:CSS3进度条

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>CSS3进度条</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            .wrap{
                width: 200px;
                height: 40px;
                margin: 20px auto;
                border: 1px solid #ddd;
                overflow: hidden;
            }
            .progress{
                width: 400px;
                height: 40px;
                transition: 3s all;
                background: -webkit-repeating-linear-gradient(30deg,green 0,green 10px,#fff 10px,#fff 20px);
            }
            .wrap:hover .progress{
                background-position: -100px 0;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="progress">

            </div>
        </div>
    </body>

</html>

练习2:光线轨迹

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>百度光斑</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            .wrap{
                width: 300px;
                height: 300px;
                background: -webkit-linear-gradient(-25deg,rgba(255,255,255,0) 0,
                            rgba(255,255,255,0) 150px,
                            rgba(255,255,255,1) 160px,
                            rgba(255,255,255,1) 170px,
                            rgba(255,255,255,0) 180px) 
                            no-repeat -140px 0px,
                            red;
                transition: 1s all;
            }
            .wrap:hover{
                background-position: 300px 0;
            }
        </style>
    </head>
    <body>
        <div class="wrap">

        </div>
    </body>
</html>