浮动元素margin负值的应用

上次写到三列布局,其中提到浮动元素margin为负值时的应用,今天就来总结一下,它的用处何在.

首先,先来探究一下,当一个元素的margin为负值时,都会有哪些影响.

其一,对自身的影响.

当元素不存在width属性或则width:auto的时候,负值margin会增加元素的宽度.(注意:这仅仅是在元素不存在width属性或则width属性默认的时候,如果有宽度设置,margin-left和margin-right为负值时,会发生位移.)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>验证</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            .wrap{background-color: #f00;width: 800px;margin: 100px auto 0; height: 300px;font-size: 30px;}
            .box{background-color: #007AFF;margin-left: -100px;height: 200px;}
        </style>
    </head>
    <body>
        <div class="wrap">
            最外层的宽度为800px
            <div class="box">里层的元素设置了margin-left:-100px</div>
        </div>
    </body>
</html>

代码效果如图,里层元素的宽度增加了100px,margin-left和margin-right为负值的时候都可以增加元素的宽度.

而margin-top为负值的时候,不会增加宽度,而是会让元素上移.

margin-bottom为负值的时候不会位移,而是会减少自身供css读取的高度.

那么问题来了,什么是减少自身供css读取的高度呢?

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>验证</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            .box{background-color: #007AFF;margin-bottom: -100px;height: 200px;}
            .t{background-color: #f00;height: 20px;width: 200px;}
        </style>
    </head>
    <body>
        <div class="box">高度为200px</div>
        <div class="t">高度为20px</div>
    </body>
</html>

可以看出,类名为box的元素的高度依旧是200px,浏览器依旧将整个元素渲染出来了,如果用console.log($(".box").height());打印box的高度,其高度依旧是200px,但是,其在浏览器中实际读取的高度减少到了100px,类名为t的元素的位置为证.

其二,对文档流的影响

元素如果用了margin-left:-100px;其会向左位移100px,但是和相对定位不同的是,在其后面的元素会进行补位,也就是后面的行内元素会紧贴在此元素之后.即,如果不脱离文档流不浮动的话,margin为负值的元素不会破坏页面的文档流.

当然,如果你用负margin上移一个元素,接下的元素都会跟着上移.

其三,对浮动元素的影响

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>三栏布局的实现方案</title>
        <style type="text/css">
            *{
                padding: 0;
                margin: 0;
            }
            .container{
                margin: 100px auto 0;
                border: 1px solid #000;
                width: 300px;
            }
            .clearfix::after{
                display: block;
                content: "";
                height: 0;
                font-size: 0;
                clear: both;
            }
            .clearfix{
                zoom: 1;
            }
            .flb{
                float: left;
                width: 100px;
                height: 100px;
                /*margin-left: -25px;*/
            }
            .flbox1{background-color: rgba(33, 114, 214, 0.8);}
            .flbox2{background-color: rgba(255, 82, 0, 0.8);}
            .flbox3{background-color: rgba(90, 243, 151, 0.8);}
        </style>
    </head>
    <body>
        <div class="container clearfix">
            <div class="flb flbox1">box1</div>
            <div class="flb flbox2">box2</div>
            <div class="flb flbox3">box3</div>
        </div>
    </body>
    <script src="js/jquery-1.8.2.min.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
    </script>
</html>

其效果为:

当给他们都设置margin-left:-25px;后,其效果为:

这是由于,每个box元素都发生了左位移,而其后的元素紧跟着之后,也发生了一次位移,这就形成了上面的结果.

即,负margin会改变浮动元素的显示位置,即使我的元素写在DOM的后面,我也能让它显示在最前面。圣杯布局、双飞翼布局啊什么的,都是利用这个原理实现的。

其四,对绝对定位的影响

我经常用之来进行已知宽高元素的上下左右居中.

<div class="absolute"></div>

.absolute{
    position: absolute;
    top:50%;
    left:50%;
    height: 200px;
    width: 200px;
    background-color: #ccc;
    margin-top: -100px;
    margin-left: -100px;
}

代码如上,对于绝对定位的元素,设置了margin负值之后,会根据它定位的位置进行再位移.

说完margin为负值的影响,再来说说其应用.

一、适用于左右固定,中间自适应的三列布局(类圣杯布局,双飞翼布局),前面的内容和以前的博文有介绍,不再详解.

二、去除列表右边框.

我们经常会遇到这种情况,要求两边对齐,中间元素平均分布的布局,类似于下图:

做成这种布局,比较笨的方法就是都浮动之后,再对最后第一个进行特殊处理,不过这需要后端的配合,而另外一种就是使用弹性布局,但由于其兼容性,现今并不太推荐.

而利用margin-left为负值,能增加元素宽度的特性,我们可以轻松实现上面的布局.

代码如下:

<div class="container">
    <ul class="list">
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
        <li>我是一个列表</li>
    </ul>
</div>
.container{
        margin:0 auto;
        width: 500px;
        border: 1px #ccc solid;
        margin-bottom: 20px;
}
.list{
    overflow: hidden;
    margin-right: -10px;

}
.list li{
    width:92px;
    height: 92px;
    background-color: #ccc;
    margin-bottom: 20px;
    float: left;
    margin-right: 10px;
}

效果如图:

由于其外层list使用了margin-left为负值,增加了其宽度,其中的元素排列显示出来就呈现出如上效果,简单高效.

其计算公式:
假设一横列展示的数量为x,元素见的间距为y,父距宽度z
则元素的宽度=(z-y(x-1))/x
本例中li的宽度为(500-10(5-1))/5=92

三、margin负值+定位:实现元素水平垂直居中.

上面已有提到,不多赘述.

四、去除列表最后一个li元素的border-bottom

很多情况下,我们会用li标签来模拟表格,再给li标签添加下边距的时候,最后一个li标签表格会和父元素的边框靠在一起,会显得整个“table”的底部边框会比其他的边粗一些!

    <style>
    ul.table{
        border:1px #ccc solid;
        margin-top:100px;
    }
    ul.table li{
        border-bottom: 1px #ccc solid;
        list-style: none;
    }
    </style>
    <ul class="table">
        <li>I am li</li>
        <li>I am li</li>
        <li>I am li</li>
        <li>I am li</li>
        <li>I am li</li>
    </ul>

这时,如果给li添加一个margin-bottom:-1px;就会正常.

五、多列等高(这种方案应用也比较多,建议详细看下)

<style>
    .container{
        margin:0 auto;
        width: 100%;
        overflow: hidden;
    }
    .left{
        height: 50px;
        width: 33.33%;
        margin-bottom: -5000px;
        padding-bottom: 5000px;
        float: left;
        background-color: rgba(33, 114, 214, 0.8);
    }
    .main{
        height:100px;
        margin-bottom: -5000px;
        width: 33.33%;
        float: left;
        padding-bottom: 5000px;
        background-color: rgba(255, 82, 0, 0.8);
    }
    .right{
        width: 33.33%;
        float: left;
        margin-bottom: -5000px;
        padding-bottom: 5000px;
        background-color: rgba(90, 243, 151, 0.8)
    }
</style>
<div class="container">
    <div class="left"> height:50px</div>
    <div class="main">height:100px</div>
    <div class="right">height:30px</div>
</div>

虽然设置了5000px的内边距,但是又用margin为负值来进行了抵消,它还是原来的高度,但显示出来的效果却是5000px+本来高度,这时候,再通过父元素的overflow:hidden;以最高元素的高度进行一刀切,所以看起来就是三个登高的div了.

暂时就这么多,如果有发现,会继续补充.......

时间: 2024-10-14 20:57:50

浮动元素margin负值的应用的相关文章

几个常见的布局的多种实现方式及margin负值总结

第一部分:几个常见的布局实现方式 一.左右两边固定, center中间自适应未知 html代码中 center 部分首先要放在box的最前部分.然后是left,right 圣杯布局: <div class="box"> <div class="center"></div> <div class="left"></div> <div class="right"&g

如何让一个浮动元素既水平又垂直居中

2016年3月22日 让一个普通标签居中很容易,使用div {margin:0 auto}然后利用css可以自动计算元素左右的宽度就可以了 div {margin:0 auto;} 但是让一个浮动元素居中的话,却是无法通过这种形式居中的,因为浮动元素会自动跑到浮动的方向上的最边上,设置的外边框auto根本不起作用. 这时我们可以先把这个元素的位置设置为relative,这样的话就可以通过left属性来将它相对于父元素左边框的距离改为50%,当然这样还是不能实现水平居中的目标,因为元素有自己的宽度

初探Margin负值(转)

相对而言,margin 负值的使用机率在布局中似乎很少,但是我相信一旦你开始掌握就会着迷,接下来我们看看关于margin负值的一些资料: 它是一个有效的属性,至少w3c中明确描述如下:”Negative values for margin properties are allowed…”; margin负值并非hack,正因为不熟悉所以有时候会避而远之,甚至误解; margin负值遵循文档流:假如使用margin负值促使一个元素向上位移,那么相关元素也会随之发生位移. 良好兼容,甚至是ie6也能

(学习随笔)关于浮动元素换行机制的小测试

引言: 之前看了一篇张鑫旭老师的博文<关于文字内容溢出用点点点(-)省略号表示>.其中的他的"margin负值定位法"原理中的"当文字内容足够长时就把隐藏在上面的省略号层给挤下来了."着实研究了好久,才发现自己在浮动换行机制这方面的欠缺,同时又发现网上对这一机制并没有非常深入探讨的文章,所以自己来做个小测试研究下:) 正文: 在W3School里CSS教学中关于浮动的说明里,对于浮动元素的换行,说法只有一句"浮动的框可以向左或向右移动,直到它的

浮动元素居中&amp;&amp;浮动元素内容相对于浮动元素父元素居中

一:浮动元素内容相对于浮动元素父元素居中 我们知道元素内容居中可以用text-align:center;但是如果元素是浮动的呢?就像下边这样,怎样使得所有链接水平居中? <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>浮动元素内容相对于浮动元素父元素居中</title> <style type="text/css"&g

[转] margin负值的探讨

原文:  margin负值-权威指南 [http://www.csswang.com/exp/cssexp/3863.html] static元素是没有设定成浮动的元素,下图说明了负margin对static元素的作用. 1. 当static元素的margin-top/margin-left被赋予负值,元素将被拉进指定的方向. /* 元素向上移动10px */ #mydiv1 { margin-top: -10px; } 2. 但如果你设置margin-bottom/right为负数,元素并不会

深入理解CSS中的margin负值

转自:http://www.cnblogs.com/xiaohuochai/p/5314289.html#anchor1 原文对margin负值做了特别详细的解读,应用案例也特别实用,转来为日后参考复习之用. 前面的话: margin属性在实际中非常常用,也是平时踩坑较多的地方.margin折叠部分相信不少人都因为这样那样的原因中过招.margin负值也是很常用的功能,很多特殊的布局方法都依赖于它.它看似简单,实际上却蛮复杂,本文就margin负值作详细介绍和梳理. 一.表现:  虽然margi

margin负值的应用总结

margin负值  之前一直 应用都是定位 和 列表的时候,从来没有想着进行个总结,直到遇到了在项目中遇到了 一个margin负值 但是宽度增加的问题 才想着研究下 margin负值的问题.现将网上找到资料和文章,加上自己理解整理如下 1.元素水平垂直居中 <style> .popMsg{position:absolute;top:50%;margin-top:-150px;left:50%;margin-left:-150px;width:300px;height:300px; backgr

如何垂直居中一个浮动元素

如何垂直居中一个浮动元素 // 方法一:已知元素的高宽 #div1{ width:200px; height:200px; position: absolute;        /*父元素需要相对定位*/ top: 50%; left: 50%; margin-top:-100px ;   /*二分之一的height,width*/ margin-left: -100px; } //方法二:未知元素的高宽 #div1{ width: 200px; height: 200px; margin:au