练习动画最好的方式(SCSS篇):图片故障效果~

什么是RGB置换?

============================================================================

色差、RGB偏移、RGB分裂(RGB split)等。有各种方法来描述它,但从本质上讲,它意味着光的三原色,即红、绿、蓝,在没有任何错位的情况下应该重叠显示的状态。

这是与突变效果一起使用的,在某些情况下,突变一词被用来包括颜色的转变,所以在这种情况下也实施它,会产生更多的突变效果。

实际操作

=======================================================================

HTML:

在元素的内联样式中指定你想要突变的图像作为背景图像

我们使用background-image是为了避免在将图像分割成RGB时多次写入图像的URL,虽然我们可以在CSS中指定背景图像,但我们使用了内联样式,使之更容易在HTML中改变图像。

CSS:

.glitch {

background: #000 no-repeat center;

background-size: 0; // .glitch 不要在自身上显示背景图像

height: 100vh;

overflow: hidden;

position: relative;

}

这是我们的CSS代码,关键是background-size: 0;这意味着.glitch元素本身并不显示图像。

原始的CSS当然也可以,但我们将使用Sass,使其更容易写出随机的图像来制作动画。

将图像分割成RBG


html:

现在让我们试试只显示红色通道。

.glitch {

.channel {

background: inherit; // 继承容器元素的背景

background-size: cover;

bottom: 0;

left: 0;

position: absolute;

right: 0;

top: 0;

}

// 与上面的".channel "分开,以便以后执行。

.channel {

&::before {

bottom: 0;

content: “”;

display: block;

left: 0;

mix-blend-mode: multiply; // 将图像乘以R/G/B来创建各自的通道

position: absolute;

right: 0;

top: 0;

}

}

.r {

&::before {

background: #f00;

}

}

}

现在你应该能够看到红色通道。

同样的,添加绿色和蓝色通道。

.glitch {

.channel {

}

.channel {

mix-blend-mode: screen; // 每个通道都可以通过在屏幕上的重叠与原始图像相结合

&::before {

}

}

.r {

}

.g {

&::before {

background: #0f0;

}

}

.b {

&::before {

background: #00f;

}

}

创建每个RGB通道并在屏幕上叠加,以显示原始图像。

然后你可以对通道进行平移(),以获得RGB位移效果。

.r {

transform: translate(4px, 2px);

}

.g {

transform: translate(-3px, -1px);

}

RGB位移动画


@function rand($min, $max) {

@return random() * ($max - $min) + $min;

}

我们将创建一个随机函数,使我们能够轻松地设置最大和最小值。

$animation-duration: 3s; // 循环播放动画的时间为多少秒

$glitch-duration: 20%; // 突变(RGB位移)本身的长度,占上述秒数的百分比

$glitch-frequency: 10; // 运动频率

$glitch-interval: $glitch-duration / $glitch-frequency;

@mixin rgb-shift($name) {

@keyframes rgb-shift-#{$name} {

@for $i from 0 to $glitch-frequency {

#{$i * $glitch-interval} {

transform: translate(

#{rand(-2, 2) * 1%}, // 它向左或向右移动的程度(宽度的±2%)。

#{rand(-0.5, 0.5) * 1%} // 上下移动的程度(高度的±0.5%)。

);

}

}

#{$glitch-duration}, 100% {

transform: none;

}

}

animation: rgb-shift-#{$name} $animation-duration steps(1, jump-end) infinite alternate both;

}

为每个RGB通道创建一个混合器,同时创建@keyframes并设置动画。

@use ‘sass:math’;

@function rand($min, $max) {

@return math.random() * ($max - $min) + $min;

}

g l i t c h − i n t e r v a l : m a t h . d i v ( glitch-interval: math.div( glitchinterval:math.div(glitch-duration, $glitch-frequency);

最新版本的Sass推荐使用上述数学函数,但其中一些函数不被CodePen所支持,所以我们将全程使用一个稍微传统的方法。

重点是,动画定时函数应该使用step(n, <jumpterm>)函数,使运动更加突兀,因为它将是生硬的而不是平滑的。

另一件事是,动画方向被设置为交替进行。你可以通过调整$animation-duration $glitch-duration $glitch-frequency来做到没有它,但如果你把它设置为交替,重复的动画将是上图的一半,即使它有同样的glitch长度和静态状态。 如上图所示,同样长度的故障和停顿,交替进行的时间减半。 如上图所示,同样长度的突变和静止,需要重复动画的一半,因此需要编写一半的CSS代码。

.r {

transform: translate(4px, 2px);

@include rgb-shift®;

}

.g {

transform: translate(-3px, -1px);

@include rgb-shift(g);

}

.b {

@include rgb-shift(b);

}

在每个通道中包括一个混合器来播放RGB位移动画。

故障

=====================================================================

如何实现glitching,就是将同一张图片重叠,剪掉一部分,然后转移。

.glitch {

&::before,

&::after,

.channel {

background: inherit;

background-size: cover;

bottom: 0;

left: 0;

position: absolute;

right: 0;

top: 0;

}

&::before {

content: “”;

}

&::after {

content: “”;

}

}

使用一个伪元素来分层相同的图像(例如,一个div)。

.glitch {

&::before {

clip-path: polygon(

0 20%,

100% 20%,

100% 30%,

0 30%

);

transform: translate(5%, 0.5%);

content: “”;

}

&::after {

clip-path: polygon(

0 60%,

100% 60%,

100% 65%,

0 65%

);

transform: translate(-5%, -0.5%);

content: “”;

}

}

让我们尝试在静态状态下显示故障。 使用clip-path()来裁剪图像。

之前的是在RGB层下面,而RGB层有mix-blend-mode: sreen;,所以只有那部分的图像比较亮,我觉得这是很突兀的。

后面的就比较难看了,但在中间稍下方有一小部分图像稍微有点不对劲。

这只是两张图片,但如果你经常移动它们并调整它们的大小,再加上RGB位移,就会出现相当多的故障。 当然,你可以通过使用div等添加更多内容。

故障动画

=======================================================================

@mixin glitch($name) {

@keyframes glitch-#{$name} {

@for $i from 0 to $glitch-frequency {

$left: 0%;

$right: 100%;

$top: rand(0, 90) * 1%;

$bottom: $top + rand(1, 10) * 1%;

#{$i * $glitch-interval} {

clip-path: polygon(

$left $top,

$right $top,

$right $bottom,

$left $bottom

);

transform: translate(

#{rand(-8, 8) * 1%},

#{rand(-0.5, 0.5) * 1%}

);

}

}

#{$glitch-duration}, 100% {

clip-path: none;

transform: none;

}

}

animation: glitch-#{$name} $animation-duration linear infinite alternate both;

}

与RGB置换一样,创建了一个混杂物。

.glitch {

&::before {

@include glitch(before);

clip-path: polygon(

0 20%,

100% 20%,

100% 30%,

0 30%

);

transform: translate(5%, 0.5%);

content: “”;

}

&::after {

@include glitch(after);

clip-path: polygon(

0 60%,

100% 60%,

100% 65%,

0 65%

);

transform: translate(-5%, -0.5%);

content: “”;

Vue 面试题

1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?

算法

  1. 冒泡排序
  2. 选择排序
  3. 快速排序
  4. 二叉树查找: 最大值、最小值、固定值
  5. 二叉树遍历
  6. 二叉树的最大深度
  7. 给予链表中的任一节点,把它删除掉
  8. 链表倒叙
  9. 如何判断一个单链表有环
  10. 给定一个有序数组,找出两个数相加为一个目标数

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666

2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?

[外链图片转存中…(img-ScVgkTJ6-1718873360751)]

算法

  1. 冒泡排序
  2. 选择排序
  3. 快速排序
  4. 二叉树查找: 最大值、最小值、固定值
  5. 二叉树遍历
  6. 二叉树的最大深度
  7. 给予链表中的任一节点,把它删除掉
  8. 链表倒叙
  9. 如何判断一个单链表有环
  10. 给定一个有序数组,找出两个数相加为一个目标数

    [外链图片转存中…(img-DqUiqMhl-1718873360752)]

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+评论666

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值