盒子模型(重点)

盒子模型

每个盒子由四个部分(或称区域)组成,其效用由它们各自的边界(Edge)所定义(原文:defined by their respective edges,可能意指容纳、包含、限制等)。如图,与盒子的四个组成区域相对应,每个盒子有四个边界:内容边界 Content edge内边距边界 Padding Edge边框边界 Border Edge外边框边界 Margin Edge

CSS Box model

盒子边框(border)

语法:

border : border-width | border-style | border-color

边框属性—设置边框样式:border-style 用于定义页面中边框的风格,常用属性值如下:

none: 没有边框即忽略所有边框的高度(默认值)
solid:边框为单实线(最常用)
dashed: 边框为虚线
dotted:边框为点线
double:边框为双实线

<style>
        div {
            width: 200px;
            height: 200px;
            border-width: 1px;/*边框粗细*/
            border-color: lightpink;
            border-style: solid;/*单实线边框*/
        }
    </style>
</head>
<body>
<div>盒子</div>
</div>

盒子边框总结表:

设置内容 样式属性 常用属性值
上边框 border-top-style:样式; border-top-width:宽度;border-top-color:颜色;border-top:宽度 样式 颜色;
下边框 border-bottom-style:样式;border- bottom-width:宽度;border- bottom-color:颜色;border-bottom:宽度 样式 颜色;
左边框 border-left-style:样式; border-left-width:宽度;border-left-color:颜色;border-left:宽度 样式 颜色;
右边框 border-right-style:样式;border-right-width:宽度;border-right-color:颜色;border-right:宽度 样式 颜色;
样式综合设置 border-style:上边 [右边 下边 左边]; none无(默认)、solid单实线、dashed虚线、dotted点线、double双实线
宽度综合设置 border-width:上边 [右边 下边 左边]; 像素值
颜色综合设置 border-color:上边 [右边 下边 左边]; 颜色值、#十六进制、rgb(r,g,b)、rgb(r%,g%,b%)
边框综合设置 border:四边宽度 四边样式 四边颜色;

表格的细线边框

table{ border-collapse:collapse; } collapse 单词是合并的意思

border-collapse:collapse; 表示边框合并在一起。

cellpadding: 不要使用这个属性,因为它已经被废弃。 <table>元素应该使用 CSS定制样式。 在<table>元素上使用 CSS属性值为 collapseborder-collapse属性,在 <td>元素上使用属性 padding,以达到类似于 cellpadding 的效果。

cellspacing:小贴士:不要使用这个属性,因为它已经被废弃。 <table>元素应该使用 CSS 定制样式。在 <table>元素上使用 CSS 的属性 border-spacing。以达到类似于 cellspacing 的效果。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <style>
        table {
            width: 700px;
            height: 300px;
            border: 1px solid red;
            border-collapse: collapse;  /* 合并相邻边框 */
        }
        td {
            border: 1px solid red;
        }
        </style>
    </head>
    <body>
    <table cellspacing="0" cellpadding="0">
        <tr>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
        </tr>
        <tr>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
        </tr>
        <tr>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
        </tr>
        <tr>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
        </tr>
        <tr>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
            <td>123</td>
        </tr>
    </table>
    </body>
</html>
image.png

圆角边框(css3)

CSS属性 border-radius 允许你设置元素的外边框圆角。当使用一个半径时确定一个圆形,当使用两个半径时确定一个椭圆。这个(椭)圆与边框的交集形成圆角效果。

image.png

border-radius: 左上角 右上角 右下角 左下角;

border-radius: 30px;

image.png

border-radius: 25% 10%;

image.png

border-radius: 10% 30% 50% 70%;

image.png

border-radius: 10% / 50%;

image.png

border-radius: 10px 100px / 120px;

image.png

border-radius: 50% 20% / 10% 40%;

image.png

使用百分数定义圆形半径或椭圆的半长轴,半短轴。水平半轴相对于盒模型的宽度;垂直半轴相对于盒模型的高度。负值无效


border-radius: 1em/5em;

/* 等价于: */

border-top-left-radius:     1em 5em;
border-top-right-radius:    1em 5em;
border-bottom-right-radius: 1em 5em;
border-bottom-left-radius:  1em 5em;
border-radius: 4px 3px 6px / 2px 4px;

/* 等价于: */

border-top-left-radius:     4px 2px;
border-top-right-radius:    3px 4px;
border-bottom-right-radius: 6px 2px;
border-bottom-left-radius:  3px 4px;
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <style>
        div {
            width: 200px;
            height: 200px;
            border: 1px solid red;
            display: inline-block;
        }
        div:first-child {  /* 结构伪类选择器 选亲兄弟 */
            border-radius: 10px;  /*  一个数值表示4个角都是相同的 10px 的弧度 */ 
        }

        div:nth-child(2) {
            /*border-radius: 100px;    取宽度和高度 一半  则会变成一个圆形 */
            border-radius: 50%;   /*  100px   50% 取宽度和高度 一半  则会变成一个圆形 */
        }

        div:nth-child(3) {
            border-radius: 10px 40px;  /* 左上角  和 右下角  是 10px  右上角 左下角 40 对角线 */
        }
        
        div:nth-child(4) {
            border-radius: 10px 40px  80px;   /* 左上角 10    右上角  左下角 40   右下角80 */
        }
        div:nth-child(5) {
            border-radius: 10px 40px  80px  100px;   /* 左上角 10    右上角 40  右下角 80   左下角   右下角100 */
        }
        div:nth-child(6) {
            border-radius: 100px;  
            height: 100px; 
        }
        div:nth-child(7) {
            border-radius: 100px 0;  
        }   
        </style>
    </head>
    <body>
    <div> 1. 20px</div>
    <div> 2. 50%  或者 100px</div>
    <div>3. 10px 40px</div>
    <div>4. 10px 40px  80px</div>
    <div>5. 10px 40px  80px  100px</div>
    <div>6. 123</div>
    <div>7. 100px 0</div>
    </body>
</html>
image.png

内边距(padding)

padding属性用于设置内边距。 是指 边框与内容之间的距离。

值的个数 表达意思
1个值 padding:上下左右边距 比如padding: 3px; 表示上下左右都是3像素
2个值 padding: 上下边距 左右边距 比如 padding: 3px 5px; 表示 上下3像素 左右 5像素
3个值 padding:上边距 左右边距 下边距 比如 padding: 3px 5px 10px; 表示 上是3像素 左右是5像素 下是10像素
4个值 padding:上内边距 右内边距 下内边距 左内边距 比如: padding: 3px 5px 10px 15px; 表示 上3px 右是5px 下 10px 左15px 顺时针

padding-top:上内边距

padding-right:右内边距

padding-bottom:下内边距

padding-left:左内边距

padding: 1em;

image.png

padding: 10% 0;

image.png

padding: 10px 50px 20px; 上10px;左右50px;下20px;

image.png

padding: 10px 50px 30px 0;

image.png

padding: 0;

image.png

实例:


padding: 5%;                /* All sides: 5% padding */

padding: 10px;              /* All sides: 10px padding */

padding: 10px 20px;         /* top and bottom: 10px padding */
                            /* left and right: 20px padding */

padding: 10px 3% 20px;      /* top:            10px padding */
                            /* left and right: 3% padding   */
                            /* bottom:         20px padding */

padding: 1em 3px 30px 5px;  /* top:    1em padding  */
                            /* right:  3px padding  */
                            /* bottom: 30px padding */
                            /* left:   5px padding  */

案例:导航栏

  1. a链接自带下划线,用text-decoration: none;取消下划线。
  2. padding: 0 15px; 设置内边距上下0,左右15px,因为盒子内的字数不同,所以不能给盒子宽度,否则无法调整文字和盒子之间的边距,直接设置内边距,然后用文字本身撑开盒子,最后设置行高等于高line-height
    :41px;
    ,让文字居中显示就可以了
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        nav {
            height: 41px;
            background-color: #fcfcfc;
            border-top: 3px solid #ff8500;/*上边框*/
            border-bottom: 1px solid #edeef0;/*下边框*/
        }
        nav a {
            font-size: 14px;
            color: #4c4c4c;
            text-decoration: none;/*取消下划线*/
            padding: 0 15px;/*内边距上下0,左右15px,因为盒子内的字数不同,所以不能给盒子宽度,要不无法调整边距,直接设置内边距,然后用文字本身撑开盒子,然后行高等于高,让文字居中显示就可以了*/
            height: 41px;
            line-height: 41px;/*让行高等于盒子高,使文字垂直居中*/
            background-color: ;
            display: inline-block; /*链接是行内元素,不能设置高度,将其转换为行内块元素*/
        }
        nav a:hover {  
            background-color: #ccc;
        }
    </style>
</head>
<body>
<nav>
    <a href="#">首页</a>
    <a href="#">手机新浪网</a>
    <a href="#">网站导航</a>
    <a href="#">客户端</a>
</nav>
</body>
</html>

效果如下:鼠标经过变灰色


外边距(margin)

一个盒子实现水平居中的两个条件:

  1. 必须是块级元素

  2. 盒子必须制定宽度(width)

然后就给 左右边距 都设定为auto 就可以实现盒子水平居中。

margin: 1em;

image.png

margin: 5% 0;

margin: 10px 50px 20px;

image.png

margin: 10px 50px 20px 0;

image.png

margin: 0;

image.png

示例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            /* margin-top: 100px;
            margin-left: 50px; */
            margin: 30px auto;  /* 上下 30px;  左右 auto  自动 这样可以使块级带有宽度的盒子水平居中对齐 */
            padding:4px;
        }
        header,
        span {  /*span是行内元素,不是块元素,所以设置自动居中不起效果*/
            width: 900px;
            height: 120px;
            background-color: black;
            margin: 0 auto;  /* 左右设置auto使盒子居中 */
        }
        </style>
    </head>
    <body>
    <div></div>
    <header>头部标签</header>
    <span>123</span>
    </body>
</html>
image.png

文字水平居中和盒子水平居中的区别

文字居中水平
text-align: center;
盒子水平居中
margin: 10px auto; 左右margin 改为 auto

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    div {
        width: 300px;
        height: 100px;
        border: 1px solid pink;
        text-align: center; /*  文字居中水平 */
        margin: 10px auto;  /* 盒子水平居中  左右margin 改为 auto 就阔以了 */
    }
    section {
        width: 400px;
        height: 400px;
        border: 1px solid #000;
    }
    section img {  
        width: 200px;/* 插入图片更改大小 width 和 height */
        height: 210px;
        margin-top: 30px;  /* 插入图片更改位置 可以用margin 或padding  盒模型 */
        margin-left: 50px; /* 插入的图片也是一个盒子 */
    }

    aside {
        width: 400px;
        height: 400px;
        border: 1px solid purple;
        background: #fff url(images/sun.jpg) no-repeat;
    
        background-size: 200px 210px; /*  背景图片更改大小只能用 background-size 插入图片直接用宽、高设置*/
        background-position: 30px 50px; /* 背景图片更该位置 用 background-position */
    }
    </style>
</head>
<body>
    1. 文字水平居中  和  盒子水平居中 

    <div>文字水平居中</div>

    2. 插入图片和背景图片

    <section>
        <img src="images/sun.jpg" height="691" width="721" alt="">123
    </section>

    <aside>
        123123123
    </aside>

    3. 一般情况下,背景图片适合做一些小图标使用 
       产品展示之类的就用插入图片
</body>
</html>
image.png

外边距实现盒子居中

清除元素的默认内外边距

用通配符 * 也能做到同样的效果,但是 * 的清除范围太广了,不建议使用。

p,
ul {
margin: 0;
padding: 0;
}

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        p,
        ul {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
<p>abc</p>
<p>abc</p>
<ul>
    <li>列表</li>
    <li>列表</li>
    <li>列表</li>
</ul>
</body>
</html>
image.png

外边距合并

相邻块元素垂直外边距的合并

块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并。注意浮动元素绝对定位元素的外边距不会折叠。
下面列出了会发生外边距折叠的三种基本情况:

毗邻的两个元素之间的外边距会折叠(除非后一个元素需要清除之前的浮动)。

父元素与其第一个或最后一个子元素之间

如果在父元素与其第一个子元素之间不存在边框、内边距、行内内容,也没有创建块格式化上下文、或者清除浮动将两者的 margin-top分开;或者在父元素与其最后一个子元素之间不存在边框、内边距、行内内容、heightmin-heightmax-height将两者的 margin-bottom 分开,那么这两对外边距之间会产生折叠。此时子元素的外边距会“溢出”到父元素的外面。

空的块级元素

如果一个块级元素中不包含任何内容,并且在其 margin-topmargin-bottom 之间没有边框、内边距、行内内容、heightmin-height将两者分开,则该元素的上下外边距会折叠。

一些需要注意的地方:

  • 上述情况的组合会产生更复杂的外边距折叠。
  • 即使某一外边距为0,这些规则仍然适用。因此就算父元素的外边距是0,第一个或最后一个子元素的外边距仍然会“溢出”到父元素的外面。
  • 如果参与折叠的外边距中包含负值,折叠后的外边距的值为最大的正边距与最小的负边距(即绝对值最大的负边距)的和。
  • 如果所有参与折叠的外边距都为负,折叠后的外边距的值为最小的负边距的值。这一规则适用于相邻元素和嵌套元素。

嵌套块元素垂直外边距的合并

两个嵌套关系的块元素,如果父元素没有上内边距以及边框,则父元素的上内边距会与子元素的上外边距发生合并,合并后的外边距为两者中的较大者吗,既使父元素的上外边距为0,也会合并。
解决方案:

  1. 可以为父元素定义1px的上边框或内边距
  2. 可以为父元素添加 overflow:hidden;(BFC)

content宽度和高度

  1. 使用宽度属性width和高度属性height可以对盒子的大小进行控制。

  2. width和height的属性值可以为不同单位的数值或相对于父元素的百分比%,实际工作中最常用的是像素值。

  3. 大多数浏览器,如Firefox、IE6及以上版本都采用了W3C规范,符合CSS规范的盒子模型的总宽度和总高度的计算原则是:

  4. 如果盒子本身没有指定宽度,而是继承父级元素宽度,那么给内边距padding和height高度不会使盒子变大。

/外盒尺寸计算(元素空间尺寸)/
Element(元素)空间高度 = content height + padding + border + margin
Element 空间宽度 = content width + padding + border + margin
/内盒尺寸计算(元素实际大小)/
Element Height = content height + padding + border (Height为内容高度)
Element Width = content width + padding + border (Width为内容宽度)

注意:

1、宽度属性width和高度属性height仅适用于块级元素,对行内元素无效( img 标签和 input除外)。

2、计算盒子模型的总高度时,还应考虑上下两个盒子垂直外边距合并的情况。

3、如果一个盒子没有给定宽度/高度或者继承父亲的宽度/高度,则padding 不会影响本盒子大小

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <style>
        div {
            width: 100px;
            height: 100px;
            background-color: pink;
            border: 5px solid red;  /* 4个边框  110   5 + 5 */
            padding: 10px;  /* left right  10 + 10    =  130  */
            margin: 20px;   /* left right 20 + 20   = 170  */
            /* 空间尺寸:  width + border + padding + margin ; */
            /* 内合 实际尺寸:  width + border + padding  130 ; */
        }
        </style>
    </head>
    <body>
    <div></div>
    <div></div>
    </body>
</html>
image.png

案例:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {/*写css需要先清除默认样式*/
            margin: 0;
            padding: 0;
        }
        ul {
            list-style: none;/*取消列表自带的小点,取消默认样式*/
        }
        .searchPic {
            width: 238px;
            height: 294px;
            border: 1px solid #d9e0ee;
            border-top: 3px solid #ff8400;
            margin: 100px;
        }
        .searchPic h3 {
            height: 35px;
            line-height: 35px;
            border-bottom: 1px solid #d9e0ee;
            font-size: 16px;
            font-weight: normal;/*让粗体不变粗*/
            padding-left: 12px;
        }
        .searchPic img {
            margin: 7px 0 0 8px;
        }
        .searchPic ul li a {
            font-size: 12px;
            color: #666;
            text-decoration: none;/*取消链接自带的下划线*/
        }
        .searchPic ul {
            margin-left: 8px;
        }
        .searchPic ul li {
            padding-left: 10px;
            height: 26px;
            line-height: 26px;/*让li 垂直居中*/
            background: url(images/square.png) no-repeat left center;/*left center是让li前面的小点水平垂直居中,上面的line-height是让文字居中*/
        }
        .searchPic ul li a:hover {
            text-decoration: underline;/*添加下划线*/
            color: #ff8400;
        }
    </style>
</head>
<body>
<div class="searchPic">
    <h3>搜索趣图</h3>
    <img src="images/happy.gif" />
    <ul>
        <li><a href="#">GIF:小胖墩游泳被卡 被救后一脸无辜</a></li>
        <li><a href="#">GIF:小胖墩游泳被卡 被救后一脸无辜</a></li>
        <li><a href="#">GIF:小胖墩游泳被卡 被救后一脸无辜</a></li>
    </ul>
</div>
</body>
</html>
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 什么是盒子? CSS处理网页时,它认为每个元素都包含在一 个不可见的盒子里。 我们只需要将相应的盒子摆放到网页中相...
    咻咻咻滴赵大妞阅读 905评论 0 0
  • 大家好,我是IT修真院的学员,一位正直纯洁善良的web前端程序员 今天给大家分享一下如何理解盒模型? 1.背景介绍...
    宁静森林阅读 2,133评论 0 0
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,421评论 1 45
  • 看了《绿皮书》后,久违的一种暖流注入心里,又对这个世界多了一种期待。 电影里,托尼和谢利是格格不入的两种人,托尼生...
    我最快乐_4676阅读 421评论 0 1