<!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <div class="colorblock1" id="b"></div>
      <button onclick="a()">变色</button>
      <style>
        .colorblock1 {
          width: 300px;
          height: 100px;
          margin: 20px auto;
          background-image: -webkit-linear-gradient(left, rgb(255, 0, 0), blue);
          /* Safari 5.1 - 6.0 */
          background-image: -o-linear-gradient(right, red, blue);
          /* Opera 11.1 - 12.0 */
          background-image: -moz-linear-gradient(right, red, blue);
          /* Firefox 3.6 - 15 */
          background-image: linear-gradient(to right, red, blue);
          /* 标准的语法(必须放在最后) */
          opacity: 1;
        }
    
        .colorblock2 {
          width: 300px;
          height: 100px;
          margin: 20px auto;
          background-image: -webkit-linear-gradient(left, rgba(228, 248, 50, 0.479), rgba(52, 235, 77, 0.932));
          /* Safari 5.1 - 6.0 */
          background-image: -o-linear-gradient(right, rgba(228, 248, 50, 0.473), rgba(52, 235, 77, 0.932));
          /* Opera 11.1 - 12.0 */
          background-image: -moz-linear-gradient(right, rgba(228, 248, 50, 0.473), rgba(52, 235, 77, 0.932));
          /* Firefox 3.6 - 15 */
          background-image: linear-gradient(to right, rgba(228, 248, 50, 0.438), rgba(52, 235, 77, 0.932));
          /* 标准的语法(必须放在最后) */
          opacity: 0;
        }
      </style>
      <script>
        //实现颜色渐弱然后渐强
        function a() {
          let d = document.getElementById('b')
          let j = 1
          let z = 0
    
          for (let i = 1; i >= 0; i = i - 0.001) {
            setTimeout(function () {
              d.style.cssText = ` opacity: ${j}; `
              j = j - 0.001
            }, i * 400)
          }
          setTimeout(function () {
            d.setAttribute("class", "colorblock2")
          }, 500)
    
          for (let i = 0, j = 2; i <= 1; i = i + 0.001, j = j - 0.001) {
            setTimeout(function () {
              d.style.cssText = ` opacity: ${z}; 
              `
              z = z + 0.001
            }, j * 600)
          }
        }
      </script>
    </body>
    
    </html>
    

    原理:通过 JS 函数修改颜色的透明度属性,从1到0逐渐减少透明度就会让颜色消失,再从0到1逐渐增加透明度就可以让颜色重新出现,如果在消失和出现之间在变换样式颜色,就可以实现颜色从一个颜色逐渐变为另一个颜色。

    方法L:利用for循环,和三个 setTimeout安排渐变和颜色改变的顺序,三个setTimeout的延迟经过测试,可以是 400,500,600或者他们的倍数。
    透明度的递增递减的步长最好在0.001的数量级最好。

    让透明度改变呈现一个加速再减速的效果
    更多js动画效果:https://www.jb51.net/article/74686.htm