【问题标题】:SCSS reusable functionSCSS 可重用函数
【发布时间】:2013-06-28 00:15:27
【问题描述】:

我的 sass 文件中有一个错误,我不知道它有什么问题...

这是我拨打.class{ col(6);收到的消息

error scss/components.scss (Line 18: Invalid CSS after "...gin:7px 0; col": expected "{", was "(6);")

这是用于创建函数的函数和变量(如果有点混乱,请见谅):

$columnWidth:40;
$numberOfColumns:16;
$gutterWidth: 20;

$fullWidth:($columnWidth * $numberOfColumns) +  ($gutterWidth * $numberOfColumns); 

@function perc($target) {
  @return (($target / $fullWidth) * 100%);
}

@function gw($n, $fluid: false) {
  $calculatedValue: ($n * $columnWidth + ($n - 1) * $gutterWidth);
  @if $fluid == false {  
    @return $calculatedValue + px;  
  } @else { 
    @return perc($calculatedValue);
  }
}

@function col($n, $fluid: false){  
  @return unquote("width: gw($n, $fluid);");
}

我要做的就是重新使用gw()函数,这样我就可以在css中使用它来输出列数作为宽度css属性,即grid(4);将输出width: 200px;

函数 gw 可以正常工作,因为它可以正确生成我的网格 css,但是我想定义一个全局函数以在任何地方使用。因此col() 函数。

【问题讨论】:

  • 您忘记添加实际失败的代码。似乎所有这些功能都有效。此外,您不应该将col 设为mixin 吗?看看stackoverflow.com/a/12319330/538866
  • 我在上课时打电话给.class{ col(6);",这就是它正在死去的地方。 mixin 会起作用吗?如果我会使用它,但我更喜欢一个函数,主要是因为添加 @JonasG.Drange 很短
  • A mixin 会更容易,因为您可以将 SCSS 放入其中,而不是 unquote 等等。 :) 但是,是的,你需要在它前面有@include

标签: css function sass


【解决方案1】:

mixin 就像一个函数,但除了它的主体之外不返回任何东西,它可以是完整的 SCSS。

因此您可以通过将col 设置为mixin 来解决此问题,如下所示:

@mixin col($n, $fluid: false){  
  width: gw($n, $fluid);
}

然后你可以调用:

.class{ @include col(6) };

产生:

.class {
  width: 340px; }

【讨论】:

  • 但是如果我想用一个函数来做到这一点,我该怎么做呢?不过谢谢你的回答
  • 因为 mixins 不返回任何东西,它们被它们的 body 替换。 SASS 函数当前无法调用它们/与它们交互。所以你有点卡在@include 关键字上。这并不全是坏事,因为函数应该都是逻辑,没有 CSS。 :)
【解决方案2】:

函数只能用于返回简单类型(字符串、颜色、数字等)或简单类型列表。它不能用于返回属性/值(例如“颜色:红色”):当您这样做时,您所能得到的只是一个字符串或字符串列表(并且不能以这种方式使用字符串)。与简单地使用mixin相比,处理字符串列表对你来说更有用。

@function foo() {
    @return color red;
}

.foo {
    $kv: foo();
    #{nth($foo, 1)}: #{nth($foo, 2)}
}

比较:

@mixin foo() {
    color: red;
}

.foo {
    @include foo;
}

您的 gw() 函数本质上不可重用(事实上,它比您梦寐以求的不可能的功能更多可重用):它返回可用于 any 属性的数值。事实上,使用它代替 mixin 或返回字符串列表的函数是处理您要查找的内容的最有效方法:

.foo {
    width: gw(1);
}

【讨论】:

  • gw 函数是一个主函数,我确实想将 cols 函数分开,因为我还想从 gw 函数创建另外 4 个函数。更改每个函数的默认值,以便有必要。我还希望我的函数按照我的示例生成宽度属性,所以再次有必要。
  • 对不起,投反对票是为了什么?正如您在 OP 中所拥有的那样,该代码是充满冗余的冗余代码。如果它没有显示完整的图片,那么没有提供足够的代码。
  • 投反对票是因为你没有阅读这篇文章,我问,并在我的问题标题“SCSS 可重用功能”中明确说明。看来你理解错了。我在整个 OP 中清楚地写道,我想重新使用该功能。这就是这个问题的重点,不是codereview.stackexchange.com/‎
  • 提出问题时,希望 OP 对他们所询问的主题有基本的了解,而您在此处显示的内容很少。你想要的是无效的 Sass 并且可能永远不会。我更新的答案包含您关于此主题的only选项。
  • 这正是人们来这里的原因,不是吗?找出他们是否在做正确的事情。实际上,我已经知道@jonas 在您的答案上方提供的另一个选项也比您的答案更好。我如何表现出对这个主题的“非常少”的理解,我清楚地知道足够的 sass 来创建开始的功能。你太可笑了。
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2010-10-21
  • 1970-01-01
  • 2016-05-08
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多