从bootstrap源码中学习Sass(一)
可以在github看代码,非常方便:https://github.com/twbs/bootstrap/blob/main/scss/_variables.scss
就是有时候网络差。
基础用法
scss/bootstrap.scss
1. @import、@include、@mixin
// 引入`variables.scss`
@import variables;
// 调用`@mixin`创建的sass代码块
// 在调用前必须有 @mixin bsBanner($var) {}
@include bsBanner("");
mixins/_banner.scss里的bsBanner():
// 作用应该是在被调用处加入这一块头部注释信息
@mixin bsBanner($file) {
/*!
* Bootstrap #{$file} v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
}
那么,这一段的年份和版本又是怎么自动更新的呢?
在bootstrap/build/banner.mjs:
import fs from 'node:fs/promises'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const pkgJson = path.join(__dirname, '../package.json')
const pkg = JSON.parse(await fs.readFile(pkgJson, 'utf8'))
const year = new Date().getFullYear()
function getBanner(pluginFilename) {
return `/*!
* Bootstrap${pluginFilename ? ` ${pluginFilename}` : ''} v${pkg.version} (${pkg.homepage})
* Copyright 2011-${year} ${pkg.author}
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/`
}
export default getBanner
scss/_variables.scss
1. !default
$gray-100: #f8f9fa !default;
设置默认值,优先级最低;当变量已经存在时,!default对应的值被覆盖。
2. @funciton、mix()、@return
// 使用函数tint-color()
$blue-100: tint-color($blue, 80%) !default;
scss/_functions.scss里的tint-color():
@function tint-color($color, $weight) {
// mix()是sass的color模块的内置方法
// mix($color1, $color2, $weight)
@return mix(white, $color, $weight);
}
$weight为混合比例,可以是80%或者0.8,意思是$color1占比80%,$color2占比20%。
3. map数据类型
// 格式
// $map: (
// key1: value1,
// key2: value2,
// key3: value3
// );
$grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px,
xxl: 1400px
) !default;
4. length()、map-values()、nth()、@if、@warn
@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints");
scss/_functions.scss里的_assert-starts-at-zero():
@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
// 此处的length()是sass的list模块的内置方法
// 返回 $list 的长度
@if length($map) > 0 {
// map-values()是sass的map模块的内置方法
// 返回 $map 中所有值的逗号分隔列表
$values: map-values($map);
// nth()是sass的list模块的内置方法
// nth($list, $n)
// 返回 $list 在 索引 $n 处的元素,从1开始计数。如果 $n 为负数,则从 $list 末尾开始计数
$first-value: nth($values, 1);
@if $first-value != 0 {
// @warn发出警告、堆栈跟踪。相比@error,它不阻止程序继续运行
// 避免使用者传递现在已弃用的旧参数,或者以不太理想的方式调用你的 API
@warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
}
}
}
5. CSS变量、#{$text}(插值)
CSS变量,也就是CSS var():
--gray: #f7f7f7;
color: var(--gray);
插值:
$link-color: $primary !default;
$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`
$prefix: $variable-prefix !default;
$font-family-base: var(--#{$prefix}font-sans-serif) !default;
$btn-link-color: var(--#{$prefix}link-color) !default;
// 也可以这样用:`background-image: url("/icons/#{$name}.svg");`
那么,--#{$prefix}link-color在哪里?
在scss/_root.scss:
:root,
[data-bs-theme="light"] {
--#{$prefix}link-color: #{$link-color};
}
6. type-of()、comparable()、unquote()、if()、calc()
$card-border-radius: var(--#{$prefix}border-radius) !default; // --bs-border-radius: 0.375rem;
$card-border-width: var(--#{$prefix}border-width) !default; // --bs-border-width: 1px;
$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;
scss/_functions.scss里的subtract():
@function subtract($value1, $value2, $return-calc: true) {
@if $value1 == null and $value2 == null {
@return null;
}
@if $value1 == null {
@return -$value2;
}
@if $value2 == null {
@return $value1;
}
// comparable()返回 $number1 和 $number2 是否具有兼容的单位
// 如果返回 true,$number1 和 $number2 可以安全地进行计算和比较
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
@return $value1 - $value2;
}
// unquote($string)删除字符串中的引号
// 此处unquote("(")输出结果为:(
@if type-of($value2) != number {
$value2: unquote("(") + $value2 + unquote(")");
}
// if( expression, value1, value2 )
// expression结果为true时,返回value1,否则返回value2
@return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
}
在Sass中,calc()与CSS calc()的语法相同,但具有使用 Sass 变量 和调用 Sass 函数 的附加功能。这意味着/始终是计算中的除法运算符!
参考资料:
- sass中!default和!global的作用:https://juejin.cn/post/7045162753807515655
- Sass map详解 :https://www.cnblogs.com/whqet/p/Sassmap.html
- 插值:https://sass.nodejs.cn/documentation/interpolation/
- mix是sass的color模块的内置方法:https://www.cnblogs.com/qjuly/p/9125219.html
- unquote:https://sass.nodejs.cn/documentation/values/strings/
- SASS if()简介 :https://juejin.cn/post/7108948522153541662
- calc():https://developer.mozilla.org/zh-CN/docs/Web/CSS/calc
更多资料
- Sass文档:
- 中文文档,缺点是有广告:https://sass.nodejs.cn/documentation
- 没有广告,缺点是英文文档:https://sass-lang.com/documentation
- 阮一峰——CSS 变量教程
从bootstrap源码中学习Sass(一)的更多相关文章
- 如何从源码中学习javascript
艾伦说啊,学习javascript,必须要学会看源码,通过高手的源码,你可以从中吸取很多书本上难以看到的技巧. 看源码就好像喝鸡汤,所有的营养都在这汤里了.这汤就是源码,高手写的源码,就是最好的鸡汤. ...
- MVVM架构~knockoutjs系列之从Knockout.Validation.js源码中学习它的用法
返回目录 说在前 有时,我们在使用一个插件时,在网上即找不到它的相关API,这时,我们会很抓狂的,与其抓狂,还不如踏下心来,分析一下它的源码,事实上,对于JS这种开发语言来说,它开发的插件的使用方法都 ...
- 快来!我从源码中学习到了一招Dubbo的骚操作!
荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 55 篇. 老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 魔幻的 2020 年的上半年过去了,很多人都在朋友圈和上半 ...
- Spring源码学习:第1步--在Spring源码中添加最简单的Demo代码
为了最大程度地贴近Spring源码并进行学习,一种比较直接的做法是:直接在Spring源码中加入Demo代码,并进行调试. 参照以前使用Spring的经验,Spring最简单的使用方法是:一个实体类. ...
- bootstrap源码学习与示例:bootstrap-tab
http://www.cnblogs.com/rubylouvre/archive/2012/12/22/2829176.html bootstrap源码学习与示例 https://www.w3sc ...
- Bootstrap源码分析系列之整体架构
作为一名合格的前端工程师,你肯定听说过Bootstarp框架.确实可以说Bootstrap框架是最流行的前端框架之一.可是也有人说Bootstrap是给后端和前端小白用的,我认为只要学习它能给我们前端 ...
- Appium Android Bootstrap源码分析之启动运行
通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...
- Appium Android Bootstrap源码分析之控件AndroidElement
通过上一篇文章<Appium Android Bootstrap源码分析之简介>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的 ...
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...
- Jquery源码中的Javascript基础知识(一)
jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...
随机推荐
- 图片验证码pillow模块
安装下载 pip install pillow 使用 需要引入PIL里面的Image from PIL import Image # mode为采用什么色系,size为大小px,color为颜色 im ...
- Simulink模型指标分析与模型重构的最佳实践 - 软件模型质量保证不可忽视的一环
在基于模型的开发中,优质的模型架构是生成优质代码的必要前提.静态模型分析对于模型的质量保证有着至关重要的作用,同时建模规范已在业内有着广泛而成熟的应用.然而建模规范并非模型设计原则合规性的唯一考量标准 ...
- Apifox:成熟的测试工具要学会自己写接口文档
好家伙, 在开发过程中,我们总是避免不了进行接口的测试, 而相比手动敲测试代码,使用测试工具进行测试更为便捷,高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman,他还拥有一个 ...
- 【Azure 事件中心】Event Hubs中存在非常多的错误数据,是否能提前删除这些数据呢?
问题描述 因为一些特殊原因,Event Hub 里面堆积了很多不需要的数据事件,正常要等事件中的过期时间到后才有Event Hub自动删除掉,但希望能够尽快马上删除,有没有什么手动的方法吗? 问题解答 ...
- 【Azure API 管理】APIM的容量指标(Capacity)数据异常高的情况记录
问题描述 APIM从标准版降级到基础版,在没有用户使用的情况,Capacity的指标平均显示在80%以上. 这是什么异常情况呢? 问题分析 APIM的容量指标(Capacity)是 API 管理实例中 ...
- 在Avalonia项目中使用MediatR和MS.DI库实现事件驱动通信
大家好,我是沙漠尽头的狼! AvaloniaUI是一个强大的跨平台.NET客户端开发框架,让开发者能够针对Windows.Linux.macOS.Android和iOS等多个平台构建应用程序.在构建复 ...
- Apache Hudi 在 vivo 湖仓一体的落地实践
作者:vivo 互联网大数据团队 - Xu Yu 在增效降本的大背景下,vivo大数据基础团队引入Hudi组件为公司业务部门湖仓加速的场景进行赋能.主要应用在流批同源.实时链路优化及宽表拼接等业务场景 ...
- C++ //常用算法 adjacent_find //查找相邻的重复元素
1 //常用算法 adjacent_find 2 //查找相邻的重复元素 3 #include<iostream> 4 #include<string> 5 #include& ...
- mysql中innodb创建表的一些限制
1. 背景 在新创建mysql数据表的时候.不太确定表能创建多少个字段,多少个索引.索引多少有限制么?mysql的数据是怎么存储的存在在哪里. 2.基本个数限制 在MySQL5.6.9以后的版本,一个 ...
- Zabbix6.0使用教程 (三)—zabbix6.0的安装要求
接上篇,我们继续为大家详细介绍zabbix6.0的使用教程之zabbix6.0的安装部署.接下来我们将从zabbix部署要求到四种不同的安装方式逐一详细的为大家介绍.本篇讲的是部署zabbix6.0的 ...