百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

SCSS揭秘:写出更智能简洁的样式代码

qiyuwang 2024-10-06 12:16 8 浏览 0 评论

简介

scss是sass的另一种语法,Sass是一种CSS预处理器,允许开发者编写更具结构性、可维护性和动态性的样式表

scss保持了css的语法结构,同时具备sass的强大功能,可以简单理解为一种增强版的css,除css含有功能外,还包含但不限于更优的变量、嵌套规则、混合、函数、动态运算等,文件后缀名为scss

安装与设置

在浏览器前端中,正常是不能直接使用scss的,其是一种CSS预处理器,即需要通过编译,生成对应的css文件,再进行使用

  • 首先需要安装Node.jsnpm
  • 接着用npm安装Sass,可以选择全局安装-g
  • 编译scss或sass为css
    • sass命令后接两个路径,第一个路径example.scss为待编译的scss文件所在路径,第二个example.css为生成的css保存路径,可以用相对路径也可以用绝对路径

基础语法

SCSS整体语法与CSS基本类似,其是CSS的一个超集,在SCSS内写CSS也是完全可以的

注释

SCSS的注释主要有两种形式,一种为//,另一种为/**/,与Js类似

变量

SCSS的变量用$来声明,使用时直接通过$ + 名称调用即可,变量数据可以是数字字符串颜色布尔值null,甚至还可以是ListMap

变量可以使用在几乎任何需要的地方,如属性值,属性名合成、复杂运算、函数调用等

CSS变量相比:

  • SCSS变量的作用域类似块作用域,在一个规则内定义的变量只能在该规则及其子规则内使用;CSS变量的作用域是基于DOM树结构,变量在一个元素作用域内定义,那么在该元素及其子元素的任何作用域(选择器)内均可使用
  • SCSS变量主要在编译阶段使用,其最终会将变量值整合到编译后的CSS中,相当于变量值的占位符,不会包含在编译后的CSS中;CSS变量主要在运行时使用,因此也可用JS动态更改

声明规则$name: value;

形式与样式属性类似,$后接名称即为变量名,冒号后面跟变量值

变量声明后,在其之后的位置依旧可以重新声明赋值

举个栗子

编译后的CSS如下:

  • 编译后的CSS是比较简洁的,SCSS的变量值在经过计算后被整合到CSS中了

了解一下即可,我们在定义值为字符串的变量时,有两种写法,带引号和不带引号,两者都能正常使用

带引号的可用于表达式计算

不带引号的一般不用于表达式计算(容易报错),而是直接使用

内置变量

除了自己定义的变量外,SCSS还包含一些内置变量,其分布在不同模块内,使用时需另行导入

示例如下

需注意的是,内置变量是不支持重新自定义赋值的

嵌套

在使用CSS写一些子元素样式时,很多时候都需要带上其父元素,以使选择器更精准或提高其优先级,但当大量书写类似属性时,每次都需要带上其父元素选择器,这其实的重复的工作

SCSS则可以规避这种情况,其支持嵌套使用

选择器嵌套

  • 子元素选择器直接嵌套在父元素选择器规则内即可
  • 在选择器规则内,可用&引用当前选择器,常用于配合伪类选择器使用,此时不会发生嵌套行为

编译后的CSS如下:

属性嵌套

嵌套除了用在选择器外,其还可以用在样式属性中,如下:

编译后如下:

算术运算

SCSS支持对变量或值进行运算,支持 +-*/%==!=>< 等运算符,对于不同单位之间的运算,运算结果取第一个值的单位,如果值之间只有一个有单位,则运算结果就取该单位

在介绍运算前,先介绍一个新的规则@debug,其用于帮助在开发过程中查看一些变量值或表达式值,SCSS运行后会将@debug后面的内容输出到控制台,类似Js的输出语句

比较运算

普通运算

需要注意的是,除法/比较特殊,其只在以下三种情况会进行除法运算:

  • 值,或值的一部分,是变量或者函数的返回值
  • 值被圆括号包裹
  • 值是算数表达式的一部分

但是,如果你的SCSS版本较高,可能会收到一个warning警告,官方团队不推荐直接使用/的形式进行除法运算,这是由于在CSS/也作为分隔符使用

官方更推荐使用sass:math模块的math.div函数或calc函数来执行除法运算,如下:

颜色运算

除了普通值运算外,SCSS还支持颜色值之间的运算

需注意的是,这在高版本的SCSS中已经弃用,高版本如需计算颜色,推荐使用sass:color模块内的颜色函数

插值

插值,即将SCSS表达式用#{}包围,作用是将SCSS表达式结果嵌入到CSS

插值几乎可以使用在SCSS样式表的所有位置,如:选择器名、属性名、属性值、变量值、动画名等

编译后的CSS为:

带引号字符串

在插值内使用带引号的字符串时,解析时会将引号去掉

编译后为:

使用时需思考是否要带引号,否则可能导致超乎预期的结果

导入

一个项目的样式往往是很多的,而我们一般不会将其完全放在一个文件内,一般会按某种规则区分,存放于多个文件内,不同文件需共享时就导入

SCSSCSS具有类似的导入语法@import,其允许多个导入用逗号分隔,导入文件后缀sass/scss可省略,如下:

但是,官方团队不鼓励继续使用该规则,其将在未来几年内逐步淘汰它,并最终从语言中删除

原因是:

  • @import使所有变量、混入和函数都可以全局访问,这使得人们很难分辨任何定义的位置
  • 由于一切都是全局的,因此库必须为其所有成员添加前缀,以避免命名冲突
  • @extend规则也是全局性的,这使得很难预测哪些样式规则将被扩展
  • 每个样式表的@import都会被执行,每次编辑时都会重新输出CSS,这会增加编译时间并产生臃肿的输出
  • 无法定义下游样式表无法访问的私有成员或占位符选择器

官方更推荐使用@use来导入模块,以这种方式加载的任何样式都将在编译的 CSS 输出中只包含一次,无论这些样式被加载了多少次

@use具有和@import同样的功能,并且它还具有命名空间,以避免命名冲突,默认其命名空间即为文件名,也可以用as设置

对于自己编写的文件,如果不在意命名冲突,也可完全导入,此时即可直接使用

高级功能

除了一些常见功能外,SCSS还具备一些高级功能,如:控制语句、函数等

条件和循环

条件语句主要使用@if@else@else if,效果于常见编程语言类似,如下:

以上SCSS会根据$pos变量值动态选择生成的justify-content

编译后CSS为:

循环语句主要有三个:@each@for@while

  • @each主要可用于变量ListMap
  • 编译后CSS
  • @for主要是从一个数字遍历到另一个数字,有两种形式:
    • @for <索引变量名> from <a> to <b>,这种不包含最后一个数字,范围为[a, b)
    • @for <索引变量名> from <a> through <b>,这种会包含最后一个数字,范围为[a, b]
  • 编译后的CSS如下:
  • @while是基于表达式结果的循环,当结果为false时退出循环
  • 编译后的CSS为:

函数

与Js类似,函数用于封装、定义一些复杂操作

  • 参数:函数的参数主要支持以下几类:
    • 普通参数:与变量名声明差不多,多个参数用,逗号分隔
    • 可选参数:到默认值的参数,默认值可以是任何表达式,甚至可以引用前面的参数
    • 任意参数:声明参数时,参数名最后以...结尾,表示接收余下所有参数
  • 返回:需返回值可采用@return返回
  • 调用:调用通过函数名调用,括号内传参数,除了按顺序传参数之外,还可通过关键字传参,即使用参数名后冒号跟值的方式

一些示例如下:

有趣的事实

与所有Scss标识符一样,函数名称将连字符和下划线视为相同,这意味着is-center和is_center两者都引用相同的函数,这是早期的历史遗留物,当时它只允许在标识符名称中使用下划线

混入

使用@mixin定义,使用@include引用,用于定义一些可以在整个样式表中重复使用的样式,其与函数类似,也可执行复杂操作、传入参数等,主要用于定义一些复杂的、规则的通用样式

语法如下:

  • @mixin <name> {语句}
  • @mixin <name> (参数列表) {语句}

引用如下:

  • @include <name>
  • @include <name>(参数值列表)

一些示例

@content用于表示自定义内容,使用时会将{}内的内容注入到@content所占位置

继承

继承是基于选择器的,其实现一个选择器可以继承另一个选择器的所有样式,包括组合样式(如伪类选择器样式)

默认浏览器样式不可继承,因为其不属于样式表样式

示例

编译后的CSS如下:

编译与调试

SCSS是一款CSS预处理器,其具备部分高级编程语言的特性,因此其需要经过编译使用,其也可以进行调试

编译

SCSS是需要经过编译,变成CSS才可以正常使用的,这在上面已经提到

编译单个文件比较简单,在命令行输入sass空格后接文件名即可,如需生成对应CSS文件,则在原有命令后再接空格加生成文件名即可

不想每次都运行命令重新编译,也可以通过添加命令参数--watch以监听编译,此时不必关闭控制台,系统会监听所编译SCSS文件的变化,但内容改变则重新编译,具体如下

如需停止监听,只需在控制台按Ctrl + C即可

调试

SCSS提供了几个命令用于开发调试

  • @debug用于输出调试内容
  • @warn用于输出警告内容,不会终止程序运行编译,但控制台会有警告信息
  • @error用于输出错误信息,会终止程序运行编译,同时在控制台输出错误信息

参考资料

SCSS模块文档:https://sass.bootcss.com/documentation/modules.html
SCSS官网:https://sass.bootcss.com



相关推荐

PayPal严重漏洞可通过不安全的JAVA反序列化对象

在2015年12月,我在PayPal商业网站(manager.paypal.com)中发现了一个严重的漏洞,这个漏洞的存在,使得我可以通过不安全的JAVA反序列化对象,在PayPal的网站服务器上远程...

提醒:Apache Dubbo存在反序列化漏洞

背景:近日监测到ApacheDubbo存在反序列化漏洞(CVE-2019-17564),此漏洞可导致远程代码执行。ApacheDubbo是一款应用广泛的高性能轻量级的JavaRPC分布式服务框架...

【预警通报】关于WebLogicT3存在反序列化高危漏洞的预警通报

近日,我中心技术支撑单位监测到WebLogicT3存在反序列化0day高危漏洞,攻击者可利用T3协议进行反序列化漏洞实现远程代码执行。...

Apache dubbo 反序列化漏洞(CVE-2023-23638)分析及利用探索

在对Apachedubbo的CVE-2023-23638漏洞分析的过程中,通过对师傅们对这个漏洞的学习和整理,再结合了一些新学的技巧运用,从而把这个漏洞的利用向前推了一步。整个过程中的研究思路以及...

案例|WebLogic反序列化漏洞攻击分析

目前网络攻击种类越来越多,黑客的攻击手段也变得层出不穷,常规的防护手段通常是对特征进行识别,一旦黑客进行绕过等操作,安全设备很难发现及防御。通过科来网络回溯分析系统可以全景还原各类异常网络行为,记录所...

【预警通报】关于ApacheOFBizRMI反序列化远程代码 执行高危漏洞的预警通报

近日,我中心技术支撑单位监测发现ApacheOFBiz官方发布安全更新,修复了一处远程代码执行漏洞。成功利用该漏洞的攻击者可造成任意代码执行,控制服务器。该漏洞编号:CVE-2021-26295,安...

关于OracleWebLogic wls9-async组件存在反序列化远程命令执行高危漏洞的预警通报

近日,国家信息安全漏洞共享平台(CNVD)公布了OracleWebLogicwls9-async反序列化远程命令执行漏洞。攻击者利用该漏洞,可在未授权的情况下远程执行命令。该漏洞安全级别为“高危”。现...

Rust语言从入门到精通系列 - Serde序列化/反序列化模块入门指北

Serde是一个用于序列化和反序列化Rust数据结构的库。它支持JSON、BSON、YAML等多种格式,并且可以自定义序列化和反序列化方式。Serde的特点是代码简洁、易于使用、性能高效。...

Java反序列化漏洞详解(java反序列化漏洞利用)

Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具。本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进行详...

关于Oracle WebLogic Server存在反序列化远程代码执行漏洞的安全公告

安全公告编号:CNTA-2018-00222018年7月18日,国家信息安全漏洞共享平台(CNVD)收录了OracleWebLogicServer反序列化远程代码执行漏洞(CNVD-2018-13...

CVE-2020-9484 Apache Tomcat反序列化漏洞浅析

本文是i春秋论坛作家「Ybwh」表哥原创的一篇技术文章,浅析CVE-2020-9484ApacheTomcat反序列化漏洞。01漏洞概述这次是因为错误配置和org.apache.catalina....

告别脚本小子系列丨JAVA安全(8)——反序列化利用链(下)

0x01前言...

关于WebLogic反序列化高危漏洞的紧急预警通报

近日,WebLogic官方发布WebLogic反序列化漏洞的紧急预警通告,利用该漏洞可造成远程代码执行并直接控制Weblogic服务器,危害极大。该漏洞编号为:CVE-2019-2890,安全级别为“...

高危!Fastjson反序列化漏洞风险通告

漏洞描述...

学习Vulhub的Java RMI Registry 反序列化漏洞

这个实验,我们先通过dnslog演示命令执行,然后通过反弹shell获得root权限。JavaRemoteMethodInvocation用于在Java中进行远程调用。RMI存在远程bind的...

取消回复欢迎 发表评论: