美文网首页
postcss 不能处理 cssnext 局部变量的问题

postcss 不能处理 cssnext 局部变量的问题

作者: TWLESVCNZ | 来源:发表于2018-03-20 21:34 被阅读151次

    postcss-cssnext

    postcss-cssnext 是一个插件的集合, 其中通过 postcss-custom-properties 插件处理自定义变量的特性, 但这个插件只能处理 :root 下的 变量

    https://github.com/postcss/postcss-custom-properties#readme

    css custom properties 依赖 DOM 结构

    postcss 无法处理局部变量, 原因是 cssnext 的自定义变量会依赖 DOM 结构, 如 http://jsbin.com/tisucijaho/edit?html,css,output 所示

    :root {
      --text-color: red;
    }
    .component {
      --text-color: blue;
    }
    .component .header {
      color: var(--text-color);
    }
    .component .text {
      --text-color: green;
      color: var(--text-color);
    }
    

    header 并没有取 root 的 red, 而是取 .component 的 blue, 这和 sass 是不同的. sass 的 {} 可以理解为变量的局部作用域, 在编译层面可以确定这个变量的作用范围. 而 cssnext 的变量就像可继承的 css 属性, 必然依赖实际的 DOM 结构

    如上面这种写法搭配如下 DOM, cssnext 中输出的是

    <div class="component">
      Black
      <div class="header">
        Blue
        <div class="text">
          Green
          <div class="header">Green</div>
        </div>
      </div>
    </div>
    

    脱离这段 HTML, 在 postcss 转换的时候, 最里面的 header 的 --text-color 无法确定是采用 .component 声明的 blue, 还是 .component .text 声明的 green

    而这样一段类似的 sass

    $--text-color: red;
    .component {
      $--text-color: blue;
    }
    .component .header {
      color: $--text-color;
    }
    .component .text {
      $--text-color: green;
      color: $--text-color;
    }
    

    输出的是

    <div class="component">
      Black
      <div class="header">
        Red
        <div class="text">
          Green
          <div class="header">Green</div>
        </div>
      </div>
    </div>
    

    有另一个插件 postcss-css-variables 可以实现局部变量, 但这个插件并没有遵循 cssnext 规范: https://github.com/MadLittleMods/postcss-css-variables/issues/4, 原因就是 DOM 依赖导致实际上是无法实现的

    更多阅读: 是时候使用CSS自定义属性了 – Smashing Magazine

    相关文章

      网友评论

          本文标题:postcss 不能处理 cssnext 局部变量的问题

          本文链接:https://www.haomeiwen.com/subject/dhdiqftx.html