刚刚开始学习css的时候,我采用了float为主来实现布局的方式,但是运用浮动很长一段时间之后,我发现这是一种被人牵着鼻子走的做法。至少,页面上不应过多的运用浮动,尤其是不要拿来确定整个布局。
很简单的道理,当你用了float:left,后面的div很可能需要跟着用float:left,而且当宽度不够的时候,本来该和上一个div一个水平线上的div跑到下面去了,如果某个div有margin属性,还会遇到ie6那个烦人的bug。而且浮动之后,你还必须在合适的地方使用清除浮动。
在网上看到了一篇讲负margin的文章,仔细研究之后,觉得很实用。我将那篇文章的内容提炼出来,原文写的很好,但是需要花很长的时间去阅读。
为了形象、易懂的解释负margin,我们将引入W3C上没有的参考线的说法。何谓参考线?参考线就是 margin移动的基准点,此基准点相对于box(自身)是静止的。而margin的数值,就是box相对于参考线的位移量。
一个完整的margin属性是这么写的margin: top right bottom left;(eg: margin:10px 20px 30px 40px)。在margin属性中一共有两类参考线,top和left的参考线属于一类,right和bottom的参考线属于另一类。top和left是以外元素为参考,right和bottom是以元素本身为参考。margin的位移方向是指margin数值为正值时候的情形,如果是负值则位移方向相反。
先看看一个完整的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" />
<title>Margin参考线举例说明</title> <style type= "text/css" >
*{margin:0; padding:0;} .wrap{width:400px; border:5px solid #aaa;}
.example{width:200px; height:200px; background: #CCCCFF;}
.normal{width:200px; height:200px; background: #CCE8CF;}
.example{margin:-10px 20px -30px 40px;} </style> </head> <body> <div class= "wrap" >
<div class= "example" >example元素:margin参考线举例说明文字,请查看此元素由于margin的变化所移动的位移量。</div>
<div class= "normal" >一个普通的Box</div>
</div> </body> </html> |
来分析这段代码,example元素下方有一相邻元素normal(注:这里分析的是添加和删除margin后的example元素,normal元素仅作为example元素前后效果的参照)。
根据上文的参考线原理margin:-10px(top) 20px(right) -30px(bottom) 40px(left); 上-10px和左40px将以外元素为参考,所谓外元素就是本元素的边界元素(再白话点的解释就是元素的紧邻元素,这里涉及到containing block知识,可自行网上搜索)。example元素上边和左边的边界元素即为wrap父元素,wrap父元素为基准点,example的margin-top为-10px,想象下如果这里margin-top为+10px会什么情况,没错如果为+10px,example元素相对于wrap父元素边缘为基准,那么example元素会同wrap父元素10px产生间隙边距,那么反过来,margin-tip:-10px;还是与wrap父元素边缘为基准,反过来向上推10px的距离位置。example元素的margin-left为40px,这里就按照正常逻辑相隔40px边距,同理如果为-40px,那么就是反方向向左推进40px的距离位置。
再来看example元素的margin-right和margin-bottom,由上文得知这俩个值是以元素本身为参考。什么叫以元素本身为参考呢,确切含义是指以自身为参考来影响周围元素的位置(实质即为影响下边和右边相邻元素的参考线)。这里的margin-bottom为-30px,对于其自身位置没有任何变化,但是对于其下方元素normal元素产生了极大的影响,因为normal元素的上边界元素即为example元素,根据example元素边界来判定自身位置,想象下如果example元素margin-bottom为+30px,那么example元素将隔开下方的normal元素,反之为-30px,下方normal元素由于example参考线内凹,导致了normal元素自个儿身不由己的被“提”了上去了。这就是以自身为参考影响周围元素位置的含义。
当margin四个值都为正数值的话,那么margin按照正常逻辑同周围元素产生边距。当元素margin的top和left是负值时会引起元素的向上或向左位置移动。而当元素margin的bottom和right是负值时会影响右边和下边相邻元素的参考线。
接下来我们将利用两个例子深入讲解负margin技术的应用领域。
负margin在Tab选项卡中的应用:
最核心的就是下方俩行高亮部分代码,第二行的margin-bottom:-1px;使下方的正文部分向上“提”了1px的距离,从而达到了鼠标上移后选项卡白色遮住下方黑色边框的效果(注:由于IE不是符合W3C标准,所以当鼠标移到选项卡上时需要添加一个额外属性position:relative;来修复IE不覆盖下方边框的这个Bug)。第四行的margin-left:-1px;的目的是让四个选项卡向左移动1px的距离,达到左右都只有一条分割线的效果。
1
2
3
4
5
6
7
8
9
|
.demoTab{width:400px; font:14px/1.5 Microsoft YaHei,verdana,Helvetica,Arial,sans-serif;} .demoTab .demoTabHd{margin-bottom:-1px; border:1px solid #6C92AD; border-bottom:none; background:#EAF0FD;}
.demoTab .demoTabNav{height:28px; overflow:hidden; *zoom:1;} .demoTab .demoTabList{float:left; margin-left:-1px; padding:0 22px; line-height:28px; border-left:1px solid #6C92AD; border-right:1px solid #6C92AD; font-weight:bold; color:#005590; text-align:center; cursor:pointer;}
.demoTab .demoTabList.current{position:relative; background: #fff;}
.demoTab .demoTabBd{border:1px solid #6C92AD;}
.demoTab .demoTabBd .roundBox{padding:15px;} .demoTab .demoTabContent{display:none;} .demoTab .demoTabContent.current{display:block;} |
HTML代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<div id= "demoTab" class= "demoTab" >
<div class= "demoTabHd" >
<ul class= "demoTabNav clearfix" >
<li class= "demoTabList current" >前端</li>
<li class= "demoTabList" >实战</li>
<li class= "demoTabList" >交互</li>
<li class= "demoTabList" >优化</li>
</ul>
</div>
<div class= "demoTabBd" >
<div class= "roundBox" >
<div class= "demoTabContent current" >这是第一个选项卡的内容。</div>
<div class= "demoTabContent" >这是第二个选项卡的内容。</div>
<div class= "demoTabContent" >这是第三个选项卡的内容。</div>
<div class= "demoTabContent" >这是第四个选项卡的内容。</div>
</div>
</div>
</div> |
利用负margin制作自适应左右布局:
1
2
3
4
5
|
.demoLayout{width:500px; border:1px solid #aaa; background:#EEEEEE;}
.demoLayout .roundBox{padding:10px; min-height:170px; _height:170px;} .demoLayout .demoShowPic img{padding:1px; border:1px solid #DAA520;}
.demoText{margin:-170px 0 0 215px;} .demoLayoutBtn{margin:15px 0 0 0;} |
1
2
3
4
5
6
|
<div id= "demoLayout" class= "demoLayout" >
<div class= "roundBox" >
<div class= "demoShowPic" ><img width= "200" height= "166" src= "toygersKittens.jpg" alt= "toygers kittens" /></div>
<div class= "demoText" >利用负margin制作自适应左右布局</div>
</div>
</div> |
如上例这类布局效果(左边一个固定图片,右边为内容),负margin能够替代float浮动布局,进行左右布局规划,并且拥有float所没有的自适应效果。
根据上面的几个实例,相信你已经对负margin技术有了一个比较完整的理解。负margin不但可以做出一般CSS属性所不能达到的效果还能够化繁为简、化腐朽为神奇之奇效,当然负margin用到的地方不仅仅是这些,还有许多效果都是需要负margin技术来实现的,只要你耐心的去实践去探索,相信你会发现更多负margin用到得场合。
负边距(negative margin)实现自适应的div左右排版
我记得我写过一篇 css中的负margin技术以及运用 的文章,那是很久以前的事了,现在看来那篇文章讲了很多,但是始终没把握好重点,现在再通过这篇文章clear一下思路。
左右排版本来是可以这样实现的:两边都使用百分比,然后左右浮动。但是这样做满足不了下面这样的场景: 在一个文章页面里面,分为左边的正文区域和右边的与文章关联的其他信息区域,我想让正文区域能随着用户的显示屏宽度变化而变化,这似乎百分比就能做到,但是如果使用百分比,左右两边都必须有一个固定的比值,那样右边也会随着用户显示屏的宽度变化,如果用户的显示屏很宽,那这右边就显得似乎国语宽了,正文无论多款是无所谓的,但是侧边最好是一个固定值。
就像这种下图所示效果:
也就是说我需要一个左边自适应,而右边固定的左右布局,或者说某一边固定,另一边占据剩余部分,该如何做呢?
我找到的最好的答案是使用 负margin (配合浮动),下面概括一下原理:
使用负margin可以使当前的div左边能容纳下面的div浮动上来,因此把右边的div摆在前面,左边的摆后面,右边的使用负margin就能让左边的浮上来,这样就遮住了右边的左半部分,只要右边再内部使用一个div,外左边距为左边的宽度就实现了左右的排版。
1、左边固定,右边自适应
(1)右边使用margin-left值为200(刚好是左边的宽度)的宽度,那么左边就刚好能浮动上来。为什么说浮动上来呢,因为如果没有这个margin: 0 0 0 -200px;由于右边的宽度是100%,因此左边肯定是排在下面的。
(2)左边虽然能浮动上来,但是右边和左边的内容是有重叠的
所以你还需要绿色部分的代码,右边再内部使用一个div,外左边距为左边的宽度
<div>
<div style="float: right; margin: 0 0 0 -200px; width: 100%;">
<div style="margin: 0 0 0 200px; background: #e4e4e4;">
这是右边部分
</div>
</div>
<div style="float: left; width: 200px; background: #669999">
这是左边部分
</div>
</div>
这个产生的效果如下图:(图片区域宽度固定的,但是文字是占据这个div的剩余部分,这里右边没有紧贴边框是因为父div有较大padding的原因没能挤满,不要受误导)。
提示:真正在实现的时候好像没必要左边必须写在后面,我试过,即使按从左到右书写也是可以的,但是很多大型网站都是反着写,我就按正规的来讲了。
2、右边固定,左边自适应
跟上一个最大的不同点就是,左右两个div容器的代码的前后位置换了,原因就是"float:rihgt"一定要在"float:left"前面。
- <div>
- <div style="float: right; width: 200px; background: #669999">
- 这是右边部分
- </div>
- <div style="float: left; margin: 0 -200px 0 0; width: 100%;">
- <div style="margin: 0 200px 0 0; background: #e4e4e4;">
- 这是左边部分
- </div>
- </div>
- </div>
3、左右各占一定百分比,这就简单了,把上面任意一种将200px改成比例值20%就实现了。
- <div>
- <div style="float: right; margin: 0 0 0 -20%; width: 100%;">
- <div style="margin: 0 0 0 20%; background: #e4e4e4;">
- 这是右边部分
- </div>
- </div>
- <div style="float: left; width: 20%; background: #669999">
- 这是左边部分
- </div>
- </div>
4、再加一栏,实现左中右三栏布局。这只要再加一栏,float为right的多空一些位置就行了。这里以按比例为例
- <div>
- <div style="float: right; margin: 0 0 0 -40%; width: 100%;">
- <div style="margin: 0 0 0 40%; background: #e4e4e4;">
- 这是右边部分
- </div>
- </div>
- <div style="float: left; width: 20%; background: #669999">
- 这是左边部分
- </div>
- <div style="float: left; width: 20%; background: #663333">
- 这是中间部分
- </div>
- </div>
5、实现框架页的效果(左右可分别出现滚动条,页面无滚动条):只要左右div各加position: absolute; overflow: scroll; height: 100%;左边再加left: 200px;即实现了,这里用了绝对定位,因此float属性可以干掉了
- <div>
- <div style="margin: 0 0 0 -200px; width: 100%; position: absolute; overflow: scroll;
- height: 100%; left: 200px;">
- <div style="margin: 0 0 0 200px; background: #e4e4e4;">
- 这里是右边部分
- </div>
- </div>
- <div style="width: 200px; background: #669999; position: absolute; overflow: scroll;
- height: 100%;">
- 这是左边部分
- </div>
- </div>
相关推荐
此外,如果元素设置了 `min-/max-` 的尺寸限制,则无法应用负margin技术。而且,负margin可能会导致内容溢出容器,如果元素使用了padding,就需要在计算负margin值时额外加上这个padding值。 如果要使用CSS3的 `box...
标题中的“li自适应,栏目分割(负margin...总的来说,这个主题涵盖的是利用CSS技术实现li元素的自适应多列布局,通过负margin调整间距,以及考虑浏览器兼容性的问题,这些都是Web前端开发者日常工作中不可或缺的技能。
在CSS布局中,负margin是一种巧妙的技术,常用于调整元素的位置和实现特定的布局效果。本文将探讨负margin的妙用以及其他实现方式,以满足在一行内放置多个块状元素并保持它们之间相等间距的需求。 1. **负margin大...
【CSS左导航菜单详解】 在网页设计中,一个高效的导航菜单是至关重要的,它能帮助用户轻松地在网站中穿梭。CSS(层叠样式表)是实现这一...这个过程中,理解并熟练运用CSS选择器、定位、过渡效果等核心概念至关重要。
同时,表格布局、流体布局以及负margin的运用也是CSS2布局中的重要技术。 **五、图像与背景** CSS2允许设置元素的背景色、背景图像、背景重复、背景位置等。还可以使用精灵图技术优化网页加载速度。对于图像,可以...
虽然负margin可能导致布局变得复杂,但在某些场景下,它能提供解决方案。比如,实现元素的相对定位、调整元素的位置,甚至实现某些创新的布局效果。比如,当需要元素部分超出其父元素的边界时,可以适当使用负的`...
5. **纯CSS的百分比高度和负margin方法** 当图片高度未知时,可以利用负的`margin-top`来实现垂直居中: ```css .container { display: inline-block; position: relative; } .image { position: absolute; ...
在电商网站中常见,通过CSS的浮动和负margin技巧,使div元素自适应地填充空间,形成类似瀑布下落的效果。 四、800张网页背景素材的应用 丰富的网页背景素材可以极大地提升用户体验。设计师可以利用这些素材,结合...
对于优惠券的剪切效果,可以使用CSS的绝对定位(`position: absolute`)和负边距(`margin`)技巧。创建两个重叠的矩形,一个作为优惠券主体,另一个作为剪切形状,通过调整负边距模拟剪切的角部,这样就能实现如同...
2. **栅格系统**:利用百分比宽度和负margin等技巧,创建自适应的栅格布局,提高网页设计的灵活性。 3. **动画效果**:CSS3提供了丰富的动画和过渡效果,如旋转、缩放、滑动等,使网页更具动态感。 4. **美化表单*...
总的来说,这个“CSS3科技感环形菜单动画特效”项目展示了如何运用现代前端技术,结合CSS3的动画和布局特性以及jQuery的便利性,创造出引人注目的用户体验。开发者可以通过学习和理解这个案例,进一步提升自己的网页...
10. **由浅入深漫谈margin属性.doc**:深入解析margin属性,可能涵盖不同方向的margin合并、负margin的运用,以及在布局中的作用。 这些文档集合为CSS学习者提供了全面的学习资源,不仅包含基础理论,还涉及到实践...
2. **负margin**:CSS2允许设置负的margin值,可以用来调整元素的位置,实现更精细的布局控制。 3. **表格样式**:CSS2提供了一整套用于美化表格的样式,包括边框合并、单元格间距等。 **四、CHM格式** CHM是...
对联广告通常贴紧页面边缘,可能需要设置负的`margin`值来达到理想效果。 4. **响应式设计**: 考虑到不同设备的屏幕尺寸,可以使用媒体查询(`@media`)来实现响应式设计。根据屏幕宽度改变广告的宽度、高度或...
【CSS中的负边距奇技淫巧】 自从1998年CSS2成为推荐标准以来,传统的表格布局逐渐被更灵活的CSS布局所取代。...尽管大多数现代浏览器都支持负边距,但在实际应用中仍需谨慎测试,确保在各种环境下都能正常工作。
下面,我们将深入探讨CSS 2.0的核心概念、特性以及如何应用它们。 ### 一、CSS 2.0基础 1. **选择器**: CSS 2.0中的选择器允许你根据元素的类型、ID、类、属性等来定位和样式化HTML或XML文档中的元素。例如,`h1`...
在早期的CSS中,由于盒模型的影响,实现等高布局通常需要复杂的JavaScript或负边距技巧,如“瀑布流”布局。但随着CSS3的引入,这种方法已经被更为优雅和灵活的方式所替代。 1. **Flexbox布局**:Flexbox(弹性盒...
11. **双飞翼布局**:双飞翼布局是一种解决圣杯布局问题的变体,通过负margin和浮动元素实现,简化了代码和理解。 12. **瀑布流布局**:常用于图片展示,元素自上而下排列,随着浏览器窗口宽度变化而自动调整排列...
可以使用百分比宽度和负margin来实现六边形的相邻效果。 3. **使用Flexbox或Grid**:选择适合的布局方式,如`display: flex`或`display: grid`,并设置相应的布局参数,使图片能按蜂窝模式排列。 4. **CSS3 旋转**...
在CSS3中,我们可以利用其丰富的动画特性来创建各种引人入胜的视觉效果,比如环形星星发光动画。这个“css3样式环形星星发光动画效果”就是一个很好的实例,展示了CSS3在网页动态设计中的强大功能。接下来,我们将...