likes
comments
collection
share

别再死板地写样式了!SCSS 函数帮你高效管理颜色和布局还在死板地写 CSS 吗?每次调颜色、布局时手动计算,不仅繁琐还

作者站长头像
站长
· 阅读数 211

当你在写 CSS 的时候,是不是遇到过这样的情况:

“我需要一个漂亮的蓝色按钮,但鼠标移入时要变亮,点击时要变暗。这时候,我得定义三个不同的颜色值,搞来搞去头都大了!”

“更糟糕的是,如果我有五种不同颜色的按钮,那我就得定义一大堆颜色变量!封装组件时要做一套主题,CSS 变量简直让我崩溃。”

“还有数值计算的问题。比如我要做一个 3 列布局,居然连 100% ÷ 3 这种简单的事情都得自己去手算,CSS 没有直接支持!”

这些问题,写 CSS 的同学一定都不陌生。调颜色、复用样式、做复杂的数值计算时,原生 CSS 常常让人感觉力不从心

如果你在封装组件时需要定制多个按钮主题,或者想要对页面布局进行一些复杂的计算,那原生 CSS 简直就是一场灾难。

这时候,就需要用到 Sass 和 SCSS 了!

它们不仅能帮你定义变量、复用样式,还能让你对颜色、数值进行智能操作。

用 SCSS 你只需要定义一次颜色,然后让函数帮你调亮、调暗,轻松搞定交互效果。甚至连数值计算,如百分比分配、余数处理等,SCSS 都能让你不再手动计算。

那我们如何去区分 Sass 和 SCSS 并且优雅地使用呢?


一、Sass 和 SCSS 的区别——她们其实是一家人

1.1 Sass:精简版 CSS,像极了 Python

首先,Sass 其实是 Sass 家族的“原始风格”,它没有大括号和分号,用缩进表达层级,像极了编程语言中的 Python 。它看起来非常优雅简洁,但也有点“讲究”,要求你时刻注意缩进和结构。

// Sass 语法
$primary-color: #3498db

body
  background-color: $primary-color
  color: #fff

优点:写得少,代码更短,结构很清晰。 缺点:不太像我们熟悉的 CSS,初学者可能不太习惯。

1.2 SCSS:像 CSS 一样,但更聪明更强大

SCSS 则是 Sass 的“更大众化”的版本,语法上几乎和 CSS 一样,但提供了所有 Sass 的功能。你可以像平常写 CSS 一样去写 SCSS,只是多了变量、函数等酷炫功能。

// SCSS 语法
$primary-color: #3498db;

body {
  background-color: $primary-color;
  color: #fff;
}

优点:看起来就是 CSS,熟悉的配方,不用重新学习。 缺点:要写分号和大括号,稍微啰嗦点。

所以呢,如果你已经习惯 CSS,SCSS 是更适合你的选择;如果你追求极简美学,Sass 会让你眼前一亮。不过,不论你选哪个,接下来的内容一样适用!


二、SCSS 各种骚操作:函数篇

在实际项目中,封装按钮组件时,我们常常需要定义不同状态下的颜色,比如按钮的默认颜色、鼠标悬停时变亮的颜色、点击时变暗的颜色。

用原生 CSS,我们必须手动为每个状态定义不同的颜色值,这显然很麻烦。更别说,如果有多种颜色的按钮,你可能需要定义大量变量。

在 SCSS 中,颜色处理函数 可以极大简化这一过程,只需定义一次颜色,通过函数自动处理亮度和暗度,轻松搞定悬停、点击等交互效果。

2.1 颜色处理函数

SCSS 提供了一些颜色处理函数,可以帮助你调整颜色的亮度、深度,甚至混合两种颜色,提升样式的灵活性和维护性。

自 Sass 版本更新以来,推荐使用的颜色处理函数有了一些变化。以下是几个常用的颜色处理函数及其示例。

1. color.scale($color, $lightness: X%) - 提亮/变暗颜色

color.scale() 函数用于按比例增加或减少颜色的亮度。这个函数可以接受一个百分比参数,通过正值来增加亮度,负值来减少亮度。例如:

@use 'sass:color';

$base-color: #3498db; // 基础颜色

.button {
  background-color: $base-color; // 默认按钮颜色

  &:hover {
    background-color: color.scale($base-color, $lightness: 10%); // 悬停时按钮颜色变亮 10%
  }

  &:active {
    background-color: color.scale($base-color, $lightness: -20%); // 点击时按钮颜色变暗 20%
  }
}

在这个示例中,当鼠标悬停在按钮上时,颜色会变亮 10%;在按钮被点击时,颜色会变暗 20%。

补充说明:

Sass 官方已经不再推荐使用 darken()lighten() 函数来调整颜色的亮度。这是因为:

  • lighten() 函数通过固定的值来增加亮度,可能不是你所期望的效果。为了将颜色变得更亮,推荐使用 color.scale(),它可以按照百分比来调整。
  • darken() 函数通过固定的值来减少亮度,同样可能不是你所期望的效果。为了将颜色变得更暗,也建议使用 color.scale()

官方指出,使用 color.scale() 使得颜色调整更加灵活和精确,能够满足不同设计需求。

我们使用最新的 scss 时如果使用 darken()lighten() 将会出现这样的提示信息:

别再死板地写样式了!SCSS 函数帮你高效管理颜色和布局还在死板地写 CSS 吗?每次调颜色、布局时手动计算,不仅繁琐还

2. color.mix($color1, $color2, $weight) - 混合颜色

如果你希望混合两种颜色,color.mix() 函数可以帮助你生成中间色。以下是使用示例:

@use 'sass:color';

$red: #ff0000; // 红色
$blue: #0000ff; // 蓝色

.button-red {
  background-color: $red;

  &:hover {
    background-color: color.mix($red, $blue, 50%); // 悬停时生成紫色
  }
}

.button-blue {
  background-color: $blue;

  &:hover {
    background-color: color.mix($blue, $red, 50%); // 悬停时同样生成紫色
  }
}

在这个示例中,鼠标悬停时红色和蓝色按钮会混合成紫色。

3. 实际应用场景

在封装按钮组件库时,你可以使用 color.scale()color.mix() 函数来处理不同状态下的颜色变化。这让你只需定义一次基础颜色,并根据不同的状态通过函数进行亮度或暗度调整。这样可以保持代码的简洁性和可维护性。

@use 'sass:color';

$primary-color: #3498db; // 蓝色主题
$danger-color: #e74c3c; // 红色主题

.primary {
  background-color: $primary-color; // 蓝色按钮

  &:hover {
    background-color: color.scale($primary-color, $lightness: 10%); // 悬停时变亮
  }

  &:active {
    background-color: color.scale($primary-color, $lightness: -10%); // 点击时变暗
  }
}

.danger {
  background-color: $danger-color; // 红色按钮

  &:hover {
    background-color: color.scale($danger-color, $lightness: 10%); // 悬停时变亮
  }

  &:active {
    background-color: color.scale($danger-color, $lightness: -10%); // 点击时变暗
  }
}

使用 SCSS 的颜色处理函数,可以显著提升样式的灵活性和可维护性。通过使用 color.scale()color.mix() 函数,你可以轻松地控制颜色的表现,简化样式表的复杂性,并增强组件的交互效果。

2.2 数字处理函数:数学小天才

在最新的 Sass 中,许多数字处理函数依然可以让我们轻松完成数值计算,如除法、取整、百分比转换等。不过,也有一些函数和行为在更新中已经被弃用或者推荐新的替代方法。

1. math.div():除法运算的新方式

Sass 已经弃用了使用 / 作为除法运算符,因为 / 同时也是 CSS 中的分隔符,用作除法可能引发混淆。现在推荐使用 math.div() 代替。

@use 'sass:math';

$column-width: math.div(100%, 3); // 三列布局,每列宽度 33.3333%
.column {
  width: $column-width;
}

补充说明:

使用 / 作为除法运算符已被弃用,建议在所有新的样式表中使用 math.div() 进行除法计算,以避免将来可能的警告或错误。

2. math.percentage():小数转百分比

这个函数仍然是将小数转换为百分比的首选方式,特别适合用于响应式设计。它使得小数(如 0.5)轻松转换为百分比。

@use 'sass:math';

$decimal: 0.5;
$percent: math.percentage($decimal); // 转换为 50%

.column {
  width: $percent;
}

3. math.ceil()math.floor():向上/向下取整

在处理数值时,math.ceil()math.floor() 可以确保你精确控制数值的向上或向下取整,用于布局或其他场景时非常方便。

@use 'sass:math';

$rounded-up: math.ceil(4.2); // 结果为 5
$rounded-down: math.floor(4.8); // 结果为 4

.column-up {
  width: $rounded-up * 10%; // 宽度 50%
}

.column-down {
  width: $rounded-down * 10%; // 宽度 40%
}

4. math.clamp():限制数值范围

math.clamp() 用于将一个数值限制在指定范围内,它会确保数值不超出最小值和最大值的范围。这对于处理响应式设计中的布局宽度特别有用。

@use 'sass:math';

$clamped-value: math.clamp(20px, 50px, 100px); // 保持数值在 50px 和 100px 之间

.box {
  width: $clamped-value;
}

5. math.abs():取绝对值

math.abs() 函数可以确保数值始终为正数,尤其是在处理尺寸或位置时非常有用。

@use 'sass:math';

$distance: math.abs(-10px); // 结果为 10px

.element {
  margin-left: $distance;
}

6. math.random():生成随机数

在旧版 Sass 中,random() 函数会忽略参数的单位,而是直接返回一个无单位的随机数。但在最新的 Sass 中,这种行为已经被弃用。现在推荐使用 math.random() 函数,并且其返回的随机数将带有与参数一致的单位

@use 'sass:math';

$random-value: math.random(100px); // 生成 1px 到 100px 之间的随机数

.box {
  width: $random-value; // 随机宽度,例如 42px
}

补充说明:

在旧版中,random() 函数会忽略单位并返回无单位的随机数,但这种行为已经被弃用。现在,math.random($limit) 会返回与 $limit 相同单位的随机整数。如果你还在使用老的 random() 函数,可能会触发警告,建议尽快更新到 math.random()

通过这些 SCSS 数字处理函数,无论你是处理多列布局,还是精确控制元素尺寸,都能更加轻松高效。再也不用手动计算或者担心小数精度问题,布局更智能,代码更简洁!

2.3 字符串处理函数:让字符串也听话

Sass 提供了一系列用于处理字符串的函数,这些函数可以帮助你轻松操作字符串内容,在生成动态类名、处理文本样式时特别有用。

在最新的 Sass 版本中,许多经典的字符串处理函数依然保留,且没有重大变动或弃用。接下来我们将介绍几个常用的字符串处理函数。

1. string.quote($string)string.unquote($string):为字符串加引号或去引号

  • quote($string):用于为字符串加上引号,非常适合在需要生成带引号的字符串时使用(如 font-family)。
  • unquote($string):用于去掉字符串的引号,但要注意去引号后的字符串可能不符合 CSS 语法规范,因此需谨慎使用。
@use 'sass:string';

@debug string.quote("Helvetica"); // "Helvetica"
@debug string.unquote('"Helvetica"'); // Helvetica

2. string.index($string, $substring):找到子字符串的索引位置

string.index() 返回子字符串在父字符串中的第一个位置,若未找到则返回 null。索引从 1 开始计数。

@use 'sass:string';

@debug string.index("Helvetica Neue", "Neue"); // 11

3. string.insert($string, $insert, $index):在字符串中插入子字符串

string.insert() 用于在指定位置插入子字符串,可以通过正数或负数指定插入位置。

@use 'sass:string';

@debug string.insert("Roboto Bold", " Mono", 7); // "Roboto Mono Bold"

4. string.length($string):计算字符串长度

string.length() 用于返回字符串的长度,可以用于需要控制字符串长度或限制文本的场景。

@use 'sass:string';

@debug string.length("Helvetica Neue"); // 14

5. string.slice($string, $start-at, $end-at: -1):提取字符串的子串

string.slice() 可用于从字符串中提取指定范围内的子串。索引从 1 开始,负数表示从末尾开始计算。

@use 'sass:string';

@debug string.slice("Helvetica Neue", 1, 3); // "Hel"
@debug string.slice("Helvetica Neue", 1, -6); // "Helvetica"

补充说明: 该函数非常有用,适合在需要精确截取字符串的场景中使用。

6. string.split($string, $separator, $limit: null):拆分字符串为列表

string.split() 从 Sass 1.57.0 开始支持,它将字符串按照分隔符拆分成一个列表。可选的 $limit 参数控制拆分次数。

@use 'sass:string';

@debug string.split("Segoe UI Emoji", " "); // ["Segoe", "UI", "Emoji"]
@debug string.split("Segoe UI Emoji", " ", $limit: 1); // ["Segoe", "UI Emoji"]

补充说明: 这是一个较新的函数,如果使用旧版本的 Sass,可能会遇到不兼容问题。

7. string.to-upper-case($string)string.to-lower-case($string):转换字符串大小写

  • string.to-upper-case($string):将字符串中的 ASCII 字母转换为大写。
  • string.to-lower-case($string):将字符串中的 ASCII 字母转换为小写。
@use 'sass:string';

@debug string.to-upper-case("Helvetica"); // "HELVETICA"
@debug string.to-lower-case("HELVETICA"); // "helvetica"

补充说明: 这两个函数依然可以正常使用,在处理大小写转换时非常便捷。

8. string.unique-id():生成唯一字符串

string.unique-id() 会生成一个唯一且未加引号的字符串,适合在生成动态类名或 ID 时使用,确保样式在编译时是独一无二的。

@use 'sass:string';

@debug string.unique-id(); // 类似 "u1ab2c3d4"

补充说明: 该函数非常适合在动态生成类名和 ID 时使用,尤其是需要唯一标识符的场景。

9. 实际应用场景

在处理样式或生成动态类名、ID 时,Sass 的字符串处理函数非常有用。通过这些函数,你可以动态生成样式、调整文本格式、控制文本长度等。比如,你可以使用 string.unique-id() 生成独特的类名,或用 string.split() 将 CSS 类名拆分成多个部分处理。

@use 'sass:string';

$base-class: "btn primary";
$classes: string.split($base-class, " "); // 拆分为 ["btn", "primary"]

// 生成唯一类名
.unique-btn {
  content: string.unique-id();
}

Sass 的字符串处理函数提供了丰富的操作方法,无论是插入、查找、切割,还是转换大小写和生成唯一 ID,都可以轻松实现。

转载自:https://juejin.cn/post/7423980772172595235
评论
请登录