【问题标题】:CSS: how to create an infinitely-moving repeating linear gradient?CSS:如何创建一个无限移动的重复线性渐变?
【发布时间】:2020-09-08 04:44:23
【问题描述】:

所以基本上,我正在尝试创建一个进度条。在这个例子中,我只是将我使用的颜色更改为redgreenblue,因为这显然比加载十六进制值更容易理解。实际上,我想要的是让进度条有这个 RGB 渐变背景,给人的印象是渐变从左到右移动,表示仍然有活动(即网站没有冻结)。我尝试了一些东西,从设置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)。这是最接近我的目标的,但在示例中,您可以看到渐变颜色“跳跃”,而不是流畅地制作动画

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 中是可能的。如果有人能指出我正确的方向,我将不胜感激。谢谢!

【问题讨论】:

    标签: html css background css-animations linear-gradients


    【解决方案1】:

    在循环返回之前,您需要运行动画一段时间。

    @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>

    【讨论】:

    • 很棒的人。只需将背景位置设置为 -33% 就足够了。奇怪的是,我使用了多少颜色或渐变的角度似乎并不重要……只要背景 x 位置在 -33% 左右,它似乎就可以工作……有 5 个色标, 10、12,随便……
    • @CssProblem 它不适用于任何角度,仅适用于 90 度 .. 了解数字背后的逻辑:stackoverflow.com/a/51734530/8620333
    • @TemaniAfif 是的,你是对的 - 如果不是水平的,你似乎会得到一个稍微亮一点的罢工 - 仍然,我猜在我使用的示例中(在 120 度处有大约 14 个色标),它在人眼看来仍然很模糊
    【解决方案2】:

    你可以像下面那样做,它会以你想要的任何角度工作:

    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>

    【讨论】:

    • 您能否更详细地描述/* = sinus(angle) */ 以及--sinus 值是如何得出的?有没有一个公式可以根据角度来确定这个?谢谢!
    猜你喜欢
    • 2021-05-14
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多