码迷,mamicode.com
首页 > 其他好文 > 详细

盒子 你好(盒子模型初探)

时间:2015-08-27 12:41:44      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

之所以用这个题目 是当我用了很多padding boder width height的时候,才在书上看到盒子的详细介绍,这更加对于我使用这些属性和布局有了更好的帮助,本篇文章还是偏重介绍加一些小例子,毕竟肚子里的内容不足以支持一篇丰富的文章  参考图解CSS3 技术核心与项目实战

 

CSS中盒子模型被分为两种:

1)W3C的标准模型

2)IE的传统模型

他们都是对元素尺寸计算的一种模型,但是他们的计算方式不大相同

W3C标准盒模型

外盒尺寸计算(元素空间尺寸)

element空间高度 = 内容高度 + 内距(padding) + 边框(border) + 外距(margin)

element空间宽度 = 内容宽度 + 内距(padding) + 边框(border) + 外距(margin)

内盒尺寸计算(元素大小)

element高度 = 内容高度 + 内距(padding)+ 边框(border)

element宽度 = 内容宽度 + 内距(padding)+ 边框(border)

 

IE下传统盒模型(IE6以下)

外盒尺寸计算

element空间宽度 = 元素宽度 + 外距(margin)  //元素宽度包含元素内容宽度 内距(padding) 边框(border)

element空间高度 = 元素高度 + 外距(margin)//元素高度包含元素内容高度 内距(padding) 边框(border)

内盒尺寸计算

element高度 = 内容高度 // 元素高度包含元素内容高度 内距(padding) 边框(border)

element宽度 = 内容宽度 //元素宽度包含元素内容宽度 内距(padding) 边框(border)

这里我们只用考虑内盒模型的计算

W3C标准模型和IE下传统模型的主要区别就是元素的高(宽)度是否包含 padding margin

这在布局中会产生不小的影响

    <style type="text/css">
        .a {
            width:100px;
            height:100px;
            border: 5px solid black;
            padding: 10px;
            background: red;
        }

    </style>
</head>
<body>
    <div class="a">    
    </div>
</body>

上面我为一个div设置了一些样式

技术分享

我发现div的实际大小是130*130 也就是 100+5*2(border) + 10*2(padding)

这样其实在布局的时候会产生一些麻烦 当我们改变元素的的border padding的时候,都要重新的计算下盒子的尺寸,甚至不经意间打乱了布局 出现莫名其妙的无法对齐的现象(我在实际中因为开始的时候不了解盒子 就出现过这种问题)

如果是IE6下的传统模式呢 起初盒子的大小是固定的(我们预先设置好) 那当我们改变border padding的时候,并不会对原有的布局发生改变 

针对这种现象,在CSS3中增添了box-sizing属性 能事先的定义盒模型的解析方式

box-sizing: content-box | border-box | inherit

content-box 默认值  维持W3C标准盒模型

border-box 让元素维持IE传统的盒模型(之前就用过这个属性 这下算是理解了)

inherit 继承父元素的盒模型

 

<style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }
        .content {
            width:400px;
            margin-left:auto;
            margin-right:auto; /*居中*/
            font-size: 20px;
            text-align: center;
            background: #FFD700;
            



        
            
        }

        #leftbar {
            float:left;
            width:100px;
            height: 300px;
            background: red;
            margin-right: 50px;
            margin-bottom:10px;
            
        }

        #rightbar {
            float:left;
            width:250px;
            height: 300px;
            margin-bottom: 10px;
            background: green;
        }

        #footer {
            background: gray;
            height:50px;
            clear:both;
        }



    </style>
</head>
<body>
    <div class="content">
        <div id="leftbar">左侧边栏</div>
        <div id="rightbar">右侧边栏</div>    
        <div id="footer">页脚</div>
    </div>
</body>

实现这样的一个布局很容易 技术分享

宽度的设置刚好等于外围content的宽度 ,但是我们为leftbar设置一个border的时候呢

#leftbar {
            float:left;
            width:100px;
            height: 300px;
            background: red;
            margin-right: 50px;
            margin-bottom:10px;

            border:10px solid black;
            
        }

技术分享

 

发现右侧的边栏被挤下去了 因为宽度超出了它自身的宽度

这时候我将leftbar的box-sizing 设置为border-box 发现布局又回到了最初的效果

-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
border-sizing:border-box;
            

技术分享

你也许会说我需要内容的宽度不是因为设置了border-box而被压缩了吗!!!

事实上也的确如此

对比 左图是没有设置border的时候 右图是设置border的时候 (他们都设置了border-sizing:border-box)

技术分享    技术分享

可以明显的看出 内容因为设置了border 被压缩了 我就考虑到图片

我设置图片的大小刚好是没有设置border时候的大小  也就是100*300  下面是加上border的对比

技术分享  技术分享

右图中content的大小变小了 装不下这么大的图片了 导致发生这种位移的效果实在丑

所以这种问题的思路是我们从内开始 定义好content的大小 padding border 去算好整体的大小 去布局 

 

盒子 你好(盒子模型初探)

标签:

原文地址:http://www.cnblogs.com/tiantianwaigong/p/4762769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!