当前位置: 首页 > news >正文

【SASS/SCSS(一)】选择器

Sass 是一门高于 CSS 的元语言,它能用来清晰地、结构化地描述文件样式。

而SCSS是SASS引入的语法,是CSS的超集,所以所有CSS有效的使用在SCSS中都生效

一、回顾CSS选择器

  • 通用选择器 *
  • 元素选择器
  • 类选择器,.className
  • ID选择器,#id
  • 属性选择器,对元素中某个属性的值进行筛选,语法有:[attr] [attr=value] [attr~=value] [attr|=value] [attr^=value] [attr$=value] [attr*=value]
  • 逗号分隔的选择器列表
  • 空格代表的后代选择器
  • > 代表的直接后代选择器
  • ~ 代表所有后面的兄弟节点选择器
  • + 代表后面直接跟着的第一个兄弟节点选择器
  • || 列组合器,例如 col || td代表<col>该列域下的所有td结点
  • 伪类/伪元素选择器

具体参见MDN文档:

CSS 选择器 - CSS:层叠样式表 | MDN (mozilla.org)

二、SCSS利用嵌套语法实现选择器

SCSS为了优化CSS的语法表达,使其更简洁、避免重复定义样式,因此实现了嵌套语法来对元素进行选择。例如:

//对ul中的直接后代进行筛选,定制了直接后代中li的样式
ul > {li {list-style-type: none;}
}//h2选择紧邻兄弟p元素
h2 {+ p {border-top: 1px solid gray;}
}//p元素的所有一般兄弟元素中,选择出span / h1定制样式
p {~ {span {opacity: 0.8;},h1 {color: red;}}
}

由于嵌套语法,父选择器的很多属性可以不被反复定义,同时使得选择器的实现更直观、更灵活

三、父选择器

Sass中利用 & 来指示父选择器,这样在嵌套语法中,可以更方便地复用父选择器

同时,还可以在父选择器的基础上添加后缀,更便捷地寻找基于父选择器的命名【但并非父子关系】

添加后缀时,父选择器必须是字母/数字结尾的(例如以 ID 、className、元素标签定义的父类),才可以添加后缀

.alert {max-width: 600px;margin: 4rem auto;width: 90%;font-family: "Raleway", sans-serif;background: #f4f4f4;//定义该元素伪类的CSS&:hover {font-weight: bold;}//添加后缀&__copy {display: none;padding: 1rem 1.5rem 2rem 1.5rem;color: gray;line-height: 1.6;font-size: 14px;font-weight: 500;&--open {display: block;}}}

嵌套语法需要区分的部分!构成父子关系的选择器 以及 只是复用名称的选择器!

//SASS
.btn {color: red;//后代选择器a{color:white;}//复用的时候要自己再构造一遍需要的后代选择器& &-item{color:purple;}//平级,只是名称做了复用&-item {color: black;&-green {color: green}}
}//等价CSS
.btn {color: red;
}.btn a {color: white;
}.btn .btn-item {color: purple;
}.btn-item {color: black;
}.btn-item-green {color: green;
}

如果基于选择器列表,& 获取父选择器代表什么呢? 

&可以理解为所有父级选择器结构的引用,举几个例子,看看SASS该写法下css的等价内容:

1、

//scss
.main aside:hover,
.sidebar p {parent-selector: &;// => ((unquote(".main") unquote("aside:hover")),//     (unquote(".sidebar") unquote("p")))
}//等价css
.main aside:hover,
.sidebar p {parent-selector: .main aside:hover, .sidebar p;
}

2、

//scss
ul, ol {text-align: left;& & {padding: {bottom: 0;left: 0;}}
}//css
ul, ol {text-align: left;
}
ul ul, ol ol {padding-bottom: 0;padding-left: 0;
}

在这个例子中值得注意的是,有相同前缀的css属性例如padding-*、margin-*等,可以在书写时以嵌套语法的形式拆分

3、如果父选择器是类选择器,可以利用其构造新的选择器,并提取到顶层

//scss
.selector {color: blue;//利用表达式的写法构造@at-root #{a + &} {color: red;}
}//等价css
.selector {color: blue;
}
a.selector {color: red;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 高校如何拥抱国产化OS?中南民族大学信息化应用实践
  • iOS 左滑返回事件的控制
  • leetcode热题100.分割等和子集(动态规划)
  • 探索Puppeteer的强大功能:抓取隐藏内容
  • OWASP 移动应用 2024 十大安全风险
  • 为ppt中的文字配色
  • 在 Ubuntu上安装 Docker
  • 详解曼达拉升级:如何用网络拓扑结构扩容BSV区块链
  • vue是如何进行监听数据变化的?vue2和vue3分别是什么?vue3为什么要更换?
  • Rust Result 与可恢复的错误
  • 【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址
  • 子进程继承父进程文件描述符导致父进程打开设备文件失败
  • C#字符串基本操作
  • 【ARM】SMMU系统虚拟化整理
  • Docker容器化技术(1)
  • [译] React v16.8: 含有Hooks的版本
  • 10个最佳ES6特性 ES7与ES8的特性
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android优雅地处理按钮重复点击
  • chrome扩展demo1-小时钟
  • Codepen 每日精选(2018-3-25)
  • Electron入门介绍
  • iOS | NSProxy
  • Linux各目录及每个目录的详细介绍
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • ucore操作系统实验笔记 - 重新理解中断
  • vue中实现单选
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 服务器从安装到部署全过程(二)
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 面试遇到的一些题
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 在Mac OS X上安装 Ruby运行环境
  • 主流的CSS水平和垂直居中技术大全
  • 回归生活:清理微信公众号
  • #162 (Div. 2)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #LLM入门|Prompt#3.3_存储_Memory
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (09)Hive——CTE 公共表达式
  • (20)docke容器
  • (k8s中)docker netty OOM问题记录
  • (二)c52学习之旅-简单了解单片机
  • (原)Matlab的svmtrain和svmclassify
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)ObjectiveC 深浅拷贝学习
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 8 跨平台高性能边缘采集网关
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net web项目 调用webService
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net(C#)自定义WinForm控件之小结篇