【SASS/SCSS(三)】样式的复用与动态计算(@mixin和@function)

目录

一、@mixin

1、定义复用的样式代码,接受传参,搭配@include使用。

 位置传参

关键词传参

...语法糖接受传入的任意参数

2、在@mixin中使用@content,获取外部对mixin的追加内容

二、@function

三、字符串——值得注意的点

很多时候,我们在写样式的时候,会发现在同一套样式主题下,许多样式代码会被重复使用。在原生的css中,我们只能通过class和选择器的组合来尽量使得样式代码简洁。

在sass中,除了选择器的嵌套语法外,其提供的@mixin和@function可以实现高能的代码复用

接下来我们详细学习两者的使用。

一、@mixin

1、定义复用的样式代码,接受传参,搭配@include使用。

在下面的例子中,mixin中使用了 & 代替父选择器。而这个 & 指向的是@include样式引入所在位置的父选择器

但mixin中的参数声明时,使用了默认赋值,则其会变成可选参数,外面使用该mixin时设置了默认值的参数可不必要传入新的值

@mixin testStyle ($property,$value:2px , $color:#000) {
   //....
}


.outer {

  @include testStyle(font,3px)
}

mixin传参可接受的方式有 位置传参、关键词传参 以及 用...语法糖接受传入的任意参数组成列表

  •  位置传参

位置传参即如上所示,按照位置顺序一一传入相应的参数

  • 关键词传参

关键词传参,是在传入参数前,指定此时传入的参数对应的是哪个

@mixin testStyle ($property,$value:2px , $color:#000) {
   //....
}


.outer {

  @include testStyle(font,$color: #fff)
}

这种传参更加安全,尤其是在定义了默认可选参数时,传参可以不必拘泥于位置,而是直接通过关键词锁定。 

  • ...语法糖接受传入的任意参数

语法糖传入后,mixin中的args变成一个参数列表。注意,...跟在后面

@mixin order($height, $selectors...) {
  @for $i from 0 to length($selectors) {
    #{nth($selectors, $i + 1)} {
      position: absolute;
      height: $height;
      margin-top: $i * $height;
    }
  }
}

@include order(150px, "input.name", "input.address", "input.zip");


如果想将参数列表以 map 的形式访问,可以同时获取参数列表中的 key和value,可以用 meta.keywords()对参数列表进行转换。 示例如下:

//导入内置的meta
@use "sass:meta";

@mixin colors-customize($args...) {
    //用@debug控制台输出其返回值
    @debug meta.keywords($args);   
    //输出: (string: #080, comment: #800, variable: #60b)
    
    //用each遍历map的key和value
    @each $name,$color in meta.keywords($args) {
        div span.color-#{$name}{
            color: $color;
        }
    }
}



//引入mixin中定义的样式
@include colors-customize (
      $string: #080,
      $comment: #800,
      $variable: #60b,
)

2、在@mixin中使用@content,获取外部对mixin的追加内容

使用方法如下代码:

//写一段媒体查询的样式
@mixin media-query($types...) {
    @each $type in $types {
        //css语法中的@media媒体查询方法
        @media #{$type} {
            //外部内容块中使用了该作用域内定义的变量
            @content($type);
        }
    }
}


//用using引入变量
@include media-query(screen,print) using ($type) {
    h1{
        font-size: 40px;
        @if $type == print {
            font-family: Calluna;
        }
    }

}

二、@function

@function与@mixin不同的点在于:

  • @function不会直接被引用函数体内的内容,而是经过函数内部的计算,用@return返回需要使用的变量值
  • @function不需要借助@include,可以在声明后直接调用

@function也可以位置传参、关键词传参、默认值可选参数、接收参数列表等。因此这里仅仅对其使用举个示例:

除了自定义的函数外,sass提供一些内置函数,可被直接调用例如:var()、rgb()、radial-gradient(#f2ece4,#e1d7d2)等等 。

所有的内置模块以及内置全局函数,可查见于:Sass: Built-In Modules

三、字符串——值得注意的点

一般情况下,sass中符合scss语法的值,即使是字符串都不含有引号,作为关键字/标识直接使用。

但其实scss既支持有引号的字符串解析,又支持无引号的字符串,只是应用场景不同

两者的互换可以用内置模块string提供的unquote和quote函数来实现。

@use "sass:string";

@debug string.unquote(".widget:hover"); // .widget:hover
@debug string.quote(bold); // "bold"

另外,在#{ }传入变量时,变量中的字符串引号会被自动去掉。但不建议使用该方法去除字符串引号!

如果要保留引号,则直接传递即可: 

相关推荐

  1. react经验14:动态修改第方组件样式

    2024-07-19 06:04:02       26 阅读
  2. vue 中 mixin 应用场景,原理合并规则

    2024-07-19 06:04:02       31 阅读
  3. 函数function{}return含义

    2024-07-19 06:04:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 06:04:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 06:04:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 06:04:02       57 阅读
  4. Python语言-面向对象

    2024-07-19 06:04:02       68 阅读

热门阅读

  1. C++ STL partition用法

    2024-07-19 06:04:02       19 阅读
  2. Vue 3路由详解:从基础配置到高级技巧

    2024-07-19 06:04:02       19 阅读
  3. MQTT 固定报头中的剩余长度介绍

    2024-07-19 06:04:02       21 阅读
  4. uniapp自定义tabBar

    2024-07-19 06:04:02       21 阅读
  5. Redis

    2024-07-19 06:04:02       14 阅读
  6. 构建RSS订阅机器人:观察者模式的实践与创新

    2024-07-19 06:04:02       20 阅读