css常见问题
BFC
BFC (block formatting context) 及块级格式化上下文,从样式上看,具有 BFC 的元素与普通的容器没有什么区别,从功能上看,BFC 相当于构建了一个密闭的盒子模型,在 BFC 中的元素不受外部元素的影响。
创建 BFC 的场景:
- 根元素或其它包含它的元素 (也就是 html 元素本身就是 BFC)
- float:left , right
- position:absolute,fixed
- display:inline-block,table-cell,table-caption;(行内块元素与表格元素)
- overflow:hidden,auto,scroll (非 visible 属性)
- display: flow-root (该元素生成一个块级元素盒,其会建立一个新的区块格式化上下文,定义格式化上下文的根元素)
BFC 的作用:
- 清除浮动,解决浮动元素高度塌陷的问题
- 解决浮动元素重叠的问题
- 解决边据重叠问题
- 父子元素边距重叠
- 兄弟元素边据重叠
水平垂直居中
/* case1 绝对定位 + margin偏移 */
.container {
position: relative;
}
.center {
width: 200px;
height: 200px;
position: absolute;
top: 50%;
left: 50%;
margin-top: -100px;
margin-left: -100px;
}
/* case2 当被居中的元素是inline或者inline-block元素 */
.container {
display: table-cell;
text-align: center;
vertical-align: middle;
}
.center {
}
/* case3 绝对定位 + transform偏移 */
.container {
position: relative;
}
.center {
width: 200px;
height: 200px;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%); /* 这个方法更常用,自 身的宽高可以是未知的 */
}
/* case4 使用 transform */
.container {
position: relative;
}
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
/* case5 使用flex */
.container {
display: flex;
justify-content: center;
align-items: center;
}
.center {
}
/* case6 使用grid */
/* place-items 属性。用于同时设置 justify-items 和 align-items。 */
.container {
display: grid;
place-items: center; /* 水平和垂直居中 */
}
/* 使用 align-items 和 justify-items */
.container {
display: grid;
justify-items: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
/* 使用 grid-template-rows 和 grid-template-columns */
.container {
display: grid;
grid-template-rows: 1fr; /* 占据剩余空间 */
grid-template-columns: 1fr; /* 占据剩余空间 */
}
.child {
margin: auto; /* 自动边距使子元素居中 */
}
/* 使用 grid-template-areas */
.container {
display: grid;
grid-template-areas: "center";
justify-content: center; /* 水平居中 */
align-content: center; /* 垂直居中 */
}
.center {
grid-area: center;
}
清除浮动
/* 父级div定义 伪类:after */
<style>
.float {
float: left;
}
/*清除浮动代码*/
.clearfix:after {
content: "";
display: block;
clear: both;
}
</style>
<div class="clearfix">
<div class="float">
</div>
</div>
隐藏元素的方式及区别
有多种方法可以隐藏元素的 CSS。
display: none;:将元素完全隐藏,不占据任何空间。
visibility: hidden;:将元素隐藏,但仍占据空间。
opacity: 0;:将元素透明化,但仍占据空间。
position: absolute; left: -9999px;:将元素定位到屏幕外部,不显示在可见区域。
height: 0; width: 0; overflow: hidden;:将元素高度和宽度设为0,同时隐藏溢出内容。
clip-path: polygon(0 0, 0 0, 0 0);:使用剪切路径将元素隐 藏。
display: none;
、visibility: hidden;
和 opacity: 0
都可以使元素不可见。
核心点在于 display: none
的 DOM
元素在布局阶段中会被擦除(即布局树上不存在对应节点)。
区别:
结构上:
display: none
:布局树中不存在对应节点,因此不占布局空间,而且不能点击。
visibility: hidden
:布局树中存在对应节点,因此占据布局空间,但是不能点击。
opacity: 0
:布局树中存在对应节点,因此占空间,而且能响应点击事件。
继承上:
display: none
:作用于父元素后,子元素也不会被渲染(即使给子元素加了 display: block)
visibility: hidden
:作用于父元素后,子元素继承这个属性,也不可见;不过可以给子元素设置 visibility: visible 使其可见。
opacity: 0
:作用于父元素后,虽然子元素不会继承这个属性,但是子元素的透明度也会被影响,所以也不可见;而且不能通过给子元素设置 opacity: 1 使其变成不透明。
性能上:
display: none
:会造成回流/重绘,性能影响大
visibility: hidden
:会造成元素内部的重绘,性能影响相对小
opacity: 0
:由于 opacity 属性启用了 GPU 加速,性能最好
使用场景:
opacity: 0
:适用于需要实现淡出效果的场景,比如弹出层的显示和隐藏。
visibility: hidden
:适用于需要占据原来空间的元素,但不需要显示的场景,比如菜单的展开和收起。
display: none
:适用于需要完全隐藏元素的场景,比如实现一个开关,点击开关后可以隐藏或者显示某个元素。
其他:
读屏器不会读取display: none;
元素内容;会读取visibility: hidden;
元素内容
opacity
是不继承属性,父元素设置opacity
,子元素并不会继承。但是因为该属性的特殊性(类似background
),父元素有了透明度,子元素的样式也会被影响。如果父元素设置opacity: 0.5
,子元素设置opacity: 0.5
,那么实际上子元素的透明度是0.5 \* 0.5 = 0.25
。
如果希望子元素不被父元素的透明度影响,我们可以使用
background: rgba
代替opacity: 0