Open easonhuang123 opened 6 years ago
标准盒子
box-sizing: content-box
使用场景
其实是看设计师的习惯和团队的统一规范,其实两种都可以实现,就看哪种更好维护罢了
对于按照百分比布局,同时有内边距的时候使用 box-sizing: border-box会更好维护,你不需要在意改动内边距和边框会影响到盒子的宽高。
box-sizing: border-box
笔者一般都直接全局设置 *{box-sizing: border-box}
*{box-sizing: border-box}
如需兼容ff和移动端的话最好加上前缀-moz-,-webkit-,所以格式如下
*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
⚠️margin外边距不属于盒子模型范围内,它只占有对应的外边距位置
对于行级元素inline,margin-top和margin-bottom对于上下元素无效,margin-left和margin-right有效
对于相邻的块级元素block,margin-bottom和margin-top
脱离文档流,相对于已定位的父元素进行移动,当某个absolute定位元素的父元素具有position:relative/absolute/fixed时,定位元素都会依据父元素而定位,而父元素没有设置position属性或者设置了默认属性,那么定位属性会依据html元素来定位
脱离文档流,不随着滚动条的移动而改变位置,相对于浏览器窗口,对于IE78需要DOCTYPE
相对于自身位置移动,原位置还保留在文档流中,内容发生了移动
position默认值
css新属性——粘性定位
被滚动超过指定的偏移值时,元素在容器内固定在指定位置,所以必须设置上下左右其中一个值(达到阈值前会相对定位,达到后变成固定定位)
不脱离文档流,仍然保留元素原本在文档流中的位置
nav{ position:sticky; top:10px; /* 阈值 */ }
但是兼容性非常不乐观
position: -webkit-sticky; position: sticky;
挺好玩的,例如我们不再用监听scroll事件,即可实现导航栏滚动绝对定位
⚠️注意
父元素不能overflow:hidden或者overflow:auto属性。
必须指定top、bottom、left、right4个值之一,否则只会处于相对定位
父元素的高度不能低于sticky元素的高度
sticky元素仅在其父元素内生效
只对于absolute,relative,fixed三种定位有效
子级无论z-index为何值,都不会对父级元素层级造成影响,但是可以通过设置子元素的z-index为负数来控制顺序。
网上看到一个不错的比喻: 你可以把同一层级的层叠上下文元素看做是两个不同的人,不同的人有不同的高度,你可以比较两个人的高度,但是你不能说手长身高就更高一点吧。
网上看到一个不错的比喻:
你可以把同一层级的层叠上下文元素看做是两个不同的人,不同的人有不同的高度,你可以比较两个人的高度,但是你不能说手长身高就更高一点吧。
link标签
没有兼容性问题
还可以引入图标等资源
在页面加载的时候同时加载css文件
可通过js控制dom操作样式
import引入
兼容性问题 css2.1 IE5
网页加载完后再加载css文件,所以会出现闪烁现象
不可通过js修改样式
只能引入样式文件,但是可以在css文件里再引入css文件
推荐书写 @import url(style.css)
::before 和 :before 差别时前者是css3调整的写法,所以后者的兼容性更好,其实效果一样
必须与content属性一起使用
不能通过js控制,只能在css中使用
用途:清除浮动,制造各种小形状,icon
::after { content: ""; display: table; clear: both; }
块状元素
特点
独占一行
宽高边距都可控
宽度默认父容器宽度
可容纳块与内联
元素
div
p
h
ul
dl
ol
form
内联元素
都在一行
高,行高,上下内外边距不可改,左右内外边距可改变但是不影响左右元素
宽度是内容宽度
只能容纳内联和文本
a
span
input
img
textarea
可继承属性
字体属性font
visibility
cursor
color
部分文本属性
line-height
word-spacing字间距
letter-spacing字符间距
text-transform大小写
direction方向
其中文本缩进text-indent,text-align只有块状元素可继承
不可继承属性
背景属性background
布局属性margin
定位属性position
display
vertical-align
text-decoration
text-shadow
white-space
unicode-dibi
*
.class
div,p
div p
div>p
div+p
[attribute]
[attirbute=‘123']
[attribute~=‘123’]
[attritube|=‘123’]
:link :hover :active :visited :focus
:before :after
p:first-of-type (last, only,nth) 其父元素的第1/最后/唯一/n个p元素的所有p元素
p:nth-(-last-)child(n) 其父元素的(顺序,倒序)第n个元素的所有p元素
:root
p:empty
:disabled :checked
:not(p)
元素选择器: 1
类选择器:10
ID选择器:100
内联: 1000
!important > 行内样式 > ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性
⚠️CSS选择器读取匹配顺序是从右向左的。
若从左向右的匹配,发现不符合规则,需要进行回溯,会损失很多性能。若从右向左匹配,先找到所有的最右节点,对于每一个节点,向上寻找其父节点直到找到根元素或满足条件的匹配规则,则结束这个分支的遍历。两种匹配规则的性能差别很大,是因为从右向左的匹配在第一步就筛选掉了大量的不符合条件的最右节点(叶子节点),而从左向右的匹配规则的性能都浪费在了失败的查找上面。
JQ的选择符匹配规则就是参考了css选择器读取规则来进行DOM节点的查找,得到很大的性能提高
css布局考察的知识点比较综合,基本就是使用上了所有css的基础技巧,以下是一些比较常见的场景总结。
方法一: 定宽 + margin: 0 auto
<div class="parent"> <p class="child">我是子元素</p> </div> <style> .child{ width: 100px; margin: 0 auto; } </style>
方法二: 行内元素 inline-block + text-align
<div class="txtCenter">xxx</div> <div class="imgCenter"><img src="xxx" /></div> <style> div.txtCenter{ text-align:center; } .imgCenter{ text-align:center; } </style>
方法三: display: table + margin: 0 auto
<div class="parent"> <p class="child">我是子元素</p> </div> <style> .parent{ display:table; } .child{ margin: 0 auto; } </style>
方法四: 父元素display: flex + justify-content: center
<div class="parent"> <p class="child">我是子元素</p> </div> <style> .parent{ display:flex;/*Flex布局*/ display: -webkit-flex; /* Safari */ justify-content: center;/*指定水平居中*/ } </style>
方法一: display: table-cell + vertical-align: middle
<div class="parent"> <p class="child">我是子元素</p> </div> <style> .parent { display: table; } .child { display: table-cell; vertical-align: middle; } </style>
方法二: 父元素display: flex + align-item: center
<div class="parent"> <p class="child">我是子元素</p> </div> <style> .parent{ display:flex;/*Flex布局*/ display: -webkit-flex; /* Safari */ align-items:center;/*指定垂直居中*/ } </style>
方法三:对单行文本使用 line-height
<div class="parent"> xxx </div> <style> .parent{ height: 300px; line-height: 300px; } </style>
方法四: 对图片使用 line-height + vertical-align
<div class="parent"> <img src="xxx"/> </div> <style> .parent{ height: 300px; line-height: 300px; } img{ vertical-align: middle; } </style>
方法五: 绝对定位 margin: auto 0
<div class="parent"> <p class="child">我是子元素</p> </div> <style> .parent { position: relative; } .child { position: absolute; top: 0; bottom: 0; margin: auto 0; } </style>
方法:position: absolute + top + left + transform: translate()
<div class="parent"> <div>xxx</div> </div> <style> .parent{ position: relative; } img{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style>
方法一: 图片作为背景图片 background-image background-repeat background-size
<style> .testTXT { height:60px; line-height:60px; padding-left:65px; background:url(xxx) no-repeat left center } </style> <div class="testdiv"> <div class="testTXT"> <span>XXXX</span> </div> </div>
方法二: 图片固定宽高,父容器相对定位,子容器绝对定位
<style> .img { border: 1px solid black; width: 200px; height: 200px; position: relative; } .img img { width: 100px; height: 100px; position: absolute; top: 50%; left: 50%; margin: -50px 0 0 -50px; } </style> <div class="img"> <img src="xxx" /> </div>
方法三: 图片宽高自适应,使用line-height,text-align,vertical-align,max-width,max-height
<style> .img { border: 1px solid black; width: 200px; height: 200px; line-height: 200px; text-align: center; } .img img { max-width: 150px; max-height: 150px; vertical-align: middle; } </style> <div class="img"> <img src="xxx" /> </div>
方法四: css3 display:box
.img { border: 1px solid black; width: 200px; height: 200px; text-align: center; display: -webkit-box; -webkit-box-align: center; -webkit-box-pack: center; display: -moz-box; -moz-box-align: center; -moz-box-pack: center; display: -o-box; -o-box-align: center; -o-box-pack: center; display: -ms-box; -ms-box-align: center; -ms-box-pack: center; display: box; box-align: center; box-pack: center; } .img img { width: 100px; height: 100px; } <div class="img"> <img src="xxx" /> <span>xxx</span> </div>
参考文章 完美实现文字图片水平垂直居中
参考文章
完美实现文字图片水平垂直居中
方法一: float + overflow: hidden
方法二: columns-width columns-count(IE10以下不支持,需要添加前缀)
方法三: flex (也需要加入兼容语法)
参考文章 CSS布局之多列布局
CSS布局之多列布局
参考文章 圣杯布局、双飞翼布局、Flex布局和绝对定位布局的几种经典布局的具体实现示例 flex 基础属性说明 参考文章 A Complete Guide to Flexbox
圣杯布局、双飞翼布局、Flex布局和绝对定位布局的几种经典布局的具体实现示例
基础属性说明 参考文章
A Complete Guide to Flexbox
使用实例
参考文章 flex的使用实例
flex的使用实例
兼容性问题
Can I use display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; grid 参考文章 CSS:Grid 布局
Can I use
display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex;
CSS:Grid 布局
https://www.jianshu.com/p/07eb19957991 清除浮动 原因 浮动元素脱离文档流,影响页面结构 父元素高度无法撑开 .clearfix { zoom: 1; }
https://www.jianshu.com/p/07eb19957991
.clearfix { zoom: 1; }
.clearfix::after { content: ''; clear: both; height: 0; visibility: hidden; display: block; }
## **BFC** * 块级格式化上下文 * 触发条件 * float不为none * overflow不为visible * display 为table-cell,table-caption,inline-block * position为absolute,fixed * fieldset元素 * 功能 * 自我独立,内部元素不会影响外部元素 * 会包含浮动元素 * 同一个BFC的margin重叠 > 参考文章 > > ⚠️ [前端布局基础概述](https://mp.weixin.qq.com/s/X9i_7BX-32EZlxsYP6MxEg) ## **css3** * 边框图片,圆角 * Border-radius * &-image * 背景 * Background-image * &-size * &-origin(位置区域content-box/border-box/padding-box) * &-clip(裁剪描绘区域) * 多重背景 * 渐变色 * Linear-gradient(angle,color1 10%,color2 30%,..) * Radial-gradient * 兼容性,添加前缀 * 文本效果 * Text-shadow * Box-shadow * Text-overflow * Word-wrap (break-word,强制断开分行) * Word-break(keep-all,break-all 是否换行) * 一行省略
display: block; text-overflow: ellipsis; white-space: nowrap; overflow: hidden;
display: -webkit-box; overflow: hidden; text-overflow: ellipsis; -webkit-box-orient: vertical; -webkit-line-clamp: n;
* columns * 2D/3D转换 * transform * Matrix 矩阵变换 * translate平移 * scale缩放 * rotate旋转 * skew倾斜 * 过渡 * transition * 动画 * @keyframes * animation ## **单位** * px * em 当前字体大小 * rem 根节点字体大小 * vh, vw, vmin, vmax 视窗单位 * ex, ch 给予特殊字体的单位 * ex em的一半,字体的中间标志,可以上下用于微调 * ch 数字0的宽度 ## **BEM** * box--body * box__body ## **命名空间** ## **媒体查询** * 设置Meta标签
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no”/>
@media (max-width: 960px) and (min-width: 600px) {…}
## **响应式设计** * rem适应屏幕大小 * 媒体查询 * flex流式布局 * 响应式图片<picture> ## **Css解析过程** CSS 解析完毕后生成CSSDOM Tree,需要将解析的结果与 DOM Tree 的内容一起进行分析建立一棵 Render Tree,最终用来进行绘图。在建立 Render Tree 时,浏览器就要为每个 DOM Tree 中的元素根据 CSS 的解析结果(Style Rules)来确定生成怎样的 Render Tree。 ## **css优化** * 雪碧图,利用背景图片位移 * 对类名的设计与选择 * 避免不必要的重复 * 避免!important * 避免链式,后代选择符 * 预处理 * less,sass * 后处理 * postCSS * 兼容 * *{margin:0 ; padding: 0;} * Hack * _color ——IE6 * *color ——IE6/7 * color: red\9 ——IE8及以下 * 24位PNG在IE6不支持 * 用8位PNG * 准备专门的一套 * A标签顺序 * Link * visited * hover * Active * 透明度 * opacity: 0.8 * filter: alpha(opacity=80) ——IE * filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=80); //IE6的写法 * 盒子模型 * 边距问题 * 浮动双倍 * Img图片存在边距 * 各种前缀 * flex ## **css变量** > https://mp.weixin.qq.com/s/wFz0PsOGaLb9KDGfEJuLaA
css学习笔记
盒子模型
结构:content + padding + border + margin
基本分类
标准盒子
css3新属性 box-sizing(默认值 content-box)
box-sizing: content-box
使用场景
其实是看设计师的习惯和团队的统一规范,其实两种都可以实现,就看哪种更好维护罢了
对于按照百分比布局,同时有内边距的时候使用
box-sizing: border-box
会更好维护,你不需要在意改动内边距和边框会影响到盒子的宽高。笔者一般都直接全局设置
*{box-sizing: border-box}
如需兼容ff和移动端的话最好加上前缀-moz-,-webkit-,所以格式如下
关于margin
⚠️margin外边距不属于盒子模型范围内,它只占有对应的外边距位置
对于行级元素inline,margin-top和margin-bottom对于上下元素无效,margin-left和margin-right有效
对于相邻的块级元素block,margin-bottom和margin-top
Position 定位
absolute
脱离文档流,相对于已定位的父元素进行移动,当某个absolute定位元素的父元素具有position:relative/absolute/fixed时,定位元素都会依据父元素而定位,而父元素没有设置position属性或者设置了默认属性,那么定位属性会依据html元素来定位
fixed
脱离文档流,不随着滚动条的移动而改变位置,相对于浏览器窗口,对于IE78需要DOCTYPE
relative
相对于自身位置移动,原位置还保留在文档流中,内容发生了移动
static
position默认值
sticky
css新属性——粘性定位
被滚动超过指定的偏移值时,元素在容器内固定在指定位置,所以必须设置上下左右其中一个值(达到阈值前会相对定位,达到后变成固定定位)
不脱离文档流,仍然保留元素原本在文档流中的位置
但是兼容性非常不乐观
挺好玩的,例如我们不再用监听scroll事件,即可实现导航栏滚动绝对定位
⚠️注意
父元素不能overflow:hidden或者overflow:auto属性。
必须指定top、bottom、left、right4个值之一,否则只会处于相对定位
父元素的高度不能低于sticky元素的高度
sticky元素仅在其父元素内生效
z-index
只对于absolute,relative,fixed三种定位有效
子级无论z-index为何值,都不会对父级元素层级造成影响,但是可以通过设置子元素的z-index为负数来控制顺序。
样式引入方式
link标签
没有兼容性问题
还可以引入图标等资源
在页面加载的时候同时加载css文件
可通过js控制dom操作样式
import引入
兼容性问题 css2.1 IE5
网页加载完后再加载css文件,所以会出现闪烁现象
不可通过js修改样式
只能引入样式文件,但是可以在css文件里再引入css文件
推荐书写 @import url(style.css)
伪类:before :after
::before 和 :before 差别时前者是css3调整的写法,所以后者的兼容性更好,其实效果一样
必须与content属性一起使用
不能通过js控制,只能在css中使用
用途:清除浮动,制造各种小形状,icon
块与内联
块状元素
特点
独占一行
宽高边距都可控
宽度默认父容器宽度
可容纳块与内联
元素
div
p
h
ul
dl
ol
form
内联元素
特点
都在一行
高,行高,上下内外边距不可改,左右内外边距可改变但是不影响左右元素
宽度是内容宽度
只能容纳内联和文本
元素
a
span
input
img
textarea
继承属性
可继承属性
字体属性font
visibility
cursor
color
部分文本属性
line-height
word-spacing字间距
letter-spacing字符间距
text-transform大小写
direction方向
其中文本缩进text-indent,text-align只有块状元素可继承
不可继承属性
背景属性background
布局属性margin
定位属性position
display
部分文本属性
vertical-align
text-decoration
text-shadow
white-space
unicode-dibi
选择器
分类
*
.class
id
div
div,p
div p
div>p
div+p
[attribute]
[attirbute=‘123']
[attribute~=‘123’]
[attritube|=‘123’]
:link :hover :active :visited :focus
:before :after
p:first-of-type (last, only,nth) 其父元素的第1/最后/唯一/n个p元素的所有p元素
p:nth-(-last-)child(n) 其父元素的(顺序,倒序)第n个元素的所有p元素
:root
p:empty
:disabled :checked
:not(p)
优先级排序
计算法则
元素选择器: 1
类选择器:10
ID选择器:100
内联: 1000
!important > 行内样式 > ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性
匹配顺序
⚠️CSS选择器读取匹配顺序是从右向左的。
若从左向右的匹配,发现不符合规则,需要进行回溯,会损失很多性能。若从右向左匹配,先找到所有的最右节点,对于每一个节点,向上寻找其父节点直到找到根元素或满足条件的匹配规则,则结束这个分支的遍历。两种匹配规则的性能差别很大,是因为从右向左的匹配在第一步就筛选掉了大量的不符合条件的最右节点(叶子节点),而从左向右的匹配规则的性能都浪费在了失败的查找上面。
JQ的选择符匹配规则就是参考了css选择器读取规则来进行DOM节点的查找,得到很大的性能提高
布局
css布局考察的知识点比较综合,基本就是使用上了所有css的基础技巧,以下是一些比较常见的场景总结。
水平居中
方法一: 定宽 + margin: 0 auto
方法二: 行内元素 inline-block + text-align
方法三: display: table + margin: 0 auto
方法四: 父元素display: flex + justify-content: center
垂直居中
方法一: display: table-cell + vertical-align: middle
方法二: 父元素display: flex + align-item: center
方法三:对单行文本使用 line-height
方法四: 对图片使用 line-height + vertical-align
方法五: 绝对定位 margin: auto 0
🌞居中万金油
方法:position: absolute + top + left + transform: translate()
图片文字对齐
方法一: 图片作为背景图片 background-image background-repeat background-size
方法二: 图片固定宽高,父容器相对定位,子容器绝对定位
方法三: 图片宽高自适应,使用line-height,text-align,vertical-align,max-width,max-height
方法四: css3 display:box
多列布局
方法一: float + overflow: hidden
方法二: columns-width columns-count(IE10以下不支持,需要添加前缀)
方法三: flex (也需要加入兼容语法)
圣杯布局 && 双飞翼布局
使用实例
兼容性问题
浮动
浮动
.clearfix::after { content: ''; clear: both; height: 0; visibility: hidden; display: block; }
display: block; text-overflow: ellipsis; white-space: nowrap; overflow: hidden;
display: -webkit-box; overflow: hidden; text-overflow: ellipsis; -webkit-box-orient: vertical; -webkit-line-clamp: n;
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no”/>
@media (max-width: 960px) and (min-width: 600px) {…}