一、内置函数变亮和变暗颜色
内置函数:可以自动变化颜色
lighten
和 darken
函数都是通过增加或者减小 HSL 中颜色的亮度来实现调节的。
$amount: 50%;
h1 {
$color1: #000000;
color: lighten($color1, $amount);
}
h2 {
$color2: #ffffff;
color: darken($color2, $amount);
}
二、列表(Lists)
列表就是 Sass 的数组。列表是一个一维的数据结构(不同于 maps
),用于保存任意类型的数值(包括列表,从而产生嵌套列表)。
$font-stack: ('Helvetica', 'Arial', sans-serif);
三、Maps
$breakpoints: (
'small': 767px,
'medium': 992px,
'large': 1200px,
);
多个变量建议使用map
,因为:最重要的优势就是 map 的遍历功能,这在多个不同变量中是不可能实现的。另一个支持使用 map 的原因,是它可以创建 map-get()
函数以提供友好 API 的功能。比如,思考一下下述 Sass 代码:
map-get(map,key)
$font-sizes: ("small": 12px, "normal": 18px, "large": 24px);
$z-indexes: (
"modal": 5000,
"dropdown": 4000,
"default": 1,
"below": -1
);
h1 {
font-size: map-get($font-sizes, "small"); // 12px
z-index: map-get($z-indexes, 'modal'); // 5000
}
四、变量的作用域标识符
-
!default
:有利于开发者重写样式 -
!global
:默认不写
!default
:
如果创建一个库、框架、栅格系统甚至任何的 Sass 片段,是为了分发经验或者被其他开发者使用,那么与之配置的所有变量都应该使用 !default
标志来定义,方便其他开发者重写变量。
// your-library
$baseline: 1em !default;
开发者才能在引入你的库之前定义自用的 $baseline
,引入后又不必担心自己的值被重定义了。
// 开发者自己定义的变量来覆盖第三方库的样式
$baseline: 2em;
// 引入第三方库,当不加 !default 会默认覆盖第二行的变量
@import "your-library";
// 最后输出:$baseline == 2em;
!global
:
!global
标志应该只在局部范围的全局变量被覆盖时使用。定义根级别的变量时,!global
标志应该省略。
$baseline: 2em;
五、扩展@Extend
@extend
:它允许一个选择器继承另一个选择器的所有样式,从而减少重复代码并提高样式的可维护性。
例如:
sass代码
%button {
display: inline-block;
padding: 10px;
border-radius: 5px;
}
.button-primary {
@extend %button;
background-color: blue;
color: white;
}
编译后
.button-primary {
display: inline-block;
padding: 10px;
border-radius: 5px;
background-color: blue;
color: white;
}
📖知识点:使用
%
占位符类
%button
是一个占位符类,不会直接生成 CSS 代码。- 只有当它被
@extend
引用时,才会将它的样式应用到实际的选择器中。
六、混合(Mixin)
通过@mixin
定义变量,@include
使用变量,@content
作占位
- 无参混合
- 含参混合
无参混合:
@mixin content {
width: 100px;
height: 100px;
background-color: sandybrown
};
h1 {
@include content;
}
含参混合:
- 用法1
@mixin content($width, $height, $color) {
width: $width;
height: $height;
background-color: $color;
};
h1 {
@include content(100px, 100px, #ff8c00);
}
也可以给默认值
@mixin content1($width: 100px, $height: 100px, $color: blue) {
width: $width;
height: $height;
background-color: $color;
}
h2 {
@include content1;
}
- 用法2
使用...
将参数展开
@mixin content($width, $height, $color) {
width: $width;
height: $height;
background-color: $color;
}
h1 {
$params: (100px, 100px, #ff8c00);
@include content($params...);
}
@content
:
通常用于在调用@mixin
时插入传递的内容
@mixin myMixin {
color: blue;
@content;
}
.demo {
@include myMixin {
font-size: 20px;
}
}
编译后:
.demo {
color: blue;
font-size: 20px;
}
七、条件语句
Sass 通过 @if
和 @else
指令提供了条件语句
$flag: true;
@if $flag {
h2 {
color: blue;
}
} @else {
h2 {
color: red;
}
}
八、循环
- @each
- @for
1、@each
@each
循环绝对是 Sass 提供的三个循环方式中最常用的。它提供了一个简洁的 API 来迭代列表或 map。
- 遍历list
$themes: (
red,
yellow,
green,
blue,
purple
);
$prefix: 'my-theme';
@each $theme in $themes {
.#{$prefix}-#{$theme} {
background-color: $theme;
}
}
#{}
语法:用于在 SCSS 中插入变量的值。- 动态生成类名:在选择器中使用
#{}
可以根据变量的值动态生成类名。- 避免字面字符串:不使用
#{}
时,变量会被当作字面字符串处理,而不是变量的值。
生成的结果为:
.my-theme-red {
background-color: red;
}
.my-theme-yellow {
background-color: yellow;
}
.my-theme-green {
background-color: green;
}
.my-theme-blue {
background-color: blue;
}
.my-theme-purple {
background-color: purple;
}
- 遍历map
$map: (
'red': red,
'yellow': yellow,
'green': green,
'blue': blue,
'purple': purple
);
@each $key, $value in $map {
.section-#{$key} {
background-color: $value;
}
}
2、@for
当需要聚合伪类 :nth-*
的时候,使用 @for
循环很有用。除了这些使用场景,如果必须迭代最好还是使用 @each
循环。
@for $i from 1 through 10 {
.item:nth-of-type(#{$i}) {
color: hsl($i * 36, 50%, 50%);
}
}
编译后:
.item:nth-of-type(1) {
color: hsl(36, 50%, 50%);
}
.item:nth-of-type(2) {
color: hsl(72, 50%, 50%);
}
.item:nth-of-type(3) {
color: hsl(108, 50%, 50%);
}
.item:nth-of-type(4) {
color: hsl(144, 50%, 50%);
}
.item:nth-of-type(5) {
color: hsl(180, 50%, 50%);
}
.item:nth-of-type(6) {
color: hsl(216, 50%, 50%);
}
.item:nth-of-type(7) {
color: hsl(252, 50%, 50%);
}
.item:nth-of-type(8) {
color: hsl(288, 50%, 50%);
}
.item:nth-of-type(9) {
color: hsl(324, 50%, 50%);
}
.item:nth-of-type(10) {
color: hsl(360, 50%, 50%);
}
九、函数
1、基本使用
$width1: 10px;
$width2: 40px;
@function widthFn($n) {
@return $n * $width1 + ($n - 1) * $width2; // 5 * 10px + (4 * 40px) = 210px
}
.leng {
width: widthFn(5);
}
2、内置函数
sass的内置函数就如同js的对象原型上的方法一样,下面列举两个:
percentage()
percentage()
函数主要是将一个不带单位的数字转换成百分比形式
/*
错误写法,不能带单位
percentage(2px / 10px)
*/
div {
width:percentage(.2);
}
round()
round()
函数将一个数四舍五入为一个最接近的整数,在round()
函数中可以携带单位的任何数值。
div {
width: round(12.5px); // 13px
}
sassbem_416">十、sass实现bem规范
BEM(Block, Element, Modifier)是一种 CSS 命名规范,旨在提高代码的可读性和可维护性。BEM 规范通过明确的命名规则来定义组件和组件的各个部分,使开发者能够更容易地理解和维护代码。
BEM 命名规范的基本概念
- Block(块):代表一个独立的组件,类似于一个功能模块。例如,一个导航栏或按钮。
- Element(元素):代表块的组成部分,与块紧密相关,但不能单独存在。例如,按钮中的图标或导航栏中的菜单项。
- Modifier(修饰符):代表块或元素的不同状态或变体,用于修改块或元素的外观或行为。例如,按钮的大小或颜色变化。
命名规则
- 双下划线(
__
):用于连接块和元素。 - 双破折号(
--
):用于连接块或元素与修饰符。
例如:
button__element--disabled
1. ts部分
export const NAMESPACE = 'xt'
export function createNamespace(name: string) {
// 组件前缀
const prefixName = `${NAMESPACE}-${name}`
return createBEM(prefixName)
}
// 提供生成不同bem的方法
function createBEM(prefixName: string) {
const b = (blockSuffix?: string) => _bem({ prefixName, blockSuffix })
const e = (element?: string) => element && _bem({ prefixName, element })
const m = (modifier?: string) => modifier && _bem({ prefixName, modifier })
const be = (blockSuffix?: string, element?: string) => blockSuffix && element && _bem({ prefixName, blockSuffix, element })
const bm = (blockSuffix?: string, modifier?: string) => blockSuffix && modifier && _bem({ prefixName, blockSuffix, modifier })
const em = (element?: string, modifier?: string) => element && modifier && _bem({ prefixName, element, modifier })
const bem = (blockSuffix?: string, element?: string, modifier?: string) => blockSuffix && element && modifier && _bem({ prefixName, blockSuffix, element, modifier })
const is = (name: string, state: boolean) => state && `is-${name}`
return {
b,
e,
m,
be,
bm,
em,
bem,
is
}
}
// 生成bem
function _bem({
prefixName,
blockSuffix,
element,
modifier
}: {
prefixName: string
blockSuffix?: string
element?: string
modifier?: string
}) {
return (
`${prefixName}` +
`${blockSuffix ? `-${blockSuffix}` : ''}` +
`${element ? `__${element}` : ''}` +
`${modifier ? `--${modifier}` : ''}`
)
}
/**
*
const bem = createNamespace('button')
console.log(bem.b()) // xt-button
console.log(bem.b('box')) // xt-button-box
console.log(bem.e('element')) // xt-button__element
console.log(bem.m('primary')) // xt-button--primary
console.log(bem.be('icon', 'element')) // xt-button-icon__element
console.log(bem.bm('box', 'primary')) // xt-button-box--primary
console.log(bem.em('element', 'primary')) // xt-button__element--primary
console.log(bem.bem('box', 'element', 'primary')) // xt-button-box__element--primary
console.log(bem.is('disabled', true)) // is-disabled
*/
sass_507">2. sass部分
@use './common.scss' as *; // * 表示导入全部
/**
导入的内容:
$namespace: 'xt';
$element-separator: '__';
$modifier-separator: '--';
$state-prefix: 'is-';
*/
@mixin b($block) {
$b: $namespace + '-' + $block;
.#{$b} {
@content;
}
}
// @at-root:将选择器的上下文提升到根级别
@mixin e($element) {
@at-root {
#{& + $element-separator + $element} {
@content;
}
}
}
@mixin m($modifier) {
@at-root {
#{& + $modifier-separator + $modifier} {
@content;
}
}
}
@mixin is($state) {
@at-root {
&.#{$state-prefix + $state} {
@content;
}
}
}
sass_552">3. 如何利用sass生成一系列颜色
这种用法在组件库使用较多
@use './common.scss' as *;
$colors: (
primary: #409eff,
success: #67c23a,
warning: #e6a23c,
danger: #f56c6c,
info: #909399
);
@function round-rgb($color) {
$r: round(red($color) * 10) / 10;
$g: round(green($color) * 10) / 10;
$b: round(blue($color) * 10) / 10;
@return rgb($r, $g, $b);
}
:root {
@each $key, $color in $colors {
--#{$namespace}-color-#{$key}: #{$color};
@for $i from 2 through 9 {
@if $i % 2 != 0 {
$brightness-increase: min($i * 5%, 30%); // 限制亮度增加的最大值为 30%
$new-color: round-rgb(lighten($color, $brightness-increase));
--#{$namespace}-color-#{$key}-light-#{$i}: #{$new-color};
}
}
--#{$namespace}-color-#{$key}-dark-2: #{round-rgb(darken($color, 10%))};
}
}
@function get-color($key) {
@return var(--#{$namespace}-color-#{$key});
}
生成的值为: