Sass学习笔记 -- 嵌套

CSS中的嵌套是特别繁琐的,即便用比较强大的编辑器比如Webstorm来编辑代码,可是在维护的时候还是不能一目了然的去找到对应的代码,我们经常看到类似这样的代码段:

#content article h1 { color: #333 }
#content article p { margin-bottom: 1.4em }
#content aside { background-color: #eee }

如果用sass来编写的话,这些重复的选择器就只用写一次了,而且可读性也更高了

#content {
  article {
    h1 { color: #333 }
    p { margin-bottom: 1.4em }
  }
  aside { background-color: #eee }
}

sass的嵌套包括两种:一种是选择器的嵌套,另一种是属性的嵌套

选择器嵌套

所谓选择器嵌套指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性

//scss
#top_nav{
  line-height: 40px;
  text-transform: capitalize;
  background-color:#333;
  li{
    float:left;
  }
  a{
    display: block;
    padding: 0 10px;
    color: #fff;

    &:hover{
      color:#ddd;
    }
  }
}

//css
#top_nav {
  line-height: 40px;
  text-transform: capitalize;
  background-color: #333; }
  #top_nav li {
    float: left; }
  #top_nav a {
    display: block;
    padding: 0 10px;
    color: #fff; }
    #top_nav a:hover {
      color: #ddd; }

在选择器嵌套中,可以使用&表示父元素选择器,最常见的就是:hover这种伪类,否则,就会被误编译成后代选择器

//scss
a {
  font-weight: bold;
  text-decoration: none;
  &:hover { text-decoration: underline; }
  body.firefox & { font-weight: normal; }
}
//css
a {
  font-weight: bold;
  text-decoration: none; }
  a:hover {
    text-decoration: underline; }
  body.firefox a {
    font-weight: normal; }
//scss
#main {
  color: black;
  a {
    font-weight: bold;
    &:hover { color: red; }
  }
}

//css
#main {
  color: black; }
  #main a {
    font-weight: bold; }
    #main a:hover {
      color: red; }
//scss
#main {
  color: black;
  &-sidebar { border: 1px solid; }
}

//css
#main {
  color: black; }
  #main-sidebar {
    border: 1px solid; }

群组选择器的嵌套

//scss
.container {
h1, h2, h3 {margin-bottom: .8em}
}

//css
.container h1, .container h2, .container h3 {
  margin-bottom: .8em;
}

子组合选择器和同层组合选择器:>、+和~

先来回忆下这三种选择器

后代选择器: article section { margin: 5px }

子代选择器: article>section { margin: 5px }

相邻兄弟选择器:article+section { margin: 5px }

通用兄弟选择器:article~section { margin: 5px }

//scss
article {
  ~ article { border-top: 1px dashed #ccc }
  > section { background: #eee }
  dl > {
    dt { color: #333 }
    dd { color: #555 }
  }
  nav + & { margin-top: 0 }
}

//css
article ~ article {
  border-top: 1px dashed #ccc; }
article > section {
  background: #eee; }
article dl > dt {
  color: #333; }
article dl > dd {
  color: #555; }
nav + article {
  margin-top: 0; }

属性嵌套

所谓属性嵌套指的是有些属性拥有同一个开始单词,如border-width,border-color都是以border开头

嵌套属性的规则是这样的:把属性名从中划线-的地方断开,在根属性后边添加一个冒号:, 紧跟一个{ }块,把子属性部分写在这个{ }块中。就像CSS选择器嵌套一样,Sass会把你的子属 性一一解开,把根属性和子属性部分通过中划线-连接起来,最后生成的效果与你手动一遍遍写 的CSS样式一样:

//scss
nav {
border: {
style: solid;
width: 1px;
color: #ccc;
}
}

//css
nav {
  border-style: solid;
  border-width: 1px;
  border-color: #ccc;
}

对于属性的缩写形式,你甚至可以像下边这样来嵌套,指明例外规则

//scss
nav {
border: 1px solid #ccc {
left: 0px;
right: 0px;
}
}

//css
nav {
  border: 1px solid #ccc;
  border-left: 0px;
  border-right: 0px;
}

@at-root

sass3.3.0中新增的功能,用来跳出选择器嵌套的。默认所有的嵌套,继承所有上级选择器,但有了这个就可以跳出所有上级选择器。

//scss     没有跳出
.parent-1 {
  color:#f00;
  .child {
    width:100px;
  }
}

//css
.parent-1 {
  color: #f00;
}
.parent-1 .child {
  width: 100px;
}
//scss      单个选择器跳出
.parent-2 {
  color:#f00;
  @at-root .child {
    width:200px;
  }
}

//css
.parent-2 {
  color: #f00;
}
.child {
  width: 200px;
}
//scss    多个选择器跳出
.parent-3 {  background:#f00;
  @at-root {
    .child1 {  width:300px;}    
    .child2 {  width:400px;}
  }
}

//css
.parent-3 {
  background: #f00;
}
.child1 {
  width: 300px;
}

.child2 {
  width: 400px;
}


@at-root (without: ...)

默认@at-root只会跳出选择器嵌套,而不能跳出@media或@support,如果要跳出这两种,则需使用@at-root (without: media),@at-root (without: support)。

这个语法的关键词有四个:all(表示所有),rule(表示常规css),media(表示media),support(表示support,因为@support目前还无法广泛使用,所以在此不表)。

我们默认的@at-root其实就是@at-root (without:rule)。

//scss   跳出父级元素嵌套
@media print {
    .parent1{
      color:#f00;
      @at-root .child1 {
        width:200px;
      }
    }
}

//css
@media print {
  .parent1 {
    color: #f00;
  }
  .child1 {
    width: 200px;
  }
}
//scss   跳出media嵌套,父级有效
@media print {
  .parent2{
    color:#f00;

    @at-root (without: media) {
      .child2 {
        width:200px;
      } 
    }
  }
}

//css
@media print {
  .parent2 {
    color: #f00;
  }
}
.parent2 .child2 {
  width: 200px;
}
//scss   跳出media和父级
@media print {
  .parent3{
    color:#f00;

    @at-root (without: all) {
      .child3 {
        width:200px;
      } 
    }
  }
}
//css
@media print {
  .parent3 {
    color: #f00;
  }
}
.child3 {
  width: 200px;
}

@at-root和&的结合

//scss
.foo {
    @at-root .bar & {
        color:gray;
    }
}

//css
.bar .foo {
  color: gray;
}

在Sass中同时使用@at-root和&起到的作用是一样的,换句话说,这样并没有带来新的特性,而且在整个开发中还带来了额外的工作量

//scss
.foo {
    @at-root & .bar {
        color:gray;
    }
}

.foo {
    & .bar {
        color:gray;
    }
}

//css
.foo .bar {
  color: gray;
}

.foo .bar {
  color: gray;
}

应用于@keyframe

//scss
.demo {
    ...
    animation: motion 3s infinite;

    @at-root {
        @keyframes motion {
          ...
        }
    }
}

//css
.demo {
    ...   
    animation: motion 3s infinite;
}
@keyframes motion {
    ...
}

@at-root和#{&}结合

Sass有脚本模式#{},他和&不同之处是,&只用作选择器,它只能出现在一个复合的开始选择器,类似于一个类型选择器,如a或者h1。但#{}他表示的是一个插值,它可以用在任何地方。同样的,当@at-root和#{&}一起使用时,可以给我们的开发带来极大的方便与优势。例如:

//scss
.foo {
    @at-root .bar #{&} {
        color: gray;
    }
}

.foo {
    @at-root #{&} .bar {
        color:gray;
    }
}
.foo {
    @at-root #{&}.bar {
        color:gray;
    }
}

//css
.bar .foo {
  color: gray;
}

.foo .bar {
  color: gray;
}

.foo.bar {
  color: gray;
}
时间: 2024-12-17 17:47:40

Sass学习笔记 -- 嵌套的相关文章

Sass学习笔记(补充)

阅读目录 1. Sass和SCSS的区别 2. @while循环 3. @at-root 4. @content 5. 凸显注释 6. CSS输出样式 7. 重置浏览器样式 8. Sass调试和@debug命令.@warn命令 9. 使用Sass时的注意事项 相关链接:Sass学习笔记前篇 Sass关于颜色函数的乐趣 在Sass学习笔记前篇,记载了Sass安装.基本用法.编程语法,在这篇,将补充在前篇未记载的知识. 1. Sass和SCSS的区别 参考链接:http://sass.bootcss

sass学习笔记2

今天介绍sass在重用代码时最具威力的两个功能.一个是嵌套(Nesting),一个混合(Mixin). 我们在写CSS通过需要多个后代选择器组合到一起才能定位到目标元素上,而这定义过程,此元素的父元素与其他选择器都有许多相同的部分,嵌套就是把这些相同的部分放到某一层花括号里,然后通过花括号的层层缩进堆砌,找到它们的共性与特性. @charset "utf-8";//必须设置了这个才能编译有中文的注释 nav { ul { margin: 0; padding: 0; list-styl

Sass学习笔记

阅读目录 一. Sass安装 1.1 Ruby安装 1.2 运行gem命令 1.3 安装Sass 二. Sass基本用法 2.1 导入 2.2 注释 2.3 变量 2.4 嵌套 2.5 继承 2.6 占位符 2.7 混合宏 三. Sass编程 3.1 数学计算 3.2 条件 3.3 循环 3.4 函数 Sass被称为"CSS预处理器",就是用一种编程的思想去写CSS样式表.在还没接触Sass的时候,很多人都不愿意去了解,认为都会了CSS,为什么还要去写Sass,Sass最终生成的还是C

Sass学习笔记之入门篇

Sass又名SCSS,是CSS预处理器之一,,它能用来清晰地.结构化地描述文件样式,有着比普通 CSS 更加强大的功能. Sass 能够提供更简洁.更优雅的语法,同时提供多种功能来创建可维护和管理的样式表.以下是我的学习笔记. Sass安装环境 1.安装sass(mac) ①:Ruby安装 ②:安装sass sudo gem install sass 可以通过 sass -v检测是否完成安装   2.更新sass gem update sass 3.卸载(删除)sass gem uninstal

sass学习笔记-输出方法

1.嵌套输出方式 nestedSass 提供了一种嵌套显示 CSS 文件的方式.例如 nav { ul { margin: 0; padding: 0; list-style: none; } li { display: inline-block; } a { display: block; padding: 6px 12px; text-decoration: none; } } 在编译的时候带上参数“ --style nested”: sass --watch test.scss:test.

sass学习笔记-安装

Sass安装(windows版) 在 Windows 平台下安装 Ruby 需要先有 Ruby 安装包,大家可以到 Ruby 的官网(http://rubyinstaller.org/downloads)下载对应需要的 Ruby 版本. Ruby 安装文件下载好后,可以按应用软件安装步骤进行安装 Ruby.在安装过程中,个人建议将其安装在 C 盘下,在安装过程中选择第二个选项(不选中,就会出现编译时找不到Ruby环境的情况),如下图所示: Ruby 安装完成后,在开始菜单中找到新安装的 Ruby

Sass学习笔记 -- 变量及变量作用域历史遗留问题

sass有两种后缀名文件: 一种后缀名为sass,写选择器时不能使用大括号和分号 一种后缀名为scss,使用大括号和分号 //后缀名为sass的语法,不能出现大括号和分号 $highlight-color: #abcdef .selected   border: 1px $highlight-color solid    //后缀名为scss的语法,跟css一样,需要大括号和分号 $highlight-color: #abcdef; .selected{   border:1px solid $

sass学习笔记1

less在处理CSS动画时,非常恶心,决定转向sass了.sass诞生得比less早,只是因为它是ruby写的,因此受众面够少.但我们不需要自己下编译器或使用命令行,我们可以koala这神器 首先几个注意点,sass可以用sass后缀名,也可以用scss后缀名.前者比较恶心,像python一样没有花括号,也不让写分号,散架子一样.因此推荐用scss,这个也是目前我遇到的大部分人的选择. 关于中文编译出错的问题,需要指定字符集. @charset "utf-8";//必须设置了这个才能编

菜鸟的 Sass 学习笔记

介绍 sass 是什么?? 在sass的官网,它是这么形容给自己的 Sass is the most mature, stable, and powerful professional grade CSS extension language in the world. sass 是世界上最成熟稳定强大的css扩展语言. sass并不是一种编程语言,但是我们可以用于开发网页样式,你可以称它为css预处理器.用sass来写css,然后再编译成正常的css文件. css兼容:Sass与所有版本的CS