CSS: 如何创建无限移动的重复线性渐变?
CSS: how to create an infinitely-moving repeating linear gradient?
基本上,我正在尝试创建一个进度条。在这个例子中,我只是将我使用的颜色更改为 red
、green
和 blue
,因为这显然比一堆十六进制值更容易理解。实际上,我想要的是让进度条具有此 RGB 渐变背景,给人以渐变从左向右移动的印象,表示仍然存在 activity(即该网站还没有冷冻)。我尝试了一些方法,首先设置 background: linear-gradient(120deg, red, green, blue)
并设置 background-position
CSS 属性 的动画以模拟渐变移动。然而,一旦在动画结束时,进度条从大部分蓝色(即渐变结束)跳回绿色......然后我尝试手动以 rgbgr
形式反映渐变- 即 background: linear-gradient(120deg, red, green, blue, green, red)
并且,虽然这看起来更好,但仍然存在神经质。最后,我尝试使用 repeating-linear-gradient
CSS 函数 - 即 background: repeating-linear-gradient(120deg, red, green, blue, green, red)
。这与我的目标最接近,但在示例中,您可以看到渐变颜色 'jumping',而不是平滑的动画效果
html, body{
height: 100%;
background: #222;
overflow: hidden;
}
body{
display: flex;
justify-content: center;
align-items: center;
}
*{
color: white;
font-family: 'Tahoma', sans-serif;
}
#wrapper {
height: 50px;
width: 400px;
position: relative;
background: #131313;
}
p{
text-align: center;
position: absolute;
width: 100%;
}
#bar {
background: repeating-linear-gradient(120deg, red,green,blue, green, red);
background-repeat:repeat-x;
height: 100%;
position: absolute;
background-size: 400% 100%;
-webkit-animation: AnimationName 3s linear infinite;
-moz-animation: AnimationName 3s linear infinite;
animation: AnimationName 3s linear infinite;
}
@-webkit-keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:0% 50%}
}
@-moz-keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:0% 50%}
}
@keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:0% 50%}
}
<div id="wrapper">
<div id="bar" style="width: 50%"></div>
<p>Downloading 5 of 10</p>
</div>
我以前在很多网站上看到过这种效果,所以我认为在 CSS 中是可能的。如果有人能指出我正确的方向,我将不胜感激。谢谢!
您需要 运行 动画再循环播放。
@keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:-33% 50%} /* instead of 0% 50% */
}
我也把渐变角度改成了90deg
因为初始值让渐变的起点和终点不是很匹配
/* instead of 120deg */
background: repeating-linear-gradient(90deg, red,green,blue, green, red);
html, body{
height: 100%;
background: #222;
overflow: hidden;
}
body{
display: flex;
justify-content: center;
align-items: center;
}
*{
color: white;
font-family: 'Tahoma', sans-serif;
}
#wrapper {
height: 50px;
width: 400px;
position: relative;
background: #131313;
}
p{
text-align: center;
position: absolute;
width: 100%;
}
#bar {
background: repeating-linear-gradient(90deg, red,green,blue, green, red);
background-repeat:repeat-x;
height: 100%;
position: absolute;
background-size: 400% 100%;
animation: AnimationName 3s linear infinite;
}
@keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:-33% 50%}
}
<div id="wrapper">
<div id="bar" style="width: 50%"></div>
<p>Downloading 5 of 10</p>
</div>
你可以像下面那样做,它可以在你想要的任何角度工作:
body {
background: #222;
}
.wrapper {
--d:100px;
--angle:120deg;
--sinus:0.866; /* = sinus(angle) */
height: 50px;
width: 400px;
position: relative;
z-index:0;
background: #131313;
text-align: center;
line-height:50px;
color: white;
margin:5px;
}
.wrapper::before {
content:"";
height: 100%;
left:0;
width:var(--w);
position: absolute;
z-index:-1;
background: repeating-linear-gradient(var(--angle), red, green, blue, green, red var(--d));
background-size: calc(var(--d)/var(--sinus)) 100%;
animation: AnimationName 2s linear infinite reverse;
}
@keyframes AnimationName {
0% {
background-position: calc(var(--d)/var(--sinus)) 0;
}
}
<div class="wrapper" style="--w:50%;">
Downloading 5 of 10
</div>
<div class="wrapper" style="--w:70%;--d:200px;--angle:45deg;--sinus:0.707">
Downloading 5 of 10
</div>
<div class="wrapper" style="--w:80%;--d:50px;--angle:-30deg;--sinus:0.5">
Downloading 5 of 10
</div>
基本上,我正在尝试创建一个进度条。在这个例子中,我只是将我使用的颜色更改为 red
、green
和 blue
,因为这显然比一堆十六进制值更容易理解。实际上,我想要的是让进度条具有此 RGB 渐变背景,给人以渐变从左向右移动的印象,表示仍然存在 activity(即该网站还没有冷冻)。我尝试了一些方法,首先设置 background: linear-gradient(120deg, red, green, blue)
并设置 background-position
CSS 属性 的动画以模拟渐变移动。然而,一旦在动画结束时,进度条从大部分蓝色(即渐变结束)跳回绿色......然后我尝试手动以 rgbgr
形式反映渐变- 即 background: linear-gradient(120deg, red, green, blue, green, red)
并且,虽然这看起来更好,但仍然存在神经质。最后,我尝试使用 repeating-linear-gradient
CSS 函数 - 即 background: repeating-linear-gradient(120deg, red, green, blue, green, red)
。这与我的目标最接近,但在示例中,您可以看到渐变颜色 'jumping',而不是平滑的动画效果
html, body{
height: 100%;
background: #222;
overflow: hidden;
}
body{
display: flex;
justify-content: center;
align-items: center;
}
*{
color: white;
font-family: 'Tahoma', sans-serif;
}
#wrapper {
height: 50px;
width: 400px;
position: relative;
background: #131313;
}
p{
text-align: center;
position: absolute;
width: 100%;
}
#bar {
background: repeating-linear-gradient(120deg, red,green,blue, green, red);
background-repeat:repeat-x;
height: 100%;
position: absolute;
background-size: 400% 100%;
-webkit-animation: AnimationName 3s linear infinite;
-moz-animation: AnimationName 3s linear infinite;
animation: AnimationName 3s linear infinite;
}
@-webkit-keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:0% 50%}
}
@-moz-keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:0% 50%}
}
@keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:0% 50%}
}
<div id="wrapper">
<div id="bar" style="width: 50%"></div>
<p>Downloading 5 of 10</p>
</div>
我以前在很多网站上看到过这种效果,所以我认为在 CSS 中是可能的。如果有人能指出我正确的方向,我将不胜感激。谢谢!
您需要 运行 动画再循环播放。
@keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:-33% 50%} /* instead of 0% 50% */
}
我也把渐变角度改成了90deg
因为初始值让渐变的起点和终点不是很匹配
/* instead of 120deg */
background: repeating-linear-gradient(90deg, red,green,blue, green, red);
html, body{
height: 100%;
background: #222;
overflow: hidden;
}
body{
display: flex;
justify-content: center;
align-items: center;
}
*{
color: white;
font-family: 'Tahoma', sans-serif;
}
#wrapper {
height: 50px;
width: 400px;
position: relative;
background: #131313;
}
p{
text-align: center;
position: absolute;
width: 100%;
}
#bar {
background: repeating-linear-gradient(90deg, red,green,blue, green, red);
background-repeat:repeat-x;
height: 100%;
position: absolute;
background-size: 400% 100%;
animation: AnimationName 3s linear infinite;
}
@keyframes AnimationName {
0%{background-position:100% 50%}
100%{background-position:-33% 50%}
}
<div id="wrapper">
<div id="bar" style="width: 50%"></div>
<p>Downloading 5 of 10</p>
</div>
你可以像下面那样做,它可以在你想要的任何角度工作:
body {
background: #222;
}
.wrapper {
--d:100px;
--angle:120deg;
--sinus:0.866; /* = sinus(angle) */
height: 50px;
width: 400px;
position: relative;
z-index:0;
background: #131313;
text-align: center;
line-height:50px;
color: white;
margin:5px;
}
.wrapper::before {
content:"";
height: 100%;
left:0;
width:var(--w);
position: absolute;
z-index:-1;
background: repeating-linear-gradient(var(--angle), red, green, blue, green, red var(--d));
background-size: calc(var(--d)/var(--sinus)) 100%;
animation: AnimationName 2s linear infinite reverse;
}
@keyframes AnimationName {
0% {
background-position: calc(var(--d)/var(--sinus)) 0;
}
}
<div class="wrapper" style="--w:50%;">
Downloading 5 of 10
</div>
<div class="wrapper" style="--w:70%;--d:200px;--angle:45deg;--sinus:0.707">
Downloading 5 of 10
</div>
<div class="wrapper" style="--w:80%;--d:50px;--angle:-30deg;--sinus:0.5">
Downloading 5 of 10
</div>