- 原文地址:Slide an Image to Reveal Text with CSS Animations
- 原文做者:Jesper Ekstrom
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:Fengziyin1234
- 校对者:portandbridge, Baddyo
在这篇文章中,我但愿能带领你们了解一下 CSS animation property,以及详细地解释个人我的网站中的一个效果:让文字在移动的物体后出现。若是你想要看最后的成果,这里有一个例子。css
咱们将从下面这里开始:前端
这里请查看 Jesper Ekstrom 的 Revealing Text Animation Part 4 - Responsive 案例。android
即便你对这个效果不是很是感兴趣,这仍将是一个能够扩展你 CSS 知识的好练习,你能够从这个效果开始建立属于你本身的动画效果。就我而言,深刻地学习研究动画,让我对本身的 CSS 能力有了更多的自信,而且让我更加有想象力,也让我对于整个前端开发都更加感兴趣了。ios
准备好了么?让咱们一块儿开始吧。git
在咱们开始制做动画效果以前,首先让咱们建立一个包含了整个视口(viewport)的父元素。在这个元素中,咱们在两的 div 中分别添加文字和图片,以方便以后的自定义。HTML 将以下:github
<!-- 父容器 -->
<div class="container">
<!-- 包含图片的 div -->
<div class="image-container">
<img src="https://jesperekstrom.com/wp-content/uploads/2018/11/Wordpress-folder-purple.png" alt="wordpress-folder-icon">
</div>
<!-- 包含将展现的文字的 div -->
<div class="text-container">
<h1>Animation</h1>
</div>
</div>
复制代码
咱们将使用一个靠谱的转换小技巧,来在的父元素中,用 position: absolute; 使两个 div 在父容器的水平和垂直方向上都居中。由于咱们但愿咱们的图片显示在文字以前,这里咱们给图片一个更大的 z-index
值。web
/* 父元素占据整个页面。 */
.container {
width: 100%;
height: 100vh;
display: block;
position: relative;
overflow: hidden;
}
/* 内含图片的 div */
/* 居中小技巧:https://css-tricks.com/centering-percentage-widthheight-elements/ */
.image-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
z-index: 2; /* 确保图片在上 */
}
/* 第一个 div 中的图片 */
.image-container img {
-webkit-filter: drop-shadow(-4px 5px 5px rgba(0,0,0,0.6));
filter: drop-shadow(-4px 5px 5px rgba(0,0,0,0.6));
height: 200px;
}
/* 包括将要被显示出来的文字的 div */
/* 一样的居中方法 */
.text-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
z-index: 1; /* 将此 div 置于图片容器之下 */
margin-left: -100px;
}
复制代码
咱们在整篇文章全部的例子中都没有保留浏览器前缀,但若是你在生产环境中使用这些效果,请务必考虑加上前缀。后端
如今咱们的例子应该长这样,基本上来讲就是图片元素在文字元素之上。浏览器
这里请查看 Revealing Text Animation Part 1 - Mail Elements 案例。bash
为了使咱们的文字能从左到右显示,咱们将在咱们的 .text-container
中添加另外一个 div。
<!-- ... -->
<!-- 包括将要被显示出来的文字的 div -->
<div class="text-container">
<h1>Animation</h1>
<div class="fading-effect"></div>
</div>
<!-- ... -->
复制代码
而后加入下列 CSS 属性并给其赋值:
.fading-effect {
position: absolute;
top: 0;
bottom: 0;
right: 0;
width: 100%;
background: white;
}
复制代码
正如你所见,这个 div 的背景是白的,能够融入父元素中,而文字则藏在它后面。
若是咱们试一下改改这个 div 的长度,文字就会开始出现。你能够在咱们下面的例子中来尝试一下:
这里请查看 Revealing Text Animation Part 2 - Hiding Block。
还有另一个不须要添加额外有背景的 div 就能够达到一样效果的方法。我会在文章后面中介绍它。🙂
下面咱们将开始有趣的部分了!咱们将使用 animation property 和它的 @keyframes
功能来开始帮咱们的目标加入动画效果。让咱们先来建立两个不一样的 @keyframes
,一个给咱们的图片,一个给咱们的文字。代码以下:
/* 把图片从左侧(-250px)滑到右侧(150px)*/
@keyframes image-slide {
0% { transform: translateX(-250px) scale(0); }
60% { transform: translateX(-250px) scale(1); }
90% { transform: translateX(150px) scale(1); }
100% { transform: translateX(150px) scale(1); }
}
/* 把目标缩小至消失(100% 到 0%)来滑动文字 */
@keyframes text-slide {
0% { width: 100%; }
60% { width: 100%; }
75%{ width: 0; }
100% { width: 0; }
}
复制代码
我建议将全部的
@keyframes
添加到 CSS 文件的顶端,这样的文件的结构会更好,固然这只是个人我的喜爱。
我只使用 @keyframes
很小一部分百分比值(主要是从 60% 到 100%)的缘由是我选择在相同的时间段对两个物体设置动画,而不是为它们添加一个 animation-delay
。这只是个人我的喜爱。若是你选择和我同样的方法,必定记得要为 0% 和 100% 设值;不然,动画效果就会开始循环或者是形成一些很奇怪的结果。
为了在咱们的 class 中启用 @keyframes
,咱们须要在 CSS 属性 animation
上调用咱们的动画名称。例如,要将 image-slide
加入图片元素上,咱们得这样作:
.image-container img {
/* [动画名称] [动画时间] [动画变形方法] */
animation: image-slide 4s cubic-bezier(.5,.5,0,1);
}
复制代码
@keyframes
的名称的使用就像建立一个 class 同样。换句话说,这里的动画名称是什么并不重要,只要确保你在想要使用该动画的元素上使用同样的名称就能够了。
若是这里的 cubic-bezier
部分让你感到头大,那就快看看 Michelle Barker 的这个帖子。她深度的解释了这个话题。若是只是想要达到本文演示的目的,我以为我这么说就够了:这是一个为物体的整个移动过程建立一个自定义动画曲线的方法。cubic-bezier.com 网站是一个很好的能够帮助你生成这些值(而不是靠猜)的网站。
咱们以前说起了咱们但愿避免循环动画。咱们能够经过使用 animation-fill-mode
子属性来强行让物体在动画进度到达 100% 后就再也不移动。
.image-container img {
animation: image-slide 4s cubic-bezier(.5,.5,0,1);
animation-fill-mode: forwards;
}
复制代码
目前为止一切都很好!
这里请查看 Revealing Text Animation Part 3 - @keyframes。
由于动画是基于固定的大小(像素),改变视口的宽度会形成元素们偏离,这不利于咱们根据元素的位置来隐藏和展示它们。咱们能够在不一样的 media queries 上建立多个动画来解决这个问题(这也是我最初的作法),可是一次处理这么多的动画可不是什么好玩的事。咱们可使用相同的动画,经过在特色的断点改变它的属性来解决这个问题。
例如:
@keyframes image-slide {
0% { transform: translatex(-250px) scale(0); }
60% { transform: translatex(-250px) scale(1); }
90% { transform: translatex(150px) scale(1); }
100% { transform: translatex(150px) scale(1); }
}
/* 改变更画的参数来适应大至 1000 像素的宽度 */
@media screen and (max-width: 1000px) {
@keyframes image-slide {
0% { transform: translatex(-150px) scale(0); }
60% { transform: translatex(-150px) scale(1); }
90% { transform: translatex(120px) scale(1); }
100% { transform: translatex(120px) scale(1); }
}
}
复制代码
这样就能够啦。都是响应式哒!
这里请查看 Revealing Text Animation Part 4 - Responsive。
我在以前保证过我会介绍一种不同的隐藏文字方法。咱们如今来介绍它。
与其使用一个全新的 div ─ <div class="fading-effect">
,咱们可使用一个小技巧实用化 background-clip
将背景的颜色经过文字透出来:
.text-container {
background: black;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
复制代码
透明的文字容许背后背景的颜色渗透过来,能够颇有效的隐藏文字。而且,由于是用背景隐藏文字,咱们能够改变背景的宽度并观察文字如何根据所给定的宽度被切割。这一样使得给文字添加线性渐变颜色,甚至是背景图片成为可能。
我没有在以前的演示中使用这个方法,由于它不能很好地兼容 IE(你看,代码里有 -webkit 这个浏览器前缀)。在咱们实际演示中使用的方法,果把文字换成图片或者任何元素,仍然有效。
很是简单的小动画,是否是?它至关的细微,而且能够你的 UI 元素添色。例如,它能够用做揭示解释类文字甚至图片的标题。或者,能够用一点 JavaScript 代码来监听点击或滚动事件,从而触发动画,使网页的交互方式更丰富。
对咱们的动画有任何的问题嘛?有一些让它们变得更好的建议嘛?快发在下面的评论中来告诉我吧!
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。