Home

CSS变量的妙用

提出问题

我该如何编写代码,怎么使得这个小球偏移到最后再回来呢,使得这个 translateX 偏移量更优雅呢,如果用大量的 js 去操作将增加我们的代码量

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

    <style>
      .container {
        width: 80%;
        height: 300px;
        margin: 0 auto;
        border: 1px solid;
        position: relative;
      }

      .item {
        height: 200px;
        width: 200px;
        border-radius: 50%;
        background: rebeccapurple;
        position: absolute;
        top: 100px;
        left: 0;
        animation: move 4s linear infinite;
      }
      @keyframes move {
        50% {
          transform: translateX(300px);
        }
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="item"></div>
    </div>

    <script></script>
  </body>
</html>

CSS 变量

CSS 变量带有--前缀的属性名,表示带有值的自定义属性,下面是它的语法 以及使用,还可以使用 js 来设置 CSS 变量 通过setProperty()函数来设置 CSS 变量

--somecolor: #0000ff;

color:var(--somecolor)

/* 通过js的形式设置变量 */


style.setProperty(propertyName, value, priority);

// 参数
/**
 * propertyName 是一个 DOMString ,代表被更改的 CSS 属性。
 * value可选 是一个 DOMString ,含有新的属性值。如果没有指定,则当作空字符串。
 * - 注意:value 不能包含 "!important" --那个应该使用 priority 参数。
 * priority可选 是一个 DOMString 允许设置 "important" CSS 优先级。如果没有指定,则当作空字符串。
 */

calc()

calc() 此 CSS 函数允许在声明 CSS 属性值时执行一些计算

/* property: calc(expression) */
width: calc(100% - 80px);

好的了解过后让我们实现一下吧,使用 calc 计算外加 CSS 变量的形式,简化了代码,js 部分只执行赋值操作

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

    <style>
      .container {
        width: 80%;
        height: 300px;
        margin: 0 auto;
        border: 1px solid;
        position: relative;
      }

      .item {
        height: 200px;
        width: 200px;
        border-radius: 50%;
        background: rebeccapurple;
        position: absolute;
        top: 100px;
        left: 0;
        animation: move 4s linear infinite;
      }
      @keyframes move {
        50% {
          transform: translateX(calc(var(--w) - 100%));
        }
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="item"></div>
    </div>

    <script>
      const container = document.querySelector(".container");
      const item = document.querySelector(".item");
      item.style.setProperty("--w", container.clientWidth + "px");
    </script>
  </body>
</html>

到底了孩子!