Erlo

Scss 基础

2025-09-30 23:29:49 发布   30 浏览  
页面报错/反馈
收藏 点赞

scss 转 css 在线转换

https://33tool.com/scss_to_css/

变量

image

$primary-color: #000;

.main1 {
  background-color: $primary-color;
}

一、嵌套

image

1.1 父选择器 & (Referencing Parent Selectors: &)

在嵌套 CSS 规则时,有时也需要直接使用嵌套外层的父选择器,例如,当给某个元素设定 hover 样式时,或者当 body 元素有某个 classname 时,可以用 & 代表嵌套规则外层的父选择器。

出错:

.main1 {
  a {
    :hover {
      color: red;
    }
  }
}

这样直接转换的时候生成的css

//这里a和:hover中间有空格
.main1 a :hover { 
	color: red;
}

修复:下面使用&

.main1 {
  a {
    &:hover {
      color: red;
    }
  }
}

生成的CSS

.main1 a:hover {
	color: red;
}

1.2 属性嵌套 (Nested Properties)

CSS

.funky {
	font: 20px/24px;
	font-family: fantasy;
	font-weight: bold;
}

scss

.funky {
  font: 20px/24px {
    family: fantasy;
    weight: bold;
  }
}

二、混合指令(@mixin)

混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left。混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。

//@mixin 定义
@mixin large-text {
  font: {
    family: Arial;
    size: 20px;
    weight: bold;
  }
  color: #ff0000;
}

//@include 使用
.page-title {
  @include large-text; 
  padding: 4px;
  margin-top: 10px;
}

css

.page-title {
	font-family: Arial;
	font-size: 20px;
	font-weight: bold;
	color: #ff0000;
	padding: 4px;
	margin-top: 10px;
}

2.1 给混合器传参

@mixin link-colors($normal, $hover, $visited) {
  color: $normal;

  &:hover {
    color: $hover;
  }

  &:visited {
    color: $visited;
  }
}

.main1 {
  a {
     @include link-colors(blue, red, green);
  }
}

生成

.main1 a {
	color: blue;
}
.main1 a:hover {
	color: red;
}
.main1 a:visited {
	color: green;
}

当你@include混合器时,有时候可能会很难区分每个参数是什么意思,参数之间是一个什么样的顺序。为了解决这个问题,sass允许通过语法$name: value的形式指定每个参数的值。这种形式的传参,参数顺序就不必再在乎了,只需要保证没有漏掉参数即可:

a {
    @include link-colors(
      $normal: blue,
      $visited: green,
      $hover: red
  );
}

三、继承和扩展 (@extend)

选择器继承是说一个选择器可以继承为另一个选择器定义的所有样式。这个通过@extend语法实现,如下代码:

image

继承类下面的类,也会被继承

image

四、数据类型

SassScript 支持 6 种主要的数据类型:

  • 数字,1, 2, 13, 10px
  • 字符串,有引号字符串与无引号字符串,"foo", 'bar', baz
  • 颜色,blue, #04a3f9, rgba(255,0,0,0.5)
  • 布尔型,true, false
  • 空值,null
  • 数组 (list),用空格或逗号作分隔符,1.5em 1em 0 2em, Helvetica, Arial, sans-serif
  • maps, 相当于 JavaScript 的 object,(key1: value1, key2: value2)

插值语句 #{} (Interpolation: #{})

#{} 插值语句可以在选择器或属性名中使用变量:

$name: foo;
$attr: border;
p.#{$name} {
  #{$attr}-color: blue;
}

css

p.foo {
  border-color: blue; 
}

image

五、控制指令 (Control Directives)

@if

@if 的表达式返回值不是 false 或者 null 时,条件成立,输出 {} 内的代码:

image

@if 声明后面可以跟多个 @else if 声明,或者一个 @else 声明。如果 @if 声明失败,Sass 将逐条执行 @else if 声明,如果全部失败,最后执行 @else 声明,例如:

image

@for

@for 指令可以在限制的范围内重复输出格式,每次按要求(变量的值)对输出结果做出变动。这个指令包含两种格式:

@for $var from through ,或者 @for $var from to

区别在于 throughto 的含义:当使用 through 时,条件范围包含 的值,而使用 to 时条件范围只包含 的值不包含 的值

另外,$var 可以是任何变量,比如 $i 必须是整数值。

image

@each

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

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

image

@while

@while 指令重复输出格式直到表达式返回结果为 false。这样可以实现比 @for 更复杂的循环,只是很少会用到。例如:

image

六、函数指令 (Function Directives)

@function 与 mixin 相同,也可以传递若干个全局变量给函数作为参数。一个函数可以含有多条语句,需要调用 @return 输出结果。

image

七、Dart Sass 内置函数

https://sass-lang.com/documentation/modules/

从 Dart Sass 3.0.0 开始,全局内置函数(如 map-getlighten 等)将被移除,必须通过模块化语法 @use 导入 sass:xxx 模块后才能使用。以下是基于新规范的分类整理,包含各模块的常用函数及使用示例:

一、核心模块(sass:core

包含最基础的工具函数(无需显式导入,部分函数默认可用,但建议显式导入)。

函数 作用 示例
if($condition, $if-true, $if-false) 条件判断 @use "sass:core"; core.if(true, 10, 20) → 10
feature-exists($feature) 检查CSS特性支持 core.feature-exists(flexbox) → true

二、列表模块(sass:list

处理列表(有序值集合)的函数,需通过 @use "sass:list" 导入。

函数 作用 示例
list.length($list) 获取列表长度 list.length(10px 20px) → 2
list.nth($list, $index) 获取指定索引值(索引从1开始) list.nth(10px 20px, 2) → 20px
list.append($list, $value) 向列表添加值 list.append(10px, 20px) → 10px 20px
list.index($list, $value) 查找值的索引 list.index(10px 20px, 20px) → 2

使用示例

@use "sass:list";

$sizes: 10px 20px 30px;
@debug list.length($sizes); // 输出 3
@debug list.nth($sizes, 2); // 输出 20px

三、映射模块(sass:map

处理键值对映射的函数,需通过 @use "sass:map" 导入。

函数 作用 示例
map.get($map, $key) 获取映射中键的值 map.get(($a: 1), $a) → 1
map.keys($map) 返回所有键的列表 map.keys(($a:1, $b:2)) → ($a, $b)
map.has-key($map, $key) 判断是否包含键 map.has-key(($a:1), $a) → true
map.merge($map1, $map2) 合并两个映射 map.merge(($a:1), ($b:2)) → ($a:1, $b:2)

使用示例

@use "sass:map";

$theme: (primary: #42b983, secondary: #35495e);
@debug map.get($theme, primary); // 输出 #42b983
@debug map.keys($theme); // 输出 (primary, secondary)

四、颜色模块(sass:color

处理颜色的函数,需通过 @use "sass:color" 导入。

函数 作用 示例
color.lighten($color, $amount) 提亮颜色 color.lighten(#ff0000, 20%) → 亮红色
color.darken($color, $amount) 加深颜色 color.darken(#ff0000, 20%) → 暗红色
color.rgba($color, $alpha) 调整透明度 color.rgba(#ff0000, 0.5) → 半透明红
color.red($color) 提取红色通道值 color.red(#ff0000) → 255

使用示例

@use "sass:color";

$primary: #42b983;
@debug color.lighten($primary, 10%); // 输出 #5fca99
@debug color.rgba($primary, 0.8); // 输出 rgba(66, 185, 131, 0.8)

五、数字模块(sass:math

处理数值计算的函数,需通过 @use "sass:math" 导入(注意:math 模块需显式启用 precision 等配置)。

函数 作用 示例
math.abs($number) 取绝对值 math.abs(-10) → 10
math.ceil($number) 向上取整 math.ceil(3.2) → 4
math.round($number) 四舍五入 math.round(3.5) → 4
math.percentage($number) 转为百分比 math.percentage(0.5) → 50%

使用示例

@use "sass:math";

$width: 150px;
@debug math.div($width, 2); // 输出 75px(替代 / 运算)
@debug math.percentage(0.3); // 输出 30%

六、字符串模块(sass:string

处理字符串的函数,需通过 @use "sass:string" 导入。

函数 作用 示例
string.length($string) 字符串长度 string.length("hello") → 5
string.index($string, $substring) 查找子串位置 string.index("hello", "ll") → 3
string.to-upper-case($string) 转为大写 string.to-upper-case("hello") → "HELLO"

使用示例

@use "sass:string";

$className: "active";
@debug string.length($className); // 输出 6
@debug string.to-upper-case($className); // 输出 "ACTIVE"

七、选择器模块(sass:selector

处理 CSS 选择器的函数,需通过 @use "sass:selector" 导入。

函数 作用 示例
selector.nest($selectors...) 嵌套选择器 selector.nest(".a", "&:hover") → ".a:hover"
selector.append($selectors...) 拼接选择器 selector.append(".a", ".b") → ".a.b"

使用示例

@use "sass:selector";

@debug selector.nest(".parent", ".child") → ".parent .child";
@debug selector.append(".btn", "--primary") → ".btn--primary";

模块化语法注意事项

  1. 导入方式:通过 @use "sass:模块名" 导入(如 @use "sass:color"),函数需通过 模块名.函数名 调用(如 color.lighten(...))。
  2. 别名设置:可通过 @use "sass:color" as c; 简化调用(如 c.lighten(...))。
  3. 兼容性:Dart Sass 3.0.0+ 强制要求模块化导入,旧版全局函数将失效,建议尽快迁移。

完整的模块及函数列表可参考官方文档:Sass 模块化函数

vue 中安装scss

npm install sass --save-dev

vue 中 vite全局导入

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'

// https://vite.dev/config/
export default defineConfig({
  plugins: [vue(), vueDevTools()],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url)),
    },
  },
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/assets/style.scss";`,
      },
    },
  },
})

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认