Sass

133 阅读2分钟

前言

Sass 是什么?

Sass是一个功能强大的专业级CSS扩展语言

为什么要学习 Sass ?

根据 W3C标准 网页有三部分组成:结构+表现+行为。(常用)分别对应着 HTML + CSS +Javascript 。Sass让CSS有了动态语言的特点,有了Sass,在css语法的基础上不仅可以写变量、函数,而且可以转换为标准的css。,降低了工作量,提高了效率。项目中也使用到了Sass。 下面记录学习过程

保持sass条理性和可读性的最基本的三个方法:嵌套、导入和注释

使用变量

  • 变量声明 (和一般变量声明类似只不过变量用$开头)

	$hight-color:#F90
	$nav-color:#F90
	nav{
		$width:100px;
		width:$width;
		color:$nav-color
		}
  • 变量引用 (同样 引用的时候也要以$开头)

	$hight-color:#F90
	.selected {
		border:1px solid $hightlight-color 
	}
	//编译后
	.selected {
		border:1px solid #F90
			}

	$highlight-color: #F90;
	$highlight-border: 1px solid $highlight-color;
	.selected {
	  border: $highlight-border;
	}
	
	//编译后
	
	.selected {
	  border: 1px solid #F90;
	}



  • 变量名用中划线还是下划线分隔

	$link-color: blue;
	a {
	  color: $link_color;
	}
	
	//编译后
	
	a {
	  color: blue;
	}

嵌套CSS规则


	#content {
	  artcle {
	    h1 {
	      color: #333;
	    }
	    p {
	      margin-bootm: 1.4em;
	    }
	  }
	
	  aisde {
	    background-color: #eee;
	  }
	}

	
	 /* 编译后 */
	#content article h1 { color: #333 }
	#content article p { margin-bottom: 1.4em }
	#content aside { background-color: #EEE }
 	//省去了重复编写选择器

  • 父选择器标识符 & (替换父选择器)

	1. 伪类选择器的时候使用
	article a {
	  color: blue;
	  :hover { color: red }
	}
	
	
	article a {
	  color: blue;
	  &:hover { color: red }
	}
	这里 &被直接替换为父选择器
	需要的是 article a:hover { color: red } 
	而不是  	article a :hover { color: red } 
	添加 &
	2. 在父选择器之前添加选择器
	
	  #content aside {
	  color: red;
	  body.ie & { color: green }
	}
	
	/*编译后*/
	#content aside {color: red};
	body.ie #content aside { color: green }

  • 群组选择器的嵌套 (减少重复的编写工作)

	这是群组选择器 常规的写法
	.container h1, .container h2, .container h3 { margin-bottom: .8em }
	简写后
	.container {
	  h1, h2, h3 {margin-bottom: .8em}
	}


  • 子组合选择器和同层组合选择器:>、+和~ (嵌套的一种写法)

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

  • 嵌套属性

	nav {
	  border: {
	  style: solid;
	  width: 1px;
	  color: #ccc;
	  }
	}
	
	
	编译后
	nav {
	  border-style: solid;
	  border-width: 1px;
	  border-color: #ccc;
	}
	
	
	nav {
	  border: 1px solid #ccc {
	  left: 0px;
	  right: 0px;
	  }
	}
	
	编译后
	nav {
	  border: 1px solid #ccc;
	  border-left: 0px;
	  border-right: 0px;
	}

嵌套属性的规则:

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

导入Sass文件

与常规css导入不同的是 css 只有在执行到@import 时浏览器才会去下载其它的css文件 而sass的import规则在生成css文件时就把相关文件导入进来,不需要发起额外的下载请求

  • 使用Sass 部分文件(局部文件)

Sass局部文件特殊的约定:

  1. 以下划线开头
  2. @import局部文件时,可以不写文件的全名(省略文件名开头的下划线)

例:


	导入themes/_night-sky.scss这个局部文件里的变量
	在样式表中直接写@import "themes/night-sky";

  • 默认变量值 (!default 设置变量的默认值)

	$fancybox-width: 400px !default;
	.fancybox {
	width: $fancybox-width;
	}
  • 嵌套导入

局部文件 _blue-theme.scss


	aside {
	  background: blue;
	  color: white;
	}

导入到CSS规则内


	.blue-theme {@import "blue-theme"}
	
	//生成的结果跟你直接在.blue-theme选择器内写_blue-theme.scss文件的内容完全一样。
	
	.blue-theme {
	  aside {
	    background: blue;
	    color: #fff;
	  }
	} 

  • 原生的CSS导入 (Sass 支持原生的CSS导入)

Sass兼容原生的css,所以也支持原生的CSS@import 一般情况下Sass会尝试找到对应的Sass文件并导入进来

但下列情况会生成原生的CSS@import:

  1. 被导入文件的名字以.css结尾
  2. 被导入文件的名字是一个URL地址(比如www.sass.hk/css/css.css…
  3. 被导入文件的名字是CSS的url()值。

这就是说,你不能用sass的@import直接导入一个原始的css文件,因为sass会认为你想用css原生的@import。但是,因为sass的语法完全兼容css,所以你可以把原始的css文件改名为.scss后缀,即可直接导入了。

文件导入是保证sass的代码可维护性和可读性的重要一环。次之但亦非常重要的就是注释了。注释可以帮助样式作者记录写sass的过程中的想法。在原生的css中,注释对于其他人是直接可见的,但sass提供了一种方式可在生成的css文件中按需抹掉相应的注释。

静默注释

**静默注释:**在生成的css代码中看不到注释

例:


	body {
	  color: #333; // 这种注释内容不会出现在生成的css文件中
	  padding: 0; /* 这种注释内容会出现在生成的css文件中 */
	}
	
	css的标准注释格式/* ... */内的注释内容亦可在生成的css文件中抹去。当注释出现在原生css不允许的地方,如在css属性或选择器中,sass将不知如何将其生成到对应css文件中的相应位置,于是这些注释被抹掉。
	
	body {
	  color /* 这块注释内容不会出现在生成的css中 */: #333;
	  padding: 1; /* 这块注释内容也不会出现在生成的css中 */ 0;
	}

混合器

**作用:**通过混合器实现大段样式的重用

混合器定义用 @mixin 调用用 @include 例:


	//定义混合器
	@mixin rounded-corners {
	  -moz-border-radius: 5px;
	  -webkit-border-radius: 5px;
	  border-radius: 5px;
	}
	
	//使用混合器
	notice {
	  background-color: green;
	  border: 2px solid #00aa00;
	  @include rounded-corners;
	}
	//最终生成
	
	.notice {
	  background-color: green;
	  border: 2px solid #00aa00;
	  -moz-border-radius: 5px;
	  -webkit-border-radius: 5px;
	  border-radius: 5px;
	}

  • 什么时候使用混合器?

重复编写的样式 或者 这段样式是一个逻辑单元(能够想出一个好名字)

  • 混合器中的css规则

	// 定义混合器
	@mixin no-bullets {
	  list-style: none;
	  li {
	    list-style-image: none;
	    list-style-type: none;
	    margin-left: 0px;
	  }
	}
	//调用混合器
	ul.plain {
	  color: #444;
	  @include no-bullets;
	}
	//最终生成
	ul.plain {
	  color: #444;
	  list-style: none;
	}
	ul.plain li {
	  list-style-image: none;
	  list-style-type: none;
	  margin-left: 0px;
	}

  • 混合器传参 (像函数一样使用就行)
	//像函数一样定义
	@mixin link-colors($normal, $hover, $visited) {
	  color: $normal;
	  &:hover { color: $hover; }
	  &:visited { color: $visited; }
	}
	
	// 像函数那样调用
	a {
	  @include link-colors(blue, red, green);
	}
	
	//Sass最终生成的是:
	
	a { color: blue; }
	a:hover { color: red; }
	a:visited { color: green; }


  • 默认参数值

	//赋一个默认值 这里注意不是 = 号
	@mixin link-colors(
	    $normal,
	    $hover: $normal,
	    $visited: $normal
	  )
	{
	  color: $normal;
	  &:hover { color: $hover; }
	  &:visited { color: $visited; }
	}
	//调用
	
	@include link-colors(red)

使用选择器继承来精简CSS

继承使用: @extend + 选择器名字


	//通过选择器继承继承样式
	.error {
	  border: 1px solid red;
	  background-color: #fdd;
	}
	.seriousError {
	  @extend .error;
	  border-width: 3px;
	}

关于@extend有两个要点你应该知道:

  1. 跟混合器相比,继承生成的css代码相对更少。因为继承仅仅是重复选择器,而不会重复属性,所以使用继承往往比混合器生成的css体积更小。如果你非常关心你站点的速度,请牢记这一点。
  2. 继承遵从css层叠的规则。当两个不同的css规则应用到同一个html元素上时,并且这两个不同的css规则对同一属性的修饰存在不同的值,css层叠规则会决定应用哪个样式。相当直观:通常权重更高的选择器胜出,如果权重相同,定义在后边的规则胜出。