[译] 使用 CSS transitions(MDN)

栏目: CSS · 发布时间: 4年前

内容简介:始发于我的博客ryougifujino.com,欢迎访问留言。CSS transitions 提供了一种在改变CSS属性时控制动画速度的方法。你可以让某个属性在一段时间里逐渐改变,而不是猛地突变。例如,如果你想把颜色从白色变为黑色,通常这个变化是突然地。而利用CSS transitions,这个变化可以发生在一段时间里,并且遵循一个加速曲线,所有的这一切都是可定制的。

始发于我的博客ryougifujino.com,欢迎访问留言。

原文地址(MDN)

CSS transitions 提供了一种在改变CSS属性时控制动画速度的方法。你可以让某个属性在一段时间里逐渐改变,而不是猛地突变。例如,如果你想把颜色从白色变为黑色,通常这个变化是突然地。而利用CSS transitions,这个变化可以发生在一段时间里,并且遵循一个加速曲线,所有的这一切都是可定制的。

涉及到在两个状态之间过渡的动画被称为 隐式过度( implicit transitions) ,因为在开始和结束状态之间的状态是由浏览器隐式定义的。

[译] 使用 CSS transitions(MDN)

CSS transitions 让你自行决定对哪些属性产生动画(通过显式地把它们列出来),动画何时发生(通过设置 delay ),过渡持续多久(通过设置 duration ),和过渡如何执行(通过定义一个 timing function ,例如,线性的或者先快后慢的)。

哪些 CSS 属性可以被过渡?

网页作者可以定义哪些属性需要执行和以何种方式执行动画。这是可以创建非常复杂的过渡的。由于某些属性执行动画是没有意义的,所以可执行动画的属性被限制到了一个有限集之中。

注意:可执行动画的属性会随着规范的发展而变化。

auto 这个值通常来说是非常复杂的。规范推荐在定义动画时,不要在开始(from)和结束(to)中使用 auto 。(The specification recommends not animating from and to auto.)一些基于Gecko的UA,现实了这个需求,而另一些基于WebKit的UA则没有很严格地实现。在动画里使用 auto 可能会导致不可预测的结果,根据浏览器和它们的版本而定,这种情况应该被避免。

定义 transitions

CSS Transitions 是由简写属性 transition 所控制的。这是配置过渡的最佳方式,因为这样的方式可以更容易地避免参数上的不同步(这种不同步会让人很泄气,并且不得不花大量的时间在CSS里调试)。

你可以使用以下子属性来控制过渡的各个部分:

(注意这些无限循环的过渡只是出于举例的目的;这些CSS transition 只是让一个属性从开始到结束的变化可视化了。如果你需要循环的可视化,请查看CSS animation 属性。)

transition-property

指定一个或多个CSS属性的名字,这些属性将会被应用过渡效果。只有被列在此处的属性会在过渡中产生动画效果;其他属性的变化还是像往常一样立刻发生。

transition-duration

给过渡指定时长。你可以指定一个时长给所有会产生过渡的属性,也可以指定多个值,让每个属性都拥有不同的过渡时长。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        .parent {
            width: 200px;
            height: 200px;
            border: 1px solid black;
            position: relative;
        }

        .box {
            width: 20px;
            height: 20px;
            left: 0;
            top: 0;
            background: lightblue;
            position: absolute;
            transition-property: width height left top background;
            transition-duration: 1s;
        }

        .box1 {
            width: 50px;
            height: 50px;
            left: 100px;
            top: 100px;
            background: lightgreen;
            position: absolute;
            transition-property: width height left top background;
            transition-duration: 1s;
        }
    </style>
</head>
<body>
<div class="parent">
    <div class="box"></div>
</div>
<script>
    function updateTransition() {
        let el = document.querySelector('div.box');
        if (el) {
            el.className = 'box1';
        } else {
            el = document.querySelector('div.box1');
            el.className = 'box';
        }
    }

    setInterval(updateTransition, 1000);
</script>
</body>
</html>
复制代码

transition-timing-function

[译] 使用 CSS transitions(MDN)

指定一个函数来定义属性的中间值是如何计算的。Timing function 决定了过渡的中间值是如何计算的。大多数的timing function都可以通过相应函数的图像来指定,如四点定义的贝塞尔曲线图像。你也可以从缓动函数备忘单中选择缓动效果(easing)。

transition-delay

定义在属性改变和过渡真正开始之前等待多久。

缩写语法

transition: <property> <duration> <timing-function> <delay>;
复制代码

例子

简单例子

这个例子执行一个4秒的字体大小过渡和一个2秒的用户鼠标放到元素之上和动画效果真正开始之间的延迟。

#delay {
  font-size: 14px;
  transition-property: font-size;
  transition-duration: 4s;
  transition-delay: 2s;
}

#delay:hover {
  font-size: 36px;
}
复制代码

多个将会产生动画效果的属性的例子

CSS 内容

.box {
    border-style: solid;
    border-width: 1px;
    display: block;
    width: 100px;
    height: 100px;
    background-color: #0000FF;
    -webkit-transition: width 2s, height 2s, background-color 2s, -webkit-transform 2s;
    transition: width 2s, height 2s, background-color 2s, transform 2s;
}

.box:hover {
    background-color: #FFCCCC;
    width: 200px;
    height: 200px;
    -webkit-transform: rotate(180deg);
    transform: rotate(180deg);
}
复制代码

这个盒子结合了 width , height , background-color , transform 四种属性的过渡。

当属性值列表长度不一时

当任何属性的值列表比其他属性更短时,它的值将会不断重复来让使得它们匹配。例如:

div {
  transition-property: opacity, left, top, height;
  transition-duration: 3s, 5s;
}
复制代码

等同于:

div {
  transition-property: opacity, left, top, height;
  transition-duration: 3s, 5s, 3s, 5s;
}
复制代码

同样的,如果任何属性值列表比 transition-property 的值列表更长,那么它将被截取,所有如果你有如下CSS:

div {
  transition-property: opacity, left;
  transition-duration: 3s, 5s, 2s, 1s;
}
复制代码

这会被解释为如下情况:

div {
  transition-property: opacity, left;
  transition-duration: 3s, 5s;
}
复制代码

在高亮菜单时使用 transitions

有一个常见的CSS用例:当用户的鼠标悬停在菜单里的某一项时,这一项会高亮。我们可以使用 transitions 来让这个效果变得更有吸引力。

在我们看代码片段之前,你可能想看看live demo(假定你的浏览器支持 transitions )。

首先,我们设置菜单所要用到的HTML:

<nav>
  <a href="#">Home</a>
  <a href="#">About</a>
  <a href="#">Contact Us</a>
  <a href="#">Links</a>
</nav>
复制代码

然后我们创建CSS来实现我们菜单的外表和感觉。相关的片段如下:

a {
  color: #fff;
  background-color: #333;
  transition: all 1s ease-out;
}

a:hover,
a:focus {
  color: #333;
  background-color: #fff;
}
复制代码

这个CSS创建了菜单的外表,并且背景和文字颜色都会在它的元素处于 :hover:focus 状态时变化。

JavaScript的例子

在如下情况之后立即使用 transition 应当特别小心:

.appendChild()
display: none;

这些情况下,初始状态会好像从未发生,并且元素总是处于它最后的状态。克服这些限制的最简单方式就是在你打算改变应用过渡效果的属性的时候,使用 window.setTimeout() 设置一个合适的时间来延迟执行。

利用 transitions 让JavaScript效果更平滑

Transitions 是一个可以使得事物变得更加平滑的非常好的工具,这并不需要对你的 JavaScript 做任何事情。看看下面的例子。

<p>Click anywhere to move the ball</p>
<div id="foo"></div>
复制代码

利用 JavaScript 你可以做出让小球移动到中间位置的效果:

var f = document.getElementById('foo');
document.addEventListener('click', function(ev){
    f.style.transform = 'translateY('+(ev.clientY-25)+'px)';
    f.style.transform += 'translateX('+(ev.clientX-25)+'px)';
},false);
复制代码

利用CSS你可以让这一过程更加平滑而且不需要任何额外的 JavaScript 工作。仅仅对元素添加一个 transition ,一切将会变得丝滑。

p {
  padding-left: 60px;
}

#foo {
  border-radius: 50px;
  width: 50px;
  height: 50px;
  background: #c00;
  position: absolute;
  top: 0;
  left: 0;
  transition: transform 1s;
}
复制代码

你可以在这里找到demo。

检测 transition 的开始和结束

你可以使用 transitioned 事件来检测一段动画是否结束。这就是 TransitionEvent 对象,它除了典型的 Event 对象外还有两个额外的属性:

propertyName
一个字符串,指示了结束了过渡效果的CSS属性的名称。

elapsedTime 一个浮点数,指示了过渡从事件开始时已经运行了的秒数。这个值不被 transition-delay 所影响。

通常,你可以使用 addEventListener() 方法来监听这个事件:

el.addEventListener("transitionend", updateTransition, true);
复制代码

你还可以用 transitionrun (在任何延迟之前触发)和 transitionstart (在任何延迟之后触发)来检测 transition 的开始:

el.addEventListener("transitionrun", signalStart, true);
el.addEventListener("transitionstart", signalStart, true);
复制代码

注意:如果 transitiontransition 完成之前被取消,那么 transitionend 事件不会被触发。这是因为要么这个元素被设置为了 display: none ,要么动画属性的值改变了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序化广告实战

程序化广告实战

吴俊 / 机械工业出版社 / 2017-8-15 / 79.00元

中国程序化广告领域领袖级专家,私有化程序购买领域的布道者的一线实战笔记,宋星等近20位专家联袂推荐。从业务和技术双重视角系统讲解程序化广告的理论、知识、实践方法和关键要点。一起来看看 《程序化广告实战》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换