您的位置:首页 > Web前端 > CSS

CSS 元素分类 / 盒模型基础 / 深入理解

2017-02-25 10:52 1016 查看

元素分类

在讲解CSS布局之前,我们需要提前知道一些知识,在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素内联元素(又叫行内元素)和内联块状元素

常用的块状元素有:

<div>、<p>、<h1>...<h6>、<ol>、<ul>、<dl>、<table>、<address>、<blockquote> 、<form>


常用的内联元素有:

<a>、<span>、<br>、<i>、<em>、<strong>、<label>、<q>、<var>、<cite>、<code>


常用的内联块状元素有:

<img>、<input>


元素分类 – – 块级元素

什么是块级元素?在html中
<div>、 <p>、<h1>、<form>、<ul>
<li>
就是块级元素。设置
display:block
就是将元素显示为块级元素。如下代码就是将内联元素a转换为块状元素,从而使a元素具有块状元素特点。

a{display:block;}


块级元素特点:

1、每个块级元素都从新的一行开始,并且其后的元素也另起一行。(从左到右撑满页面,一个块级元素独占一行, 触碰到页面边缘时,会自动换行)

2、元素的高度、宽度、行高以及顶和底边距都可设置。

3、元素宽度在不设置的情况下,是它本身父容器的100%(和父元素的宽度一致),除非设定一个宽度。

示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>内联块状元素</title>
<style type="text/css">
div,p{background:pink;}
a{
display:block;
font-weight:20px;
color:red;
background:white;
}
</style>
</head>
<body>
<div>div1</div>
<div>div2</div>
<p>p标签第一段<a>a标签中间段</a>p标签第二段</p>
</body>
</html>




元素分类 – – 内联元素

在html中,
<span>、<a>、<label>、 <strong>
<em>
就是典型的内联元素行内元素)(inline)元素。当然块状元素也可以通过代码 display:inline 将元素设置为 内联元素 。如下代码就是将 块状元素div 转换为 内联元素,从而使 div 元素具有 内联元素 特点。

div{
display:inline;
}

......

<div>我要变成内联元素</div>


内联元素特点:

1、和其他元素都在一行上;

2、元素的高度、宽度及顶部和底部边距不可设置;

3、元素的宽度就是它包含的文字或图片的宽度,不可改变。

小伙伴们你们观查一下示例代码段,有没有发现一个问题,内联元素之间有一个间距问题,这个问题在本小节的 wiki 中有介绍,感兴趣的小伙伴可以去查看。

示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>行内元素标签</title>
<style type="text/css">
a,span,em{
background:pink;/*设置a、span、em标签背景颜色都为粉色*/
}
</style>
</head>
<body>
<a href="http://blog.csdn.net">CSDN论坛</a>
<a href="http://blog.csdn.net/blog751196085">Code_浅蓝</a>
<span>33333</span>
<span>44444</span><em>555555</em><p>
CSDN<a>论坛</a>,Code_浅蓝</p>
</body>
</html>




元素分类 – – 内联块状元素

内联块状元素(inline-block)就是同时具备内联元素、块状元素的特点,代码
display:inline-block
就是将元素设置为内联块状元素。(css2.1新增),
<img>、<input>
标签就是这种内联块状标签。

inline-block 元素特点:

1、和其他元素都在一行上;

2、元素的高度、宽度、行高以及顶和底边距都可设置。

示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>内联块状元素</title>
<style type="text/css">
a, p{
display:inline-block;
width:20px;/*在默认情况下宽度不起作用*/
height:20px;/*在默认情况下高度不起作用*/
background:pink;/*设置背景颜色为粉色*/
text-align:center; /*设置文本居中显示*/
}
</style>
</head>
<body>
<a>1</a>
<a>2</a>
<a>3</a>
<a>4</a>
</body>
</html>


稍微总结下:

块级元素特点:

1、每个块级元素都从新的一行开始,并且其后的元素也另起一行。(真霸道,一个块级元素独占一行)

2、元素的高度、宽度、行高以及顶和底边距都可设置。

3、元素宽度在不设置的情况下,是它本身父容器的100%(和父元素的宽度一致),除非设定一个宽度。

内联元素特点:

1、和其他元素都在一行上;

2、元素的高度、宽度、行高及顶部和底部边距不可设置;

3、元素的宽度就是它包含的文字或图片的宽度,不可改变。

内联块状元素特点:

1、和其他元素都在一行上;

2、元素的高度、宽度、行高以及顶和底边距都可设置。

示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>内联块状元素</title>
<style type="text/css">
a, p, h1{
display:inline-block;
width:20px;/*在默认情况下宽度不起作用*/
height:20px;/*在默认情况下高度不起作用*/
background:pink;/*设置背景颜色为粉色*/
text-align:center; /*设置文本居中显示*/
}
</style>
</head>
<body>
<a>1</a>
<a>2</a>
<a>3</a>
<a>4</a>
<!--//<h1>2222</h1>-->
<p>333</p>
</body>
</html>




盒模型 – – 边框(一)

盒子模型的边框就是围绕着内容及补白的线, 这条线你可以设置它的粗细,样式和颜色(边框三个属性)。

如下面代码为 div 来设置边框粗细为 2px、样式为实心的、颜色为红色的边框:

div{
border:2px  solid  red;
}


上面是 border 代码的缩写形式,可以分开写:

div{
border-width:2px;
border-style:solid;
border-color:red;
}


注意:

1、border-style(边框样式)常见样式有:

dashed(虚线)| dotted(点线)| solid(实线)。

2、border-color(边框颜色)中的颜色可设置为十六进制颜色,如:

border-color:#888;//前面的井号不要忘掉。


3、border-width(边框宽度)中的宽度也可以设置为:

thin | medium | thick(但不是很常用),最常还是用象素(px)。

示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>边框</title>
<style type="text/css">
p{
border:2px dotted #ccc;
}
</style>
</head>
<body>
<h1>勇气</h1>
<p>三年级时,我还是一个胆小如鼠的小女孩,上课从来不敢回答老师提出的问题,生怕回答错了老师会批评我。就一直没有这个勇气来回答老师提出的问题。学校举办的活动我也没勇气参加。</p>
<p>到了三年级下学期时,我们班上了一节公开课,老师提出了一个很简单的问题,班里很多同学都举手了,甚至成绩比我差很多的,也举手了,还说着:"我来,我来。"我环顾了四周,就我没有举手。</p>
</body>
</html>


盒模型 – – 边框(二)

现在有一个问题,如果有想为 p 标签单独设置下边框,而其它三边都不设置边框样式怎么办呢?css 样式中允许只为一个方向的边框设置样式:

div{border-bottom:1px solid red;}


同样可以使用下面代码实现其它三边(上、右、左)边框的设置:

border-top:1px solid red;
border-right:1px solid red;
border-left:1px solid red;


示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>边框</title>
<style type="text/css">
li{
border-bottom:1px dotted #ccc;
}
</style>
</head>
<body>
<ul>
<li>别让不会说话害了你</li>
<li>二十七八岁就应该有的见识</li>
<li>别让不好意思害了你</li>
</ul>
</body>
</html>




盒模型 – – 宽度和高度

盒模型宽度和高度和我们平常所说的物体的宽度和高度理解是不一样的,css内定义的宽(width)和高(height),指的是填充以里的内容范围

因此一个元素实际宽度(盒子的宽度)=左边界+左边框+左填充+内容宽度+右填充+右边框+右边界。



元素的高度也是同理。

比如:

css代码:

div{
width:200px;
padding:20px;
border:1px solid red;
margin:10px;
}


html代码:

<body>
<div>文本内容</div>
</body>


元素的实际长度为:10px+1px+20px+200px+20px+1px+10px=262px。在chrome浏览器下可查看元素盒模型,如下图:



从第一层到第五层依次为:border、content+padding、background-image、background-color、margin。



示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>宽度和高度</title>
<style type="text/css">
li{
border-bottom:1px dotted #ccc;
width:200px; height:30px;
}
</style>
</head>
<body>
<ul>
<li>别让不会说话害了你</li>
<li>二十七八岁就应该有的见识</li>
<li>别让不好意思害了你</li>
</ul>
</body>
</html>




(上面示例,列表项长度为什么这么长啊,不明白同学是不是应该看一看标签分类,li是块状元素,块状元素有一个特点之一:在不设置宽度的情况下,显示为父容器的100%。)

盒模型–填充(padding)

padding基础

元素 内容 与 边框 之间是可以设置距离的,称之为“填充”。填充也可分为上、右、下、左(顺时针)。如下代码:

div{padding:20px 10px 15px 30px;}


顺序一定不要搞混。可以分开写上面代码:

div{
padding-top:20px;
padding-right:10px;
padding-bottom:15px;
padding-left:30px;
}


如果上、右、下、左的填充都为10px;可以这么写

div{padding:10px;}

如果上下填充一样为10px,左右一样为20px,可以这么写:

div{padding:10px 20px;}

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>填充</title>
<style type="text/css">
#box1{
width:100px;
height:100px;
padding:10px;
border:1px solid red;
}
</style>
</head>
<body>
<div id="box1">盒子</div>
</body>
</html>


深入之padding 1、padding与容器的尺寸

对于Block水平元素

padding值暴走,一定会影响尺寸;

width非auto,padding影响尺寸;

width为auto或box-sizing为border-box,

同时padding值没有暴走,不影响尺寸;

对于inline水平元素

水平padding影响尺寸,垂直padding不影响尺寸,但是会影响背景颜色(占据空间)



那么我们要如何利用这个特性呢?



深入之padding 2、padding负值和百分比值

1、关于padding负值

padding不支持负值!

2、关于block水平元素的padding百分比值

padding百分比均是相对于宽度计算的

div{padding: 50%} 轻松实现一个正方形


3、关于inline水平元素的padding百分比值

1. 同样相对于宽度计算
2. 默认的高宽度细节有差异
3. padding会端行


空inline元素+padding高宽也不相等

为什么会有额外的高度?

inline元素的垂直padding会让"空白节点"显现,也就是规范中的"strut"出现。


深入之padding 3、标签元素的内置padding

1.ol/ul(有序/无序)列表

1. ol/li元素内置padding-left,但是单位是px不是em;

元素很多内置padding/margin单位是em值,尤其是margin基本上是em值,也就是说相对于文字本身大小的;

2. 例如Chrome浏览器下是40px;

3. 所以如果字体很小,间距就会很开;

4. 所以若果字体很大,序号会爬到容器外面;


(平时开发font-size:是12/14,padding-left:22/25px相对合适)


2.表单元素的内置padding

所有浏览器input/textarea输入框内置padding

所有浏览器button按钮内置padding

部分浏览器select下拉内置padding。如FrieFox IE8+可以设置padding

所有浏览器radio/chexkbox单复选框无内置padding

button按钮元素的padding最难控制!

3.button表单按钮padding

Chrome浏览器(✅)

FireFox浏览器

设置:
padding:0
左右依然有padding

设置:
button : : -moz-focus-inner {padding:0}
这样才能够没有padding值

IE浏览器

IE7文字越多,左右padding逐渐变大!

button { overflw: visible;}


padding与高度计算的不兼容

button {
line—height: 20px;
padding: 10px;
border: none;
}


IE7: 45px; ❓

IE8+: 40px; ✅

FireFox: 42px; ❓

Chrome: 40px;✅

个人建议:

<button id="btn"></button>
<label for="btn">按钮</label>


label {
dispaly: inline-block;
line-height: 20px;
padding: 10px
}


IE7: 40px; ✅

IE8+: 40px; ✅

FireFox: 40px; ✅

Chrome: 40px;✅

深入之padding 4、padding与图形绘制

直接上代码

案例一(不借助伪元素实现三杠)

<div class="line-tri"></div>


.line-tri {
width: 150px; height 30px;
padding:15px 0;                 /*透明区域*/
border-top: 30px solid;         /*上边框*/
border-bottom: 30px solid;      /*下边框*/
background-color: currentColor; /*中间背景色*/
background-clip: current-box;   /*重点: 可以让背景色只会在内容区域显示*/
}




案例二

<div class="eye"></div>


.eye {
width: 150px; height: 150px;
padding: 10px;
border: 10px solid;
barder-radius: 50%;
background-color: currentColor;
background-clip: current-box;
}




深入之padding 5、padding布局实战

使用百分比单位构建固定比例布局结构

正方形

配合margin等高布局



盒模型– –边界

元素与其它元素之间的距离可以使用边界(margin)来设置。边界也是可分为上、右、下、左。如下代码:

div{margin:20px 10px 15px 30px;}

也可以分开写:

div{
margin-top:20px;
margin-right:10px;
margin-bottom:15px;
margin-left:30px;
}


如果上右下左的边界都为10px;可以这么写:

div{ margin:10px;}

如果上下边界一样为10px,左右一样为20px,可以这么写:

div{ margin:10px 20px;}

总结一下:padding和margin的区别,padding在边框里,margin在边框外。

示例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>边距</title>
<style type="text/css">
div{
width:100px;
height:100px;
border:1px solid red;
/*margin:10px;*/
margin-bottom:10px;
}
</style>
</head>
<body>
<div id="box1">box1</div>
<div id="box2">box2</div>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: