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

目录

一、@mixin

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

位置传参

关键词传参

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

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

二、@function

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

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

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

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

一、@mixin

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

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

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

css 复制代码
@mixin testStyle ($property,$value:2px , $color:#000) {
   //....
}


.outer {

  @include testStyle(font,3px)
}

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

位置传参

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

关键词传参

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

css 复制代码
@mixin testStyle ($property,$value:2px , $color:#000) {
   //....
}


.outer {

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

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

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

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

css 复制代码
@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()对参数列表进行转换。 示例如下:

css 复制代码
//导入内置的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的追加内容

使用方法如下代码:

css 复制代码
//写一段媒体查询的样式
@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函数来实现。

css 复制代码
@use "sass:string";

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

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

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

相关推荐
Lupino几秒前
被 React “玩弄”的 24 小时:为了修一个不存在的 Bug,我给大模型送了顿火锅钱
前端·react.js
米丘7 分钟前
了解 Javascript 模块化,更好地掌握 Vite 、Webpack、Rollup 等打包工具
前端
Heo9 分钟前
深入 React19 Diff 算法
前端·javascript·面试
滕青山10 分钟前
个人所得税计算器 在线工具核心JS实现
前端·javascript·vue.js
小怪点点10 分钟前
手写promise
前端·promise
国思RDIF框架19 分钟前
RDIFramework.NET Web 敏捷开发框架 V6.3 发布 (.NET8+、Framework 双引擎)
前端
Mintopia20 分钟前
如何在有限的时间里,活出几倍的人生
前端
炫饭第一名21 分钟前
速通Canvas指北🦮——变形、渐变与阴影篇
前端·javascript·程序员
Neptune122 分钟前
让我带你迅速吃透React组件通信:从入门到精通(上篇)
前端·javascript
阿懂在掘金23 分钟前
Vue 表单避坑(一):为什么 v-model 绑定对象属性会偷偷修改父组件数据?
前端·vue.js