【问题标题】:Sass mixin position stickySass mixin 位置粘滞
【发布时间】:2018-04-20 20:11:31
【问题描述】:

这是我使用 SASS 的第一天,如果这听起来很简单,我很抱歉。

我正在尝试为我目前拥有的position: sticky; 应用 mixin:

@mixin position($sticky) {
  -webkit-position: $sticky;
     -moz-position: $sticky;
      -ms-position: $sticky;
       -o-position: $sticky;
          position: $sticky;
}

.menu-link{
    z-index: 12;
    @include position($sticky);
}

我来了

正文:之前 {
空白:pre;
字体系列:等宽;
内容:“错误:未定义的变量:\”$sticky\”.\A on line 70

我从这个例子开始工作:

@mixin border-radius($radius) {
  -webkit-border-radius: $radius;
     -moz-border-radius: $radius;
      -ms-border-radius: $radius;
          border-radius: $radius;
}

.box { @include border-radius(10px); }

我看到我没有定义 (10px) 或等效项,但我认为没有任何东西可以放在这里作为位置,所以我不确定为什么在这种情况下我会得到未定义的变量。

如果我只是输入@include position; 我会得到

错误:混合位置缺少参数 $sticky.\A

【问题讨论】:

    标签: sass mixins


    【解决方案1】:

    我认为您的意思是使用 .menu-link { @include position(sticky); } 而不是 $sticky。您正在尝试使用 SASS 变量,而不是 CSS 属性。

    在您从中提取的示例中,mixin 正在寻找参数$radius。 参数以 10px 的形式传入,因此在 mixin $radius = 10px 中。

    在您的代码中,您正在寻找$sticky。您尝试使用未定义的变量 $sticky 而不是参数sticky 来调用mixin。如果在调用 mixin 之前已经定义了变量名,则可以使用它。

    示例

    @mixin position($sticky) {
      -webkit-position: $sticky;
      -moz-position: $sticky;
      -ms-position: $sticky;
       -o-position: $sticky;
          position: $sticky;
    }
    
    $sticky: sticky;
    
    .menu-link{
      z-index: 12;
      @include position($sticky);
    }
    

    【讨论】:

      【解决方案2】:

      您实际上为任何位置值创建了一个 mixin。变量名称是“粘性的”,但它可以保存任何值。这个:

      @mixin position($sticky) {
        -webkit-position: $sticky;
        -moz-position: $sticky;
        -ms-position: $sticky;
         -o-position: $sticky;
            position: $sticky;
      }
      

      等价于:

      @mixin position($pos) {
        -webkit-position: $pos;
        -moz-position: $pos;
        -ms-position: $pos;
         -o-position: $pos;
            position: $pos;
      }
      

      它适用于任何位置值:

      .menu-link{
        z-index: 12;
        @include position(sticky);
        @include position(relative);
        @include position(absolute);
      }
      

      如果只是对位置感兴趣:粘性;

      @mixin stickyPosition {
        -webkit-position: sticky;
        -moz-position: sticky;
        -ms-position: sticky;
         -o-position: sticky;
            position: sticky;
      }
      
      .menu-link{
            z-index: 12;
            @include stickyPosition;
      }
      

      我希望它有所帮助。 :)

      【讨论】:

        【解决方案3】:

        您可能可以通过使用一些浏览器前缀函数来稍微清理一下,这样您就不必写出浏览器前缀。

        @mixin prefix($declarations, $prefixes: ()) {
           @each $property, $value in $declarations {
              @each $prefix in $prefixes {
                 #{'-' + $prefix + '-' + $property}: $value;
              }
              // Output standard non-prefixed declaration
              #{$property}: $value;
           }
        }
        
        .menu {
            &-link {
               @prefix((position: sticky), webkit moz ms o);
               z-index:12;
            }
            // other menu classes
        }
        

        【讨论】:

        • 顺便说一句,您可以将该 mixin 用于任何浏览器前缀,而不仅仅是粘性 ;)
        • 老实说,你最好的办法是把这个节点模块扔到你的资产构建管道中。然后你只需编写普通的 CSS,告诉它你需要支持哪些浏览器,它会根据 caniuse 数据自动添加必要的前缀规则。它也适用于旧的 IE 规则,它们有时不会简单地将“-ms-”放在前面(例如 -ms-flex-pack)。 github.com/postcss/autoprefixer 如果您的目标浏览器多年来一直支持这些规则,这还有一个额外的好处,即不会无缘无故地让您的输出 CSS 像 5x 一样长。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 2013-03-01
        • 2021-04-17
        • 1970-01-01
        • 2013-03-14
        • 2011-10-31
        相关资源
        最近更新 更多