前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CSS魔法堂:Transition就这么好玩

CSS魔法堂:Transition就这么好玩

作者头像
^_^肥仔John
发布于 2018-07-11 06:38:53
发布于 2018-07-11 06:38:53
87400
代码可运行
举报
运行总次数:0
代码可运行

前言

 以前说起前端动画必须使用JS,而CSS3为我们带来transition和@keyframes,让我们可以以更简单(声明式代替命令式)和更高效的方式实现UI状态间的补间动画。本文为近期对Transition的学习总结,欢迎各位拍砖。

属性介绍

 首先先我们简单粗暴了解transition属性吧!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transition: <transition-property> <transition-duration> <transition-timing-function> <transition-delay>;

/* 设置启用Transition效果的CSS属性
 * 注意:仅会引发repaint或reflow的属性可启用Transition效果
 *       [CSS_animated_properties](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties)
 */
<transition-property>: all | none | <property> [,<property>]*

/* 设置过渡动画持续时间,单位为s或ms
 */
<transition-duration>: 0s | <time> [, <time>]*

/* 设置过渡动画的缓动函数
 * cubic-bezier的值从0到1
 * [一个很好用的cubic-bezier配置工具](http://cubic-bezier.com)
 */
<transition-timing-function>: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n)

/* 设置过渡动画的延时,单位为s或ms
 */
<transition-delay>: 0s | <time> [, <time>]

 另外我们可以一次性为多个CSS属性启动Transition效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
transition: width 1s ease .6s,
            color .5s linear,
            background 2s ease-in-out;

触发方式

 既然Transition是UI状态间的补间动画,那么有且仅有修改UI状态时才能让动画动起来。那么就有3种方式了:

  1. 伪类.:link,:visited,:hover,:active:focus
  2. 通过JS修改CSS属性值
  3. 通过JS修改className值

TransitionEnd事件详解

TransitionEnd Event

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
el.addEventListener("transitionend"
  , e => 
    {
      const pseudoElement = e.pseudoElement // 触发动画的伪类
          , propertyName = e.propertyName   // 发生动画的CSS属性
          , elapsedTime = e.elapsedTime     // 动画的持续时间
      // ..................
    })

注意:每个启用TransitionCSS属性的分别对应独立的transitionend事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* 触发3个transitionend事件 */
transition: width 1s ease .6s,
            color .5s linear,
            background 2s ease-in-out;

Visibility也能transition?

 在可启用Transition的CSS属性中,我们发现到一个很特别的CSS属性——visibilityvisibility常与display相提并论的属性,它凭什么能启用Transition,而display不行呢?这个我真心不清楚,不过我们还是了解启用transition的visibility先吧! visibility是离散值,0(hidden)表示隐藏,1(visible)表示完全显示,非0表示显示。那么visibility状态变化就存在两个方向的差异了:

  1. 隐藏显示,由于非0就是显示,那么从值从0到1的过程中,实际上是从隐藏直接切换到显示的状态,因此并没有所谓的变化过程;
  2. 显示隐藏,从1到0的过程中,存在一段时间保持在显示的状态,然后最后一瞬间切换到隐藏,因此效果上是变化延迟,依然没有变化过程。

 上述表明启用transition的visibility并没有补间动画的视觉效果,那么到底有什么作用呢?答案就是不影响/辅助其他CSS属性的补间动画。其中最明显的例子就是辅助opacity属性实现隐藏显示的补间动画。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style>
.form-input{
    display: inline-flex;
    line-height: 2;
    border: solid 1px rgba(0,0,0,0.3);
}
.form-input:hover{
        border: solid 1px rgba(0,0,0,0.4);
}
.form-addon{
    font-style: normal;
    color: #666;
    background: #ddd;
    padding-left: 10px;
    padding-right: 10px;
    border-right: solid 1px rgba(0,0,0,0.3);
}
.form-addon-after{
    border-left: solid 1px rgba(0,0,0,0.3);
    border-right: none 0;
}
.form-control{
    border:none 0;
    outline-color: transparent;
    padding: 5px;
    caret-color: #888;
    font-size: 16px;
}
.tips-host{
    position: relative;
}
.tips{
    cursor: default;
    z-index: 999;
    position: absolute;
    top: 120%;
    font-size: 12px;
    color: #444;
    background: #ccc;
    padding: .5em;
    box-shadow: 2px 2px 10px #999;
    transition: box-shadow .2s,
                       opacity 1s,
                       visibility .8s;
    visibility: hidden;
    opacity: 0;
}
.tips:hover{
    box-shadow: 2px 2px 5px #999;
}
.tips::before{
    content: "";
    border: solid 10px transparent;
    border-bottom: solid 10px #ccc;
    position:  absolute;
    transform: translate(0, -100%);
}
.form-control:focus + .tips{
    visibility: visible;
    opacity: 1;
}
</style>
<div class="form-input tips-host" >
    <i class="form-addon">Amount</i>
    <input class="form-control">
    <div class="tips">
        Starts with alphabet, then anything you would like.
    </div>
</div>

 当opacity:0时,需要元素隐藏了但实际上它仍然位于原来的位置,而且可以拦截和响应鼠标事件,当出现元素重叠时则会导致底层元素失效。而由于visibility:hidden时,元素不显示且不拦截鼠标事件,所以在补间动画的最后设置visibility:hidden为不俗的解决办法。

display:none让transition失效的补救措施

 虽然修改display有可能会引发reflow,但它依然不能启用Transition,这点真心要问问委员会了。更让人疑惑的是,它不单不支持启用Transition,而且当设置display:none时其余CSS属性的Transition均失效。难到这是让元素脱离渲染树的后果??

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style>
.box{
  display: none;
  background: red;
  height: 20px;
}
</style>
<div class="box"></div>
<button id="btn1">Transition has no effect</button>
<button id="btn2">Transition takes effect</button>
<script>
const box = document.querySelector(".box")
    , btn1 = document.querySelector("#btn1")
    , btn2 = document.querySelector("#btn2")
btn1.addEventListener("click", e => {
  box.style.display = "block"
  box.style.background = "blue"
})
btn2.addEventListener("click", e => {
  box.style.display = "block"
  box.offsetWidth              // 强制执行reflow
  box.style.background = "blue"
})
</script>

上面的代码,当我们点击btn1时背景色的transition失效,而点击btn2则生效,关键区别就是通过box.offsetWidth强制执行reflow,让元素先加入渲染树进行渲染,然后再修改背景色执行repaint。 那么我们可以得到的补救措施就是——强制执行reflow,下面的操作均可强制执行reflow(注意:会影响性能哦!)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
offsetWidth, offsetHeight, offsetTop, offsetLeft
scrollWidth, scrollHeight, scrollTop, scrollLeft
clientWidth, clientHeight, clientTop, clientLeft
getComputeStyle(), currentStyle()

总结

尊重原创,转载请注明转自^_^肥仔John

参考

小tip: transition与visibility https://www.cnblogs.com/surfaces/p/4324044.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【CSS】378- [译]44个 CSS 精选知识点
一个周五的晚上,闲来无事整理下自己的 github(经常做收藏党),今天打算都过一遍,发现一个 star很高的项目,里面有大量的 CSS 片段,而且标题很诱人,然后又花了将近1个小时从头到尾过了一遍,其中一些是我们常用的一些知识点,另外也包含一些比较新的属性的应用,知识点挺多的,为了让大家看起来更方便些,然后又花了点(很长很长)时间翻译成中文。
pingan8787
2019/10/15
5.5K0
【CSS】378- [译]44个 CSS 精选知识点
css3 transition原理(动画系列二)
CSS 过渡(transition)是通过定义元素从 起点的状态 和 结束点的状态 ,在一定的时间区间内实现元素平滑地过渡或变化 的一种补间动画机制。你可以让属性的改变过程持续一段时间,而不是立即生效。
全栈程序员站长
2022/09/14
1.4K0
CSS Transitions
今天,我们来讲的轻松的话题。作为一个前端,能画出一手炫酷的动画,是一件很振奋人心的事情。并且网页动画已经成为一个庞大而复杂的工具和技术。类似GSAP[1]、Framer Motion[2]和React Spring[3]等库已经涌现,以帮助我们在DOM中添加动画效果。
前端柒八九
2023/09/28
4450
CSS Transitions
CSS3的变形transform、过渡transition、动画animation学习
变形有rotate旋转、scale缩放、translate位移、skew倾斜、matrix矩阵变形、perspective透视几种操作,通过例子来了解各个操作
书童小二
2018/09/03
3K0
CSS八种让人眼前一亮的HOVER效果
巧用伪元素:before、:after等,让你的页面按钮眼前一亮。原文链接:8 amazing HTML button hover effects, that will make your website memorable。更多内容:github.com/reng99/blog…
Jimmy_is_jimmy
2020/10/15
8430
Joe主题加大图
1.复制代码 2.修改index.php 3.修改post.php 4.增加css文件 5.引入css文件 6.站长总结
堡主
2023/03/04
6230
Joe主题加大图
Web - CSS3过渡与动画
transition过渡属性是css3浓墨重彩的特性,过渡可以为一个元素在不同样式之间变化自动添加补间动画。
stark张宇
2025/02/07
1280
八.CSS之animation(动画)
​ 多个属性间使用,隔开 ​ 如果所有属性都需要过渡,则使用all关键字 ​ 大部分属性都支持过渡效果,注意过渡时必须是从一个有效数值向另外一个有效数值进行过渡(auto不是有效数值,过渡动画效果不会生效)
小海怪的互联网
2020/11/24
9920
搞定这些疑难杂症,向css3动画说yes
本文篇幅比较长,涉及到的知识点也比较多,如3d,动画性能,动画js事件等,参考文献及demo展示也比较多,所以建议pc阅读效果更佳。 动画库 到现在来说css3动画也不是什么新技术,既然是要搞定它,好歹我们也得先看下别人做的一些东西吧,所以在此先向各位推荐几个比较好用的动画库: animate.css effeckt hover.css animatable 关于css3动画不得不说的几个属性 看完上面那些动画库,心痒就不如行动了。 说起css3动画,有一个属性我们绝对避不开了,那就是transform这个
IMWeb前端团队
2018/01/15
2.1K0
搞定这些疑难杂症,向css3动画说yes
【前端攻略--HTML/CSS】这是你需要的transform学习教程
transition语法格式:transition: property duration timing-function delay;
野原测试开发
2019/07/10
1K0
SAO-UI-PLAN--Card-Player
这是SAO UI PLAN 的第五弹了,效果没有我想的那么理想。在面积有限的作者卡片上做文章实在是有些捉襟见肘,除了可以在配色上动动脑筋以外,没啥可以放内容的地方。
Akilar
2021/08/03
8590
CSS实现渐隐渐现效果
实现渐隐渐现效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求——希望元素消失时具有平滑的效果。
WindRunnerMax
2021/02/05
4K0
wordpress后台登录界面美化
@font-face { font-family:fzz; src: url('https://img.zuanmang.net/ttf/fzz.ttf'); } 模板从吾爱破解论坛搬的,原作者分享出来的图片都丢失了,样式也有点问题。写了个圆角样式及添加阴影,以及透明显示。(本想用高斯模糊奈何这个结构全都都会变成毛玻璃效果。)用PHP随机显示图片做背景,实现后台登录背景随机刷新。
AlexTao
2019/12/13
6.3K0
wordpress后台登录界面美化
Typecho增加首页大图
修改index.php 路径 usr/themes/Joe/index.php 代码 截图 <!--首页大图--> <div class="HeaderImg" style="back
小东东
2023/03/20
8960
HTML5+CSS3
CSS权重指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式。
py3study
2020/01/16
2.1K0
CSS动效集锦,视觉魔法的碰撞与融合(三)
在一些杀毒或文件扫描类的软件上,我们可能会看到一些雷达扫描的UI样式,例如下图所示
啦啦啦321
2020/02/18
2K0
CSS动效集锦,视觉魔法的碰撞与融合(三)
CSS3 transition的使用
transition: property duration timing-function delay;
全栈程序员站长
2022/09/14
3640
网页|CSS的动画实现
一些CSS属性是可以实现动画效果,即我们可以用CSS实现动画和过渡。而动画属性的实现其实就是,属性逐渐地从一个值变化到另一个值,比如尺寸大小、数量、百分比和颜色,也就是通过设置多个节点来精确控制一个,或一组动画,常用来实现复杂的动画效果从而实现动画。动画是CSS最具有颠覆性的特征之一,接下来我们就来感受一下CSS的动画吧。
算法与编程之美
2019/11/29
1.4K0
理解CSS3属性transition
一、说明 1.1 定义和用法 transition 属性是一个简写属性,用于设置四个过渡属性: transition-property:规定设置过渡效果的CSS属性的名称。 transition-duration:规定完成过渡效果需要多少秒或毫秒。 transition-timing-function:规定速度效果的速度曲线。 transition-delay:定义过渡效果何时开始。 1.2 语法 transition: property duration timing-function delay; 1
py3study
2020/01/15
4010
CSS魔法堂:Flex布局
 Flex是Flexible Box的缩写,就是「弹性布局」。从2012年已经面世,但由于工作环境的原因一直没有详细了解。最近工作忙到头晕脑胀,是要学点新东西刺激一下大脑,打打鸡血。
^_^肥仔John
2018/06/21
5650
相关推荐
【CSS】378- [译]44个 CSS 精选知识点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档