前言

很早之前就看到国外很多酷炫的网站在实践"故障艺术", 或者错位动画", 感觉非常有意思, 现在APP端的抖音启动界面有着这种设计的影子, 作为一名用于探索未知的前端工程师, 有必要好好实践一下这一设计.

正文

接下来笔者将带大家使用纯Css3来实现"故障动画", 并将这一特效封装成React/vue组件, 供大家学习和使用. 先来看看实现的效果:

当然在下面的文章中笔者还会介绍其他风格的"故障动画".

实现原理

该效果的实现依赖于Css3的新特性mix-blend-mode和background-blend-mode.接下来笔者简单介绍一下:

1. mix-blend-mode

该属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合. 具体的属性值介绍如下:

  • mix-blend-mode: normal;(正常)

  • mix-blend-mode: multiply(正片叠底)

  • mix-blend-mode: screen;(滤色)

  • mix-blend-mode: overlay;(叠加)

  • mix-blend-mode: darken; (变暗)

  • mix-blend-mode: lighten; (变亮)

  • mix-blend-mode: color-dodge; (颜色减淡)

  • mix-blend-mode: color-burn; (颜色加深)

  • mix-blend-mode: hard-light; (强光)

  • mix-blend-mode: soft-light;(柔光)

  • mix-blend-mode: difference; (差值)

  • mix-blend-mode: exclusion; (排除)

  • mix-blend-mode: hue;(色相)

  • mix-blend-mode: saturation; (饱和度)

  • mix-blend-mode: color; (颜色)

  • mix-blend-mode: luminosity; (亮度)

  • mix-blend-mode: initial;(初始)

  • mix-blend-mode: inherit; (继承)

  • mix-blend-mode: unset; (复原)

有点类似于PS里面的图层叠加模式.另一个css属性background-blend-mode和mix-blend-mode类似, 主要针对背景的混合模式, 这里我们主要采用mix-blend-mode来实现我们的故障效果.

2. 动画结构分析

由上图我们可以分析出, "故障动画"包含4个元素: 背景, 前置文字, 后置文字, 故障线. 具体分解如下:

通过以上分析我们大致可以写出基本的dom结构来了, 有经验的朋友可能会想到使用伪元素来实现前置/后置文字/故障线, 虽然这种方式可以节省很多dom结构, 但是缺点就是封装的灵活度会降低, 所以笔者采用如下结构:

<div className="blink-item"><div className="text text-front">趣谈前端</div><div className="text text-back">趣谈前端</div>
</div>
复制代码

这里故障线我们采用伪元素来实现. 所以在文章开头的动画实现就变得很简单了,我们只需要设置一个画布背景,然后用内容混合让文字叠加, 最后设计文字和故障线的动画即可. 接下来我们看看具体的实现步骤.

实现方案

我们先来实现文字的混合效果, 故障线和画布背景, css代码如下:

.blink {// ...background-color: #000;.blink-item {&::after {content: '';position: absolute;z-index: 3;left: 0;top: 30px;width: 100%;height: 4px;background-color: #000;}.text-front {color: #74fcfd;}.text-back {position: absolute;transform: translate(-5px, -100%);color: #ea3448;mix-blend-mode: lighten;}}
}

由以上代码可知我们在后置文字的css样式中采用了mix-blend-mode并设置成lighten, 当然我们也可以设置成其他模式的值. 我们接下来就来实现故障的文字动画和故障线动画, 这块也很简单, 我们采用css3的@keyframe动画即可, 代码如下:

@keyframes shakeFront {0% {transform: translate(1px, 1px);}20% {transform: translate(-1px, 0);}60% {transform: translate(-1px, 0);}100% {transform: translate(1px, -1px);}
}
@keyframes shake {0% {transform: translate(-5px, -100%);}20% {transform: translate(-3px, -100%);}60% {transform: translate(1px, calc(-100% - 1px));}100% {transform: translate(2px, calc(-100% + 1px));}
}
@keyframes lineShake {0% {top: 10%;}20% {top: 60%;}40% {top: 35%;}60% {top: 2%;}80% {top: 80%;}100% {top: 99%;}
}

shakeFront和shake分别为后置文字和前置文字的动画, lineShake为故障线的动画. 最后, 我们只需要借助css3的animation让动画循环播放即可.

封装成react/vue组件

为了实现故障动画更大的自由度以及降低工程师的使用成本, 笔者将其封装成了react组件, vue组件的封装思路类似, 感兴趣的朋友可以自己试试. 这里我们来拆解故障动画组件设计的模型:

组件的设计思想往往是设计的复杂性和使用的便捷性的博弈, 为了让使用者有更大的自由度, 往往会通过增加组件内部复杂度来弥补. 我们先来看看实现后的效果:

为了实现以上这种自定义配置, 我们需要进一步对已有的代码进行封装, 比如故障线我们使用伪元素来实现的, 那么如何保证切换背景色之后能保证伪元素的背景色也响应的变化呢? 这里笔者采用的是背景继承, 即:

.blink {.blink-item {background-color: inherit;&::after {// ...background-color: inherit;animation: lineShake .5s infinite;}

这样我们只需要在.blink容器中动态传入背景颜色, 即可实现我们想要的效果. React组件代码如下:

import React from 'react'
import './index.less'export default function Blink(props) {const {text = '趣谈前端',fontSize = '48px',themeColor = '#000',textColor = ['#74fcfd', '#ea3448']} = propsreturn (<div className='blink' style={{backgroundColor: themeColor}}><div className="blink-item" data-text={text} style={{fontSize: fontSize}}><div className="text text-front" style={{color: textColor[0]}}>{text}</div><div className="text text-back" style={{color: textColor[1]}}>{text}</div></div></div> )
}

怎么样,是不是很简单呢?

最后

轻松使用纯css3打造有点意思的故障艺术(附React加强组件版)相关推荐

  1. vue 图片被背景色覆盖_如何使用纯css3打造有点意思的故障艺术(附React/Vue加强组件版)...

    前言 很早之前就看到国外很多酷炫的网站在实践"故障艺术", 或者错位动画", 感觉非常有意思, 现在APP端的抖音启动界面有着这种设计的影子, 作为一名用于探索未知的前端 ...

  2. [原创]纯CSS3打造的3D翻页翻转特效

    刚接触CSS3动画,心血来潮实现了一个心目中自己设计的翻页效果的3D动画,页面纯CSS3,目前只能在Chrome中玩,理论上可以支持Safari. 1. 新建HTML,代码如下(数据和翻页后的数据都是 ...

  3. html5云朵效果,纯CSS3打造逼真的多层云彩动画特效

    这是一款效果非常炫酷的纯CSS3逼真的多层云彩动画特效.该特效使用多张透明的云彩PNG图片作为背景图片,使用CSS animation动画来制作云彩水平飘动的动画效果. 使用方法 HTML结构 该多层 ...

  4. html 让按钮立体,纯CSS3打造立体质感按钮

    此CSS3按钮包含5个实例DEMO,自适应宽度,立体感强并带有鼠标滑过效果.开发产品.软件必备素材.下载 此效果. CSS3按钮HTML代码: Click me! Come on, don't be ...

  5. 来自程序员的圣诞浪漫纯CSS3打造的圣诞祝福【献给前端初学者】内附代码以及运行方法

    如果你想编一个简单的圣诞树送给你的男/女朋友的话, 这里也许有你要的东西, 对于你也许他很简单,不值一提. 但是对于小白,也许是他入门HTML.css3的极佳小项目 代码运行方式:代码运行很简单,解压 ...

  6. 【sgTopo】强哥古法炮制、纯手工打造简单拓扑图、流程图、思维导图组件(完善中ing)

    疯狂撸码中ing 实现组件效果 src/components/sgTopo.vue <template><!-- 强哥的拓扑图2021.09.14 --><divclas ...

  7. html 3d立体阴影效果图,CSS3打造带阴影的旋转3D图像

    CSS3打造带阴影的旋转3D图像 Sponsor CSS3可以实现很多创新好玩的交互效果,正如今天将和大家介绍的3D旋转图像,效果很漂亮,这个旋转图像的特别之处就是支持阴影旋转和兼容响应式网页设计,使 ...

  8. 8个超震撼的HTML5和纯CSS3动画源码

    HTML5和CSS3之所以强大,不仅因为现在大量的浏览器的支持,更是因为它们已经越来越能满足现代开发的需要.Flash在几年之后肯定会消亡,那么HTML5和CSS3将会替代Flash.今天我们要给大家 ...

  9. css 语音,纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果

    语音气泡是一种很流行的效果,在很多社交网站上可以看到评论使用这样的效果来实现,对于游客来说非常有吸引力,但我发现很多这样的效果都是依赖于HTML或JavaScript来实现的非常麻烦.本教程包含各种形 ...

最新文章

  1. 超硬核全套Java视频教程(学习路线+免费视频+配套资料)
  2. Java解析html页面,获取想要的元素
  3. python如何统计字典里面健的数量_Python中使用Counter进行字典创建以及key数量统计的方法...
  4. android程序运行无操作一段时间显示屏保
  5. yarn 卸载包_0609-6.1.0-如何卸载CDH6.1
  6. html5显示字母的值,使用HTML5 Canvas API控制字体的显示与渲染的方法
  7. java 查询windows进程_Oracle查询语句,你知道几个?(下)
  8. mysql如何给数据增加tab_怎么往mysql表里添加数据
  9. C++_类和对象_对象特性_This指针的用途_用来解决名称冲突_*this实现链式编程---C++语言工作笔记049
  10. JS获取元素的第一个子节点
  11. IPD+CMMI企业产品开发系统性解决方案
  12. kafka 生产和消费信息入门
  13. 2022年GPS广播星历精密星历如何下载
  14. HTTP协议-报文解析
  15. 利用Epplus将数据导出到Excel
  16. win10锁屏账户和计算机名,如何玩转Win10锁屏和主题
  17. 木马可以损坏计算机硬件么,台式电脑总是自动重启怎么处理
  18. PyCharm 不能自动生成函数注释
  19. 实时音视频开发理论必备:如何省流量?视频高度压缩背后的预测技术
  20. 60.left join(左连接)

热门文章

  1. PY32F002A开发板,32位 M0内核,最高20KB的flash,3KB的SRAM
  2. Android中检测手机制式和移动网络类型
  3. 游戏服务器AOI兴趣点算法原理--四叉树与九宫格 (golang)
  4. xlsx模块 前端_利用xlsx-syle前端导出excel且支持自定义样式
  5. Flutter-Dart入门,常用细节
  6. C4D模型工具—内部挤压
  7. 华为nova7se能云闪付吗_华为Nova支持NFC功能吗 华为Nova能刷公交卡吗【详解】
  8. Python爬虫:爬取我爱我家网二手房源信息
  9. 赛马娘全自动刷初始脚本配置指南
  10. 这个界面不简单——登录界面怎样设计才惊艳?来看看这些案例