SASS详解之继承(extend)

2023-11-08

  每一个类名都有可能有另一个类名的所有样式和它自己的特定样式的。当一个div的身上有两个类名,一个是“one”,另一个是“two”的时候。如下


  HTML代码

<div class="one two">
梦龙小站
</div>

  CSS代码

.one {width:100px;height:100px;}
.two {background:red;border:5px solid #000;}

  这就意味着,我们要配备一个很好的记忆力才能应急那些棘手的BUG问题。很多时候,我们需要一个个的找到类名“one”的样式才逐一改过。这样在无形中加大了。而在SASS中,有那么一个功能,继承,可以方便轻松的让这棘手的问题变得很简单。@extend指令,可以继承你想要的类名。如下


  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	@extend .one;
	background:red;border:5px solid #000;
}

  编译后的CSS代码

.one, .two {
  width: 100px;
  height: 100px;
}

.two {
  background: red;
  border: 5px solid #000;
}

  从上面的例子可以看出,类名“one”,可以被所有的类名继承。而继承类名“.one”的类名还可以有专属于自己的类名,专属的样式和风格,并不影响类名“.one”本身的样式。


 它是如何工作



  SASS中继承(Extend)将想要继承的选择器(如“.two”)和其引用的选择器(如“.one”)组成群组选择器中间用逗号隔开,组成群组选择器。如下:红色背景和边框是类名“.two”单加的样式,而宽度高度都是继承类名(“.one”)的。如下


  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}

  编译后的CSS代码

.one, .two {
  /*继承的样式*/
  width: 100px;
  height: 100px;
}

.two {
  /*独立的样式*/
  background: red;
  border: 5px solid #000;
}

  就在合并选择器的时候,SASS中继承(Extend)是相当聪明的,会自己避免一些不必要的错误,或者说是不为人知的错处,也不会产生各种多余的东西如“##two”。


 继承复杂的选择器

 

  要继承的不仅仅是一个类名,可以是一个id也可以是一个元素,也可以是某个状态,任何选择器都能继承。如下


  SCSS代码

.hoverlink {
  @extend a:hover;
}
a:hover {
  text-decoration: underline;
}

  编译后的CSS代码

a:hover, .hoverlink {
  text-decoration: underline;
}

  就像上面编译出来的一样,在hover状态下的样式也能继承。所以不仅是a的hover状态,几乎任何选择器都能继承。


 继承多个选择器

 

  在编写的过程中,往往会遇到一个选择器要继承多个选择器的样式,那么这应该怎么办呢?看看下面的小实例吧。


  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one;
	@extend .three;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}
.three {
	padding:10px;
}

  编译后的CSS代码

.one, .two {
  width: 100px;
  height: 100px;
}

.two {
  background: red;
  border: 5px solid #000;
}

.three, .two {
  padding: 10px;
}

  上面的例子告诉我,继承多个选择器的样式是得写多个“@extend”,但事实上有没有简便写法呢?看下面的小例子。


  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one, .three;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}
.three {
	padding:10px;
}

  编译后的CSS代码

.one, .two {
  width: 100px;
  height: 100px;
}

.two {
  /*独立的样式*/
  background: red;
  border: 5px solid #000;
}

.three, .two {
  padding: 10px;
}

  从上面的小例子,不难看出,继承多个选择器的样式是有简便方法的,那就是继承的多个选择器自己用逗号“,”隔开即可。

 

 链型继承


  在咱们编写的过程中,不仅仅的单方面的继承,很多时候都是类名“.three”继承类名“.two”,而类名“.two”又继承了类名“.one”。那么这样的情况在SASS中应该怎么写呢?写法如下


  SCSS代码

.one {
	width:100px;height:100px;
}
.two {
	/*继承的样式*/
	@extend .one;
	/*独立的样式*/
	background:red;
	border:5px solid #000;
}
.three {
	/*继承的样式*/
	@extend .two;
	/*独立的样式*/
	padding:10px;
}

  编译后的CSS代码

.one, .two, .three {
  /*继承的样式*/
  width: 100px;
  height: 100px;
}

.two, .three {
  /*独立的样式*/
  background: red;
  border: 5px solid #000;
}

.three {
  /*独立的样式*/
  padding: 10px;
}

  从编译后的CSS中不难看出,类名“.one”变成了群组选择,添加了类名“.two”和类名“.three”。而类名“.two”变成了群组选择,添加了类名“.three”。那么为什么叫做链型继承呢?是因为一层一层的继承,很像一条链子故得名。


 继承的局限性


  虽然能够继承的选择器数量很多,但是也有很多选择器并不被支持继承的,如包含选择器(.one .two)或者相邻兄弟选择器(.one+.two)目前还是不支持继承。但若继承的元素是“a”,恰巧这个元素“a”又有hover状态的样式,那么hover状态的样式也会被继承。如下


  SCSS代码

.myLink {
  @extend a;
}
a {
  color: blue;
  &:hover {
    text-decoration: underline;
  }
}

  编译后的CSS代码

a, .myLink {
  color: blue;
}
a:hover, .myLink:hover {
  text-decoration: underline;
}

  继承有强大的地方,也有局限的地方。对于a的继承可以继承其hover状态,但是对于某些选择器就不适用了。


 继承交叉合并选择


  继承交叉合并选择,从字面上其实很难理解说的事件什么事儿。既然有点难理解,那么就先看小例子吧,用例子来解释感觉会比较清楚。例子如下


  SCSS代码

.meng a {
	font-weight:bold;
}

.long .link {
	@extend a;
}

  编译后的CSS代码

.meng a, .meng .long .link, .long .meng .link {
  font-weight: bold;
}

  从上面 的例子不难看出,类名“.meng”中的“a”选择器被类名“.long”中的类名“.link”继承了,但是由于没有在同一个父级下,会产生交叉合并的编译结果。这种其实是可以解决的,就是把父级改成相同的即可。若父级不能改的话,那么就乖乖的在写一遍,或者将“.meng a”直接换成类名,继承这个类名也可以。


 继承带%的东西


  有时候你想继承一个类名,但是并不想再在HTML中使用,就单单想写一个能够继承的类名。尤其是不想让它出现在css样式中。我们可以用占位符来写一些继承的样式(如“%one”),然后再通过@extend继承,这样就可以防止被渲染到CSS的规则集中。如下


  SCSS代码

#meng a%long {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}

.notice {
  @extend %long;
}

  编译后的CSS代码

#meng a.notice {
  color: blue;
  font-weight: bold;
  font-size: 2em;
}

 继承在指令中的作用域


  继承在指令中是有作用域问题的,继承是无法使在指令如(@media)之外的选择器继承的,要是继承就只能写在指令中。实例如下


  SCSS代码

.one {
	height:300px;
}
@media print {
  .two {
	@extend .one;
	width:300px;
  }
}

  编译后的CSS代码

.one {
  height: 300px;
}

@media print {
  .two {
    width: 300px;
  }
}

  右上可见,类名“.two”并没有继承类名“.one”的样式,那么需要让类名“.two”成功继承类名“.one”的样式,就应该把类名“.one”也放在@media中,实例如下


  SCSS代码

@media print {
	.one {
		height:300px;
	}
	.two {
		@extend .one;
		width:300px;
	}
}

  编译后的CSS代码

@media print {
  .one, .two {
    height: 300px;
  }

  .two {
    width: 300px;
  }
}


  SASS详解之继承(extend)就为大家介绍到这里了,感谢大家能够耐心的看到这里。更多有关SASS的详解敬请关注梦龙小站SASS详解的更新。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SASS详解之继承(extend) 的相关文章

  • 我可以用 SASS \ Compass 计算和使用元素高度吗

    我在 RoR 项目中使用 sass 和 compass 我需要分配给top元素的 CSS 属性值 即元素高度除以 2 我可以用 SASS Compass 来做吗 你似乎已经得到了XY问题 https meta stackexchange c
  • 修改变量后动态重新导入 Sass 部分

    我正在开发一个利用 Sass 预编译的 Twitter Bootstrap 的项目 每次覆盖变量时 我都必须重新导入 bootstrap sass文件到我的项目主样式表以使覆盖生效 您是否知道如何使此过程自动进行 以便每次修改变量时立即生效
  • python列表理解和extend() [重复]

    这个问题在这里已经有答案了 深入学习 Python 2 7 1 但未能理解这一点 几个小时 gt gt gt a 1 2 gt gt gt b 3 4 gt gt gt gt gt gt a extend b 0 gt gt gt a 1
  • 使用 npm 安装 font Awesome 5 以供 scs 使用

    就像标题所说 我无法出于 scss 目的使用 npm 安装 font Awesome 5 尝试安装版本5 根据https fontawesome com how to use use with node js https fontaweso
  • Zurb Foundation:半透明顶栏可能吗?

    有没有办法用 Zurb Foundation 制作一个半透明的顶栏 据我所知 我已经在我的 settings scss file topbar bg color topbar bg topbar dropdown bg topbar dro
  • 如何根据 Angular 中的全局 CSS 类名调整组件的 CSS?

    我们正在使用一个类html 判断用户是否在的元素dark or light应用程序的模式 这个类是使用添加的Renderer2在检测用户所选设置的服务中 到目前为止效果很好 现在 我们必须调整所有组件 以便在黑暗模式下也能看起来很好 但问题
  • 安装 Sass 时出错(Ruby 2.5.0.1、MSYS2 20161025.0.0)

    我尝试安装 Sass 我安装了Ruby and MSYS2在此之前 来自所有人的最新消息巧克力味 https chocolatey org choco install ruby choco install msys2 看来它们已正确安装 r
  • 如何在 scss 中包含仅限 Safari 的样式? [复制]

    这个问题在这里已经有答案了 我只是想修改仅适用于 safari 浏览器的样式属性 这将覆盖默认属性 简单的例子 Default div color blue Safari 浏览器 div color red 我想这可以通过 scss 的 i
  • 将自定义 CSS 添加到使用 Compass 生成的精灵中

    我有这个代码my images scss file icon layout smart icon sprite dimensions true import icon png include all icon sprites 输出是这样的
  • 如何覆盖和扩展基本的 Django 管理模板?

    如何覆盖管理模板 例如 admin index html 同时扩展它 请参阅https docs djangoproject com en dev ref contrib admin overriding vs replacing an a
  • 使用 webpack 导入目录中的所有 sass 文件

    我目前正在尝试使用 Webpack 捆绑我的所有文件 但我不知道在处理多个文件夹和 scss files 我曾经使用 grunt 来完成这些任务 这是我的文件夹结构的示例 functions mixin scss function scss
  • scss bootstrap 4 覆盖地图

    我正在尝试使用 Bootstrap 4 进行 scss 但我不知道如何正确地覆盖变量 使用映射 自定义 scss Your variable overrides primary rgb 40 167 36 spacer 1 spacers
  • 与 webpack 捆绑时如何为每个 .scss 文件提供变量.scss?

    这是我当前的项目目录结构 因为我想不出更好的方法来组织每个组件都有自己的用例 scss文件 但是 整个应用程序都提供主题 其中包括全局variables scss文件 目前 我正在导入variables scss文件位于每个组件的顶部 sc
  • 可以同时“观看”HAML 和 SASS 吗?

    我希望能够即时更新 保存我的 html 和 css 但我不知道如何同时观看 HAML 和 SASS Thanks 显然你只能使用 StaticMatic 或其他一些第三方工具来同时观看两者
  • Azure DevOps 管道构建工件中缺少 Gulp 编译的 CSS 文件夹

    一点背景 我有一个小型 dotnet 核心应用程序 该应用程序托管在 Azure 上 并且正在使用 Azure DevOps Pipelines 进行构建和部署 在我们开始使用 DevOps Pipelines 之前 CI 直接连接到 Az
  • Bootstrap - 为反向行模式创建移动自适应

    我想用 Bootstrap 创建一个反向效果 第一行 左边是文字 右边是图像 第二行 左边是图片 右边是文字 第三行 左边是文字 右边是图片 第四行 左边是图片 右边是文字 而且这种情况一直持续下去 它在大型设备上看起来非常漂亮 但当它在设
  • 我可以在用例中扩展参与者吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我可以在用例中扩展参与者吗 例如我有
  • 如何更改 bootstrap 版本 4 按钮颜色

    我可以通过更改 bootstrap v4 中的主题颜色来更改主按钮颜色 但它也会影响所有其他组件 如何设置主按钮颜色而不影响主题颜色 我不想设置品牌为主并实现它 还有其他选择吗 Bootstrap 4 1 2019 年更新 现在 Boots
  • 如何将 css 预处理器与 Angular 7 一起使用

    我是预处理器世界的新手 我如何使用它们 特别是 postcss 和 LostGrid 与 Angular 7 我正在尝试申请这段代码 https codepen io anon pen BeLWeb有角度的 正如你所看到的 它使用postc
  • 将参数从 mixin 传递到内容块

    This Sass 队列中的未决问题 https github com sass sass issues 871似乎意味着将参数传递给 content还不是一个功能 但是Susy 2 https github com ericam susy

随机推荐

  • nestjs: Redundant character escape ‘\@‘ in RegExp 处理

    问题 如标题 参考 Redundant character escape in RegExp CodeAntenna 解决办法 将转义符号 删除掉
  • 【分布式金融交易模型】Seata中间件的TCC模式实现一对一转账

    Seata中间件实现一对一转账 1 转账界面 2 本地事务在分布式下的问题 2 1 本地事务 2 1 1 事务四大特性 2 1 2 本地事务的概念 2 1 3 本地事务的实现 使用注解 Transactional 2 1 4 事务的隔离级别
  • elastisearch启动报错:org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAIL

    使用命令启动一个ES进程 bin elasticsearch E node name warmnode E cluster name geektime E path data warm data E node attr my node ty
  • upload-labs第一关

    level1 根据提示这是本地js文件上传绕过 有两种思路 第一种将浏览器中的js检验代码删除 第二种 将一句话木马的后缀改成可以上传的文件类型 利用burp suit抓包再改包绕过js 改包过程 上传成功 获取上传的图片地址 在网页上打开
  • 计算机无法识别3.0u盘启动,USB3.0接口不能识别U盘的解决方法

    USB3 0接口不能识别U盘的解决方法 USB接口可以说是电脑的标配 现在基本上所有电脑都会搭载USB接口 而USB标准从1 0发展到现在的3 0 甚至更新的也已出来 不过 如果USB3 0无法识别U盘 那该怎么办呢 USB3 0是一种技术
  • tensorflow实战(五)——过拟合调参(2)及学习率动态调整

    我们通过采取动态调整学习率的策略 缓解过拟合问题 随着训练轮数的增加 学习率逐渐下降会使模型拟合的更好 在这里 我们设定网络结构为 model tf keras Sequential 0 255共256个 故第一个参数为256 数据为三位数
  • Docker(一)简介、环境搭建

    文章目录 一 docker简介 1 什么是docker 2 什么是容器 3 传统的虚拟化技术和容器之间的差别 4 容器运行的过程 重要 二 docker环境部署及测试 1 环境部署 2 通过镜像运行容器 3 拉取镜像 一 docker简介
  • Qt_QWidget窗体设置模态显示

    QWidget是Qt中的窗口类 实现QWidget窗口显示有三个步骤 1 实例化一个窗口类对象 类QWidget的对象可以是QWidget 也可以是QWidget的继承类 QWidget pW new QWidget NULL 2 调用函数
  • 物联网LoRa系列-28:LoRaWAN PingPong终端与Class A/B/C类型终端不能互通的原因与解决办法

    在LoRa终端与LoRa网关和服务器联调之前 有时候需要通过相对简单的PingPong终端序给Class A B C类型的终端发送数据 以验证Class A B C终端可以正常收发数据包 然而原生提供的 PingPong与Class A B
  • 怎么用VLC播放器将m3u8链接视频下载到本地

    m3u8格式链接在浏览器上打开 没有插件的情况下你会得到长得跟下面差不多的一个文本列表 有基础的同学可能知道 以 ts 结尾的那些就是视频连接的实际播放地址 当然你还要拼上前面的前缀 在浏览器上安装过插件的情况 你可以直接在线预览影片 但是
  • echarts设置柱形图宽度 最大宽度 最小宽度

    一般来说不需要设置柱形图宽度 不过如果实在是要设置也只能硬着头皮设置了 修改series对应数组里面的barWidth属性即可设置柱形图宽度 当然还有最小宽 最大宽则是barMinWidth和barMaxWidth api地址 https
  • 现在的00后,实在是太卷了,我们这些老油条都想辞职了......

    现在的小年轻真的卷得过分了 前段时间我们公司来了个00年的 工作没两年 跳槽到我们公司起薪20K 都快要超过我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好 一大家子指望他一个
  • ❤ npm install报错以及各种错误码的含义

    npm install报错以及各种错误码的含义 1 npm install 10054 报错 Error while executing 造成这个错误很有可能是网络不稳定 连接超时导致的 如果再次尝试后依然报错 可以执行下面的命令 打开Gi
  • 种类并查集+入门题A Bug's Life

    我觉得种类并查集还是先从一个基础入门题讲起吧 Background Professor Hopper is researching the sexual behavior of a rare species of bugs He assum
  • apt-get install:安装软件包命令

    apt get install 是一个用于在 Debian Ubuntu 和其他基于 Debian 的 Linux 发行版中安装软件包的命令 它是 Advanced Packaging Tool APT 工具集中的一部分 用于管理软件包的安
  • 【HBZ分享】java的大顶堆与小顶堆

    大顶堆 大顶堆属于完全二叉树的一种 大顶堆是父节点一定 大于 子节点 左右两个子节点没有顺序要求 左字节点大也行 有子节点大也可以 二叉堆就是我们所说的大顶堆 或 小顶堆 小顶堆 小顶堆也是完全二叉树 小顶堆是父节点一定 小于 子节点 左右
  • 百问网7天物联网记录(一)

    HAL库初步移植 在STM32F103 MINI开发板上成功移植 这次来移植自己的开发板 芯片是F103ZET6 一 创建文件夹 在上述文件夹中 APP存放业务逻辑代码 如main c BSP存放外设模块的驱动代码 Core存放系统配置文件
  • 潜在狄利克雷分配(LDA)(latent Dirichlet allocation)

    我们先理解下多项分布 狄利克雷分布 共轭先验的知识 再讲LDA的基本思想 最后简单说一下LDA和PLSA之间的区别 关于LDA的学习过程 比较复杂 就不讲了 多项分布 假设重复进行 次独立随机试验 每次实验可能出现的结果有 种 第 种结果出
  • nio简单例子

    缓冲区底层就是数组用于存储不同的数据类型 boolean除外 ByteBuffer CharBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer 上述缓冲区通过al
  • SASS详解之继承(extend)

    每一个类名都有可能有另一个类名的所有样式和它自己的特定样式的 当一个div的身上有两个类名 一个是 one 另一个是 two 的时候 如下 HTML代码 div class one two 梦龙小站 div CSS代码 one width