内置函数

sass官网提供了很多实用的内置函数,当然目前我也是在一步一步探索这些函数。目前我会将常用到的内置函数以及场景分享给大家使用。

1、darken

lighten()和darken()两个函数都是围绕颜色的亮度值做调整的,其中lighten()函数会让颜色变得更亮,与之相反的darken()函数会让颜色变得更暗。这个亮度值可以是0~1之间。

lighten(#fff,10%) //原色的亮度值 增加百分之10亮度
draken(#fff,10%) // 在原色的基础上 减少百分之10亮度

应用场景
lighten和darken这两个内置函数经常被用到元素被hover/focus时,当我们hover,一个元素的时候。此时并不希望改变这个元素的色值,但是又想要用户感知到鼠标停留在这个元素上。此时这两个内置函数就发挥了他们的作用了。

@mixin button-type($background,$border,$color,$hover-background: lighten($background, 7.5),$hover-border: lighten($border, 10%),$hover-color: $color
) {color: $color;background: $background;border-color: $border;&:hover {color: $hover-color;background: $hover-background;border-color: $hover-border;}&:focus,&.is-focus {color: $hover-color;background: $hover-background;border-color: $hover-border;}&[disabled],&.is-disabled {color: $color;background: $background;border-color: $border;}
}

2、desaturate

饱和度(Saturation)是指色彩的纯度,饱和度越高色彩越纯越浓,饱和度越低则色彩变灰变淡。

lighten(#fff,10%) //原色的亮度值 增加百分之10亮度
draken(#fff,10%) // 在原色的基础上 减少百分之10亮度

应用场景
lighten和darken这两个内置函数经常被用到元素被hover/focus时,当我们hover,一个元素的时候。此时并不希望改变这个元素的色值,但是又想要用户感知到鼠标停留在这个元素上。此时这两个内置函数就发挥了他们的作用了。

@mixin button-type($background,$border,$color,$hover-background: lighten($background, 7.5),$hover-border: lighten($border, 10%),$hover-color: $color
) {color: $color;background: $background;border-color: $border;&:hover {color: $hover-color;background: $hover-background;border-color: $hover-border;}&:focus,&.is-focus {color: $hover-color;background: $hover-background;border-color: $hover-border;}&[disabled],&.is-disabled {color: $color;background: $background;border-color: $border;}
}

3、desaturate

饱和度(Saturation)是指色彩的纯度,饱和度越高色彩越纯越浓,饱和度越低则色彩变灰变淡。sass中的desaturate函数就是针对饱和度操作的内置方法。

desaturate($color, $amount) //=> color

使color饱和度降低,在color饱和度降低, 在color饱和度降低,在amount必须之间的数字0%和100%(包含)。

4、@warn

在编写mixins和function时,您可能希望阻止用户传递某些参数或某些值。它们可能正在传递现在已被弃用的遗留参数,或者它们可能以不太理想的方式调用您的API。简单来说在mixin或者function内部,我们可以通过@warn操作符给用户提示一些警告内容输出在控制台。

@mixin prefix($property, $value, $prefixes) {@each $prefix in $prefixes {@if not index($known-prefixes, $prefix) {@warn "Unknown prefix #{$prefix}.";}-#{$prefix}-#{$property}: $value;}#{$property}: $value;
}

控制台会提示:

Warning: Unknown prefix wekbit.example.scss 6:7   prefix()example.scss 16:3  root stylesheet

其实Inspect()函数用的比较少,主要是用来做校验类型的。Inspect(…)表达式中的内容如果是正常会返回对应的内容,如果发生错误则会弹出一个错误提示。

5、Map相关内容

①、Map-has-key

If keys∗∗isempty,returnswhether∗∗keys** is empty, returns whether **keys∗∗isempty,returnswhether∗∗map contains a value associated with $key.

如果keys为空,则返回keys为空,则返回keys为空,则返回map是否包含与$key关联的值。

$font-weights: ("regular": 400, "medium": 500, "bold": 700);map.has-key($font-weights, "regular"); // truemap.has-key($font-weights, "bolder"); // false

map.has-key()在scss中的条件判断时应用场景特别多。

比如下方这段代码:

$--sm: 768px !default;
$--md: 992px !default;
$--lg: 1200px !default;
$--xl: 1920px !default;$--breakpoints: ('xs' : (max-width: $--sm - 1),'sm' : (min-width: $--sm),'md' : (min-width: $--md),'lg' : (min-width: $--lg),'xl' : (min-width: $--xl)
);@mixin res($key, $map: $--breakpoints) {// 循环断点Map,如果存在则返回@if map.has-key($map, $key) {@media only screen and #{inspect(map-get($map, $key))} {@content;}} @else {@warn "Undefeined points: `#{$map}`";}
}

②、map.get(map,k1,k2,…)

简单来说就是通过key在map中取到对应的value

$config: (a: (b: (c: d)));
map.get($config, a, b, c); // d

6、占位符选择器%作用

定义
Sass 额外提供了一种特殊类型的选择器:占位符选择器 (placeholder selector)。与常用的 id 与 class 选择器写法相似,只是 # 或 . 替换成了 %。

比如:

%heading {margin-top: 0; // 1margin-bottom: $headings-margin-bottom;font-family: $headings-font-family;font-style: $headings-font-style;font-weight: $headings-font-weight;line-height: $headings-line-height;color: $headings-color;
}

应用场景:
其实使用%在大多数(所有)场景下,我的理解就是和@mixin是一样的效果。使用%占位符选择器的样式,只能被@extend进行调用。需要注意的是,如果使用占位符选择器%定义的样式,单独使用的时候(未通过extend)进行调用,那么这段样式是不会编译到css的输出结果之后的。

7、Partials import

定义
和css类似scss支持@import命令,但css的import命令每次调用都会创建一个额外的html请求,但scss的import命令是编译时将文件包含在css中,不需要额外发起请求。

如果我们需要导入 SCSS 或者 Sass 文件,但又不希望将其编译为 CSS,只需要在文件名前添加下划线,这样会告诉 Sass 不要单独编译这些文件,但导入语句中却不需要添加下划线。简单来说,项目目录中的所有scss文件在编译阶段都会被编译成为一个个css文件。

但是对于一个公用样式文件,此时我们并不需要将它编译成为单独的css文件,而是希望将公用文件中的样式插入到对应引入样式文件中,我们只需要在引入它的文件中将它编译进入引入的css文件中就可以。

此时给文件名称以_开头就可以告诉scss在编译阶段并不会将它编译成为单独的css文件,而是仅仅会将它的样式编译进入引入它的样式文件中去。

比如一个文件夹两个 scss 文件,一个 root.scss,一个 _vars.scss。

// 第一个 scss 文件夹名 -o 是输出文件夹名称``npx node-sass scss -o output``// 只会有一个文件生成
rendering Complete, saving .css file...
Wrote CSS to /Users/liusha/Public/vikingship/output/root.css //将 _vars 该名称为 vars.scss 再执行一遍
Rendering Complete, saving .css file...
Wrote CSS to /Users/liusha/Public/vikingship/output/root.css
Rendering Complete, saving .css file...
Wrote CSS to /Users/liusha/Public/vikingship/output/vars.css
会有两个文件生成

应用场景:
这在组件库的开发中是非常有用的,定义单独组件的样式文件以Partials import进行定义,不单独打包成为css文件,在最终导入的样式文件中统一进行合并管理而不打包出单独的css文件。

8、变量声明global与default

①、!default 默认变量

可以在变量的结尾添加 !default 给一个未通过 !default 声明赋值的变量赋值,此时,如果变量已经被赋值,不会再被重新赋值,但是如果变量还没有被赋值,则会被赋予新的值。

比如这样一段代码:

$color:red;
$color:blue !default;.modules-a {color: $color; // red
}

我们可以看到即使是先声明的red,因为blue !default,所以红色覆盖了蓝色。!default声明变量的意思就是说如果项目中存在相同的声明则优先使用别的声明,如果不存在则使用!default的值,可以理解为默认值。

②、!global全局声明

变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加 !global 声明

在scss中我们都清楚局部变量的定义是无法影响同名的global变量的。但是我们可以通过!global在局部作用域中去定义一个全局都可以使用的变量。同样也可以通过!default在局部作用域中去覆盖一个全局变量的值。

#main {$width: 5em !global;width: $width;
}#sidebar {// 同样可以使用$width全局变量width: $width;
}

编译为

#main {width: 5em;
}#sidebar {width: 5em;
}

9、mixin

参数变量…
有时,不能确定混合指令需要使用多少个参数,比如一个关于 box-shadow 的混合指令不能确定有多少个 ‘shadow’ 会被用到。这时,可以使用参数变量 … 声明(写在参数的最后方)告诉 Sass 将这些参数视为值列表处理.其实就类似于js中的…rest运算符。

@mixin box-shadow($shadows...) {-moz-box-shadow: $shadows;-webkit-box-shadow: $shadows;box-shadow: $shadows;
}
.shadows {@include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
}

编译后:

.shadowed {-moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;-webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
}

使用,分隔为.shadowed元素添加多个阴影。

10、@content-- 向混合样式中导入内容

在引用混合样式mixin的时候,可以先将一段代码导入到混合指令中,然后再输出混合样式,额外导入的部分将出现在 @content 标志的地方比如这样的代码,我们在include中填充了对应的样式,在mixin中可以通过@content使用。

@mixin apply-to-ie6-only {* html {@content;}
}
@include apply-to-ie6-only {#logo {background-image: url(/logo.gif);}
}

编译为

// mixin中接受了include 可以理解为插槽
* html #logo {background-image: url(/logo.gif);
}

为便于书写,@mixin 可以用 = 表示,而 @include 可以用 + 表示,所以上面的例子可以写成:

// = 简写mixin
=apply-to-ie6-only* html@content// + 简写include
+apply-to-ie6-only#logobackground-image: url(/logo.gif)

注意: 当 @content 在指令中出现过多次或者出现在循环中时,额外的代码将被导入到每一个地方。

11、@at-root

常规用法:
@at-root指令可以使一个或多个规则被限定输出在文档的根层级上,而不是被嵌套在其父选择器下。
比如

.parent {...@at-root .child { ... }
}

编译之后.child并不会嵌套在任何规则之下,因为使用了@at-root选择符

.parent { ... }
.child { ... }

@at-root同样也可以当作一个作用域给多个选择器去使用:

.parent {...@at-root {.child1 { ... }.child2 { ... }}.step-child { ... }
}

编译后:

.parent { ... }
.child1 { ... }
.child2 { ... }
.parent .step-child { ... }

支持参数
@at-root (without: …) and @at-root (with: …)

默认使用@at-root不传递任何时,他的作用为跳出选择器的作用域嵌套,当然可以传递参数去使用。

比如下面的@at-root意为跳出@media的嵌套:

@media print {.page {width: 8in;@at-root (without: media) {color: red;}}
}
@media print {.page {width: 8in;}
}
.page {color: red;
}

默认 @at-root 只会跳出选择器嵌套,而不能跳出@media或 @support,如果要跳出这两种,则需使用 @at-root(without: media),@at-root(without: support)。这个语法的关键词有四个:

  • all(表示所有)
  • rule(表示常规,默认行为。
  • media(表示 media)
  • support(表示 support )。

我们默认的 @at-root 其实就是 @at-root( without: rule ):跳出作用域嵌套规则。

Ⅰ、@at-root(without: rule)
rule 关键词只能跳出选择器嵌套,不能跳出 @media 和 @support

Ⅱ、@at-root(without: media)
可以跳出 @media ,但是没有跳出父级选择器

Ⅲ、@at-root(without: support)
@at-root(without: support) 和 @at-root(without: media) 相似,只是跳出的是 @support。

Ⅳ、@at-root(without: all)
@at-root(without: all) 是跳出所的指令和规则,如上面的代码里 @at-root(without: media rule) 我们可以换成 @at-root(without: all),效果是一样的。

12、@each in

maps数据格式
首先我们来说说在scss中定义类似js中的对象。

$map: (key1: value1, key2: value2, key3: value3);

我们通过()就可以定义了。比如这样的Maps结构定义。

$blue: #0d6efd !default;
$indigo: #6610f2 !default;
$purple: #6f42c1 !default;
$pink: #d63384 !default;
$red: #dc3545 !default;
$orange: #fd7e14 !default;
$yellow: #fadb14 !default;
$green: #52c41a !default;
$teal: #20c997 !default;
$cyan: #17a2b8 !default;$primary: $blue !default;
$secondary: $gray-600 !default;
$success: $green !default;
$info: $cyan !default;
$warning: $yellow !default;
$danger: $red !default;
$light: $gray-100 !default;
$dark: $gray-800 !default;$theme-colors: ('primary': $primary,'secondary': $secondary,'success': $success,'info': $info,'warning': $warning,'danger': $danger,'light': $light,'dark': $dark,
);

我们定义了一个maps的主题,分别存在对应的名称和对应的颜色值。

@each 指令的格式是 $var in , $var 可以是任何变量名,比如 $length 或者 $name,而 是一连串的值,也就是值列表。

"数组"迭代
@each 将变量 $var 作用于值列表中的每一个项目,然后输出结果,例如:

@each $animal in puma, sea-slug, egret, salamander {.#{$animal}-icon {background-image: url('/images/#{$animal}.png');}
}

编译为

.puma-icon {background-image: url('/images/puma.png'); }
.sea-slug-icon {background-image: url('/images/sea-slug.png'); }
.egret-icon {background-image: url('/images/egret.png'); }
.salamander-icon {background-image: url('/images/salamander.png'); }

此时类似于js中的数组迭代。

对象迭代
当然@each val,val,val,key in maps,也支持"迭代"一个对象(maps)。比如:

@each $key, $value in $theme-colors {.#{$prefix}-icon--#{$key} {color: $value;}
}

这样我们就迭代了上边定义的$theme-colors这个对象,并且取得了他的key,value。

多个值迭代
@each 指令也可以使用多个变量,如@each $var1, $var2, … in 。如果是列表列表,则子列表的每个元素都分配给相应的变量。例如:

@each $animal, $color, $cursor in (puma, black, default),(sea-slug, blue, pointer),(egret, white, move) {.#{$animal}-icon {background-image: url('/images/#{$animal}.png');border: 2px solid $color;cursor: $cursor;}
}

编译为:

.puma-icon {background-image: url('/images/puma.png');border: 2px solid black;cursor: default; }
.sea-slug-icon {background-image: url('/images/sea-slug.png');border: 2px solid blue;cursor: pointer; }
.egret-icon {background-image: url('/images/egret.png');border: 2px solid white;cursor: move; }

css :scope选择器
在JavaScript中,当用于Element.querySelector[3],Element.querySelectorAll[4]或Element.closest[5]时,:scope是指调用这些方法的元素。例如,document.body.querySelector(“:scope”)返回body元素。尽管CSS对 :scope的支持已被移除,但 :scope 的这种用法仍然被支持。

使用:scope选择器可以匹配对应的方法比如element.querySelector(‘:scope’)则会返回element元素本身。需要主要的是:scope伪类在css中已经不被大多数浏览器支持,甚至已经废弃。但是在js这些方法中仍然被主流浏览器支持。

【SCSS】常用的内置函数相关推荐

  1. python常用函数-Python小白必备的8个最常用的内置函数(推荐)

    Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print() prin ...

  2. python常用内置函数总结-Python学习教程之常用的内置函数大全

    前言 内置函数,一般都是因为使用比较频繁或是元操作,所以通过内置函数的形式提供出来.在Python中,python给我们提供了很多已经定义好的函数,这里列出常用的内置函数,分享出来供大家参考学习,下面 ...

  3. python 常用内置函数_Python小白必备的8个最常用的内置函数(推荐)

    Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print() prin ...

  4. python学习之最常用的内置函数

    python学习之最常用的内置函数 Python 内置函数总共有70余个(通常把内置类也统称为内置函数),覆盖面广,功能强大.不过,对于初学者在初级阶段,掌握下面几个函数是当务之急. (1) 控制台输 ...

  5. python必背代码-Python小白必备的8个最常用的内置函数(推荐)

    Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print() prin ...

  6. python 中一些常用的内置函数

    一.常用内置函数 abs(x) 返回绝对值,参数为int float,非字符只能num all(iterable) 如果迭代对象里面的所有值都为真就返回True.all([1, 2, -7]) --- ...

  7. MySql中常用的内置函数

    函数中可以将字段名当作变量来用,变量的值就是该列对应的所有值:在整理98在线字典数据时(http://zidian.98zw.com/),有这要一个需求,想从多音字duoyinzi字段值提取第一个拼音 ...

  8. python中常用的内置函数,可迭代对象,迭代器对象

    知识点1 :常用内置函数 1 常用内置函数的实际应用 1.1 abs() 返回值是一个绝对值,参数可以是整数和浮点数,如果参数是一个复数,则返回它的模. print(abs(-12.3)) # 12. ...

  9. python常用的内置函数

    内置函数,就是Python提供的, 可以直接拿来直接用的函数. 一.数字相关 01 数据类型 bool() 描述:测试一个对象是True, 还是False.bool 是 int 的子类. 语法:cla ...

最新文章

  1. Numpy的介绍和优势
  2. 脑机接口中的后门攻击
  3. js遮罩层以及移动端的上拉框
  4. Win11蓝屏100%不重启解决方法
  5. nginx限流方案的实现(三种方式)
  6. 【MyBatis笔记】01-MyBatis入门程序
  7. nvidia-rapids︱cuDF与pandas一样的DataFrame库
  8. cadsee plus看图纸 7.2.0.1
  9. Eclipse中SVN分支与合并
  10. 《凤凰项目 一个IT运维的故事传奇》读后感
  11. 2021年教师资格证 科目三 高中数学 课程标准 简答题
  12. python input函数换行_python input函数换行_python_input函数
  13. Django学习笔记1 Web开发简介和Django安装运行
  14. centos安装Docker与使用构建业务镜像挂载卷harbor仓库的高可用及网络模式和资源限制介绍...
  15. Serialization
  16. 经典S Q L语句大全
  17. (13.1.1)PMBOK之一:运营,项目、项目集、项目组合、组织战略及其管理
  18. 8g内存学习计算机专业够吗,现在电脑内存一般多大_现在电脑内存8个g够吗
  19. 蓝牙芯片|伦茨科技-智能蓝牙BLE5.2芯片ST17H66
  20. 苹果手机4g网速慢怎么办_安卓手机12G运存,打不过苹果4G?原因在这

热门文章

  1. Linux查询出口IP
  2. [C++11]左值、右值、左值引用、右值引用小结
  3. 软考高级之信息系统案例分析七重奏-《7》
  4. 浏览器的工作原理:新式网络浏览器幕后揭秘
  5. Unity UI动画通过布尔变量来转换状态机的模板
  6. tcpcopy mysql_利用tcpcopy引流过程
  7. 马云:创业是一场长跑,有时你必须要学会跪着才能生存下去
  8. 直播APP平台应该如何规范化管理
  9. 一起看看 Activity启动模式
  10. vue 自适应(同等缩小放大)