Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >如何使用线性梯度创建无限大的背景图案动画?

如何使用线性梯度创建无限大的背景图案动画?
EN

Stack Overflow用户
提问于 2019-02-27 07:46:18
回答 1查看 1.5K关注 0票数 5

我正在尝试创建一个动画重复模式(对角线条纹水平滑动),作为加载块的占位符(本例中为li)。

如何使动画光滑/连续,给幻象以无限滑动的模式?

  • 如何计算元素width,使模式是连续的?(条纹不应显得破损/中断)。
  • 如何使其循环看起来像它不是重新启动,而是无限滑动?( 100%帧应传递到0%帧,没有任何故障)

目标是有一个类,我可以添加到任何块,并在视觉上看起来像加载/处理。

注释:Note;纯。

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc(20px * 8); /* how to calculate this, relative to the width (of the pattern or the step), to achieve pattern continuity exactly?
    Of course without doing trying&error to know it should be 24.75px * 8.
  */
  height: 200px;
  background-color: blue;

  background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, black 10px, black 20px);
  animation: loading-slide 1s linear infinite;

}
  @keyframes loading-slide {
    from { background-position: 0% 0% }
    to { background-position: 100% 0% }
  }
代码语言:javascript
代码运行次数:0
复制
<ul>
    <li>test
    <li>test
</ul>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 07:56:27

正确的公式应该是(20px / cos(45deg)) * N。然后,您可以将background-size设置为200% 100% (比元素大两倍),并将其从左向右动画:

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc( (20px / 0.707) * 3); /*cos(45deg) = 0.707*/
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, black 10px, black 20px);
  background-size: 200% 100%;
  background-color: blue;
  animation: loading-slide 3s linear infinite;
}

@keyframes loading-slide {
  from {
    background-position: left;
  }
  to {
    background-position: right;
  }
}

.alt li {
  width: calc( (20px / 0.707) * 6);
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

你可以考虑任何程度,并根据需要调整公式。(20px / cos(90deg - |Xdeg|)) * NX-90deg90deg之间

使用-60deg的示例

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc((20px / 0.866) * var(--n,3)); /*cos(30deg) = 0.866*/
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  background-image: repeating-linear-gradient(-60deg, transparent, transparent 10px, black 10px, black 20px);
  background-size: 200% 100%;
  background-color: blue;
  animation: loading-slide 3s linear infinite;
}

@keyframes loading-slide {
  from {
    background-position: left;
  }
  to {
    background-position: right;
  }
}

.alt li {
  --n:6;
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

使用30deg的示例

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc((20px / 0.5) * var(--n,8)); /*cos(60deg) = 0.5*/
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  background-image: repeating-linear-gradient(30deg, transparent, transparent 10px, black 10px, black 20px);
  background-size: 200% 100%;
  background-color: blue;
  animation: loading-slide 3s linear infinite;
}

@keyframes loading-slide {
  from {
    background-position: left;
  }
  to {
    background-position: right;
  }
}

.alt li {
  --n:12;
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

使用80deg的示例

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc((20px / 0.9848) * var(--n,8)); /*cos(10deg) = 0.9848*/
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  background-image: repeating-linear-gradient(80deg, transparent, transparent 10px, black 10px, black 20px);
  background-size: 200% 100%;
  background-color: blue;
  animation: loading-slide 3s linear infinite;
}

@keyframes loading-slide {
  from {
    background-position: left;
  }
  to {
    background-position: right;
  }
}

.alt li {
  --n:12;
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

您可以清楚地识别X=+/-90deg (垂直条纹)和cos(0)=1的简单情况,因此公式将是20px * N。同样,当X=0 (水平条纹),我们将有cos(90deg) = 0和任何宽度将工作,因为没有垂直模式(公式不再定义)

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc(20px * var(--n,8)); 
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  background-image: repeating-linear-gradient(90deg, transparent, transparent 10px, black 10px, black 20px);
  background-size: 200% 100%;
  background-color: blue;
  animation: loading-slide 3s linear infinite;
}

@keyframes loading-slide {
  from {
    background-position: left;
  }
  to {
    background-position: right;
  }
}

.alt li {
 background-image:repeating-linear-gradient(0deg, transparent, transparent 10px, black 10px, black 20px);
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

[-90deg,90deg]**?**以外的值是什么?

上面的范围已经涵盖了180deg,而且由于我们正在处理一些系统,所以所有的值都可以在该范围内表示。

示例:110deg-70deg相同

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc((20px / 0.9396) * var(--n,8)); /*cos(20deg) = 0.9396*/
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  background-image: repeating-linear-gradient(110deg, transparent, transparent 10px, black 10px, black 20px);
  background-size: 200% 100%;
  background-color: blue;
  animation: loading-slide 3s linear infinite;
}
.alt li {
  --n:12;
  background-image: repeating-linear-gradient(-70deg, transparent, transparent 10px, black 10px, black 20px);
}

@keyframes loading-slide {
  from {
    background-position: left;
  }
  to {
    background-position: right;
  }
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

示例:-150deg30deg相同

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc((20px / 0.5) * var(--n,4)); /*cos(60deg) = 0.5*/
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  background-image: repeating-linear-gradient(-150deg, transparent, transparent 10px, black 10px, black 20px);
  background-size: 200% 100%;
  background-color: blue;
  animation: loading-slide 3s linear infinite;
}
.alt li {
  --n:6;
  background-image: repeating-linear-gradient(30deg, transparent, transparent 10px, black 10px, black 20px);
}

@keyframes loading-slide {
  from {
    background-position: left;
  }
  to {
    background-position: right;
  }
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

基本上,我们添加/删除180deg,直到我们进入[-90deg,90deg],以便能够应用公式。

有关background-size/background-position如何工作的更多详细信息,请查看此答案:Using percentage values with background-position on a linear-gradient

另一种方法

这里有一个完全不同的想法,您可以依赖于skew转换和伪元素。这里的诀窍是,您不必根据条纹来定义宽度,但是条纹将遵循您定义的宽度,这样就更容易处理了。

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc( 20px * 3); /* it's only 20px * N */
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  position:relative;
  z-index:0;
  overflow:hidden
}
li::before {
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  width:400%;
  /*we keep 0deg in the gradient*/
  background-image: repeating-linear-gradient(90deg, transparent, transparent 10px, black 10px, black 20px);
  transform:skewX(30deg);
  transform-origin:bottom left;
  animation: loading-slide 4s linear infinite;
}

@keyframes loading-slide {
  to {
    transform: translateX(-50%) skewX(30deg);
  }
}

.alt li {
  width: calc( 20px * 6);
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul class="alt">
  <li>test</li><li>test</li>
</ul>

如您所见,我们保持垂直梯度,根据梯度的宽度定义元素的宽度。我们使伪元素足够大,并在其上应用一个转换。唯一需要调整的是控制度的倾斜转换。

使用这种方法,您也将有更好的性能,因为您将动画转换,而不是background-size

更多的例子:

代码语言:javascript
代码运行次数:0
复制
li {
  display: inline-block;
  width: calc( 20px * var(--n,3)); /* it's only 20px * N */
  height: 50px;
  margin-bottom:10px;
  background-color: blue;
  position:relative;
  z-index:0;
  overflow:hidden
}
li::before {
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  left:-400%;
  right:-800%;
  /*we keep 0deg in the gradient*/
  background-image: repeating-linear-gradient(90deg, transparent, transparent 10px, black 10px, black 20px);
  transform:skewX(var(--d,30deg));
  animation: loading-slide 12s linear infinite;
}

@keyframes loading-slide {
  to {
    transform: translateX(-50%) skewX(var(--d,30deg));
  }
}
代码语言:javascript
代码运行次数:0
复制
<ul>
  <li>test</li><li>test</li>
</ul>

<ul style="--n:6;--d:45deg">
  <li>test</li><li>test</li>
</ul>
<ul style="--n:8;--d:-70deg">
  <li>test</li><li>test</li>
</ul>
<ul style="--n:8;--d:30deg">
  <li>test</li><li>test</li>
</ul>

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54909275

复制
相关文章
realsense深度图像保存方法
结果显示: 左边是float,右边是uint16保存方法,左边数据出现了数据压缩,被压缩在0-255之间,而右边值正常。
全栈程序员站长
2022/08/10
1.5K0
realsense深度图像保存方法
彩色图像中的人脸检测
色彩模型vs色彩空间 要解开YCbCr色彩空间这个结,色彩模型(color model)和色彩空间(color space)的区别必须要理解。简单来说两者的关系就像设计与实现之间的关系,针对同一种色彩模型可以有多种不同的实现。比如最常见的RGB色彩模型是根据人的眼睛是通过识别红绿蓝三元色来识别所有颜色的原理进行设计的,可是实际应用的时候我们需要把这个设计予以实现,于是就出现了Adobe RGB、sRGB、ProPhoto RGB等不同版本针对RGB色彩模型实现的色彩空间。
一点儿也不潇洒
2018/08/07
8480
彩色图像中的人脸检测
伪红外图像处理
《优秀的IC/FPGA开源项目》是新开的系列,旨在介绍单一项目,会比《优秀的 Verilog/FPGA开源项目》内容介绍更加详细,包括但不限于综合、上板测试等。两者相辅相成,互补互充~
碎碎思
2023/08/30
2960
伪红外图像处理
LabVIEW彩色图像分割
基于目标颜色的彩色图像分割常包括色彩阈值处理(Color Threshold)和色彩分割(Color Segmentation)两种方法。
不脱发的程序猿
2021/08/24
1.7K0
浅谈彩色图像、灰度图像、二值图像和索引图像区别
彩色图像:每个像素由R、G、B三个分量表示,每个通道取值范围0~255。数据类型一般为8位无符号整形。
种花家的奋斗兔
2020/11/12
5.5K0
图像处理之灰度模糊图像与彩色清晰图像的变换
本文介绍了一种基于神经网络的图像着色方法,该方法利用全局和局部特征进行图像着色。该方法通过一个端到端的神经网络来学习图像的局部和全局特征,并将其用于图像着色。该方法在多个数据集上进行了实验,并与其他方法进行了比较。实验结果表明,该方法能够有效地利用全局和局部特征进行图像着色,比传统方法具有更好的性能。"
码科智能
2018/01/02
2.7K0
图像处理之灰度模糊图像与彩色清晰图像的变换
彩色图像色彩空间原理
自然界的各种色彩、人类所感知的色彩以及各种图像设备和计算机软件所使用的颜色可通过色彩空间(Color Space)来描述。
不脱发的程序猿
2021/08/10
1.1K0
彩色图像高斯反向投影
彩色图像高斯反向投影 一:介绍 图像反向投影的最终目的是获取ROI然后实现对ROI区域的标注、识别、测量等图像处理与分析,是计算机视觉与人工智能的常见方法之一。图像反向投影通常是彩色图像投影效果会比灰度图像效果要好,原因在于彩色图像带有更多对象细节信息,在反向投影的时候更加容易判断、而转为灰度图像会导致这些细节信息丢失、从而导致分割失败。最常见的是基于图像直方图特征的反向投影。我们这里介绍一种跟直方图反向投影不一样的彩色图像反向投影方法,通过基于高斯的概率分布公式(PDF)估算,反向投影得到对象区域,该方法
OpenCV学堂
2018/04/04
7160
彩色图像高斯反向投影
红外图特点析及红外图像分割
所有高于绝对零度(-273℃)的物体都会发出红外辐射。 红外热成像仪是利用红外探测器、光学成像物镜和光机扫描系统接受被测目标的红外辐射能量分布图形反映到红外探测器的光敏元上,在光学系统和红外探测器之间,有一个光机扫描机构对被测物体的红外热像进行扫描,并聚焦在单元或分光探测器上,由探测器将红外辐射能转换成电信号,经放大处理、转换或标准视频信号通过电视屏或监测器显示红外热像图。
AomanHao
2022/01/14
7780
红外图特点析及红外图像分割
如何使用C++和OpenCV库将彩色图像按连通域进行区分?
在计算机视觉和图像处理中,将彩色图像按照连通域进行区分是一种常见的操作。通过将图像转化为灰度图像,然后使用图像分割和连通域分析算法,我们可以识别出图像中的不同物体或区域,并对其进行进一步的处理和分析。本文将详细介绍如何使用C++和OpenCV库将彩色图像按连通域进行区分。
网络技术联盟站
2023/09/04
5990
如何使用C++和OpenCV库将彩色图像按连通域进行区分?
OpenCV之图像伪彩色增强
python代码: import cv2 as cv src = cv.imread("test1.png") cv.namedWindow("input", cv.WINDOW_AUTOSIZE) cv.imshow("input", src) dst = cv.applyColorMap(src, cv.COLORMAP_COOL) cv.imshow("output", dst) # 伪色彩 image = cv.imread("test0.jpg") color_image = cv.apply
MachineLP
2021/07/19
6960
OpenCV之图像伪彩色增强
Python使用均值法实现彩色图像转灰度图像
给定一个JPG/PNG/BMP格式的彩色图像文件,使用Python+pillow+numpy将其转换为灰度图像,原始彩色图像每个像素颜色值的平均值作为灰度值。
Python小屋屋主
2020/09/07
1.2K0
Python使用均值法实现彩色图像转灰度图像
C/C++,彩色图像小游戏。
林冠宏-指尖下的幽灵
2018/01/02
1.2K0
C/C++,彩色图像小游戏。
将图像像素信息按照坐标映射到参数空间的霍夫变换。
1、点击[Matlab] 2、点击[命令行窗口] 3、按<Enter>键
裴来凡
2022/05/28
5380
将图像像素信息按照坐标映射到参数空间的霍夫变换。
数字图像处理学习笔记(十六)——彩色图像处理
当一束白光通过一个玻璃棱镜时,出现的光束 不是白光,而是由一端为紫色到另一端为红色的 连续彩色谱组成
荣仔_最靓的仔
2021/02/02
2.4K0
数字图像处理学习笔记(十六)——彩色图像处理
OpenCV图像藏密--将图像隐藏到另一张图像中
密码学的应用流行多年并且技巧繁多。本文所有介绍的是图像藏密(image steganography)的隐藏技术。而密码学分为加密和解密,本文先介绍加密再介绍解密。1
程序员小涛
2020/12/03
2.2K0
OpenCV图像藏密--将图像隐藏到另一张图像中
Matlab图像彩色转灰色「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116423.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
5850
Matlab图像彩色转灰色「建议收藏」
三种主流深度相机介绍
深度相机又称之为3D相机,顾名思义,就是通过该相机能检测出拍摄空间的景深距离,这也是与普通摄像头最大的区别。
点云PCL博主
2019/07/30
5.7K0
三种主流深度相机介绍
24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
用户1138785
2018/01/03
4.2K0
24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
OpenCV4.0 灰度图像彩色化
OpenCV4.0发布以后,有很多新的特性与黑科技支持,无论是支持OpenVINO加速、图计算模块、二维码识别,还是DNN中新增加的人脸检测与识别模型,作为OpenCV开发者的我深深被吸引,几乎只要有时间就会一个一个的去发现与之前的不同之处。OpenCV DNN模块,不仅支持图像分类、对象检测、人脸检测、图像分割等操作除外,还支持对灰度图像的自动彩色化转换,而且效果十分靠谱,亲测有效!
OpenCV学堂
2019/04/29
1.7K1
OpenCV4.0 灰度图像彩色化

相似问题

用realsense2实现深度图像到彩色图像的映射

21

将物体从二值图像映射到彩色图像

13

OpenGL ES着色器将彩色图像转换为黑白红外?

13

创建一个图像和彩色红外线?

10

Matlab中的红外图像处理

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文