css - 将单位类型附加到 Sass 中的计算结果

标签 css sass

我最近一直在将我的 CSS 重构为 SASS 样式表。我正在使用 Mindscape Web Workbench extension对于 VS2012,每次保存 SCSS 时都会重新生成 CSS。我从类似这样的代码开始:

/* Starting point: */
h1 { font-size: 1.5em; /* 24px ÷ 16px */ }

然后我尝试先将其重构为:

/* Recfator: */
h1 { font-size: (24px / 16px)em; }

但不幸的是,这会产生:

/* Result: */
h1 { font-size: 1.5 em; }              /* doesn't work, gives "1.5 em" */

注意额外的空间,我不希望它出现在那里。我已经尝试了几种替代方案,这里有一些:

h1 { font-size: (24/16)em; }           /* doesn't work, gives "1.5 em" */
h2 { font-size: 24 / 16em; }           /* doesn't work, gives "24/16em" */
h3 { font-size: (24px / 16px) * 1em; } /* works but "* 1 em" feels unnecessary */
h4 { font-size: (24em) / 16; }         /* works, but without "px" it's not 
                                          really conveying what I mean to say */

我也尝试过这些带有变量的变体(因为无论如何我都想要那些),但这并没有太大改变情况。为了使这个问题中的示例流畅,我省略了变量。但是,我很乐意接受依赖于使用变量(以干净的方式)的解决方案。

我已经完成了 relevant SASS documenation on '/' ,并意识到这对 SASS 来说是一个艰难的过程,因为 '/' 字符在基本 CSS 中已经有了意义。无论哪种方式,我都希望有一个干净的解决方案。我在这里遗漏了什么吗?

附言。 This blogpost确实提供了一种解决方案,使用用户定义的函数。不过,这似乎有点沉重,所以我很想知道是否有符合我上述尝试的“更清洁”的解决方案。如果有人可以解释“功能方法”是更好(甚至唯一)的解决方案,那么我也会接受它作为答案。

附言。 This related question似乎是同一件事,尽管那个人特别想做进一步的计算。 The accepted answer there是我的第三个解决方法(乘以 1em),但如果我愿意放弃进行进一步计算的能力,我很想知道是否有不同的(更清洁的)方法。也许上述问题中提到的方法(“插值”)对我有用?


底线:如何将单位类型(例如 em)干净地附加到 SASS 中的计算结果?

最佳答案

将单位添加到数字的唯一方法是通过算术

执行连接(例如 1 + px)或插值(例如 #{1}px)等操作只会创建一个字符串 看起来 像一个数字。即使您绝对 100% 确定永远不会在其他算术运算中使用您的值,您也不应该这样做

比无法执行算术运算更重要的是,您将无法将它们与其他需要数字的函数一起使用:

$foo: 1; // a number
$foo-percent: $foo + '%'; // a string

.bar {
    color: darken(blue, $foo-percent); //Error: "1%" is not a number!
}

$amount: "1%" is not a number for `darken'

将数字转换为字符串没有任何好处。始终使用算术(乘以 1,或加法 0)来添加一个单位:

$foo: 1; // a number
$foo-percent: $foo * 1%; // still a number! //or: $foo + 0%

.bar {
    color: darken(blue, $foo-percent); //works!
}

输出:

.bar {
  color: #0000fa;
}

这是我作为我的 Flexbox mixin 库的一部分编写的 mixin,如果你传入一个字符串,它会阻塞(对于那些不熟悉 Flexbox 的人,原始规范只允许 box-flex 的整数属性。flex: autoflex: 30em 无法与可比较的 box-flex 属性兼容,因此 mixin 不会费心尝试)

@mixin flex($value: 0 1 auto, $wrap: $flex-wrap-required, $legacy: $flex-legacy-enabled) {
    @if $legacy and unitless(nth($value, 1)) {
        @include legacy-flex(nth($value, 1));
    }

    @include experimental(flex, $value, flex-support-common()...);
}

@mixin legacy-flex($value: 0) {
    @include experimental(box-flex, $value, $box-support...);
}

关于css - 将单位类型附加到 Sass 中的计算结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13905407/

相关文章:

SASS混合: only apply hover style if class is on a link?

css - 我怎样才能排除 sass-lint 上的某种错误?

css - 空样式 (.css/.scss) 文件

javascript - Chrome 中的 HTML 表格分页符打印

html - 悬停文本时更改父 div 背景颜色

javascript - 如何使用jquery在跨域iframe中更改css 跨域意味着外部链接

css - SASS 变量和继承

html - parent 的背景颜色与 child 的高度相匹配,上下边距为负

css - 无法在 android-4.2 中看到图标

sass - 如何在 aurelia 中设置使用 repeat.for 生成的 li 之一的样式?