Sass 支持所有CSS3的 @规则,以及一些已知的其他特定的Sass "指令"。这些在 Sass 都有对应的效果,更多资料请查看 控制指令 (control directives) 。今天重点讲mixins/include/extend
- @at-root限定输出在文档的根层级上,而不是被嵌套在其父选择器下。
- @extend 继承另一选择器样式
- @mixin 指令允许我们定义一个可以在整个样式表中重复使用的样式。
- @include 指令可以将混入(mixin)引入到文档中。
@extend
当一个样式类(class)含有另一个类的所有样式,并且它自己的特定样式。我们使用@extend
代码语言:javascript复制.error {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
编译为
代码语言:javascript复制.error, .seriousError {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
border-width: 3px;
}
@extend通过在样式表中出现被扩展选择器(例如.error)的地方插入扩展选择器(例如.seriousError)
混合(mixins)
混入(mixin)通过 @mixin 指令定义。在它后面跟混入的名称和任选的arguments(参数),以及混入的内容块。
Mixin有点像C语言的宏(macro),是可以重用的代码块。使用@mixin命令,定义一个代码块。
@mixin命令应用
使用@mixin命令,可以指定参数和缺省值。
代码语言:javascript复制@mixin left($value: 10px) {
float: left;
margin-right: $value;
}
使用的时候,根据需要加入参数:
代码语言:javascript复制div {
@include left(20px);
}
下面是一个mixin的实例,用来生成浏览器前缀。
代码语言:javascript复制@mixin rounded($vert, $horz, $radius: 10px) {
border-#{$vert}-#{$horz}-radius: $radius;
-moz-border-radius-#{$vert}#{$horz}: $radius;
-webkit-border-#{$vert}-#{$horz}-radius: $radius;
}
#navbar li { @include rounded(top, left); }
#footer { @include rounded(top, left, 5px); }
再来个复杂点的
scss换肤
- 添加全局样式,动态改变主题
- 通过scss 定义多套主题
- 使用混合模式动态取值
// 1.主题定义
$theme-default: (
font-color: red,
font-size: 14px,
background: pink,
);
$theme-green: (
font-color: green,
font-size:18px,
background: yellow,
);
$theme-blue: (
font-color: blue,
font-size:24px,
background: #fff,
);
// 2.将定义好到主题添加到map中
$themes:(
default:$theme-default,
green:$theme-green,
blue:$theme-blue,
);
// 4. 调用混合指令themify() ,定义规则,此处到规则会替换@content
@mixin mytheme{
@include themify() {
color: themed("font-color");
font-size: themed("font-size");
.test-theme {
background: themed("background");
}
}
};
// 3.定义混合指令, 切换主题,并将主题中到所有规则添加到theme-map中
@mixin themify() {
@each $theme-name, $map in $themes {
// & 表示父级元素
// !global 表示覆盖原来的
.theme-#{$theme-name} & {
$theme-map: () !global;
// 循环合并键值对
@each $key, $value in $map {
$theme-map: map-merge($theme-map, ($key: $value)) !global;
}
// 表示包含 下面函数 themed()
@content;
$theme-map: null !global;
}
}
}
// 通过key获取map中到值
@function themed($key) {
@return map-get($theme-map, $key);
}
这里需要熟悉 Sass Maps的语法
Sass Maps的语法
Maps代表一个键和值对集合,其中键用于查找值。
Sass的map使用一个括号,并用冒号将键值与值分隔开来,并且使用逗号将一对键值/值隔开。下面是一个有效的Sass的map:
代码语言:javascript复制$map: (
key1: value1,
key2: value2,
nextKey: nextvalue,
other-key: other-value
);
键值不一定是字符串,他可以是任何类型。甚至是null,甚至是map。
- map中的最后一对键值/值后面的逗号可以省略
- 键值必须是唯一的
- 键值/值可以是Sass的任何类型,包括列表和其他的Sass map
Maps的主要操作使用的是 SassScript 函数。map-get函数用于查找map中的值,map-merge函数用于添加值到map中的值, @each 指令可以用来为 map 中的每个键值对添加样式。map中键值对的顺序和map创建时始终相同。
- map-get()方法来找出某个key的value
- map-has-key()检测出某个key是否存在
- map-merge()合并两个甚至更多个maps成一个
$colors: (
light: #ccc,
dark: #000
);
$brand-colors: (
main: red,
alternative: blue
);
.element {
//判断是否存在light颜色
@if map-has-key($colors, light){
color: map-get($colors, light);
} @else {
color: map-get($brand-colors, light);
content: 'color Map has not this key.'
}
}
// 合并maps
$merged: map-merge($colors, $brand-colors);
.element {
content: map-get($merged, alternative);
}
这个只是用法说明
sass map的经典案例
代码语言:javascript复制// _m-buttons.scss
$buttons: (
error: (#d82d2d, #666),
success: (#52bf4a, #fff),
warning: (#c23435, #fff)
);
.m-button {
display: inling-block;
padding: .5em;
background: #ccc;
color: #666;
@each $name, $colors in $buttons {
$bgcolor: nth($colors, 1);
$fontcolor: nth($colors, 2);
&--#{$name} {
background-color: $bgcolor;
color: $fontcolor;
}
}
}
参考文章:
介绍Sass Maps:用法跟例子 https://aotu.io/notes/2015/12/09/an-introduction-to-sass-maps/index.html
使用Sass Maps https://www.w3cplus.com/preprocessor/using-sass-maps.html
新手也可以輕鬆玩轉 SASS - @mixin and @include https://5xruby.tw/posts/play-sass-mixin-and-include/
extend、mixin、function使用時機 https://icguanyu.github.io/scss/scss_2/
Sass (3.4.21) 中文文档 https://www.html.cn/doc/sass/#mixins
转载本站文章《SASS详解@mixins/@include/@extend/@at-root》, 请注明出处:https://www.zhoulujun.cn/html/webfront/style/sass/2020_0827_8550.html