当前位置: 首页 > Web前端 > HTML5

ModernCSSAdvancedImageFade

时间:2023-04-04 23:08:08 HTML5

以前我们想实现一个图片淡入淡出。最常见的是整体透明度的变化,像这样:

div{width:300px;高度:300px;背景:网址(图片.jpg);过渡:.4s;}.img:hover{opacity:0;}然而,如今CSS是如此强大。我们用CSS可以实现的淡入淡出效果不再那么简单了。想一想,下面的效果是不是可以通过CSS来实现呢?答案是肯定的!本文将循序渐进,从头开始,只使用一个标签来实现上述图像淡化效果。这里有两个核心点:怎么把这么薄的图剪成这么多块?基于以上(1),如何控制这些小块的独立隐藏和显示呢?不要惊慌,让我们逐步解决它们。强大的Mask首先,我们需要使用Mask。在CSS中,mask属性允许用户通过屏蔽或裁剪图像的特定区域来隐藏元素的部分或全部可见区域。语法是最基本的。mask的使用方法是使用图片,像这样:{/*Imagevalues*/mask:url(mask.png);/*使用位图作为遮罩*/mask:url(masks.svg#star);/*使用SVG图形中的shape做mask*/}当然,图片的使用方式后面会讲到。图片的使用方式其实还是比较繁琐的,因为我们要先准备好相应的图片素材。除了图片,mask还可以接受一个类似于background的参数,那就是gradient。类似下面的使用方法:{mask:linear-gradient(#000,transparent)/*使用渐变做mask*/}那么如何使用呢?一个很简单的例子,上面我们创建了一个从黑色到透明的渐变,我们在实践中使用,代码类似这样:);mask:linear-gradient(90deg,transparent,#fff);}应用mask后,如下所示:在这个DEMO中,你可以简单了解mask的基本用法。这里说下使用mask最重要的结论:图像的重叠部分和mask生成的渐变透明会变成透明的。值得注意的是,上面的渐变使用的是linear-gradient(90deg,transparent,#fff),这里的#fff纯色部分其实可以换成任何颜色都不影响效果。CodePenDemo--MASK的基本使用使用mask隐藏hover时的图片了解了mask的简单用法之后,我们来看这样一个非常简单的例子。下面对上面的第一个DEMO进行改造。
div{宽度:300px;高度:300px;background:url(image.jpg);}.img:hover{mask:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0));}是的,使用Mask,我们也可以得到一个大概的消失效果:如果你还不了解Mask,需要先看这篇文章:精彩的CSSMASK当然,目前的效果,有一个很大的缺陷,就是缺少的动画。画面瞬间消失。因此,我们还需要为上述借助mask实现的图片消失效果添加动画。为此,您需要使用CSS@property。强大的CSS@propertyCSS@property大家应该不陌生吧。@propertyCSSat-rule是CSSHoudiniAPI的一部分,它允许开发人员显式定义他们的CSS自定义属性,允许属性类型检查、设置默认值以及定义自定义属性是否可以被继承。如果你对CSS@property还有疑惑,建议你赶紧阅读这篇文章——CSS@property,让不可能成为可能回到我们的主题,如果我们要使用MaskAnimation添加上面的代码,我们希望代码是像这样:div{width:300px;高度:300px;背景:网址(图片.jpg);面具:线性渐变(rgba(0,0,0,1),rgba(0,0,0,1));}.img:悬停{面具:线性渐变(rgba(0,0,0,0),rgba(0,0,0,0));}这里mask来自mask:linear-gradient(rgba(0,0,0,1),rgba(0,0,0,1))屏蔽:线性梯度(rgba(0、0、0、0)、rgba(0、0、0、0))变化。但实际上,这并不会产生任何动画效果。原因是我们的Mask属性本身不支持过渡动画!但是,使用CSS@property,整个效果就不一样了。借助CSS@property,我们修改一下代码:@property--m-0{syntax:"";初始值:1;继承:false;}div{宽度:300px;高度:300px;背景:网址(图片.jpg);遮罩:线性渐变(90deg,rgba(0、0、0,var(--m-0)),rgba(0、0、0,var(--m-0)));transition:--m-00.5s;}div:hover{--m-0:0;}我们使用CSS@property定义一个名为--m-0的变量,然后,我们设置整个动画的过渡effect分配给这个变量,而不是整个面具。利用这个小技巧,我们就可以成功实现基于mask属性的动画效果了:将图片分割成多个mask后,下面的步骤其实就很清晰了。由于蒙版具有与背景相同的特性。因此,掩码可以有多个掩码。也就是说,我们可以对同一个元素设置多个不同的遮罩效果。这意味着什么?上面的效果只是一层遮罩,我们添加一些遮罩代码使其成为两层遮罩:@property--m-0{syntax:"";初始值:1;继承:false;}@属性--m-1{语法:“”;初始值:1;inherits:false;}div{mask:linear-gradient(90deg,rgba(0,0,0,var(--m-0)),rgba(0,0,0,var(--m-0))),线性梯度(90deg,rgba(0,0,0,var(--m-1)),rgba(0,0,0,var(--m-1)));遮罩尺寸:50%100%;遮罩位置:左,右;掩码重复:不重复;过渡:--m-00.3s,--m-10.25s0.15s;}div:hover{--m-0:0;--m-1:0;}这样,我们的步骤大致是:先把mask一分为二,左右各一个然后,根据CSS设置两个变量@property,--m-0和--m-0然后,在悬停的瞬间为它们设置不同的transitiontime和transitiondelay时间,然后设置这两个变量的值都设置为0,即linear-gradient(90deg,rgba(0,0,0,1),rgba(0,0,0,1))到线性渐变(90deg,rgba(0,0,0,0),rgba(0,0,0,0))用于隐藏相应的掩码块。由于设置了不同的过渡时间和延迟时间,所以整个动画分为两部分看效果:继续切成4重遮罩,既然2重遮罩的效果没问题,那我们就可以更进一步,将整个效果切割成4个遮罩代码还是一样,这里我再贴一遍核心代码:@property--m-0{syntax:"";初始值:1;继承:false;}@property--m-1{语法:“”;初始值:1;继承:false;}@property--m-2{语法:“”;初始值:1;继承:false;}@property--m-3{语法:“”;初始值:1;inherits:false;}div{mask:linear-gradient(90deg,rgba(0,0,0,var(--m-0)),rgba(0,0,0,var(--m-0))),线性渐变(90deg,rgba(0,0,0,var(--m-1)),rgba(0,0,0,var(--m-1))),线性渐变(90deg,rgba(0,0,0,var(--m-2)),rgba(0,0,0,var(--m-2))),线性梯度(90deg,rgba(0,0,0,变量(--m-3)),rgba(0,0,0,变量(--m-3)));遮罩尺寸:50%50%;掩码重复:不重复;遮罩位置:左上、右上、左下、右下;过渡:--m-00.3s,--m-10.15s0.1s,--m-20.25s0.21s,--m-30.19s0.15s;}div:hover{--m-0:0;--m-1:0;--m-2:0;--m-3:0;}我们可以得到4张分割图片的mask消失效果:OK,以此类推,我们可以分割成9张,分割成16张。因为代码太多,简单看效果:CodePenDemo--基于Imagefadingwith@propertyandmask基于SCSS简化代码那么,如果我们要拆分成100块呢?或者400呢?我必须手写这些代码吗?当然不是,因为上面代码的规律很明显,我们可以使用预处理器很好的封装整个效果。这样就可以快速实现切割成任意数量的规则块的效果。完整的代码如下:$count:400;$sqrt:20;$per:100%/$sqrt;$width:300px;$perWid:15;@for$ifrom1to($count+1){@property--m-#{$i}{语法:“<数字>”;初始值:1;继承:假的;}}@functionbgSet($n){$bg:径向梯度(rgba(0,0,0,var(--m-1)),rgba(0,0,0,var(--m-1))));@for$i从2到$n{$bg:$bg,radial-gradient(rgba(0,0,0,var(--m-#{$i})),rgba(0,0,0,var(--m-#{$i})));}@return$bg;}@functionpositionSet($n){$bgPosition:();@for$i从0到($n){@for$j从0到($n-1){$bgPosition:$bgPosition,#{$i*$perWid}px#{$j*$perWid}px;}}@return$bgPosition;}@functiontransitionSet($n){$transition:--m-10.1s0.1s;@for$ifrom1through$n{$transition:$transition,--m-#{$i}#{random(500)}ms#{random(500)}ms;}@return$transition;}div{宽度:$宽度;高度:$宽度;背景:网址(图片.jpg);掩码:bgSet($count);掩码大小:$per$per;掩码重复:不重复;遮罩位置:positionSet($sqrt);transition:transitionSet($count);}div:hover{@for$i从1到$count{--m-#{$i}:0;}}这里简单说明以生成400个blocksBlocks为例:在上面的SCSS变量定义中,$count是我们最终要生成的块数$sqrt是每行每列都会有的块数$per是每个块占整个图片元素的百分比$width是整个图片的宽高值$perWid是每个块的宽高值。使用top循环函数,批量生成css@property变量,从--m-0到--m-400@functionbgSet($n){}是生成400个mask段@functionpositionSet($n)就是生成400张maskmask-position,也就是生成400张不同位置的mask,这样400张mask正好覆盖了整张图片@functiontransitionSet($n){}就是随机设置动画时间和每个块的延迟时间。代码底部有循环函数生成400个css@property变量的悬停值。悬停时全部变为0,这样我们就实现了400点BlockFadeEffect效果如下:CodePenDemo--根据@property和mask的图像淡入淡出技术调整transition变量,控制方向。当然,上面每小块transition的transitiontime和transitiondelay时间的设置都是随机的:@functiontransitionSet($n){$transition:--m-10.1s0.1s;@for$i从1到$n{$transition:$transition,--m-#{$i}#{random(500)}ms#{random(500)}ms;}@return$transition;}我们可以通过一定的控制,比如有一定的方向感,让转场效果不那么随意。接下来,我们将动画延迟时间与$i挂钩,它是遮罩块的索引:@functiontransitionSet($n){$transition:--m-10.1s0.1s;@for$i从1到$n{$transition:$transition,--m-#{$i}#{100+random(500)}ms#{($i/50)*random(100)}ms;}@return$过渡;}然后,整个动画的方向就是从左到右逐渐消失:CodePenDemo--基于@property和mask的图片淡入淡出技术2当然,有趣的是这个效果不仅仅适用于图片,可以作用于任何元素!比如我们手头的只是一段纯文本,这个效果也适用:CodePenDemo--基于@property和mask的文本淡出技术总结到这里,简单总结一下。在这篇文章中,我们使用CSS@propery和mask来实现一些原本看起来需要大量div或者只能借助Canvas才能实现的效果。同时,我们使用了SCSS预处理器,在找到规律后大大简化了CSS代码的编写。今天,强大的CSS让我们可以做出越来越有趣的动效。CSS的@propery和mask这两个属性在现代CSS中起到了非常重要的作用。强烈建议您认真掌握以下两个属性。最后,本文到此结束,希望本文对大家有所帮助:)有什么问题或者建议可以多交流,原创文章,文笔有限,知识匮乏,如有不妥之处,敬请谅解!这篇文章,请告诉我。