【问题标题】:SASS: Incompatible units: 'vw' and 'px'SASS:不兼容的单位:“vw”和“px”
【发布时间】:2019-01-08 10:59:22
【问题描述】:

如何解决单位不兼容的问题?

@mixin square-size($size, $min: $size, $max: $size) {
  $clamp-size: min(max($size, $min), $max);
  width: $clamp-size;
  height: $clamp-size;
}

输入是:

@include square-size(10vw, 40px, 70px);

问题:

Incompatible units: 'vw' and 'px'.
node_modules\@ionic\app-scripts\dist\util\helpers.js:253.replace(/&/g, '&')

但如果我使用calc(1vw - 1px),它就可以工作。 (没有单位问题)。 例如max(calc(1vw - 1px)) 不起作用。因为no number for max

在我的例子中,我想要一个 mixin 来调整元素的大小。包括夹子。 min-widthmax-width 等不起作用。它将是一个矩形或一个椭圆。因为它不保持纵横比。 我想要一个具有动态size 但具有minmax 大小的元素。

我了解动态单元vw(视口)必须在 sass 编译后存在。因此,无法将该值转换为固定单位。 但是没有办法吗?

【问题讨论】:

  • 由于 Sass 是在服务器上编译的,而不是在浏览器中编译的 - vw(和其他相关的)单位不能转换成东西,你可以用它来做数学运算。 calc() 由浏览器计算,而不是 Sass。因此,您需要获取绝对值以使用 Sass 执行计算,或者将您的方程转换为 calc() 表达式以在浏览器中计算。

标签: sass type-conversion viewport-units


【解决方案1】:

我能够使用 calc 函数修复 React SASS 中的错误。

font-size: calc(max(8vw, 30px));

【讨论】:

    【解决方案2】:

    如果您无法以任何其他方式解决它,SCSS 有一个功能可以忽略引号中的内容:

    width: unquote("max(50px, 5rem)");
    

    这将在不带引号的情况下进行编译,并且是有效的 CSS。

    width: max(50px, 5rem);
    

    在你的 scss 中使用它会很奇怪,但这是确保现代 CSS 不会中断你的 scss 功能的可靠方式

    【讨论】:

      【解决方案3】:

      您需要绕过 scss 编译器并改用文字。

      @mixin square-size($size, $min: $size, $max: $size) {
        $clamp-size: #{'min(max(#{$size}, #{$min}), #{$max})'};
        width: $clamp-size;
        height: $clamp-size;
      }
      

      【讨论】:

      • 这是正确的解决方案,但是我第一次忽略了它,因为我看不到相关的变化在哪里。
      【解决方案4】:

      问题

      CSS 过去没有自己的运行时min()max() 函数,在它们存在之前,SASS 有一个编译时版本。由于 SASS 没有实时运行,因此无法确定 10vw40px 是否更大 - 因此会出现错误。

      解决方案

      由于 SASS 区分大小写CSS 不区分,您可以通过调用 MIN() 或 @ 来强制解析器使用最小或最大的 CSS 版本987654326@ 代替。如果您需要在 MAX() 内恢复 SASS 解析(喜欢引用 SASS 变量),只需用 #{...} 包围 SASS 代码即可。

      这里有一个固定版本的代码来演示:

      @mixin square-size($size, $min: $size, $max: $size) {
        /* $clamp-size: min(max($size, $min), $max); */
        $clamp-size: MIN(MAX(#{$size}, #{$min}), #{$max});
        width: $clamp-size;
        height: $clamp-size;
      }
      

      祝你好运!

      【讨论】:

      • 我比calc() hack 更喜欢这个解决方法的想法,但是我的 stylelint 设置将它压缩回小写,然后致命错误又回来了......所以......计算它!
      【解决方案5】:

      您可以使用 min-width/height 和 max-width/height 来避免混合单位:

      @mixin square-size($size, $min: $size, $max: $size) {
        min-width: $min;
        max-width: $max;    
        min-height: $min;
        max-height: $max;    
        width: $size;
        height: $size;
      }
      .class {
          @include square-size(10vw, 40px, 70px);
      } 
      

      【讨论】:

      • 感谢您的回答。但这正是我目前的实现。但正如我上面写的,在某些情况下它会导致矩形或椭圆形。因为min-widthmin-heightmax-widthmax-height 没有保持纵横比。如果以上描述中的信息不清楚,我很抱歉。不管怎么说,还是要谢谢你。 :)
      • 你试过运行它吗?它总是会产生正方形 - 尝试再看一下 :) 这是一个笔示例:codepen.io/jakob-e/pen/REBzKw
      【解决方案6】:

      在sass中做minmax时,如果遇到不兼容的单位错误,你可以简单地将值放在引号中,它会让它通过。

      min(10vw, 20px)"min(10vw, 20px)"

      这也适用于其他功能。

      如果您在计算中使用变量,则在变量上使用#{} 使其通过

      $a: 10px;
      $b: 25%;
      
      .mydiv {
        width: calc(#{$a} - #{$b});
      }
      

      #{} 将它们转换为字符串,这样 sass 就不会在编译时使用它们进行算术运算

      【讨论】:

        【解决方案7】:

        为此,而不是 SCSS @include

        .foo {
          @include square-size(10vw, 40px, 70px);
        }
        

        使用更好的css函数“clamp”:

        .foo {
            width:clamp(10vw, 40px, 70px);
            height:clamp(10vw, 40px, 70px);
        }
        

        【讨论】:

        • 问题是如果你在整个项目中使用了SCSS,由于上面的错误,SCSS不会编译clamp()、min()或max()。
        • 纯CSS。它工作得很好。 SCSS 不会抛出错误。徒劳地给我一个减号。
        • 您写的是纯 css,但 OP 询问的是 SCSS - 您的代码需要内联或作为单独的 .css
        • 我在我的 SCSS 中使用了这个 CSS 代码,效果很好,编译器没有问题。有人认为 SCSS 有解决方案,但 CSS 中的解决方案是表面的——更简单、更好、更优雅!
        • 我的 scss 抛出错误,因为 CLAMP 是一个 scss 函数,它要求的选项比 css 中的 3 少/多 - 如果您正在运行旧的 scss,则有许多函数现在无关紧要对于现代 css,但失败了,因为它们将它们解释为函数。更新 SCSS 有时可能会破坏项目,因此 unquote() 函数是一种将 css 钳位包装在 scss 中的方法,而无需与魔鬼打交道。 :)
        猜你喜欢
        • 2017-08-05
        • 2014-03-11
        • 2019-10-23
        • 1970-01-01
        • 2015-10-28
        • 2017-11-29
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        相关资源
        最近更新 更多