盒模型
margin box
、border box
、padding box
、content box
这四个盒子由外到内构成了盒模型。
IE模型
IE模型:box-sizing: border-box
此模式下,元素的宽度计算为border+padding+content
的宽度总和。也就是说我们使用css设置元素的宽度,这个宽度是该元素的border+padding+content
的和。所以元素在文档中占据的总宽度为 css设置元素的宽度 + margin
w3c标准模型
w3c标准模型:box-sizing: content-box
此模式下,元素的宽度计算为content
的宽度。也就是说我们使用css设置元素的宽度,这个宽度是该元素的content
的宽度。所以元素在文档中占据的总宽度为 css设置元素的宽度 + margin
+ border
+ padding
层叠顺序
层叠上下文我们只需要记住这张图就可以了。
顺序一次是正的z-index -> 0或auto -> 行内元素 -> 浮动元素 -> 块级盒子 -> 负的z-index -> 背景颜色
只有设置了定位的元素才能设置z-index
只有设置了定位的元素才能设置z-index
,也就是position
的值不为static
的元素。
子元素不会超过父元素的层级
并且层级受父元素控制,也就是说父元素层级不高,子元素再怎么设置层级也不会超过父元素的层级。
比如下面的例子,
<div class='div1'>div1</div>
<div class='div2'>div2
<div class='div2-1'>div2-1</div>
</div>
div1
的z-index
是2,div2
的z-index
是1,不管div2
里面的div2-1
的z-index
设置为多少,始终都会被div1
盖住。
浮动
浮动现在基本上不使用了,但是面试的时候有可能会被问到,所以我们还是需要了解下。
我们使用float: left/right
开启左右浮动。
节点参与浮动布局后,自身脱流但其文本不脱流。
浮动元素特点
- 不管是块级元素还是行内元素,设置浮动后的
display
属性值是inline-block
,也就是变为行内块级元素了。大小由子元素决定。 - 浮动元素直到遇到另一个浮动元素或者遇到它外边缘的包含框或者块级元素才不会向上浮动。
浮动带来的问题
- 浮动会导致父元素撑不开,会有父元素高度塌陷问题。
- 浮动元素会脱离文档流,会影响内联元素的布局。
清除浮动的方式
- 浮动元素后加空
div
标签 并添加样式clear:both
,或者看具体情况也可以使用clear:left
或者clear:right
。 - 父元素使用伪类
.parent:after{content: ''; clear: both; display: block;}
。clear
属性只有块级元素才有效的。所以需要display:block
。 - 如果单纯想解决父元素高度塌陷的问题,可以给父元素开启
BFC
,或者给父元素设置固定高度。
IFC
IFC指的是行级格式化上下文
IFC特点
- 行级上下文内部的盒子会在水平方向,一个接一个地放置。
- 当一行不够的时候会自动切换到下一行。
- 行级上下文的高度由内部最高的内联盒子的高度决定。
BFC
BFC
块级格式化上下文(Block Formatting Context)是一个独立的布局环境。
BFC特点
FC指的是块级格式化上下文,一个元素形成了BFC之后,那么它内部元素产生的布局不会影响到外部元素,外部元素的布局也不会影响到BFC中的内部元素。一个BFC就像是一个隔离区域,和其他区域互不影响。
怎么开启BFC
满足以下四条中的任意一条就可以开启 BFC
float
的值是right、left
。position
的值是absolute、fixed
。display
的值是inline-block、flex、inline-flex、grid、inline-grid、table-cell、table-caption
。overflow
的值是hidden、scroll、auto
。
margin合并
外边距合并只会是上下外边距合并,左右外边距不会合并。
行内元素可以设置左右内外边距,但是不能设置上下内外边距。
计算规则
如果出现外边距合并,我们的计算规则是 两个外边距都是正数取大的正数,两个都是负数取绝对值大的数,一正一负取和。
出现场景
- 相邻兄弟元素之间上下
margin
合并。 - 父元素
margin-top
和子元素margin-top
,高度为auto
的父元素margin-bottom
和子元素margin-bottom
。 - 空块级元素自身的
margin-top
和margin-botom
合并。
解决方案
对于兄弟元素上下外边距合并
- 底部元素变为行内盒子:
display: inline-block
- 底部元素设置浮动:
float
- 底部元素的
position
的值为absolute/fixed
对于父子上外边距合并
- 父元素开启
BFC
- 父元素设置
border
或padding
阻隔margin
。 - 子元素变为行内盒子:
display: inline-block
- 子元素
position
的值为absolute/fixed
- 子元素设置浮动:
float
对于父子下外边距合并
- 父元素开启
BFC
。 - 父元素设置
border
或padding
阻隔margin
。 - 子元素变为行内盒子:
display: inline-block
。
对于空元素自身上下外边间距合并
- 父元素开启
BFC
。
margin和padding
边距合并
margin
有可能会产生上下外边距合并问题,但是padding
不会有外边距合并问题。
背景色
padding
能看到背景色,而margin
看不到背景色。
行内元素和块级元素的有效性
行内元素只能设置左右margin
和padding
,设置上下margin
和padding
会无效。但是对于内联替换元素(img、input),垂直margin
和padding
会有效,并且没有margin
合并的问题。
块级元素上下左右margin
和padding
都能设置。
margin和padding的百分比计算
margin
和padding
的百分比值,在垂直方向和水平方向上是一样的,都是相对于父元素宽度计算的。
下面我用例子说明
.container {
background-color: lavenderblush;
width: 200px;
height: 100px;
border: 1px solid lavenderblush;
}
.child {
background-color: lawngreen;
padding: 10%;
margin: 10%;
}
<div class="container">
<div class="child">child</div>
</div>
这里子元素内外边距设置为10%,值都是20px,所以上下左右内外百分比边距都是根据父元素的宽度来计算的。
宽高
元素的宽高也是我们经常会出问题的一个点。
width和height的值auto、100%区别
width
、height
的默认值都是auto
。
width: 100%
是子元素的content box
和父元素的content box
相等,所以当子元素有内外边距或者边框的时候会超出父元素。
对于块级元素,流体布局之下width: auto
自适应撑满父元素宽度。这里的撑满并不同于width: 100%
的固定宽度,而是像水一样能够根据自身margin
、border
和padding
的不同而自适应父元素的宽度。也就是说子元素宽度不会超出父元素。
对于内联元素,width: auto
则呈现出包裹性,即由子元素的宽度决定。
无论内联元素还是块级元素,height: auto
都是呈现包裹性,即高度由子级元素撑开。并且父元素height: auto
会导致子元素height: 100%
百分比失效。
height: 100%
是子元素的content box
和父元素的content box
相等,所以当子元素有内外边距或者边框的时候会超出父元素。
如果块级元素的width
是个固定值,margin
是auto
,则margin
会撑满剩下的空间;如果margin
是固定值,width
是auto
,则width
会撑满剩下的空间。
下面我用例子说明
ontainer1 {
padding: 20px;
margin: 40px;
background-color: greenyellow;
}
.child1 {
background-color: lavender;
margin: 0 20px;
padding: 20px;
}
.container2 {
padding: 20px;
margin: 40px;
background-color: greenyellow;
}
.child2 {
background-color: lavender;
width: 100%;
margin: 0 20px;
padding: 20px;
}
.container3 {
margin: 100px;
width: auto;
background-color: greenyellow;
}
.container4 {
margin: auto;
width: 500px;
background-color: lavender;
}
<div class="container1">
<div class="child1">child width使用默认值 auto 永远被父元素包裹</div>
</div>
<div class="container2">
<div class="child2">
child widtd 100%; 如果自身有margin、border或padding会超出父元素
</div>
</div>
<div class="container3">margin: 100px; width: auto;</div>
<div class="container4">margin: auto; width: 500px;</div>
效果如下图所示
min-width/max-width 和 min-height/max-height 属性间的覆盖规则?
max-width
会覆盖width
,即使width
是行类样式或者设置了!important
。
min-width
会覆盖max-width
,此规则发生在min-width
和max-width
冲突的时候。
所以 min-width > max-width > width
同理min-height > max-height > height
line-height
line-height
主要用来设置行高,我们经常使用line-height
和height
相等来实现文字居中。
line-height
值如果是百分比的话则是根据父元素的font-size
来进行计算的。
vertical-align
vertical-align
属性值有 baseline(默认值)
、top
、middle
、bottom
、text-top
、text-bottom
、sub
、super
、数值、百分比。
很多人说我设置了vertical-align
怎么没有效果,其实vertical-align属性起作用的前提必须是作用在内联元素上。
注意如果元素设置了float: left
、dispaly: flex
、position: absolute
,则其vertical-align
属性不能生效,因为此时元素的display
不再是inline
了。当设置float: left
和position: absolute
元素的display
是inline-block
了。
display、position、float的相互关系?
- 首先我们判断display属性是否为none,如果为none,则position和float属性的值不影响元素最后的表现。
- 然后判断position的值是否为absolute或者fixed,如果是,则float属性失效。
- 如果position的值不为absolute或者fixed而是为relative,并且float属性的值存在,则relative相对于浮动后的最终位置定位。
绝对定位元素与非绝对定位元素的百分比计算的区别
绝对定位元素的宽高百分比是相对于临近的 position
不为 static
的祖先元素的 padding box
来计算的。
非绝对定位元素的宽高百分比则是相对于父元素的 content box
来计算的。
沾性定位
沾性定位使用position: sticky
表示。
.container {
height: 2000px;
padding: 100px 0;
}
.child {
background-color: lightblue;
width: 100px;
height: 100px;
position: sticky;
top: 10px;
}
元素滚动到距离浏览器顶部小于 10px 之前,元素为相对定位。之后,元素将固定在与浏览器顶部 10px 的位置,直到 viewport视口
回滚到阈值以下。
position: sticky
是相对最近的可滚动元素来计算的,也就是overflow
不为visible
的元素。
需注意当 position: sticky
的父元素的 overflow
属性设置了默认值 visible
以外的值时,position: sticky
将失效。除非父元素又设置高度。这样sticky
元素就会根据这个可滚动父元素来计算。
sticky
元素不一定会停留在可视窗口,如果父元素消失,该sticky
元素也会消失。不消失的前提是父元素会一直在可视窗口。
sticky
元素后面的会覆盖前面的,除非设置了z-index
。
CSS中可继承属性有哪些
字体相关
font-family
、font-style
、font-size
、font-weight
等;
文本相关
text-align
、text-indent
、text-decoration
、text-shadow
、letter-spacing
、word-spacing
、white-space
、line-height
等;
颜色相关
color:文本颜色
、background-color:元素背景色
等;
其他属性
visibility
、cursor
等;
对于其他默认不继承的属性也可以通过以下几个属性值来控制继承行为:
inherit
:继承父元素对应属性的计算值;initial
:应用该属性的默认值,比如 color 的默认值是#000
;unset
:如果属性是默认可以继承的,则取inherit
的效果,否则同initial
;revert
:效果等同于unset
,兼容性差。
word-spacing、white-space、word-berak、word-wrap
word-spacing
word-spacing
指的是字符“空格”的间隙。如果一段文字中没有空格,则该属性无效。如果word-spacing
值设为100px
。那么空格现在占据的宽度是原有的空格宽度+100px
的宽度。
white-space
我们都知道如果在html
中输入多个空白符,默认会被当成一个空白符处理,实际上就是white-space
控制的。
normal
:默认处理方式。不保留文字最前面的空格,其它空格做一个空格处理。空间不够的时候会换行。nowrap
:不保留文字最前面的空格,其它空格做一个空格处理。空间不够的时候不换行。pre
:保留文字的格式并且空间不够的时候不会换行。pre-wrap
:保留文字的格式但是空间不够的时候会换行。pre-line
:不保留文字最前面的空格,其它空格做一个空格处理。空间不够的时候会换行。
word-break
word-break
顾名思义这个属性控制单词如何被拆分换行的。
normal
使用浏览器默认的换行规则。break-all
所有单词或中文句子碰到边界一律拆分换行keep-all
所有单词或中文句子一律不拆分换行
word-wrap
word-wrap
这个属性也是控制单词如何被拆分换行的 作为word-break
的互补
normal
使用浏览器默认的换行规则。。break-word
一个汉字(一个单词)如果长了会换行。
.s1 {
word-spacing: 100px;
}
.p1 {
white-space: normal;
}
.p2 {
white-space: nowrap;
}
.p3 {
white-space: pre;
}
.p4 {
white-space: pre-wrap;
}
.p5 {
white-space:pre-line;
}
.div1 {
word-break: normal;
background-color: lightpink;
}
.div2 {
word-break: break-all;
background-color: lightblue;
}
.div3 {
word-break:keep-all;
background-color: lightgreen;
}
.w1 {
word-wrap: normal;
background-color: lightblue;
}
.w2 {
word-wrap: break-word;
background-color: lightpink;
}
<h3>word-spacing</h3>
<div class="s1">
我是谁我是谁我是谁我是谁我是谁我是谁 我是randy
</div>
<h3>white-space</h3>
<div class="p1">
normal:默认处理方式。 不保留文字最前面的空格, 其它空格做一个空格处理。 空间不够的时候会换行。
</div>
<div class="p2"> nowrap:不保留文字最前面的空格, 其它空格做一个空格处理。 空间不够的时候不换行。</div>
<div class="p3">
pre:保留文字的格式并且空间 不够的时候不会换行。
</div>
<div class="p4"> pre-wrap:保留文字的格式但是空间 不够的时候会换行。</div>
<div class="p5"> pre-line: 不保留文字最前面的空格, 其它空格做一个空格处理。 空间不够的时候会换行。</div>
<h3>word-break</h3>
<div class="div1">word-break: normal;我是谁我是谁我是谁我是谁我是谁我是谁我是谁我是谁randyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandy</div>
<div class="div2">word-break: break-all;我是谁我是谁我是谁我是谁我是谁我是谁我是谁我是谁randyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandy</div>
<div class="div3">keepall我是谁我是谁我是谁我是谁我是谁我是谁我是谁我是谁randyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandy</div>
<h3>word-wrap</h3>
<p class="w1">word-wrap: normal;我是谁我是谁我是谁我是谁我是谁我是谁我是谁我是谁randyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandy</p>
<p class="w2">word-wrap: break-word;我是谁我是谁我是谁我是谁我是谁我是谁我是谁randyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandyrandy</p>
样式效果如下
这里重点区分下word-wrap
和word-break
,word-wrap: break-word;
的情况下长单词会另外新起一行,并且超出范围后换行。word-break: break-all
的情况下长单词不会另外新起一行,并且超出范围后换行,因此更加严格。
css 有哪些方法?
calc
(这里面可以进行+-*/
运算)。attr()
获取某个属性的值。min(x, y, z)
取最小值。max(x, y, z)
取最大值。
a::after {
content: attr(href);
}
css变量
不使用css
预处理器的情况下我们也能使用css
变量。使用--变量名
定义变量。使用var(变量名)
使用变量。
全局变量
在:root
里面定义的是全局变量。
/* 全局变量 */
:root {
--main-bg-color: blue;
}
.a {
color: var(--main-bg-color);
}
局部变量
.a {
/* 写在类里面的是局部变量 */
--color: red;
color: var(--color);
}
.b {
/* 使用 第一个参数为自定义属性名,第一个参数找不到的时候会使用第二个参数值*/
color: var(--main-bg-color, red);
}
参考文章
后记
感谢小伙伴们的耐心观看,本文为笔者个人学习笔记,如有谬误,还请告知,万分感谢!
关于必须掌握的css
知识点的骚操作笔者将持续更新,如果本文对你有所帮助,还请点个关注点个赞~,您的支持是笔者不断更新的动力!