女友要我教她CSS,因而我就折腾了一周,终于完成了这篇长文...css
而后,而后?而后当我发布这篇文章的时候,她会感动到哭吗?html
head
部分body
部分a{}
::before{}
.link{}
[type=radio]{}
:hover{}
#id{}
[type=checkbox] + label{}
:not(.link){}
*{}
例子:计算一个不进位的数字前端
#id.link a[href] ———————————————— 计算过程: #id +100 .link +10 a +1 [href] +0 结果:111
#id .link.active ———————————————— 计算过程: #id +100 .link +10 .active +10 结果:120
那么,咱们怎么理解 不进位的数字 这关键字眼呢?用一个简单例子吧:node
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSS选择器</title> <style> #test1{ color: red; } #test1.test1{ color: blue; } .test2{ color: red; } div.test2{ color: blue; } #test3{ color: red; } .c1.c2.c3.c4.c5.c6.c7.c8.c9.c10.c11{ color: blue; } </style> </head> <body class="body" id="body"> <div id="test1" class="test1">蓝色</div> <div class="test2">蓝色</div> <div id="test3" class="c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11">红色</div> </body> </html>
结果以下图所示:
不妨发现,最后一个 div
,尽管咱们类选择器有11个,加起来有110,可是依旧没有 id 选择器优先级高,正是由于这个不进位的数字,简单说:你大爷仍是你大爷!jquery
举个栗子:webpack
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSS选择器</title> <style> .test1{ color: red; } .test1{ color: blue; } .test2{ color: red!important; } .test2{ color: blue; } #test3{ color: red; } </style> </head> <body class="body" id="body"> <div class="test1">蓝色</div> <div class="test2">红色</div> <div id="test3" style="color: blue;">蓝色</div> </body> </html>
运行结果以下图所示:css3
经典问题:图片下面有空隙,原理是什么?怎样去除?
原理是由于图片按照 inline 进行排版,排版的时候会涉及到字体对齐,默认按照 baseline
对齐,baseline
和底线之间是有误差的,误差大小是根据字体大小而定,若是是12px字体大小,则图片空隙就是3px左右。这就是经典图片3px空隙问题。git
解决方式:github
baseline
对齐,不妨将 vertical-align
设为 bottom
,按照底线对齐。display:block
能够解决该问题,可是会独占一行,以下图所示:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>渐变色背景(线性梯度)</title> <style> .div1{ height: 90px; } .div2{ height: 90px; /*background: linear-gradient(to right,red,green);*/ /*background: linear-gradient(180deg,red,green);*/ /*background: linear-gradient(135deg,red 0,green 15%,yellow 50%,blue 90%);*/ /*网格线*/ background: linear-gradient(135deg,transparent 0,transparent 49.5%,green 49.5%,green 50.5%,transparent 50.5%,transparent 100%), linear-gradient(45deg,transparent 0,transparent 49.5%,red 49.5%,red 50.5%,transparent 50.5%,transparent 100%); background-size: 30px 30px; } </style> </head> <body> <div class="div1"></div> <div class="div2"></div> </body> </html>
最后一个例子展现效果:web
background-repeat: no-repeat; background-size: 30px 30px; //相对于容器偏移 background-position: 30px 30px;
雪碧图 就是将不少个图片进行拼接成一个图片,而后经过 background-position
等属性进行偏移,在网页中获得对应图片,来达到减小http请求。
将图片进行base64编码后,就是一个字符文本,缺点之一就是图片的体积会增大 1/3
左右,而且放入css文件中,也会致使css文件变大。另外,虽然能减小http请求,但增大了解码的开销。适用于小图标icon
,例如loading
文件等。最后,在开发环境通常不采用直接将图片进行 base64
编码,由于对于协同开发来讲,没法知晓图片原样,只有一个文本。
通常状况下,是在生产环境下,经过打包的方式,将小图片进行 base64
编码。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>边框</title> <style> .c1{ width: 400px; height: 200px; border: 1px solid red; /*border: 5px solid red;*/ /*border: 5px dotted red;*/ /*border: 5px dashed red;*/ } </style> </head> <body> <div class="c1"></div> </body> </html>
经典问题:九宫格问题,例以下面图片,咱们若是想要实现9个不一样形式,而后中间放内容,若是用本来9个div方法,那么会很是麻烦,而css3提供了 border
方式能够解决上述问题。
在没有在 border-image
处设置 round
以前,是如上效果,后面 30 是用来切出四个角。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>边框</title> <style> .c1{ width: 400px; height: 200px; border: 30px solid transparent; border-image: url(./xx.png) 30 round; /*round将图片进行整数个拼接*/ } </style> </head> <body> <div class="c1"></div> </body> </html>
在 border-image
处设置 round
以后,是以下效果,基本达到咱们想要的效果。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>边框</title> <style> .c2{ width: 400px; height: 200px; border: 30px solid transparent; border-image: url(./xx.png) 30 round; /*round将图片进行整数个拼接*/ } </style> </head> <body> <div class="c2"></div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>边框</title> <style> .c3{ width: 0px; height: 200px; border-bottom: 30px solid red; border-left: 30px solid transparent; border-right: 30px solid transparent; } </style> </head> <body> <div class="c3"></div> </body> </html>
实现三角形,效果以下:
产生滚动的缘由:当内容比容器多的时候,即容器装不下内容的时候,就须要滚动。滚动主要包括以下几个方面:
overflow
设置auto
和 scroll
区别,auto 是内容多于容器时显示滚动条,反正,不显示。而 scroll 是一直显示滚动条
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>滚动</title> <style> .div1{ background: red; height: 200px; overflow: scroll; /*可选值: hidden visible auto scroll*/ } </style> </head> <body> <div class="div1"> <p>test</p> <p>test</p> <p>test</p> <p>test</p> <p>test</p> <p>test</p> <p>test</p> <p>test</p> <p>test</p> <p>test</p> <p>test</p> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>文字折行</title> <style> .div1{ border: 1px solid; width: 8em; overflow-wrap: normal; word-break: normal; white-space: normal; } </style> </head> <body> <div class="div1"> 学如逆水行舟,不进则退!Learning is like sailing against the current, retreating if not advancing </div> </body> </html>
展现效果:
经典问题:怎么让一个很长的文本不换行?
将上述属性设置为 nowrap
便可
white-space: nowrap;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>font-weight</title> <style> .div1{ font-weight: normal; /*400*/ font-weight: bold; /*700*/ font-weight: bolder; font-weight: lighter; font-weight: 100; } </style> </head> <body> <div class="div1">学如逆水行舟,不进则退!</div> </body> </html>
用来处理浏览器兼容性作法,好处就是简单粗暴。
IE6
,那么就加IE6
的class)background-position
等属性进行偏移,在网页中获得对应图片,来达到减小http请求,提升页面加载性能。将图片进行base64编码后,就是一个字符文本,缺点之一就是图片的体积会增大 1/3
左右,而且放入css文件中,也会致使css文件变大。另外,虽然能减小http请求,但增大了解码的开销。适用于小图标icon
,例如loading
文件等。最后,在开发环境通常不采用直接将图片进行 base64
编码,由于对于协同开发来讲,没法知晓图片原样,只有一个文本。
::before{}
,在页面中会显示内容)label
来搞定)CSS体系知识的重中之重
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>table布局</title> <style> .table{ margin-top: 20px; width: 500px; height: 100px; display: table; } .table-row{ display: table-row; } .table-cell{ vertical-align: center; display: table-cell; } .left{ background: red; vertical-align: middle; } .right{ background: blue; vertical-align: middle; } </style> </head> <body> <div class="table"> <div class="table-row"> <div class="left table-cell">left</div> <div class="right table-cell">right</div> </div> </div> </body> </html>
展现效果以下图所示:
display
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>display</title> <style> .block{ height: 200px; background: red; } .inline{ display: inline; background: green; } .inline-block{ display: inline-block; width: 200px; height: 100px; background: blue; } </style> </head> <body> <div class="block"> block </div> <div class="inline">inline</div> <div class="inline-block">inline-block</div> </body> </html>
position
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>position</title> <style> .p1{ width: 100px; height: 100px; background: red; } .p2{ position: relative; width: 100px; height: 100px; left: 20px; top: -10px; background: blue; } .p3{ position: absolute; width: 100px; height: 100px; left: 80px; top: 30px; background: yellow; } .p4{ position: fixed; width: 100px; height: 100px; left: 0; bottom: 10px; background: green; } .p5{ width: 100px; height: 100px; background: pink; } </style> </head> <body> <div class="p1">position:static</div> <div class="p2">position:relative</div> <div class="p3">position:absloute</div> <div class="p4">position:fixed</div> <div class="p5">no position</div> </body> </html>
展现效果以下:
由上图可知,当设置 position
为 relative
后,no position(粉色块) 并无在蓝色块下面,也就是说设置 position
为 relative
后,占据空间仍是按照原来的方式计算的,不会由于偏移而改变布局的计算。
经典问题:
absolute
,会优先查找父级定位为 absolute
或 relative
的进行定位,若是父级没有,找上级,那么最终就会根据 body
进行定位,它和 fixed
同样,也是脱离了文档流。fixed
相对于屏幕进行定位层叠问题 ,由于默认会根据前后顺序显示,所以会有覆盖状况,此时,能够经过设计 z-index
解决,权重越大,优先显示。
(目前用的不是很热的缘由是虽然简单方便,可是兼容性有点问题)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>flexbox</title> <style> .container{ width: 800px; height: 200px; display: flex; border: 1px solid black; } .flex{ background: blue; flex: 1; margin: 5px; } </style> </head> <body> <div class="container"> <div class="flex">flex</div> <div class="flex">flex</div> <div class="flex">flex</div> <div class="flex">flex</div> <div class="flex">flex</div> </div> </body> </html>
展现效果以下:
由这个很方便的布局,咱们能够写一个圣杯布局的例子(即左右固定,中间自适应):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>圣杯布局-flexbox</title> <style> *{ margin: 0; } .container{ min-height: 200px; display: flex; } .left{ width: 200px; display: flex; background: red; } .center{ background: yellow; flex: 1; } .right{ width: 200px; display: flex; background: blue; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="center">center</div> <div class="right">right</div> </div> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>float布局</title> <style> .container{ width: 400px; background: red; } .p1{ width: 200px; height: 80px; float: left; background: pink; } </style> </head> <body> <div class="container"> <span class="p1">float元素</span> <div class="p2">不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字不少文字</div> </div> </body> </html>
展现效果以下:
float 特性对本身的影响:
container
宽度够的话,就尽可能靠上和靠左,若是不行的话,就往下排了)简单例子:
float 特性对兄弟的影响:
float 特性对父级的影响:
经典问题:
清除浮动的方式
① 当咱们设置为 float 后,会将元素设为 BFC,接管本身的宽高,所以咱们也可让父级元素设置为 BFC,来接管本身的宽高。
初始状态:
在父级元素设置 overflow: auto/hidden;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>清楚浮动</title> <style> .container{ background: red; width: 400px; overflow: auto; margin: 10px; } .p1{ background: pink; float: left; width: 200px; height: 50px; } </style> </head> <body> <div class="container"> <span>xxxxxx</span> <span class="p1">float</span> <span class="p1">float</span> </div> <div class="container" style="height: 200px; background: blue;"> <p>第一行</p> <p>第二行</p> <p>第三行</p> </div> </body> </html>
最终状态效果图以下:
② 因为 float 不脱离文档流(不会影响其它元素布局),那么就可使得元素恰好到达下面位置。就能够经过其它元素将父级撑起来,当父级恰好撑到下方位置时,就能够将浮动清除掉。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>清楚浮动</title> <style> .container{ background: red; width: 400px; } .p1{ background: pink; float: left; width: 200px; height: 50px; } .removeFloat::after{ content: 'aaa'; clear: both; /*保证当前元素左右没有浮动元素*/ display: block; height: 0; visibility: hidden; } </style> </head> <body> <div class="container removeFloat"> <span>xxxxxx</span> <span class="p1">float</span> <span class="p1">float</span> </div> <div class="container" style="height: 200px; background: blue;"> <p>第一行</p> <p>第二行</p> <p>第三行</p> </div> </body> </html>
经典清除浮动方式,效果图以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>圣杯布局-float</title> <style> .container{ min-height: 200px; } .left{ float: left; background: red; width: 200px; } .center{ margin-left: 200px; margin-right: 200px; background: yellow; } .right{ float: right; background: blue; width: 200px; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="right">right</div> <div class="center">center</div> </div> </body> </html>
展现效果以下:
例以下图,红蓝之间有一个间隙,是由于 inline-block
就像文本同样,咱们没办法让两个字牢牢地挨着,因而咱们就有了下文所述解决方式:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>inline-block布局</title> <style> .container{ width: 800px; height: 200px; font-size: 0; } .left{ font-size: 15px; background: red; display: inline-block; width: 200px; height: 200px; } .right{ font-size: 15px; background: blue; display: inline-block; width: 500px; height: 200px; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="right">right</div> </div> </body> </html>
展现效果以下:
查看上述代码,将父级元素字体大小设置为0便可解决间隙问题,但子元素须要设置本身的字体大小,否则就不会显示。
所以,作自适应方面会有点麻烦,不像上文 float+margin
那样简单
font-size
)来肯定元素大小,但不太精确 / viewport:经过 js或手工 肯定整个界面放到多大 / media query:媒体查询,根据不一样的设备来匹配不一样的样式)下图含义就是只有在宽度小于 640px 时才会生效,即让移动端进行适配。
经典问题:
absolute
,会优先查找父级定位为 absolute
或 relative
的进行定位,若是父级没有,找上级,那么最终就会根据 body
进行定位,它和 fixed
同样,也是脱离了文档流。fixed
相对于屏幕(viewport)进行定位层叠问题 ,由于默认会根据前后顺序显示,所以会有覆盖状况,此时,能够经过设计 z-index
解决,权重越大,优先显示。
font-size
设为0)缘由:浮动的元素不会占据父元素的布局空间,也就是父级元素不会管浮动元素,有可能浮动元素会超出父元素,从而对其它元素产生影响。
经典问题:
清除浮动的方式
① 当咱们设置为 float 后,会将元素设为 BFC,接管本身的宽高,所以咱们也可让父级元素设置为 BFC,来接管本身的宽高。
初始状态:
在父级元素设置 overflow: auto/hidden;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>清楚浮动</title> <style> .container{ background: red; width: 400px; overflow: auto; margin: 10px; } .p1{ background: pink; float: left; width: 200px; height: 50px; } </style> </head> <body> <div class="container"> <span>xxxxxx</span> <span class="p1">float</span> <span class="p1">float</span> </div> <div class="container" style="height: 200px; background: blue;"> <p>第一行</p> <p>第二行</p> <p>第三行</p> </div> </body> </html>
最终状态效果图以下:
② 因为 float 不脱离文档流(不会影响其它元素布局),那么就可使得元素恰好到达下面位置。就能够经过其它元素将父级撑起来,当父级恰好撑到下方位置时,就能够将浮动清除掉。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>清楚浮动</title> <style> .container{ background: red; width: 400px; } .p1{ background: pink; float: left; width: 200px; height: 50px; } .removeFloat::after{ content: 'aaa'; clear: both; /*保证当前元素左右没有浮动元素*/ display: block; height: 0; visibility: hidden; } </style> </head> <body> <div class="container removeFloat"> <span>xxxxxx</span> <span class="p1">float</span> <span class="p1">float</span> </div> <div class="container" style="height: 200px; background: blue;"> <p>第一行</p> <p>第二行</p> <p>第三行</p> </div> </body> </html>
经典清除浮动方式,效果图以下:
主要方法:隐藏 + 折行 + 自适应空间(rem:经过html的字体大小(即 font-size
)来肯定元素大小,但不太精确 / viewport:经过 js或手工 肯定整个界面放到多大 / media query:媒体查询,根据不一样的设备来匹配不一样的样式)
属性值介绍:前两个是偏移量,第三个是模糊区域度,第四个是拓展区域度,第五个是颜色(最后一个是透明度)
box-shadow: 5px 5px 10px 0 rgba(0, 0, 0, .2);
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>border-radius</title> <style> .container{ width: 100px; height: 100px; background: red; border-radius: 50%; } </style> </head> <body> <div class="container"></div> </body> </html>
展现效果以下:
### background
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>3D-transform</title> <style> .container{ margin: 50px; padding: 10px; border: 1px solid red; width: 200px; height: 200px; position: relative; perspective: 500px; } #cube{ width: 200px; height: 200px; transform-style: preserve-3d; transform: translateZ(-100px); transition: transform 1s; } #cube:hover{ transform: translateZ(-100px) rotateX(90deg) rotateY(90deg); } #cube div{ width: 200px; height: 200px; position: absolute; line-height: 200px; font-size: 50px; text-align: center; } .front{ background: rgba(255, 0, 0, .3); transform: translateZ(100px); } .back{ background: rgba(0, 255, 0, .3); transform: translateZ(-100px) rotateY(180deg); } .left{ background: rgba(0, 0, 255, .3); transform: translateX(-100px) rotateY(-90deg); } .right{ background: rgba(255, 255, 0, .3); transform: translateX(100px) rotateY(90deg); } .top{ background: rgba(255, 0, 255, .3); transform: translateY(-100px) rotateX(-90deg); } .bottom{ background: rgba(0, 255, 255, .3); transform: translateY(100px) rotateX(90deg); } </style> </head> <body> <div class="container"> <div id="cube"> <div class="front">1</div> <div class="back">2</div> <div class="right">3</div> <div class="left">4</div> <div class="top">5</div> <div class="bottom">6</div> </div> </div> </body> </html>
展现效果图以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>transition补间动画</title> <style> .container{ width: 100px; height: 100px; background: red; transition: width 1s, background 2s; } .container:hover{ width: 300px; background: blue; } </style> </head> <body> <div class="container"></div> </body> </html>
展现效果以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>keyframe关键帧动画</title> <style> .container{ width: 100px; height: 100px; background: red; animation: run 1s; animation-direction: reverse; animation-iteration-count: infinite; /*animation-fill-mode: forwards;*/ /*animation-play-state: paused;*/ } @keyframes run { 0%{ width: 100px; } 100%{ width: 800px; } } </style> </head> <body> <div class="container"></div> </body> </html>
展现效果:
例如:一个动物跑动的过程,经过将每一个动做的图片逐帧显示,造成动画的感受。
box-shadow
等)常见的有 less
(基于node写的,编译比较快,入门简单)和 sass
(基于Ruby
写的)
全局安装 less
npm install less -g
建立一个 test.less
文件
body{ padding: 0; margin: 0; } .wrapper{ background: white; .nav{ font-size: 12px; } .content{ font-size: 14px; &:hover{ background: red; } } }
在该文件处调用终端,执行如下命令:
lessc test.less
输出结果:
执行以下命令,输出到 test.css
文件中
lessc test.less > test.css
查看 test.css
文件,获得以下结果:
body { padding: 0; margin: 0; } .wrapper { background: white; } .wrapper .nav { font-size: 12px; } .wrapper .content { font-size: 14px; } .wrapper .content:hover { background: red; }
全局安装 sass
cnpm install node-sass -g
建立一个 test.scss
文件
body{ padding: 0; margin: 0; } .wrapper{ background: white; .nav{ font-size: 12px; } .content{ font-size: 14px; &:hover{ background: red; } } }
执行以下命令,查看输出结果:
node-sass test.scss
执行以下命令,输出到 test-scss.css
文件中
node-sass test.scss > test-scss.css
查看 test-scss.css
文件,获得以下结果:
body { padding: 0; margin: 0; } .wrapper { background: white; } .wrapper .nav { font-size: 12px; } .wrapper .content { font-size: 14px; } .wrapper .content:hover { background: red; }
从以上代码来看,sass嵌套会保留原来嵌套样式,对于css观赏性来讲,并非咱们特别想要的,因而咱们能够执行以下命令,更改输出样式:
node-sass --output-style expanded test.scss > test-scss.css
输出结果就和less嵌套同样了,读者能够本身跑一遍!
建立 variable-less.less
文件
@fontSize: 12px; @bgColor: red; body{ padding: 0; margin: 0; } .wrapper{ background: lighten(@bgColor,40%); .nav{ font-size: @fontSize; } .content{ font-size: @fontSize+2px; &:hover{ background: @bgColor; } } }
建立 variable-less.css
文件,执行以下命令:
lessc variable-less.less > variable-less.css
能够获得以下代码:
body { padding: 0; margin: 0; } .wrapper { background: #ffcccc; } .wrapper .nav { font-size: 12px; } .wrapper .content { font-size: 14px; } .wrapper .content:hover { background: red; }
相似less变量,只须要将 @
改成 $
便可,由于 less
变量命名这样作,是更贴近CSS。而 sass
是为了区别CSS。
建立 mixin.less
文件,复制以下代码:
@fontSize: 12px; @bgColor: red; .block(@fontSize){ font-size: @fontSize; border: 1px solid #ccc; border-radius: 4px; } body{ padding: 0; margin: 0; } .wrapper{ background: lighten(@bgColor,40%); .nav{ .block(@fontSize); } .content{ .block(@fontSize+2px); &:hover{ background: @bgColor; } } }
建立 mixin-less.css
文件,执行以下代码:
lessc mixin.less > mixin-less.css
查看mixin-less.css
文件,发现 .block
没有了,在CSS内部就完成了样式复用。
body { padding: 0; margin: 0; } .wrapper { background: #ffcccc; } .wrapper .nav { font-size: 12px; border: 1px solid #ccc; border-radius: 4px; } .wrapper .content { font-size: 14px; border: 1px solid #ccc; border-radius: 4px; } .wrapper .content:hover { background: red; }
建立 mixin.scss
文件,复制以下代码:
$fontSize: 12px; $bgColor: red; @mixin block($fontSize){ font-size: $fontSize; border: 1px solid #ccc; border-radius: 4px; } body{ padding: 0; margin: 0; } .wrapper{ background: lighten($bgColor,40%); .nav{ @include block($fontSize); } .content{ @include block($fontSize+2px); &:hover{ background: $bgColor; } } }
建立 mixin-sass.css
文件,执行以下代码:
node-sass --output-style expanded mixin.scss > mixin-sass.css
查看mixin-sass.css
文件,发现 .block
没有了,在CSS内部就完成了样式复用。
body { padding: 0; margin: 0; } .wrapper { background: #ffcccc; } .wrapper .nav { font-size: 12px; border: 1px solid #ccc; border-radius: 4px; } .wrapper .content { font-size: 14px; border: 1px solid #ccc; border-radius: 4px; } .wrapper .content:hover { background: red; }
总结:从上文对比来看,sass mixin 除了调用变量符号要换为 $
外,抽离公共样式须要使用 @mixin
,此外,调用时还须要使用 @include
。
那么,mixin还能作什么呢?
例如,对于布局方面,咱们在上文提到了清楚浮动的方式,那么,咱们就能够将这段样式进行复用,只须要在须要的元素处引用便可。
上文提到过的,使用过 less mixin 抽离以后,咱们能够获得以下代码,可是呢,又会有一个小问题,就是咱们会有重复样式代码。在生产环境下,就会有大量这样的形式出现,这就会影响到咱们的CSS体积了。
一种比较好的方式,以下,咱们再讲公共样式代码进行抽离,这显然会下降咱们的CSS体积。
所以,extend就发挥了它的做用
建立 extend-less.less
文件,复制以下代码:
@fontSize: 12px; @bgColor: red; .block{ font-size: @fontSize; border: 1px solid #ccc; border-radius: 4px; } body{ padding: 0; margin: 0; } .wrapper{ background: lighten(@bgColor,40%); .nav{ &:extend(.block); } .content:extend(.block){ &:hover{ background: @bgColor; } } }
建立 extend-less.css
文件,执行以下代码:
lessc extend-less.less > extend-less.css
查看 extend-less.css
文件,发现代码体积相对减小了。
.block, .wrapper .nav, .wrapper .content { font-size: 12px; border: 1px solid #ccc; border-radius: 4px; } body { padding: 0; margin: 0; } .wrapper { background: #ffcccc; } .wrapper .content:hover { background: red; }
总结:mixin 和 extend 区别, mixin 能处理一些复杂逻辑,好比添加变量,但会致使体积增大问题。而 extend的话,是将选择器提取出来,更加简单,不适合处理复杂逻辑,能将体积进行必定减小。
建立 extend-sass.scss
文件,复制以下代码:
$fontSize: 12px; $bgColor: red; .block{ font-size: $fontSize; border: 1px solid #ccc; border-radius: 4px; } body{ padding: 0; margin: 0; } .wrapper{ background: lighten($bgColor,40%); .nav{ @extend .block; } .content{ @extend .block; &:hover{ background: $bgColor; } } }
建立 extend-sass.css
文件,执行以下代码:
node-sass --output-style expanded extend-sass.scss > extend-sass.css
查看 extend-sass.css
文件,发现代码体积相对减小了。
.block, .wrapper .nav, .wrapper .content { font-size: 12px; border: 1px solid #ccc; border-radius: 4px; } body { padding: 0; margin: 0; } .wrapper { background: #ffcccc; } .wrapper .content:hover { background: red; }
建立 loop-less.less
文件,复制以下代码
.gen-col(@n) when (@n > 0){ .gen-col(@n - 1); .col-@{n}{ width: 1000px/12*@n; } } .gen-col(12);
建立 loop-less.css
文件,执行以下代码:
lessc loop-less.less > loop-less.css
查看 loop-less.css
文件,发现有12个样式
.col-1 { width: 83.33333333px; } .col-2 { width: 166.66666667px; } .col-3 { width: 250px; } .col-4 { width: 333.33333333px; } .col-5 { width: 416.66666667px; } .col-6 { width: 500px; } .col-7 { width: 583.33333333px; } .col-8 { width: 666.66666667px; } .col-9 { width: 750px; } .col-10 { width: 833.33333333px; } .col-11 { width: 916.66666667px; } .col-12 { width: 1000px; }
建立 loop-sass.scss
文件,复制以下代码:
@mixin gen-col($n){ @if $n > 0 { @include gen-col($n - 1); .col-#{$n}{ width: 1000px/12*$n; } } } @include gen-col(12);
建立 loop-sass.css
,执行以下代码:
node-sass --output-style expanded loop-sass.scss > loop-sass.css
查看 loop-sass.css
文件,发现有12个样式
.col-1 { width: 83.33333px; } .col-2 { width: 166.66667px; } .col-3 { width: 250px; } .col-4 { width: 333.33333px; } .col-5 { width: 416.66667px; } .col-6 { width: 500px; } .col-7 { width: 583.33333px; } .col-8 { width: 666.66667px; } .col-9 { width: 750px; } .col-10 { width: 833.33333px; } .col-11 { width: 916.66667px; } .col-12 { width: 1000px; }
上述版本代码或许是挺复杂的,好在 sass
提供了for循环,见以下代码:
@for $i from 1 through 12 { .col-#{$i} { width: 1000px/12*$i; } }
建立 import-less.less
文件,复制以下代码:
@import "./mixin"; @import "./variable-less";
建立 import-less.css
文件,执行以下代码:
lessc import-less.less > import-less.css
查看 import-less.less
文件
body { padding: 0; margin: 0; } .wrapper { background: #ffcccc; } .wrapper .nav { font-size: 12px; border: 1px solid #ccc; border-radius: 4px; } .wrapper .content { font-size: 14px; border: 1px solid #ccc; border-radius: 4px; } .wrapper .content:hover { background: red; } body { padding: 0; margin: 0; } .wrapper { background: #ffcccc; } .wrapper .nav { font-size: 12px; } .wrapper .content { font-size: 14px; } .wrapper .content:hover { background: red; }
语法上没有什么变化,注意符号是 $
用于组件交互
基于jquery写的,同时,依赖第三方库 Popper.js和 bootstrap.js
如上图,第二个js文件包含了 Popper.js
使用方式:
很是精华的部分
关注几个事情:组织、优化、构建、维护
常见:
全局安装 postcss-cli
npm install postcss-cli -g
在 postcss.config.js
文件进行配置
PostCSS 支持的构建工具
话说,我有女友吗?我有吗?原来我没有...
扯开女友话题,终于完成了这篇史诗级大做,时隔几天时间。更多笔记内容还请关注 小狮子前端笔记仓库 (不要白嫖,给个 star ✿✿ヽ(°▽°)ノ✿ 就是对我最大的支持啦~)
学如逆水行舟,不进则退