sass
//定位上下左右居中
@mixin center
position: absolute
top: 50%
left: 50%
transform: translate(-50%, -50%)
// 背景图片地址和大小
@mixin bis($url)
background-image: url($url)
background-repeat: no-repeat
background-size: 100% 100%
听说现在很多sass的项目都用, 这个 Bourbon - A Lightweight Sass Tool Set
sass文件组织
Sass: Directory Structures That Help You Maintain Your Code知乎-你是如何去组织项目中的 Less/Sass 代码的
sass 基础入门
Sass 快速入门SASS官方文档SASS参考手册SASS基础——十个常见的MixinsSASS使用总结
编程风格
- nested:嵌套缩进的css代码,它是默认值。
- expanded:没有缩进的、扩展的css代码。
- compact:简洁格式的css代码。
- compressed:压缩后的css代码。
变量
使用$
$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
如果变量需要镶嵌在字符串之中,就必须需要写在#{}之中。(下次见到 别觉得神奇)
$side : left;
.rounded {
border-#{$side}-radius: 5px;
}
### 变量的算法
```css
body {
margin: (14px/2);
top: 50px + 100px;
right: $var * 10%;
}
嵌套
div {
hi {
color:red;
}
}
a {
&:hover { color: #ffb3ff; }
}
注释
SASS共有两种注释风格。
标准的CSS注释 /* comment */ ,会保留到编译后的文件。
单行注释 // comment,只保留在SASS源文件中,编译后被省略。
"重要注释"。即使是压缩模式编译,也会保留这行注释,通常可以用于声明版权信息。
/*!
重要注释!
*/
导入文件
@import命令,用来插入外部文件。
@import "path/filename.scss";
如果插入的是.css文件,则等同于css的import命令。 @import "foo.css";
代码重用
@extend
SASS允许一个选择器,继承另一个选择器。比如,现有class1:
.class1 {
border: 1px solid #ddd;
}
class2要继承class1,就要使用@extend命令:
.class2 {
@extend .class1;
font-size:120%;
}
@mixin 混合指令
使用@mixin命令,定义一个代码块。
@mixin left {
float: left;
margin-left: 10px;
}
使用@include命令,调用这个mixin。
div {
@include left;
}
向混合样式中导入内容 (Passing Content Blocks to a Mixin) 在引用混合样式的时候,可以先将一段代码导入到混合指令中,然后再输出混合样式,额外导入的部分将出现在 @content标志的地方:
@mixin apply-to-ie6-only {
* html {
@content;
}
}
@include apply-to-ie6-only {
#logo {
background-image: url(/logo.gif);
}
}
编译为
* html #logo {
background-image: url(/logo.gif);
}
指定参数
@mixin left($value: 10px) {
float: left;
margin-right: $value;
}
<!--使用的时候,根据需要加入参数:-->
div {
@include left(20px);
}
颜色函数
lighten(#cc3, 10%) // #d6d65c
darken(#cc3, 10%) // #a3a329
grayscale(#cc3) // #808080
complement(#cc3) // #33c
!default
!defalt 表示默认值
sass 高级用法
条件语句
@if可以用来判断:
p {
@if 1 + 1 == 2 { border: 1px solid; }
@if 5 < 3 { border: 2px dotted; }
}
配套的还有@else命令:
@if lightness($color) > 30% {
background-color: #000;
} @else {
background-color: #fff;
}
循环
@for
@for $i from 1 to 10 {
.border-#{$i} {
border: #{$i}px solid blue;
}
}
@while
$i: 6;
@while $i > 0 {
.item-#{$i} { width: 2em * $i; }
$i: $i - 2;
}
@each
each命令,作用与for类似:
@each $member in a, b, c, d {
.#{$member} {
background-image: url("/image/#{$member}.jpg");
}
}
自定义函数
@function double($n) {
@return $n * 2;
}
#sidebar {
width: double(5px);
}
sass 面向对象css - 使用%
%button {
min-width: 100px;
padding: 1em;
border-radius: 1em;
}
%twitter-background {
color: #fff;
background: #55acee;
}
%facebook-background {
color: #fff;
background: #3b5998;
}
.btn {
&--twitter {
@extend %button;
@extend %twitter-background;
}
&--facebook {
@extend %button;
@extend %facebook-background;
}
}
sass 与媒体查询
通过@mixin 编写媒体查询语句 Mixin to Manage Breakpoints使用Sass之更高级的媒体查询
Write Simple, Elegant and Maintainable Media Queries with SassSASS mixins I’m using right now
通过以上链接,以及 如何实现 font-size 的响应式
使用 编辑好的媒体查询语句 ,来编辑通过font-size的响应式。因为我们不希望,每次改变窗口, root 的font-size 的有变化,而是通过一个临界值来进行变化。
通过@mixin 编写媒体查询语句
定义
//定义好节点后
$breakpoints: (
"sm" : 767px,
"md": 992px,
"lg": 1200px
) !default;
@mixin resp($breakpoint) {
// If the key exists in the map
@if map-has-key($breakpoints, $breakpoint) {
// Prints a media query based on the value
@media (max-width: map-get($breakpoints, $breakpoint)) {
@content;
}
}
// If the key doesn't exist in the map
@else {
@warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. "
+ "Available breakpoints are: #{map-keys($breakpoints)}.";
}
}
使用
@import 'response/config.scss';
body {
@include resp(md) {
color: blue
}
@include resp(sma) {
color: lawngreen;
}
}
升级使用
通过@mixin 虽然方便了,但配置起来也显得繁琐。
Sass媒体查询应该是这样
- 动态,可定义,可以随意增加断点
- 简洁,自然的语法,可以使用 <=,>=, >,< 比如@include media(">minWidth")
- 自由组合,临时定义断点,可以组合多个断点,也可以临时自定义断点,比如@include media(">tablet", "<1280px")
请看 Eduardo Bouças和Hugo Giraudel的开源作品-- include-media
结合 include-media
//config.scss
@mixin responsive($width) {
@if $width==sm {
@include media(">phone", "<=tablet") {
@content;
}
}
@else if $width==md {
@include media(">tablet", "<=desktop") {
@content;
}
}
@else if $width==lg {
@include media(">desktop" ) {
@content;
}
}
//@else {
//@warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. "
//+ "Available breakpoints are: #{map-keys($breakpoints)}.";
//}
}
//index.scss
@import 'response/include_media.scss';
@import 'response/config.scss';
body {
@include responsive(sm){
color: blue
}
@include responsive(md){
color: red
}
@include responsive(lg){
color: lightyellow
}
}
最后生成
@media (min-width: 321px) and (max-width: 768px) {
body {
color: blue; } }
@media (min-width: 769px) and (max-width: 1024px) {
body {
color: red; } }
@media (min-width: 1025px) {
body {
color: lightyellow; } }
实践
使用SASS多值变量: list && map
list
// 将背景颜色值定义成变量
$red : #FF0000;
$orange : #FFA500;
$yellow : #FFFF00;
$green : #008000;
$bluegreen : #00FFFF;
$blue : #0000FF;
$purple : #800080;
// 定义一个list储存背景颜色
$bgcolorlist: $red $orange $yellow $green $bluegreen $blue $purple;
// 使用SASS for循环语句为每一个li设置background-color
@for $i from 1 to length($bgcolorlist)+1 {
#main-container ul li:nth-child(#{$i}) {
background-color: nth($bgcolorlist,$i);
}
}
map
$red : #FF0000;
$orange : #FFA500;
$yellow : #FFFF00;
$green : #008000;
$bluegreen : #00FFFF;
$blue : #0000FF;
$purple : #800080;
//将背景颜色以键值对的形式存在map中
$bgcolorlist : (
1: $red,
2: $orange,
3: $yellow,
4: $green,
5: $bluegreen,
6: $blue,
7: $purple);
// 使用SASS each语法为每一个li设置background-color
@each $i, $color in $bgcolorlist {
#main-container ul li:nth-child(#{$i}) {
background-color: $color;
}
}
$sprite: long1 long2 long3 long4 long5 !default;
%spriteAll{
background: url('menglong.png') no-repeat;
}
@each $one in $sprite {
.#{$one}-two {
@extend %spriteAll;
background-position:0 index($sprite,$one)*(-30px);
}
}
循环数组对象
$stars: (
(size: 40px, left: 22px, top: 97px),
(size: 32px, left: 42px, top: 70px),
(size: 31px, left: 464px, top: 273px),
(size: 28px, left: 240px, top: 402px),
(size: 25px, left: 289px, top: 557px)
);
@for $i from 1 through length($stars) {
$item: nth($stars, $i);
&:nth-child(#{$i}) {
width: map-get($item, size);
height: map-get($item, size);
left: map-get($item, left);
top: map-get($item, top);
}
}