有的HTML标签都可以看成矩形盒子,由width,height,padding,border构成,称为盒模型。
盒子的总宽度 = width + 左右padding + 左右border
盒子的总高度 = height + 上下pading + 上下border
表示盒子内容的宽度。
width属性的单位通常是px,也会涉及到 百分数、rem等单位。
当块级元素(div,h系列,li 等)没有设置width属性的时候,它将自动撑满,但这并不意味着width可以被继承。
表示盒子内容的高度
height属性的单位通常是px,也会涉及到 百分数、rem等单位
当块级元素(div,h系列,li 等)没有设置height属性的时候,它将自动撑满,但这并不意味着height可以被继承。
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-top | 上 margin,向上扩展 |
margin-right | 右margin, 向右扩展 |
margin-bottom | 下margin, 向下扩展 |
margin-left | 左margin, 向左扩展 |
两个盒子之间的,margin 不会叠加,只以大的margin的值为准。
一些元素都有默认的margin,在开始制作网页的时候,要清除他们,比如 body、ul、p等
实践:盒子实现水平居中的实现方式
<!-- 主要是 auto属性-->
.box1 {
margin: 10px auto;
}
默认值为 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>
块级元素
行内元素
行内块
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盒子的具体属性,比如宽度等信息。
也就是说一个完整的盒子模型大小是由这三个参数值共同决定的。现在我们修改代码:
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
通用选择器直接忽略
*请认真填写需求信息,我们会在24小时内与您取得联系。