负margin在布局中的运用(*****************************************************************)
Posted 最骚的就是你
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了负margin在布局中的运用(*****************************************************************)相关的知识,希望对你有一定的参考价值。
一、左右栏宽度固定,中间栏宽度自适应
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>左右栏宽度固定,中间栏宽度自适应</title> <style> body{ margin: 0; padding: 0; min-width:600px; color: #fff; font-weight: bold; font-size: 30px; text-align: center; } .main{ width: 100%; float:left; } .content{ margin:0 250px; background: #000; height: 200px; } .fl,.fr{ float: left; width:240px; height:200px; } .fl{ margin-left: -100%; background: red; } .fr{ margin-left: -240px; background: green; } </style> </head> <body> <div class="main"> <div class="content">main</div> </div> <div class="fl">left</div> <div class="fr">right</div> </body> </html>
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style type="text/css"> *{ padding: 0px; margin: 0px; } #left { float: left; background-color: red; width: 150px; height: 50px; } #right { float: right; background-color: yellow; width: 200px; height: 50px; } #middle { margin: 0 200px 0 150px; width: 100%; background-color: #fff9ca; height: 50px; } </style> </head> <body> <div id="left"><span>left</span></div> <div id="right"><span>right</span></div> <div id="middle"><span>middle</span></div> </body> </html>
今天想说的是一个左右定宽,中间自适应,实现三列布局,我也总结了以下,主要有以下几种: 废话不多说,直接上代码: 第一种:float <!--html--> <div id="left"><span>left</span></div> <div id="right"><span>right</span></div> <div id="middle"><span>middle</span></div> //css #left{ float: left; background-color: red; width: 150px; height: 50px; } #right { float: right; background-color: yellow; width: 200px; height: 50px; } #middle { margin: 0 200px 0 150px; width: 100%; background-color: #fff9ca; height: 50px; } 第二种:BFC <!--html--> <div id="left"><span>left</span></div> <div id="right"><span>right</span></div> <div id="middle"><span>middle</span></div> //css #left { background-color: red; width: 150px; height: 50px; float: left; } #right { background-color: yellow; width: 200px; height: 50px; float: right; } #middle { background-color: #fff9ca; height: 50px; overflow: hidden; } 第三种:双飞翼布局 <!--html--> <div class="grid"> <div id="middle"> <div id="middle-span"><span>middle</span></div> </div> <div id="left"><span>left</span></div> <div id="right"><span>right</span></div> </div> //css #middle { float: left; background-color: #fff9ca; width: 100%; height: 50px; } #middle-span { margin: 0 200px 0 150px; } #left { float: left; position: relative; background-color: red; width: 150px; margin-left: -100%; height: 50px; } #right { float: left; position: relative; background-color: yellow; width: 200px; margin-left: -200px; height: 50px; } 第四种:flex <!--html--> <div class="flex"> <div id="left"><span>left</span></div> <div id="middle"><span>middle</span></div> <div id="right"><span>right</span></div> </div> //css .flex { display: flex; flex-flow: row; } #left { background-color: red; width: 150px; height: 50px; } #middle { background-color: #fff9ca; flex: 1; /* flex中宽度自适应使用该属性,使用100%时其他列的固定宽度会出现问题*/ height: 50px; } #right { background-color: yellow; width: 200px; height: 50px; }
缩小窗口的效果:
二、除去列表右边框
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>除去列表右边框</title> <style> *{margin:0;padding: 0;} body{background: #000000} ul,li{list-style: none;} #content{ width:630px; height:400px; background: #ccc; margin:30px auto; } #content ul{margin-right:-10px;} #content ul li{ float: left; width:150px; height:195px; margin-right: 10px; margin-bottom: 10px; background: #e4004e; color:#fff; font-weight:bold; } </style> </head> <body> <div id="content"> <ul> <li>除去列表右边框</li> <li>除去列表右边框</li> <li>除去列表右边框</li> <li>除去列表右边框</li> <li>除去列表右边框</li> <li>除去列表右边框</li> <li>除去列表右边框</li> <li>除去列表右边框</li> </ul> </div> </body> </html>
效果:
三、除去列表最后一个li的底边框(border-bottom)
容器有边框,容器中的列表也有底边框(border-bottom),导致最后一个li的border-bottom与容器的外边框重叠,分类列表中通常会遇到这个情况;
如图:
例:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>除去列表最后一个li的底边框</title> <style> *{padding: 0;margin:0;} ul,li{list-style: none;} #category{ margin:30px auto; width:350px; background: #eee; border: 1px solid #ccc; overflow: hidden;/*将超出的部分隐藏,最后一个li的border-bottom超出,被隐藏了;*/ } #category li{ width:100%; height:49px; line-height:49px; text-indent: 30px; border-bottom: 1px dashed #e4007e; margin-bottom: -1px; } </style> </head> <body> <ul id="category"> <li>女装 /内衣</li> <li>男装 /运动户外</li> <li>女鞋 /男鞋 /箱包</li> <li>化妆品 /个人护理</li> <li> 腕表 /珠宝饰品 /眼镜</li> <li>零食 /进口食品 /茶酒</li> <li>生鲜水果</li> <li>大家电 /生活电器</li> </ul> </body> </html>
效果:
注意:当容器边框颜色和容器中列表边框的颜色不一样时,在容器元素上要添加overflow:hidden;将溢出部分隐藏起来;
四、水平垂直居中
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style type="text/css"> #box { margin: 30px auto; position: relative; width: 400px; height: 300px; background: #000000; text-align: center; } #box .main { background: #ccc; width: 200px; height: 200px; position: absolute; top: 50%; left: 50%; margin-left: -100px; margin-top: -100px; } </style> </head> <body> <div id="box"> <div class="main">margin负值,垂直居中</div> </div> </body> </html>
五、多列等高
给每个框设置大的底部内边距,然后再设置相同数值的负外边距来消除这个高度,致使每列都会溢出容器,对容器设置:overflow:hidden;多列框将在最高点裁切
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style type="text/css"> body,p { margin: 0; padding: 0; } #container { width: 500px; margin: 10px auto; overflow: hidden; position: relative; } #box1, #box2, #box3 { margin-bottom: -200px; padding-bottom: 200px; } #box1 { float: left; background: red; width: 150px } #box2 { float: left; background: #000; width: 200px } #box3 { float: left; background: green; width: 150px } p { color: #fff; text-align: center; } </style> </head> <body> <div id="container"> <div id="box1"> <p style="height:50px"> 第一部分高:50px </p> </div> <div id="box2"> <p style="height:100px"> 第二部分高:100px </p> </div> <div id="box3"> <p style="height:200px"> 第三部分高:200px </p> </div> </div> </body> </html>
深入理解css中的margin属性
之前我一直认为margin属性是一个非常简单的属性,但是最近做项目时遇到了一些问题,才发现margin属性还是有一些“坑”的,下面我会介绍margin的基本知识以及那些“坑”。这篇博文主要分为以下几个部分:
第一部分:margin--基础知识
要介绍margin的基础知识,我们不可回避地要谈到css盒子模型(Box Model),一般而言,css盒子模型是用来设计和布局的。它本质上是一个盒子,包括:外边距(margin)、边框(border)、内边距(padding)以及最中间的内容(content)。下图即为盒子模型(这里只谈W3C规范的标准盒模型,而不谈IE5和IE6在怪异模式中使用的非标准的盒子模型):
我们要介绍的margin在最外层,因为margin(外边距)一定是透明的,所以它可以用来使得不同的盒子之间留有一定的间隙从而达到布局美观等效果。从上面的盒子模型中我们可以看到,margin在四周均存在,我们可以使用margin-top、margin-right、margin-bottom、margin-left分别设置这四个方向的margin值。(注:由于这部分知识较为基础,所以我不再在这部分不做更多介绍)
第二部分:margin--在同级元素(非父子关系)之间应用
这一部分主要介绍水平方向和竖直方向的外边距的合并问题。
(1)水平方向的外边距合并
两个水平方向的盒子相遇,那么最终两者之间的距离为左边盒子的右外边距和右边盒子的做外边距之和。
例1:
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >水平方向的两个盒子</ title > < style > *{ margin:0; padding:0; border:0; } body{ font-size: 0; } .left{ width: 100px; height: 100px; background: red; display: inline-block; margin-right: 50px; font-size: 20px; } .right{ width: 100px; height: 100px; background: yellow; display: inline-block; margin-left: 50px; font-size: 20px; } </ style > </ head > < body > < div class="left">宽为100px,右边距为50px</ div > < div class="right">宽为100px,左边距为50px</ div > </ body > </ html > |
效果如下:
这时两者之间的距离刚好为100px。
补充说明:大家可以看到,为了使得两个div(块状元素)脱离正常的文档流我使用了display:inline-block;属性,另外,我还把body的font-size设置为0,这样可以解决inline-block自身的问题(如果不清楚这里的描述可以看我的博文《理解与应用css中的display属性》,这篇文章介绍了inline-block存在的问题),否则两个div的举例会大于100px。当然使用float也可以使得两个div出现在同一行中。
(2)竖直方向的外边距合并
两个竖直方向的盒子相遇时,其竖直方向的距离等于上方盒子的下外边距和下方盒子的上外边距中较大的一个。
例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >水平方向的两个盒子</ title > < style > *{ margin:0; padding:0; border:0; } .top{ width: 100px; height: 100px; margin-bottom: 100px; background: red; } .bottom{ width: 100px; height: 100px; margin-top: 50px; background: green; } </ style > </ head > < body > < div class="top">高为100px,下边距为100px</ div > < div class="bottom">高为100px,上边距为50px</ div > </ body > </ html > |
效果如下:
这时我们肉眼都可以观察出来,两者竖直方向的举例大约为100px(实际就是100px)而非100+50=150px;这正是因为两个竖直方向的盒子相遇时,其竖直方向的距离等于上方盒子的下外边距和下方盒子的上外边距中较大的一个。
另外一个有趣的例子就是:假设有一个元素同时设置了margin-top和margin-bottom,但是内容为空,那么这两个margin值也会叠加,值为两者最大的一个,它类似与竖直方向上两个盒子margin值的叠加。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >水平方向的两个盒子</ title > < style > *{ margin:0; padding:0; } .top{ width: 500px; height: 100px; background: red; } .middle{ margin-top: 100px; margin-bottom:50px; } .footer{ width: 500px; height: 100px; background: green; } </ style > </ head > < body > < div class="top">上面的div,高100px</ div > < div class="middle"></ div > < div class="footer">下面的div,高100px</ div > </ body > </ html > |
最终的效果如下:
我们发现这时在上面的div和在下面的div之间的举例并不是100+50=150px,而是两者中的最大者,即100px。
那么W3C为什么会设定这样的标准而不设定和水平方向一样的标准呢?即margin值的叠加,实际上这也是有一定的道理的。比如我们需要设计一个由若干个段落构成的一个页面。我们需要设置margin-top和margin-bottom使得第一段和页面的最上方有一段距离,使得最后一段和最下方有一段距离。下面是不叠加和叠加的效果图:
我们可以看到左边的页面没有重叠,那么两个段落之间的举例就是最上方的两倍间距了,而右边的页面发生了重叠,则所有的间距都是相等的。或许这就是这样设定标准的目的吧,谁知道呢?
第三部分:margin--在父元素和子元素之间应用(重点)
第二部分介绍了同级元素之间使用margin,而这一部分将要介绍最有意思的父元素和子元素之间margin的应用。这一部分,我们同样从两个方面来讨论。一方面是子元素设置水平方向上的margin值,另一方面是子元素设置竖直方向的margin值。
(1)在子元素中设置水平方向的margin值
我们可以设置margin-left来控制子元素的左边框和父元素的左边框之间的举例。
例3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >margin</ title > < style > *{padding:0; margin:0; border:0;} .father{ width: 500px; height: 500px; background: red; } .son{ width: 100px; height: 100px; background: green; margin-left: 100px; } </ style > </ head > < body > < div class="father"> < div class="son">宽度为100px,margin-left为100px。</ div > </ div > </ body > </ html > |
我将子元素的margin-left设置为了100px;效果如下:
即子元素的左边框和父元素的左边框之间的距离为100px。与在同级元素之间设置margin不同,因为同级元素之间的margin不会考虑到padding,但是在父元素和子元素就不同了,那么如果父元素中如果有padding,效果会是什么样的呢?请看下面一个例子:
例4:
下面我们在上面例子的基础上给父元素添加padding值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >margin</ title > < style > *{padding:0; margin:0; border:0;} .father{ width: 500px; height: 500px; padding:100px; background: red; } .son{ width: 100px; height: 100px; background: green; margin-left: 100px; } </ style > </ head > < body > < div class="father"> < div class="son">宽度为100px,margin-left为100px。</ div > </ div > </ body > </ html > |
上面的代码给父元素添加了100px的padding值,效果如下:
我们可以看到子元素举例上方的距离为100px,因为子元素一定是在父元素的content的部分的,这点毫无疑问。
但是经过测量可以发现子元素的左边框距离父元素的左边框之间的距离为200px,因为其中还有100px的左padding值,前面的例子因为我没有设置padding值,所以没有观察出来,因此这就说明了在子元素中设置margin-left,其值实际上是子元素的左边框距离父元素左padding内侧的距离。
例5:margin-right的使用和margin-left的使用是相似的,我在这里只举一个例子。
这个例子在子元素中设置了margin-right值,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >margin</ title > < style > *{padding:0; margin:0; border:0;} .father{ width: 500px; height: 500px; padding:100px; background: red; } .son{ float: right; width: 100px; height: 100px; background: green; margin-right: 100px; 负值之美:负margin在页面布局中的应用
|