本文将探索多行文本中一些有趣的文本动画。多行文字,相对于单行文字,场景会更加复杂,但是在实际业务中,多行文字也非常多,但是其效果处理会比单行文字更难。单行和多行文字的淡入淡出首先来看这样一个例子,我们要实现这样的单行文字的淡入淡出:使用mask,这个效果很容易实现,只需要:
Loremipsumdolorsitametconsectetur.
p{mask:linear-gradient(90deg,#fff,transparent);}但是如果场景变成多线怎么办?我们需要让多行文本的最后一行淡出,适应不同的多行场景:这个会稍微复杂一点,但是有很多方法可以实现。首先,让我们看看如何使用背景。使用背景实现会用到一个技巧,即display:inline内联元素的背景显示形式与display:block块级元素(或inline-block、flex、grid)的背景显示形式不一致。只看一个例子:Lorem.....
Lorem.....这里需要注意的是,Mollitianostrumplaceatconsequaturdesertvelitducimuspossimuscommoditemporibusdebitisquam
pwidth:400px;}a{background:linear-gradient(90deg,transparent,transparent70%,#fff);背景重复:不重复;游标:指针;颜色:透明;&::before{content:"Mollitianostrumplaceatconsequaturdesertvelitducimuspossimuscommoditemporibusdebtisquam";位置:绝对;顶部:0;左:0;颜色:#000;z-指数:-1;,我们需要将实际文本包装在内联元素中。实际文本被opacity:0隐藏,实际显示的文本使用元素的伪元素,其level设置为-1,目的是让父元素的背景覆盖。元素的渐变由透明变为白色,用它遮住下面伪元素显示的实际文字,从而实现文字的淡入淡出。这样,我们就可以得到这样一个效果:这里,元素的渐变是从透明到白色,利用后面的白色逐渐盖住文字。如果我把渐变从黑色改成白色(为了便于理解,渐变的黑白有一定的透明度),你可以很快明白是怎么回事:a{background:linear-gradient(90deg,rgba(0,0,0,.8),rgba(0,0,0,.9)70%,rgba(255,255,255,.9));}完整代码可以点击这里:CodePenDemo--文字淡出当然这个方案有很多问题,比如使用z-index:-1,如果父容器设置了背景色会失败,也不容易准确定位到最后一行。因此,更好的方法是使用mask来解决。使用mask实现,如果使用mask,问题会变得简单。我们只需要在一个遮罩中实现两个遮罩区域,一个用于精确控制最后一行,另一个用于控制剩余部分的透明度。也不需要特殊的HTML结构:Loremipsumdolorsitamet....
p{width:300px;填充:10px;行高:36px;遮罩:线性渐变(270deg,透明,透明30%,#000),线性渐变(270deg,#000,#000);遮罩尺寸:100%46px,100%计算(100%-46px);遮罩位置:底部、顶部;mask-repeat:no-repeat;}效果如下:核心在于整个mask相关的代码。上面说了遮罩将整个区域分成两部分进行控制:在下方,我们使用遮罩来实现从右向左淡化的效果。并且使用mask-position定位,和calc的计算,不管文字多少行都适用!需要注意的是,这里的46px是指单行文字的行高加上padding-bottom的距离。可适配任意行数的文字:完整代码可以点击这里:CodePenDemo--Textfadeaway2.添加动画效果不错。看完静态的我们来实现一个**动态的文字淡出。整体效果是当鼠标悬停在文字上时,整个文字逐行逐渐消失。像这样:这里的核心是需要适应不同的行数和不同的宽度,文字逐行消失。这里的核心还是会用到行内元素背景的特性。在Fancytexteffectwithbackground一文中,我们介绍了这样一种技术。实现整个文本的渐变,从一种颜色到另一种颜色: