BFC
官方解释:它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。当涉及到可视化布局的时候,BFC提供了一个环境,HTML元素在这个环境中按照一定规则进行布局。
目的:形成一个完整独立的空间,让空间中的子元素不会影响到外部的布局。(外面的元素不会影响到里面的元素,里面的元素也不会影响到外面的元素。)
创建BFC:
- float:left/right
- position:absolute/fixed
- block:line-block/flex/table-cell
- overflow:auto/hidden/scroll
解决问题:
浮动元素高度坍塌问题
清除浮动
布局自适应问题
一般为左侧固定,右侧自适应。
利用块级元素尽可能的沾满一行的特性。右边的宽度可以随着页面宽度的变化而变化。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BFC</title>
<style>
.out {
height: 300px;
}
.left {
height: 100%;
width: 200px;
background-color: #c5d2ff;
float: left;
}
.right {
height: 100%;
background-color: #ff8784;
overflow: hidden;
}
</style>
</head>
<body>
<div class="out">
<div class="left"></div>
<div class="right">lyz</div>
</div>
</body>
</html>
其他方法实现自适应
- 左侧浮动 右侧margin-left
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>左侧浮动 右侧margin-left</title>
<style>
.out {
height: 300px;
}
.left {
height: 100%;
float: left;
width: 200px;
background-color: #ff8784;
}
.right {
height: 100%;
margin-left: 200px;
background-color: #859cff;
}
</style>
</head>
<body>
<div class="out">
<div class="left"></div>
<div class="right">lyz</div>
</div>
</body>
</html>
- 左侧绝对定位 右侧margin-left
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>左侧绝对定位 右侧margin-left</title>
<style>
* {
padding: 0;
margin: 0;
}
.out {
height: 300px;
}
.left {
height: 300px;
width: 200px;
background-color: #ff8784;
position: absolute;
top: 0;
left: 0;
bottom: 0;
}
.right {
height: 100%;
margin-left: 200px;
background-color: #859cff;
}
</style>
</head>
<body>
<div class="out">
<div class="left"></div>
<div class="right">lyz</div>
</div>
</body>
</html>
- 右侧顶线和右边为0 left为200
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>右侧元素设置顶线和右侧位置为0 左线位置为200px</title>
<style>
* {
padding: 0;
margin: 0;
}
.out {
height: 300px;
}
.left {
height: 100%;
width: 200px;
background-color: #ff8784;
}
.right {
/*width: 100%;*/
height: 300px;
background-color: #859cff;
position: absolute;
right: 0;
top: 0;
left: 200px;
}
</style>
</head>
<body>
<div class="out">
<div class="left"></div>
<div class="right">lyz</div>
</div>
</body>
</html>
- flex
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flex</title>
<style>
.out {
height: 300px;
display: flex;
}
.left {
height: 100%;
width: 200px;
background-color: #c5d2ff;
}
.right {
flex: 1;
height: 100%;
background-color: #ff8784;
}
</style>
</head>
<body>
<div class="out">
<div class="left"></div>
<div class="right">lyz</div>
</div>
</body>
</html>
解决外边距(margin)垂直方向重合的问题
兄弟元素在垂直外边距取得是绝对值最大值而不是和
通过触发BFC来防止他们之间的相互影响。
例如:为其中一个元素外面包裹父元素,设置overflow:hidden
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.fa {
overflow: hidden;
}
.bfc {
width: 100px;
height: 100px;
background-color: #ff8784;
}
.bfc:nth-child(1) {
margin-bottom: 10px;
}
.bfc:nth-child(2) {
margin-top: 10px;
}
</style>
</head>
<body>
<div class="fa">
<div class="bfc"></div>
</div>
<div class="bfc"></div>
</body>
</html>
另一种:用padding代替margin,简单易懂但是本身就需要设计padding,就不能使用来。
DIV水平垂直居中
- 定位
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.two {
width: 300px;
height: 300px;
background-color: #ff8784;
/*必须有盒子的父元素的宽高 但是无需考虑*/
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
</style>
</head>
<body>
<div class="one">
<div class="two"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.two {
width: 300px;
height: 300px;
background-color: #ff8784;
position: absolute;
left: 50%;
top: 50%;
/*必须知道宽高 一下为宽高的一半值*/
margin-left: -150px;
margin-top: -150px;
}
</style>
</head>
<body>
<div class="one">
<div class="two"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.two {
width: 300px;
height: 300px;
background-color: #ff8784;
/*不需要具体宽高 内容撑开即可*/
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
</style>
</head>
<body>
<div class="one">
<div class="two">xx</div>
</div>
</body>
</html>
- display:flex
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.one {
width: 600px;
height: 600px;
background-color: #e74f2c;
display: flex;
justify-content: center;
align-items: center;
}
.two {
width: 300px;
height: 300px;
background-color: #ff8784;
}
</style>
</head>
<body>
<div class="one">
<div class="two"></div>
</div>
</body>
</html>
- display:table-cell
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
/*父级必须有固定宽高*/
.one {
width: 600px;
height: 600px;
background-color: #e74f2c;
display: flex;
justify-content: center;
align-items: center;
}
.two {
width: 300px;
height: 300px;
background-color: #ff8784;
display: table-cell;
vertical-align: center;
text-align: center;
}
</style>
</head>
<body>
<div class="one">
<div class="two"></div>
</div>
</body>
</html>
display/visibility/opacity区别
display:
- DOM结构:浏览器不会渲染dispaly:none的元素 不占据空间
- 事件监听:无法进行DOM事件监听
- 性能:动态改变此属性会重排,性能差。
- 继承:不能继承
- transition:不支持
visibility:
-
DOM结构:元素隐藏 但是会渲染 占据空间
-
事件监听:无法进行DOM事件监听
-
性能:动态改变会引起重绘,性能较高。
-
继承:可以继承,子元素visibility:visible时则会显示。
-
transition:立即显示,隐藏会延时。
-
opacity:
-
DOM结构:元素透明度为0 元素隐藏 占据空间
-
事件监听:可以进行DOM事件监听
-
性能:提升为合成层,不会触发重绘,性能较高。
-
继承:可以继承,但子元素不能设置opacity:1来取消隐藏
-
transition:可以延时显示和隐藏
响应式布局方式
- madia 媒体查询
- 百分比
- rem 相对html元素的字体大小
- vh/vw
- flex
px和em的区别
px是固定长度单位
em不固定,根据父元素字体大小决定。
rgba和opacity区别
opacity作用与元素以及元素所包含的内容
rgba只是作用域元素的颜色或背景颜色(不会继承)
如何实现小于12px的字体大小
transform: scale();
但是相应的容器也会变小