整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

CSS基础-盒模型

有的HTML标签都可以看成矩形盒子,由width,height,padding,border构成,称为盒模型

盒子的总宽度 = width + 左右padding + 左右border

盒子的总高度 = height + 上下pading + 上下border

width

表示盒子内容的宽度。

width属性的单位通常是px,也会涉及到 百分数、rem等单位。

当块级元素(div,h系列,li 等)没有设置width属性的时候,它将自动撑满,但这并不意味着width可以被继承。

height

表示盒子内容的高度

height属性的单位通常是px,也会涉及到 百分数、rem等单位

当块级元素(div,h系列,li 等)没有设置height属性的时候,它将自动撑满,但这并不意味着height可以被继承。

padding

padding 是盒子的那边距,即盒子边框内壁到内部文字(或者子元素)的距离

四个方向的padding,可以分别用小属性进行设置

小属性

意义

padding-top

上padding

padding-right

右padding

padding-bottom

下padding

padding-left

左padding


<!--小属性demo-->
<style>


    .box1 {
        width: 200px;
        height: 200px;
        background-color: red;
        padding-left: 20px;
        padding-top: 30px;
        padding-bottom: 40px;
        padding-right: 50px;
    }
</style>




<div class="box1"></div>


padding 合并写法

<!--padding合并写法-->
<!--      上   右   下   左-->
padding: 10px 10px 10px 10px;


<!--      上  左右  下-->
padding: 10px 20px 10px;




<!--     上下 左右 -->
padding: 10px 20px


margin

margin 是盒子的外边距,即盒子和其他盒子间的距离。

margin 的四个方向

属性名称

解释

margin-top

上 margin,向上扩展

margin-right

右margin, 向右扩展

margin-bottom

下margin, 向下扩展

margin-left

左margin, 向左扩展

两个盒子之间的,margin 不会叠加,只以大的margin的值为准。


一些元素都有默认的margin,在开始制作网页的时候,要清除他们,比如 body、ul、p等


实践:盒子实现水平居中的实现方式

<!-- 主要是 auto属性-->
.box1 {
    margin: 10px auto;
}


box-sizing 属性

默认值为 content-box , 此时的width和height 表示的是去除掉 边框和内边距后剩余的空间。


如上图,一个盒子 默认情况下, 它留给子元素的空间就是 宽300像素,高200像素的可用面积。即 width 和 height属性的区域。


box-sizing: border-box


如果添加了 如上的属性后,此时留给子元素的可用空间只有 宽270px 、高170px了。可用面积 面积 = (width - pading * 2 - border * 2) * (height - pading * 2 - border* 2) 。

也就是 width和height 就是 盒子的全部高度和宽度

<!--小属性demo, 此时留给孩子的实际可用面积是 宽270px = (300px-(10px*2)-(5px*2)) 高 170px = (200px-(10px*2)-(5px*2)) 了-->
<style>


    .box1 {
        width: 300px;
        height: 200px;
        padding: 10px;
        border: 5px solid red;
        margin: auto;
        box-sizing: border-box;
    }
</style>
<div class="box1">
</div>


display 属性


块级元素

  • 独占一行,并且有宽高的区域。
  • 特点:如果不设置宽高,会被内容元素自动撑满。
  • 例如:div、section等。

行内元素

  • 可以和其他的行内元素并排显示。
  • 特点:无法设置宽高。
  • 例如 span 等。


行内块

img 是特殊的行内块,他们既能设置宽度和高度,也能并排显示。


行内元素和块级元素的相互转换

元素

规则

display:block

将元素转为块级元素

display:inline

将元素转为行内元素,转为行内元素的情况并不多见

display:inline-block

将元素转为行内块

display:none

隐藏元素,元素会把位置也放弃


将行内元素转块级元素

<!--一个将行内元素转为块级元素的例子-->
.clickA {
    display: block;
    width:200px;
    height: 200px;
    background-color: red;
}


<a href="#" class="clickA">我是点击</a>


隐藏元素的两种写法

天带大家快速理解盒子模型,直接上代码:

<!doctype html><html>
    <head>
        <meta charset="utf-8" />
        <title>css盒子</title>
        <meta name="keywords" content="关键词,关键词" />
        <meta name="description" content="" />
        <link rel="stylesheet" href="css/index.css" />
    </head>
    <body>
        <div>我的css盒子测试模型</div>
    </body></html>

上面代码没有任何难度,只是写了一个div标签,大家已经知道,div标签是块级元素,所以会占满一行:

但是我们也注意到了图片的左侧其实还是有一些间隙的:

这个间隙在我们预期中是不应该存在的,这种间隙基本上就是出在margin或者padding或者border上。

我们先看开发者工具的右侧:

上面有一个element.style{},下面有一个div标签的属性,默认display: block。上面那个是干什么用的呢?我们修改一下代码:

<div style="border: 1px solid red">我的css盒子测试模型</div>

然后再刷新页面看:

这下我们就知道了,这个element.style就是我们写在代码里的属性。但是我们一般不会这么写,也就是大家在写代码的时候把所有属性都放到css文件中为好,不要让这个element.style有任何内容。

下面还有一个方框:

这个框就是目前这个css盒子的具体属性,比如宽度等信息。

  • margin:外边距
  • border:边框
  • padding:内边距

也就是说一个完整的盒子模型大小是由这三个参数值共同决定的。现在我们修改代码:

lesson4.html

<div id="mydiv">我的css盒子测试模型</div>

原代码不变,只是给div加一个id。

index.css

*{}#mydiv{    width: 100px;    height: 100px;        background-color: #000;        color:#fff;}

然后我们刷新页面:

下面盒子区域也会随之变化:

我们看到内容区域大小变成了100*100,而padding、border、margin都为0,我们来修改这三个值,再看效果:

*{}#mydiv{    width: 100px;        height: 100px;        background-color: #000;        color:#fff;        padding: 10px;}

盒子大小由原来的100*100变为120*120了。

padding为内边距,我们看到文字和边缘有了10像素的距离:

从上面图片看到,padding属性也是分为上下左右的,所以这个padding其实是分为padding-left、padding-right、padding-top、padding-bottom。

如果四个方向边距都不一样,我们写四个有点太累赘了,所以我们可以这样写:

padding: 10px 20px 30px 40px;

可以看到,四个值从左到右分别代表:上、右、下、左,也就是顺时针走的边距。只要这样写的方式,都是这种顺时针代表的。

如果你写

padding: 10px 20px;

就代表上下10px,左右20px。

这些大家试一下就知道了。

border代表边框。

#mydiv{    width: 100px;        height: 100px;        background-color: #000;        color:#fff;        padding: 10px 20px;        border: 10px solid red;}

border: 10px solid red;代表上下左右都是10像素、实线、红色。如果要四个边框不一样就只能一个一个写了:

#mydiv{    width: 100px;        height: 100px;        background-color: #000;        color:#fff;        padding: 10px 20px;        border-top: 10px solid #f00;        border-left: 10px solid #0f0;        border-right: 10px solid #00f;        border-bottom: 10px solid #bbb;}

增加了border以后盒子大小也会变化:

由于现在浏览器有可能会自动给你的代码加上margin或者padding,我们经常在css文件中先设置一下这两个属性值为0:

html, body{
    margin: 0px;
    padding: 0px;
}

此时,我们再看一下,样式:

lesson4.html

<!DOCTYPE html><html><head>
    <meta charset="utf-8">
    <title>Css盒子模型</title>
    <meta name="keywords" content="key1, key2">
    <meta name="description" content="">
    <link rel="stylesheet" type="text/css" href="css/index.css"></head><body>
    <div id="mydiv">我的css盒子测试模型</div></body></html>

index.css

*{}html, body{    margin: 0px;        padding: 0px;}#mydiv{    width: 100px;        height: 100px;        background-color: #000;        color:#fff;        padding: 10px 20px;        border-top: 10px solid #f00;        border-left: 10px solid #0f0;        border-right: 10px solid #00f;        border-bottom: 10px solid #bbb;}

此时,样式就会紧贴着浏览器边缘了:


有时候我们也会这样写:

index.css

*{
    margin: 0px;
    padding: 0px;
}

html,body{
    width: 100%;
    height: 100%;
}

#mydiv{
    width: 100px;
    height: 100px;
    background-color: #000;
    color:#fff;
    padding: 10px 20px;
    border-top: 10px solid #f00;
    border-left: 10px solid #0f0;
    border-right: 10px solid #00f;
    border-bottom: 10px solid #bbb;
}

这样一来,我们盒子模型的大小就会随着浏览器窗口的大小而自适应了。再来说一下外边距——margin,我们修改我们的代码为:

lesson4.html

<!DOCTYPE html><html><head>
    <meta charset="utf-8">
    <title>Css盒子模型</title>
    <meta name="keywords" content="key1, key2">
    <meta name="description" content="">
    <link rel="stylesheet" type="text/css" href="css/index.css"></head><body>
    <div class="mydiv">我的css盒子测试模型1</div>
    <div class="mydiv">我的css盒子测试模型2</div></body></html>

index.css

*{
    margin: 0px;
    padding: 0px;
}

html,body{
    width: 100%;
    height: 100%;
}

div.mydiv{
    width: 100px;
    height: 100px;
    background-color: #000;
    color:#fff;
    padding: 10px 20px;
    border-top: 10px solid #f00;
    border-left: 10px solid #0f0;
    border-right: 10px solid #00f;
    border-bottom: 10px solid #bbb;
}

我们看一下效果:

两个盒子分别在两行出现,那么如果我想把这两个盒子放到一行,我要怎么办呢?我的第一个想法是把display属性改为inline,但是发现改后样式变为:

这是因为行内元素是不能修改宽和高的,这时候我们用display: inline-block就可以了:

现在又出现了另一个问题,就是大家发现上面两个盒子中间多了一个空白的地方,而且空白地方无法选中,说实话如果你用inline-block那么中间这个间距就是默认自带的了(如果非要去掉就要加float: left或者margin: -10;)。

现在我们盒子和浏览器边缘是没有间距的,现在我们希望它离浏览器有一段距离,我们加一个margin: 10px;属性,然后再看:

我们看到它和浏览器之间有了边距,我们再来看一下现在盒子的大小:

盒子现在的大小是160*140

可以看到盒子的大小是没有计算最外层的margin属性的也就是

160=100+202+102;140=100+102+102

所以说margin是盒子的外边距,在盒子外面,不算做盒子大小的。

现在大家就掌握了盒子模型的所有基础概念了。

如果对接口、性能、自动化测试、面试经验交流等感兴趣的,可以关注我的头条号,我会不定期的发放免费的资料,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。欢迎分享,欢迎评论,欢迎转发。需要资料的同学可以关注小编+转发文章+私信【测试资料】

种盒模型

我们在盒模型的属性中提到过标准盒模型, 这是因为除了标准盒模型外, 还有在IE浏览器中使用的怪异盒模型。我们现在用一段代码分别演示这两种盒模型。

<html>
<head>
<style>
div{
    width: 200px;
    height: 100px;
    padding: 10px;
    border: 1px solid #000;
    margin: 20px;
}
.content-box{
    box-sizing: content-box;
}
.border-box{
    box-sizing: border-box;
}
</style>
</head>
<body>
<!-- 标准盒模型 -->
<div class="content-box">
我是content-box
</div>
<!-- 怪异盒模型 -->
<div class="border-box">
我是border-box
</div>
</body>
</html>

这两个盒子中, 使用了 box-sizing:content-box; 属性的就是标准模式, 用了 box-sizing:border-box; 属性的就是怪异模式。

标准盒模型, 标准盒模型这个标准是由 W3C 组织制定的, 现在除了低版本IE以外, 基本所有浏览器都遵循这个标准。

标准盒模型中, width 和 height 属性所指定的宽高就是实际内容区的大小,

而盒子实际大小是: 横向空间:width + padding宽度 + border宽度

纵向空间:height + padding宽度 + border宽度




怪异盒模型, 怪异盒模型是微软在 IE6、7、8 中使用的一种盒模型, 所以也把怪异盒模型叫做 IE盒模型。

在怪异模式下,width 和 height 做指定的宽高就是盒子的实际宽高, 而它内容区部分的大小是在 width 或 height 指定尺寸的基础上, 再减去 border 和 padding 所占的宽度。

页面的加载和渲染全过程 当我们在浏览器里输入一个 URL 后, 最终会呈现一个完整的网页。

这中间会经历如下的过程:

1 HTML 的加载

输入 URL 后, 最先拿到的是 HTML 文件。HTML是一个网页的基础, 所以要在最开始的时候下载它。

HTML下载完成以后就会开始对它进行解析。

2 其他静态资源下载

HTML 在解析的过程中, 如果发现 HTML 文本里面夹杂的一些外部的资源链接, 比如 CSS、JS 和图片等时, 会立即启用别的线程下载这些静态资源。

这里有个特殊的是 JS 文件, 当遇到 JS 文件的时候,HTML 的解析会停下来, 等 JS 文件下载结束并且执行完, HTML 的解析工作再接着来。

这样做是因为 JS 里可能会出现修改已经完成的解析结果, 有白白浪费资源的风险,所以 HTML 解析器干脆等 JS 折腾完了再干。

3 DOM 树构建

在 HTML 解析的同时, 解析器会把解析完的HTML转化成DOM 对象, 再进一步构建 DOM 树。

4 CSSOM 树构建

当 CSS 下载完, CSS 解析器就开始对 CSS 进行解析, 把 CSS 解析成 CSS 对象, 然后把这些 CSS 对象组装起来, 构建出一棵 CSSOM 树。

5 渲染树构建

DOM 树和 CSSOM 树都构建完成以后, 浏览器会根据这两棵树构建出一棵渲染树。

6 布局计算

渲染树构建完成以后,所有元素的位置关系和需要应用的样式就确定了。这时候浏览器会计算出所有元素的大小和绝对位置。

7 渲染

布局计算完成以后,浏览器就可以在页面上渲染元素了。比如从 (x1, y1) 到 (x2, y2)的正方形区域渲染成蓝色。经过渲染引擎的处理后,整个页面就显示在了屏幕上。

内联样式的权重是1000

ID 选择器里样式的权重是100

类选择器、属性选择器和伪类选择器里样式的权重是10

标签选择器里样式的权重是1

通用选择器直接忽略