本文为阅读大佬张果的文章所作的摘抄,阅读原文请看这里~
一、边距折叠的计算方法
a) 参加折叠的margin都是正值:取其中 margin 较大的值为最终 margin 值。
b) 参与折叠的 margin 都是负值:取的是其中绝对值较大的,然后,从 0 位置,负向位移。
c) 参与折叠的 margin 中有正值,有负值:先取出负 margin 中绝对值中最大的,然后,和正 margin 值中最大的 margin 相加。
二、负边距向上移动的特性
当多个元素同时从标准流中脱离开来时,如果前一个元素的宽度为100%宽度,后面的元素通过负边距可以实现上移。当负的边距超过自身的宽度将上移,只要没有超过自身宽度就不会上移,示例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>负边距</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#div1 {
height: 100px;
background: lightblue;
width: 100%;
float: left;
}
#div2 {
height: 100px;
background: lightgreen;
width: 30%;
float: left;
margin-left: -100%;
}
</style>
</head>
<body>
<div id="div1">div1
</div>
<div id="div2">div2
</div>
</body>
</html>
margin-left:-29%时运行效果:
margin-left:-30%时运行效果:
margin-left:-100%时运行效果:
三、边距折叠和负边距的应用
(1)开发中常需要在页面中展示一些列表,如商品展示列表等,如果我们要实现如下布局:
示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>负边距</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#div1 {
width: 800px;
margin: 0 auto;
border: 3px solid lightblue;
overflow: hidden;
margin-top: 10px;
}
.box {
width: 180px;
height: 180px;
margin: 0 20px 20px 0;
background: lightgreen;
float: left;
}
</style>
</head>
<body>
<div id="div1">
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
</div>
</body>
</html>
但是这段代码运行出来的结果为:
可以看到右边和下边都多了20px的间距,怎么办呢?
解决方法:
1.利用边距折叠
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>负边距</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#div1 {
width: 780px;
height: 380px;
margin: 0 auto;
border: 3px solid lightblue;
overflow: hidden;
margin-top: 10px;
}
.box {
width: 180px;
height: 180px;
margin: 0 20px 20px 0;
background: lightgreen;
float: left;
}
#div2{
margin-right: -20px;
}
</style>
</head>
<body>
<div id="div1">
<div id="div2">
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
</div>
</div>
</body>
</html>
原理如图:
2.也是利用边距折叠
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>负边距</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#div1 {
width: 780px;
margin: 0 auto;
border: 3px solid lightblue;
overflow: hidden;
margin-top: 10px;
}
#div2{
margin-right: -20px;
margin-bottom: -20px;
overflow: auto;
}
.box {
width: 180px;
height: 180px;
margin: 0 20px 20px 0;
background: lightgreen;
float: left;
}
</style>
</head>
<body>
<div id="div1">
<div id="div2">
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
<div class="box">
</div>
</div>
</div>
</body>
</html>
这两种方法的运行结果均如下图:
(2)去除列表最后一个li元素的border-bottom
解决方法:
给最后一个元素添加margin-bottom:-1px
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
ul {
margin: 0 auto;
margin-top: 20px;
width: 260px;
border: 2px solid #1FC195;
list-style: none;
overflow:hidden;/*防止border-bottom颜色和ul的border-bottom不一样溢出不美观*/
}
ul li {
height: 30px;
line-height: 30px;
border-bottom: 1px dashed #1FC195;
font-size: 14px;
padding-left: 5px;
}
ul li:last-child {
margin-bottom: -1px;
}
</style>
</head>
<body>
<ul>
<li>新闻列表新闻列表新闻列表</li>
<li>新闻列表新闻列表新闻列表</li>
<li>新闻列表新闻列表新闻列表</li>
<li>新闻列表新闻列表新闻列表</li>
<li>新闻列表新闻列表新闻列表</li>
<li>新闻列表新闻列表新闻列表</li>
<li>新闻列表新闻列表新闻列表</li>
</ul>
</body>
</html>
运行结果如图: