当前位置: 首页 > 科技观察

了解并使用CSS的负边距值

时间:2023-03-15 10:45:06 科技观察

本文中的样式代码使用了SCSS。浏览器兼容性为IE6+。在你的网页中,不使用边距是不可能的。大多数情况下,我们使用正边距值,有时也可能使用负边距值。在我们的印象中,负边距值类似于浏览器hack,不被接受。不过,本文要说明的是,负的margin值并不是hack,写在正常范围内。margin属性的负值是允许的,但可能会有特定于实现的限制。——W3C根据W3C的说法,margin可以接受负值,但在具体实现上有一些差异。那么,将margin设置为负值有什么影响呢?与设置正值不同,设置margin为负值需要根据设置的方向、元素是否浮动及其定位方式来判断最终的行为。因此,在以下情况中描述了具体行为。第一种情况:元素未浮动且未设置定位或position为static如果元素未浮动且未设置定位或position属性为static,则将元素的margin设置为负值会有效果如下:设置外边距的方向为上或左。当设置负边距的方向为top或left时,元素会按照设置的方向移动相应的距离。例如,设置margin-left:-100px;。然后,该元素将向左移动100px。设置margin-top也是一样。设置边距的方向为底部或右侧。当负边距的方向设置为bottom或right时,元素本身不会移动,元素后面的其他元素会向元素的方向移动相应的距离,覆盖元素的上方。例如,设置margin-right:-100px;。然后,元素本身不会移动,后面的元素会在元素上向左移动100px。设置margin-bottom也是如此。同时,如果元素没有指定宽度,如果margin-left或margin-right设置为负值,则其宽度会在元素对应的方向增加。效果与设置padding-left或padding-right相同。第二种情况:元素没有设置为浮动且位置是相对的如果元素没有设置为浮动,而是设置为相对定位,当margin设置为负值时,表现如下:方向设置margin的方向为top或left时设置负值当margin的方向为top或left时,元素也会按照设置的方向移动相应的距离。设置边距的方向为底部或右侧。当设置了margin-bottom/left时,元素本身不会移动,元素后面的其他元素也会向元素的方向移动相应的距离,但是元素会覆盖在后面的元素之上(当然,这里说的情况一定是后面的元素没有设置定位和z-index的情况)。第三种情况:元素没有设置为浮动且定位为绝对如果元素没有设置为浮动,而是设置为绝对定位,当设置margin为负值时,表现如下:方向设置的margin为top或left当设置为负值时margin的方向为top或left时,元素也会按照设置的方向移动相应的距离。设置边距的方向为底部或右侧。由于绝对定位的元素不在标准文档流中,设置margin-right/bottom对后面的元素没有影响。第四种情况:如果元素设置为float,那肯定没有float和absolute定位都设置的情况,那可笑了。如果你设置一个浮动元素然后设置position:relative;,元素的行为与单独设置float是一样的。对于设置为浮动的元素,当margin设置为负值时,表现如下:如果设置的margin的方向与浮动的方向相同,则元素将移动相应的距离相应的方向。例如:.elem{float:right;margin-right:-100px;}元素将向右移动100px。如果设置margin的方向与浮动方向相反,则元素本身不会移动,元素前后的元素会向钙元素的方向移动相应的距离。例如:.elem{float:right;margin-left:-100px;}位于元素左边的元素会向右移动100px,同时覆盖元素。如果下面的元素也设置为浮动,我们用一个具体的例子来说明。

.container{min-height:300px;margin:30pxauto;overflow:hidden;border:1pxsolid#000000;.left{float:left;width:400px;height:200px;margin-right:-300px;background:purple;}.right{float:left;width:300px;height:200px;background:#cccccc;}}.left和.right都是浮动的,margin-right:-300px;设置在.left上,那么.right会向左移动300px覆盖.left。此行为类似于既没有设置浮动也没有设置位置。至此,我们大致了解了设置负边距的各种情况,以及它们在各种情况下的表现。那么,当我们真正在实践中使用它时,它会是什么样子呢?原谅半遮挡标题写的不好,大概是下图的效果:按照大意,肯定是直接给标题设置绝对定位,然后再调整。不过按照我们现在说的,要实现这个效果其实很简单。这里只写了主要的代码部分。HeyThisistitle!
Hah!Thisiscontent..title{position:relative;width:200px;height:60px;margin-bottom:-30px;margin-left:-20px;background:#000000;}.content{max-width:800px;height:400px;padding:050px;background:yellow;}我们给标题设置两个负边距值,分别为margin-底部:-30px;和margin-left:-20px;。设置margin-bottom是让内容上移,设置margin-left是让标题向左移动一小段距离。另外需要注意的是需要设置position:relative;对于标题。根据我们第二种情况,通过这种方式,可以保证标题覆盖在内容之上。一列固定宽度的简单两列流体布局根据我们上一个案例,通过将边距设置为负值,我们可以轻松实现一列固定宽度的两列流体布局。.left{float:left;width:100%;height:200px;margin-right:-300px;background:purple;}.right{float:left;width:300px;height:200px;background:#cccccc;}唯一需要注意的是100%元素上的负margin值width的绝对值必须与定宽元素的宽度相同。边固定中间自适应的三列布局是一个很老的话题了,过去也有过各种实现方式,比如双飞翼布局,或者圣杯布局。这里我们以双飞翼布局为例。首先设置页面结构:这个我们没有把center放在中间,具体原因后面会解释。然后,我们将这三列设置为浮动:.left,.right,.center{float:left;height:500px;}并指定它们的宽度:.left{width:300px;background:#000000;}.right{width:400px;background:#00FFFF;}.center{width:100%;background:#93c759;}现在我们要让左边靠左,相当于让它覆盖中心,所以我们只需要这句话:margin-left:-100%;同时,要让right在右边,同理,这样设置:margin-left:-400px;注意这里的margin值的绝对值和right的width值是一样的。其实有了这个设置,我们的三栏布局就基本完成了。那么,为什么我们把中心放在左右之前呢?这个其实涉及到元素堆叠顺序的知识(这里就不详细解释了,以后有时间的话会用一篇文章来解释),这里就简单解释一下。由于我们的三列都设置为float,从某种意义上说,三者在同一个平面上(相当于同一个z-index),所以无法根据css来判断堆叠顺序。因此,这里的HTML结构决定了它们的堆叠顺序:所谓后来者。我们希望left在center之上,所以我们肯定需要将left元素放在center之前。因此,完整的三列布局的SCSS代码如下:.container{overflow:hidden;.left,.right,.center{float:left;height:500px;}.left{width:300px;margin-left:-100%;background:#000000;}.right{width:400px;margin-left:-400px;background:#00FFFF;}.center{width:100%;background:#93c759;}}参考margin-properties|W3CTheDefinitiveGuidetoComparisonofUsingNegativeMargins双飞翼布局与圣杯布局