一、css
CSS中有两种长度单位,绝对长度单位和相对长度单位。重要的是要知道它们之间的区别,以便理解它们控制的元素将变得有多大。
还原UI设计
设计稿源文件:PSD、Sketch、Xd
padding 不能为负值,margin可以为负值。
嵌套元素第一个子元素的margin-top会有传递问题(第一个子元素的margin-top会变为父元素的margin-top)
解决方法:使用padding代替;给父元素加边框;BFC块级格式化上下文;弹性布局/网格布局
兄弟元素的margin会产生重叠(只有上下会,左右不会)
解决方法:BFC块级格式化上下文;弹性布局/网格布局
块级元素(block)不设置width时,其width与父元素的width相同
内联盒子(inline)不支持width、height属性,对margin、padding的top和bottom支持度不高,其宽高由内容撑开。内联盒子之间有空隙,一般不用于做布局,做修饰较好。
自适应盒模型:
固定宽高的时候(固定了content的范围大小),设置padding/border/margin会有溢出现象,即给盒子肉眼可见宽高大于所设置的宽高。
解决方法:不设置固定宽/高。设置怪异盒子
标准盒模型和怪异盒模型区别:
标准盒模型:宽/高=content
怪异盒模型:宽/高=content+padding+border+margin
在标准模型中,如果给盒子设置 width 和 height,实际设置的是 content box。 padding 和 border 再加上设置的宽高-起决定整个盒子的大小。而怪异盒模型的width 和 height设置的是整个盒子的宽高
设置怪异盒子:box-sizing:border-box;
注意:在标准盒模型下,设置了宽/高100%或者fixed定位的情况下,使用padding/border/margin,可能会出现滚动条(我常犯的错误!)
设置了fixed定位,其宽高就由其内容决定(???)
float:left/right;特性
浮动只会影响后面的元素;文本不会被浮动元素覆盖(可实现图文混排的效果);具备内敛盒子的特性;浮动的元素溢出会自动换行。
清除浮动的方法:
clear:both;(针对块级元素) BFC 空标签 .clearfix::after{content:'';clear:both;;display:block;}
position:reactive/absolute/fixed/static/sticky;
relative:相对定位。相对于元素原来的位置定位,不会影响其他元素。
absolute:绝对定位。会脱离文档流,相对于最近的非static祖先元素定位,当不存在这个的祖先元素时,则相对于可视区域定位。
fixed:固定定位。会脱离文档流,相对于可视区域定位。
sticky:黏性定位。粘性定位可以认为是相对定位和固定定位的混合。元素在跨越特定闽值前为相对定位,之后为固定定位。可做首行冻结效果(常见需求)
z-index默认是0
书写模式writing-mode
horizontal-tb: 水平方向自上而下的书写方式
vertical-rl: 垂直方向自右而左的书写方式
vertical-Ir: 垂直方向自左而右的书写方式
sideways-rl: 内容垂直方向从上到下排列
sideways-lr: 内容垂直方向从下到上排列
!书写模式writing-mode取值与效果图](https://upload-images.jianshu.io/upload_images/18293173-5fa7ed582f018f7a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
BFC块级格式化上下文
具有BFC特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且BFC具有普通容器所没有的一些特性。通俗一点来讲,可以把BFC理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。
触发BFC的条件【满足以下任一条件即可】:
float的值不是none;
position的值不是static/relative;
display的值不是inline-block/table-cell/fixed/table-captiob/inline-flex;
overflow的值不是visible;
BFC的应用:
前面在设置盒模型的margin时,出现了传递和叠加的问题,就可以采用BFC规范来解决,原理是让盒子形成一个独立的容器,无论子元素如何折腾,都不影响到外面的元素。
<style>
.box1 {
width: 200px;
height: 200px;
background: pink;
overflow: hidden;/* 触发了BFC,形成独立盒子 */
}
.box2{
width: 100px;
height: 10@px;
background: skyblue;
margin-top: 30px;
}
</style>
<div class="box1">
<div cla55="box2"></div>
</div>
Css样式重置
标签默认样式:
一些HTML标签在浏览器中会有默认样式,例如: body标签会有margin:8px; ul标签会有margin:16px 0;及padding-left:40px;
当我们在切图软件中进行尺寸或位置测量的时候,把测量出来的数值设置到对应的标签上时,可能会受到当前标签默认样式的影响,从而了示效果跟设计图效果不符。这时就可以清除标签默认样式。
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
@charset "utf-8";
/* 应用更直观的盒模型(box-sizing) */
*, *::before, *::after {
user-select: none;
box-sizing: border-box;
}
/* 勾销默认的内外边距 margin padding */
body, h1, h2, h3, h4, h5, h6, dl, dt, dd, ol, ul , li, p, fieldset, legend, header, footer, hgroup, menu, nav, section {
margin: 0;
padding: 0;
}
/* 容许通过百分比设置利用的高度 */
html, body, #app {
width: 100%;
height: 100%;
/* 优化 text 的渲染平滑度 */
-webkit-font-smoothing: antialiased;
}
/* 滚动条默认宽度、高度 w 纵向宽 h 横向高 */
::-webkit-scrollbar {
width: 3px;
height: 3px;
}
/* 滚动条滑块 */
::-webkit-scrollbar-thumb {
border-radius: 3px;
background-color: #707070;
}
/* 横纵滚动条交接处的小方块儿 */
::-webkit-scrollbar-corner {
background-color: #707070;
}
/* 去除所有我的项目符号标识 */
li {
list-style: none;
}
/* 去除超链接默认下划线 */
a {
text-decoration: none;
}
/* 去除图片与容器底部的留白 更正当的多媒体默认展现形式 */
img {
display: block;
max-width: 100%;
}
flex弹性布局
flex盒子:display:flex;
水平垂直居中:
display: flex;
justify-content: center;/*水平居中*/
align-items: center;/*垂直居中*/
/*或者*/
position:absolute;
left:50%;
top:50%;
transform:translate(-50%,-50%);
/*绝对定位,上下左右为0,margin:auto;*/
......
弹性盒子是一种用于按行或按列布局元素的一维布局方法。元素可以膨胀以填充额外的空间,收缩以适应更小的空间。
flex子项:
flex-flow:row warp;水平排列+换行 简写
当不换行(不设置flex-warp:warp;)时,align-content时不生效的
不定项居中布局:
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<style>
.box {
width: 300px;
height: 150px;
background: skyblue;
display: flex;
justify-content: center;
/*justify-content: space-between; 均分列布局*/
align-items: flex-end;
}
.box div {
width: 30px;
height: 30px;
background: pink;
border-radius: 50%;
margin:5px;
}
</style>
二、less
1、为什么需要less?
1.1 CSS的语法虽然简单,但它同时也带来一些问题
1.2 CSS需要书写大量看似没有逻辑的代码,不方便维护及扩展,也不利于复用,
1.3 造成这些原因的本质源于CSS是一门非程序式的语言,没有变量/函数/作用域等概念
2、什么是less(Leaner Style Sheets)?
2.1 Less 是一门 CSS 预处理语言,为CSS赋予了动态语言的特征。
2.2 它扩展了 CSS 语言,增加了变量、Mixin(混合)、嵌套、函数和运算等特性,使 CSS 更易维护和扩展
2.3 一句话:用类似JS的语法去写CSS
变量:
less中定义变量的格式
@变量名称: 值;
less中使用变量的格式
**:@变量名称;
和js一样可以将一个变量赋值给另外一个变量变量名称 :
@变量名称:@变量名称;
和js一样,less中的变量也有全局变量和局部变量,定义在{}外面的就是全局变量,什么地方都可以使用,定义在{}里面的就是局部变量,只能在当前{}中使用
注意定: less中的变量是延迟加载的,写到后面也能在前面使用
<style less="less">
@w:100px;//全局变量
@w:100px;
.box{
@c: blue;//局部变量
width: @w;
height: @w:
background: @c;
}
</style>
变量插值:
1.什么是变量插值?
在less中,属性名和选择器也可以定义为变量,但使用时不能直接使用,需要使用差值语法
2.变量插值的格式
格式: @变量名称
@size: 200px;
@w: width;
@s: div;
@{s}{
@{w}: @size;
height: @size;
background: red;
}
运算:()
div{
width: 200px;
height: 200px;
background: blue;
position: absolute;
left: 50%;
/*以下的方式不利于编码,因为需要我们自己口算元素宽度的一半是多少*/
/*margin-left: -100px;*/
/*以下的方式不利于兼容,因为transform属性是CSS3新增的, 只有支持C3属性的浏览器才可以使用*)/*transform: translateX(-50%);*/
/*在CSS3中新增了一个calc函数,可以实现简单的+ - * / 运算*/
/*margin-left: calc(-200px / 2);*/
/*less中的运算和css3新增的calc一样支持简单的+ - * / 运算,需要标明单位*/
margin-left: (-200px / 2); //margin-left: (-200px * 0.5);
混合(重要):
什么是less中的混合(Mix in)?
将需要重复使用的代码封装到一个类选择器中,在需要使用的地方调用封装好的类选择器,在预处理的时候less就会自动将用到的封装好的代码拷贝过来。
本质就是ctrl+c --> ctrl + v
/*.center编译为css之后会保留*/
.center(
position: absolute;
left: 50%;
top: 50%;
ransform: translate(-50%, -50%) ;
}
.father (
width: 300px;
height: 300px;background: red;
.center;
.son{
width: 200px;
height: 200px;
background: blue:
.center;
}
}
注意:
less中混合的注意点:如果混合名称的后面没有(),那么在预处理的时候,会保留混合的代码,如果混合名称的后面加上(),那么在预处理的时候,就不会保留混合的代码。调用时也需要加()
/*.center()中的代码编译为css之后不会保留*/
.center()(
position: absolute;
left: 50%;
top: 50%;
ransform: translate(-50%, -50%) ;
}
.father (
width: 300px;
height: 300px;background: red;
.center();
.son{
width: 200px;
height: 200px;
background: blue:
.center();
}
}
带参数的混合:
.混合名(@参数1:默认值, @参数2:默认值, @参数3:默认值){
width: @参数1;
height: @参数2;
background: @参数3;
}
// 这里就是带参数的混合
/*
.whc(@w, @h, @c){
width: @w;
height: @h;
background: @c;
}
*/
// 这里就是带参数的混合, 并且带默认值
.whc(@w:100px, @h:100px, @c:pink){
width: @w;
height: @h;
background: @c;
}
.box1{
//width: 200px;
//height: 200px;
//background: red;
//.whc(200px, 200px, red);
// 这里是给混合的指定形参传递数据
.whc(@c:red);
}
.box2{
//width: 300px;
//height: 300px;
//background: blue;
.whc(300px, 300px, blue);
}
混合的可变参数:
less中的...表示可以接收0个或多个参数,如果形参列表中使用了..., 那么...必须写在形参列表最后。
当需要把混合的所有参数使用到同一个属性上时,可以不用单独复制,@arguments
就表示使用当前混合的所有参数。
//至少要传两个参数
.animate(@name, @time, ...){
//transition: @name @time @mode @delay;
transition: @arguments;
}
div{
width: 200px;
height: 200px;
background: red;
//.animate();//报错,传递的参数不够
.animate(all, 4s, linear, 0s);
}
less混合的匹配模式:
就是通过混合的第一个字符串形参,来确定具体要执行哪一个同名混合。
@_: 表示通用的匹配模式
什么是通用的匹配模式?
无论同名的哪一个混合被匹配了, 都会先执行通用匹配模式中的代码。
// 案例:将元素实现三角形的混合
.triangle(@_, @width, @color){
// 使用混合的通用匹配模式,可减少混合中的重复代码
width: 0;
height: 0;
border-style: solid solid solid solid;
}
.triangle(Down, @width, @color){
//width: 0;
//height: 0;
border-width: @width;
//border-style: solid solid solid solid;
border-color: @color transparent transparent transparent;
}
.triangle(Top, @width, @color){
//width: 0;
//height: 0;
border-width: @width;
//border-style: solid solid solid solid;
border-color: transparent transparent @color transparent;
}
.triangle(Left, @width, @color){
//width: 0;
//height: 0;
border-width: @width;
//border-style: solid solid solid solid;
border-color: transparent @color transparent transparent;
}
.triangle(Right, @width, @color){
//width: 0;
//height: 0;
border-width: @width;
//border-style: solid solid solid solid;
border-color: transparent transparent transparent @color;
}
div{
/*
混合的匹配模式
就是通过混合的第一个字符串形参,来确定具体要执行哪一个同名混合
*/
//.triangle(Down, 80px, green);
//.triangle(Top, 80px, green);
//.triangle(Left, 80px, green);
.triangle(Right, 80px, green);
}
less文件导入:
//@import "triangle.less";
@import "triangle";//后缀可省略
div{
//使用导入的less文件中的混合
.triangle(Down, 40px, red);
}
less中的内置函数:
(由于less的底层就是用JavaScript实现的,所以JavaScript中常用的一些函数在less中都支持)
// 混杂方法
image-size("file.jpg"); // => 100px 50px
image-width("file.jpg"); // => 100px
image-height("file.jpg"); // => 50px
// 单位转换
convert(9s, "ms"); // => 9000ms
convert(14cm, mm); // => 140mm
convert(8, mm); // => 8
// 列表
@list: "A", "B", C, "D";
length(@list); // => 4
extract(@list, 3); // => C
// 数学
ceil(2.1); // => 3 向上取整
floor(2.1); // => 2 向下取整
percentage(.3); // => 30% 转百分比
round(1.67, 1); // => 1.7 四舍五入,保留一位小数点
sqrt(25cm); // => 5cm 取平方根
abs(-5cm); // => 5cm 取绝对值
pi(); // => 3.141592653589793 圆周率π
max(3px, 42px, 1px, 16px); // => 42px
min(3px, 42px, 1px, 16px); // => 1px
// 字符串
replace("Hi Tom?", "Tom", "Jack"); // => "Hi Jack"
// 判断类型
isnumber(56px); // => true 是否含数字
isstring("string"); // => true
iscolor(#ff0); // => true
iscolor(blue); // => true
iskeyword(keyword); // => true
isurl(url(...)); // => true
ispixel(56px); // => true
isem(7.8em); // => true
ispercentage(7.8%); // => true
isunit(4rem, rem); // => true 是否为指定单位
isruleset(@rules); // => true 是否为变量
// 颜色操作
saturate(color, 20%) //增加饱和度
desaturate(color, 20%) //减少饱和度
lighten(color, 20%) // 增加亮度
darken(color, 20%) // 减少亮度
fadein(color, 10%) // 降低透明度
fadeout(color, 10%) // 增加透明度
fade(color, 20%) //设置绝对不透明度(覆盖原透明度)
spin(color, 10) //旋转色调角度
mix(#f00, #00f, 50%) // 将两种颜色混合,不透明度包括在计算中。
tint(#007fff, 50%) // 与白色混合
shade(#007fff, 50%) // 与黑色混合
greyscale(color) //灰度,移除饱和度
contrast(color1, color2) // 返回对比度最大的颜色
// 颜色混合
multiply(color1, color2);//每个RGB 通道相乘,然后除以255
screen(color1, color2);//与 multiply 相反
overlay(color1, color2)// 使之更浅或更暗
softlight(color1, color2)//避免太亮或太暗
hardlight(color1, color2)//与overlay相同,但颜色互换
average(color1, color2)// 计算每个通道(RGB)基础上的两种颜色的平均值
less中的层级结构:
如果在某一个选择器的{}中直接写上了其它的选择器, 会自动转换成后代选择器。
.father{
width: 300px;
height: 300px;
background: red;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/*如果在某一个选择器的{}中直接写上了其它的选择器, 会自动转换成后代选择器
例如以下代码son会转换成: .father .son{}
*/
.son{
// 这里的&的作用, 是告诉less在转换的时候不要用后代选择器来转换, 直接拼接在当前选择器的后面即可
&:hover{
background: skyblue;
}
width: 200px;
height: 200px;
background: blue;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
// 伪元素中的&与伪类中的同理
/*
&::before{
content: "子元素";
display: block;
background: yellowgreen;
width: 100px;
height: 100px;
}
*/
}
less中的继承:
1、less中的继承和less中混合的区别:
① 使用时的语法格式不同
② 转换之后的结果不同(混合是直接拷贝, 继承是并集选择器)
.center{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.father:extend(.center){//继承用法
width: 300px;
height: 300px;
background: red;
//.center; //混合用法
.son:extend(.center){//继承用法
width: 200px;
height: 200px;
background: blue;
//.center; //混合用法
}
}
less中的条件判断:
less中可以通过when给混合添加执行限定条件, 只有条件满足(为真)才会执行混合中的代码。
when表达式中可以使用比较运算符(> < >= <= =)、逻辑运算符、或检查函数来进行条件判断。
//比较运算符 宽等于100px时执行混合size
.size(@width,@height) when (@width = 100px){
width: @width;
height: @height;
}
div{
.size(100px,100px);
background: red;
}
//逻辑运算符
// (),()相当于JS中的|| 宽或高等于100px时执行混合size
.size(@width,@height) when (@width = 100px),(@height = 100px){
width: @width;
height: @height;
}
// ()and()相当于JS中的&& 宽和高都要等于100px,才会执行混合size
.size(@width,@height) when (@width = 100px)and(@height = 100px){
width: @width;
height: @height;
}
//检查函数 ispixel是less内置函数,用于判断单位是否为px
.size(@width,@height) when (ispixel(@width)){
width: @width;
height: @height;
}
三、SASS
什么是SASS(Syntactically Awesome Stylesheets Sass)?
SASS是一套利用Ruby实现的, 最早最成熟的CSS预处理器, 诞生于2007年。它扩展了 CSS 语言,增加了变量、Mixin(混合)、嵌套、函数和运算等特性,使 CSS 更易维护和扩展。
如何学习SASS?
LESS是一套利用JavaScript实现的CSS预处理器, 诞生于2009年。
由于LESS的诞生比SASS要晚, 并且LESS受到了Sass的影响, 所以在LESS中能看到大量SASS中的特性。所以只要学会了LESS就等同于学会了大部分的SASS。
LESS和SASS文件后缀名区别:
LESS以.less结尾 -------- SASS以.sass或者.scss结尾
两种不同结尾方式区别: .sass结尾以缩进替代{}表示层级结构, 语句后面不用编写分号:
.scss以{}表示层级结构, 语句后面需要写分号
企业开发中推荐使用.scss结尾
注意点: 如果需要使用考拉编译sass文件, 项目目录结构中(包含文件名)不能出现中文和特殊字符。
SASS中的注释:
SASS中的注释和LESS一样
单行注释不会被编译(不会出现在编译后的文件中),多行注释会被编译 (会出现在编译后的文件中)。
SASS中的变量:
SASS中的变量和LESS中一样, 只是定义格式不同
LESS中定义变量 @变量名称: 值;
SASS中定义变量 $变量名称: 值;
SASS中变量特点:
SASS中变量特点和LESS中几乎一样
①后定义覆盖先定义
②可以把变量赋值给其它变量
③区分全局变量和局部变量(访问采用就近原则)
注意点:
LESS中变量是延迟加载, 可以先使用后定义
SASS中变量不是延迟加载, 不可以先使用后定义
变量插值:
1.什么是变量插值?
如果是属性的取值可以直接使用变量,但是如果是属性名称或者选择器名称并不能直接使用变量, 必须使用变量插值的格式。
2.SASS中的变量插值
SASS中的变量插值和LESS中也一样, 只不过格式不一样
LESS变量插值格式: @{变量名称}
SASS变量插值格式:#{$变量名称}
SASS中的运算:
SASS中的运算和LESS也一样, 都支持+ - * / 运算
注意点: 无论是LESS中的运算还是SASS中的运算都需要加上()
SASS中的混合:
SASS中的混合和LESS中也一样, 只是定义格式和调用的格式不同
LESS中混合定义: .混合名称{}
或者.混合名称(){}
LESS中混合调用: .混合名称;
或者 .混合名称();
SASS中混合定义: @mixin 混合名称{};
或者 @mixin 混合名称(){};
SASS中混合调用: @include 混合名称;
或者 @include 混合名称();
SASS中带参数的混合:
SASS中带参数的混合和LESS中也一样
①不带默认值形参
②带默认值形参
③给指定参数赋值
SASS中的可变参数:
SASS中的可变参数和LESS中也一样,
只不过由于SASS不是使用JS实现的, 所以不能直接在混合中使用arguments
必须通过 $args...
的格式来定义可变参数, 然后通过$args
来使用
注意点:
和LESS一样,SCSS的可变参数必须写在形参列表的最后
.scss文件中导入其它.scss文件:
和LESS一样,SASS文件中也支持导入其它SASS文件。
其实原生的CSS也支持通过@import导入其它的CSS文件, 只不过不常用
不常用原因:原生的@import导入其它的CSS文件,只有执行到@import时,浏觅器才会去下载对应 css文件,这导致请求次数变多,页面加载起来特别慢。
而LESS和SASS中的@import是直接将导入的文件拷贝到当前文件中生成一份CSS,所以只会请求一次, 速度更快。
SASS中的内置函数:
和LESS一样, SASS中也提供了很多内置函数方便我们使用
*/
// 字符串函数
/*
unquote($string):删除字符串中的引号;
quote($string):给字符串添加引号;
To-upper-case($string):将字符串小写字母转换为大写字母
To-lower-case($string):将字符串大写字母转换为小写字母
*/
// 数值函数
/*
percentage($value):将不带单位的数转换成百分比值;
round($value):将数值四舍五入,转换成一个最接近的整数;
ceil($value):向上取整;
floor($value):向下取整;
abs($value):取数的绝对值;
min($numbers…):找出几个数值之间的最小值;
max($numbers…):找出几个数值之间的最大值;
random(): 获取随机数
*/
// 颜色函数
/*
rgb($red,$green,$blue):根据红、绿、蓝三个值创建一个颜色;
rgba($red,$green,$blue,$alpha):根据红、绿、蓝和透明度值创建一个颜色;
red($color):从一个颜色中获取其中红色值;
green($color):从一个颜色中获取其中绿色值;
blue($color):从一个颜色中获取其中蓝色值;
mix($color-1,$color-2,[$weight]):把两种颜色混合在一起。
*/
// 列表函数
/*
length($list):返回一个列表的长度值;
nth($list, $n):返回一个列表中指定的某个标签值;
join($list1, $list2, [$separator]):将两个列给连接在一起,变成一个列表;
append($list1, $val, [$separator]):将某个值放在列表的最后;
zip($lists…):将几个列表结合成一个多维的列表;
index($list, $value):返回一个值在列表中的位置值。
SASS中的层级结构:
和LESS一样支持嵌套, 默认情况下嵌套的结构会转换成后代选择器
和LESS一样也支持通过&符号不转换成后代选择器
SASS中的继承:
SASS中的继承和LESS中的继承一样, 都是通过并集选择器来实现的, 只不过格式不一样而已
混合和继承区别:
混合是直接拷贝到使用混合的地方, 有多少个地方用到就会拷贝多少份
继承是通过并集选择器, 不会拷贝只会保留一份
/*
// 混合center:水平垂直居中
@mixin center(){
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
*/
.center{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.father{
@extend .center; //继承类center
width: 300px;
height: 300px;
background: red;
//@include center;//使用混合
.son{
@extend .center;//继承类center
width: 200px;
height: 200px;
background: blue;
//@include center;//使用混合
}
}
SASS中的条件判断:
和LESS一样SASS中也支持条件判断, 只不过SASS中的条件判断支持得更为彻底
SASS中支持:
@if(条件语句){}
@else if(条件语句){}
... ...
@else(条件语句){}
SASS中当条件不为false或者null时就会执行{}中的代码
和LESS一样SASS中的条件语句支持通过> >= < <= ==进行判断
//使用SASS混合实现三角形
@mixin triangle($dir, $width, $color){
width: 0;
height: 0;
border-width: $width;
border-style: solid solid solid solid;
@if($dir == Up){
border-color: transparent transparent $color transparent;
}@else if($dir == Down){
border-color: $color transparent transparent transparent;
}@else if($dir == Left){
border-color: transparent $color transparent transparent;
}@else if($dir == Right){
border-color: transparent transparent transparent $color;
}
}
div{
//width: 0;
//height: 0;
//border-width: 10px 10px 10px 10px;
//border-style: solid solid solid solid;
//border-color: #000 transparent transparent transparent;
//@include triangle(50px, blue);
//@include triangle(Up, 50px, blue);
@include triangle(Left, 50px, blue);
}
SASS中的循环:
SASS比LESS厉害的地方就在于SASS中直接支持循环语句, 而LESS中需要通过混合+条件判断自己实现。
SASS中支持两种循环, 分别是for循环和while循环:
for循环
@for $i from 起始整数 through 结束整数{}
@for $i from 起始整数 to 结束整数{}
两者的区别 through含头含尾, to含头不含尾
while循环
@while(条件语句){}
案例:将ul列表中的第5-8个元素的背景色变为蓝色,其余为红色
// html
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
// js
<style lang="scss" scoped>
ul{
li{
width: 100%;
height: 50px;
border: 1px solid #000;
font-size: 20px;
color: #fff;
background: red;
//方法一:使用css选择器实现
&:nth-child(5){
background: blue;
}
&:nth-child(6){
background: blue;
}
&:nth-child(7){
background: blue;
}
&:nth-child(8){
background: blue;
}
// 方法二:@for $i from 起始整数 through 结束整数{}
@for $i from 5 through 8{
&:nth-child(#{$i}){
background: deepskyblue;
}
}
//方法三:@for $i from 起始整数 to 结束整数{}
@for $i from 5 to 9{
&:nth-child(#{$i}){
background: deepskyblue;
}
}
//方法四:使用while循环
$i:5; //定义一个变量i,并赋初始值为5
@while($i <= 8){
&:nth-child(#{$i}){
background: deepskyblue;
}
$i:$i+1;
}
}
}
</style>