CSS3 Transition详解和使用

2019-11-08 09:34:46

参考地址 CSS3 Transition

Transition 简介

Transition 可以设置 CSS 属性的过渡效果,它有以下几个属性。


transition-property 用于指定应用过渡属性的名称

transition-duration 用于指定这个过渡的持续时间

transition-delay 用于指定延迟过渡的时间

transition-timing-function 用于指定过渡的类型

transition-property

transition-property 用于指定应用过渡的属性名称,可以指定多个属性名称,多个属性名称之间用, 分隔。

默认值为 all 也就是所有的元素都应用过渡效果。

例如,想让容器的宽高有一个过渡的效果,就可以这样写:


<style>

    .box {

        width: 200px;

        height: 200px;

        background-color: dodgerblue;

        transition-property: width, height;   /*设置宽高过渡的属性*/

    }


    .box:hover {  /*在鼠标移入的时候修改宽高*/

        width: 400px;

        height: 400px;

    }

</style>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

注意:当只设置了 transition-property 属性而没有设置过渡持续时间的时候,过渡效果不会生效。


transition-duration

transition-duration 用于设置过渡的持续时间,属性值以秒s或毫秒ms为单位,默认值为0。

同样可以指定多个时长,多个每个时长会被应用到由 transition-property 指定的对应属性上。

例如:想让容器的宽度有一个5秒的过渡效果,高度有一个3秒的过渡效果,就可以这样写:


<style>

    .box {

        width: 200px;

        height: 200px;

        background-color: dodgerblue;

        transition-property: width, height;

        transition-duration: 5s, 3s;  /*设置与 transition-property 对应的过渡时间*/

    }


    .box:hover { /*在鼠标移入的时候修改宽高*/

        width: 400px;

        height: 400px;

    }

</style>

</head>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

运行效果图:


如果指定的时长个数小于属性个数,那么时长列表会重复。

以下代码的意思是:宽度、高度、背景颜色的过渡时间都是5秒。


<style>

    .box {

        width: 200px;

        height: 200px;

        background-color: dodgerblue;

        transition-property: width, height, background-color;  /* 属性列表长一些 */

        transition-duration: 5s;  /* 如果时长的个数小于属性列表,则时长列表会重复 */

    }


    .box:hover {

        width: 400px;

        height: 400px;

        background-color: deeppink;

    }

</style>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

运行结果如下:


如果时长列表更长,那么该列表会被裁减。

两种情况下,属性列表都保持不变。

以下代码的意思是:宽度的过渡时间是5秒,高度3秒,背景颜色2秒


<style>

    .box {

        width: 200px;

        height: 200px;

        background-color: dodgerblue;

        transition-property: width, height, background-color;  /* 设置三个属性的过渡效果 */

        transition-duration: 5s, 3s, 2s, 1s, 0s;  /* 有五个时长,会从第四个开始截断。 */

    }


    .box:hover {

        width: 400px;

        height: 400px;

        background-color: deeppink;

    }

</style>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

运行结果如下



transition-delay

transition-delay 规定了在过渡效果开始作用之前需要等待的时间(延迟时间),值以秒(s)或毫秒(ms)为单位,表明动画过渡效果将在何时开始。取值为正时会延迟一段时间来响应过渡效果;取值为负时会导致过渡立即开始。

可以指定多个延迟时间,每个延迟将会分别作用于你所指定的相符合的css属性transition-property。


<style>

    .box {

        width: 200px;

        height: 200px;

        background-color: dodgerblue;

        transition-property: width;  /* 设置宽度有过渡效果 */

        transition-duration: 3s;  /* 设置过渡时间为 3s */

        transition-delay: 1s;   /* 设置延迟时间为 1s */ 

    }


    .box:hover {

        width: 300px;  

    }

</style>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

运行结果如下:



transition-timing-function

transition-timing-function用于指定过渡类型,可选值有 ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier


ease 默认值,先加速后减速

<style>

    .box {

        width: 200px;

        height: 200px;

        background-color: dodgerblue;

        transition-property: width;

        transition-duration: 3s;

        transition-timing-function: ease;  /* 设置过渡类型,默认为 ease(先加速后减速) */

    }


    .box:hover {

        width: 400px;

    }

</style>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

运行结果如下:



linear 匀速

transition-timing-function: linear;

1

运行结果如下:



ease-in 加速

transition-timing-function: ease-in;

1

运行结果如下:



ease-out 减速

transition-timing-function: ease-out;

1

运行结果如下:



ease-in-out 先加速后减速,效果比 ease 感觉强烈一些

transition-timing-function: ease-in-out;

1

运行结果如下:



cubic-bezier 贝塞尔曲线

transition-timing-function: cubic-bezier(.09, .88, .2, .17);

1

运行结果如下:



简写属性 transition:

transition是一个简写属性,用于设置 transition-property,transition-duration,transition-timing-function, 和transition-delay。

CSS 过渡 由简写属性 transition 定义是最好的方式,可以避免属性值列表长度不一,节省调试时间 。


<style>

    .box {

        width: 200px;

        height: 200px;

        background-color: dodgerblue;

        /* transition 简写属性 */

        transition: 1s width, 2s height;

    }


    .box:hover {

        width: 400px;

        height: 400px;

    }

</style>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

运行结果如下:


注意:

在transition属性中,各个值的书写顺序是很重要的:第一个可以解析为时间的值会被赋值给transition-duration,第二个可以解析为时间的值会被赋值给transition-delay


推荐抒写顺序

过渡时间 过渡样式 过渡形式 延迟时间 [,过渡时间 过渡样式 过渡形式 延迟时间]


兼容性

transition可以不用厂商前缀,不过鉴于标准刚刚稳定,对于基于 Webkit的浏览器仍然需要厂商前缀。如果想兼容旧版本的浏览器那么也需要厂商前缀(例如Firefox 15 及之前版本, Opera 12 及之前版本)


过渡的坑

transition 在元素首次渲染还没有完成的情况下,是不会触发过渡的。

过渡如果写在js 中,则必须 写在 onload 函数中,否则在页面中的元素还没有渲染完的情况下不会触发过渡!

<style>

    * {

        margin: 0;

        padding: 0;

    }


    .box {

        width: 200px;

        height: 200px;

        background-color: deepskyblue;

        margin: 100px auto;

        transition: 1s;

    }

</style>

<script>

/* 在元素还没有完全加载的时候是不会触发过渡的 */

    var box = document.querySelector(".box");

    box.style.width = "300px";

</script>

</head>


<body>

    <div class="box"></div>

</body>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

解决方法


<script>

    window.onload = function () {

        var box = document.querySelector(".box");

        box.style.width = "300px";

    };

</script>

1

2

3

4

5

6

transition 在绝大部分变换样式切换时,变换组合的个数或位置不一样时,是没有办法触发过渡的

过渡只关心元素的初始状态和结束状态,没有方法可以获取到元素在过渡中每一帧的状态



  • 2019-06-04 16:40:30

    为了美观当网页图片不存在时不显示叉叉图片

    当在页面显示的时候,万一图片被移动了位置或者丢失的话,将会在页面显示一个带X的图片,很是影响用户的体验。即使使用alt属性给出了”图片XX”的提示信息,也起不了多大作用。

  • 2019-06-04 17:38:44

    PHP时间转换今天昨天前天几天前

    实际情况应该是,昨天任何时间都算一天前,前天任意时间都算2天前,所以自己琢磨了一番,去动态更新时间与今天23:59:59相差的时间秒数与86400(24 x 3600)相除后,向下取整,这样就得到了相差的天数,比如昨天00:00~昨天23:59:59的任何时间与今天的23:59:59,都相差 86400~(86400 x 2) 天,也就是2天。

  • 2019-06-04 17:44:14

    【VUE】图片预览放大缩小插件

    在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到三个插件,具体的优劣势的看自己的使用吧,我目前只是在电脑查看效果,分别是viewerjs插件、基于photoswipe的vue-photo-preview插件以及vue-picture-preview插件 作者:北极星丶超帅的 链接:https://www.jianshu.com/p/e3350aa1b0d0 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2019-06-04 21:32:05

    Android 全局Dialog的简单实现

    这里所说的全局Dialog是指无论当前应用是处于哪一个页面上,都能够及时弹出Dialog来提示用户一些信息,用户体验不会很好,一般应用于优先级非常高的通知。

  • 2019-06-06 16:14:50

    intent-filter的action,category,data匹配规则

    我们知道有两种方式来启动Activity,显示调用和隐式调用。当使用隐式调用时,又会涉及到IntentFilter的匹配规则。我确信大多数开发者很少关注隐式调用,因为平时开发中用到大多数是显示调用。例如:用Intent直接打开一个Activity,或者用Intent通过包名等其他信息打开另外一个应用等。而隐式调用则使用的比较少,当然也不是完全不使用。例如:当我们需要打开浏览器访问某个链接时,手机上可能存在多个浏览器,我们也无法拿到某一个浏览器的包名,那么一般情况下我们会写如下代码:

  • 2019-06-06 17:57:57

    input【type="checkbox"】标签与字体对齐

    今天分享一个比较实用的技巧,在实际项目中我们会经常遇到表单的input标签多选和单选的问题,但是往往由于标签自身的样式和我们项目的风格很不搭调,就不能实现了,今天就来告诉大家怎么去实现吧。

  • 2019-06-10 11:54:52

    html.div禁用点击事件

    今天做项目中偶然误把元素加上了pointer-events属性,结果导致后来在js中给该元素加点击事件不能用,检查了半天才发现是这个属性的问题。之前没有好好研究,于是决定仔细研究一下。