CSS3 基本语法 | 前端

208 阅读35分钟

1 CSS3 基本知识

1.1 认识 CSS 样式

CSS全称为 “层叠样式表 (Cascading Style Sheets)” ,它主要是用于定义 HTML 内容在浏览器内的显示样式,如文字大小、颜色、字体加粗等。

如下列代码:

p {
   font-size: 12px;
   color: red;
   font-weight: bold;
}

使用 CSS 样式的一个好处是通过定义某个样式,可以让不同网页位置的文字有着统一的字体、字号或者颜色等。

CSS 样式的优势:

为什么使用 CSS 样式来设置网页的外观样式呢?右边编辑器是一段文字,我们想把 “居基于面向的设计模式”、“sh设计模式” 这两个短语的文本颜色设置为红色,这时就可以通过设置样式来设置,而且只需要编写一条 CSS 样式语句。

第一步:把这两个短语用括起来。

第二步:写入下列代码:

span{
    color: red;
}

完整样例代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>CSS样式的优势</title>
    <style type="text/css">
    span {
        color: red;
    }
    </style>
</head>

<body>
    <p>本节课将给大家带来传统的<sapn>基于面向的设计模式</sapn>在前端中的应用场景,哪些是已经过时的,哪些是已经在语言中内置的,让大家对<span>设计模式</span>是什么有一个理解。</p>
</body>

</html>

1.2 CSS 代码语法

CSS 样式由选择符声明组成,而声明又由属性组成,如下图所示:

选择符: 又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素(如 ol )不会受到影响。

声明: 在英文大括号 “ {} ” 中的就是声明,属性和值之间用英文冒号 “ : ” 分隔。当有多条声明时,中间可以英文分号 “ ; ” 分隔,如下所示:

p { font-size: 12px; color: red; }

注意:

  1. 最后一条声明可以没有分号,但是为了以后修改方便,一般也加上分号。

  2. 为了使用样式更加容易阅读,可以将每条代码写在一个新行内,如下所示:

p {
   font-size: 12px;
   color: red;
}

CSS 注释代码:

就像在 HTML 的注释一样,在 CSS 中也有注释语句:用 /*注释语句*/ 来标明(HTML 中使用 <!--注释语句--> )。就像下面代码:

1.3 CSS 链接方式

从 CSS 样式代码插入的形式来看基本可以分为以下 3 种:内联式、嵌入式和外部式三种。

内联

内联式 CSS 样式表就是把 CSS 代码直接写在现有的 HTML 标签中,如下面代码:

<p style="color:red">这里文字是红色。</p>

注意要写在元素的开始标签里,下面这种写法是错误的:

<p>这里文字是红色。</p style="color:red">

并且 CSS 样式代码要写在 style="" 双引号中,如果有多条 CSS 样式代码设置可以写在一起,中间用分号隔开。如下代码:

<p style="color:red`;`font-size:12px">这里文字是红色。</p>

嵌入

嵌入式 CSS 样式,就是可以把 CSS 样式代码写在 <style type="text/css"></style> 标签之间。如下面代码实现把三个 <span> 标签中的文字设置为红色:

<style type="text/css">
span{
	color:red;
}
</style>

嵌入式 CSS 样式必须写在 <style></style> 之间,并且一般情况下嵌入式 CSS 样式写在 <head></head> 之间。如下代码所示:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>嵌入式css样式</title>
    <style type="text/css">
    span {
        color: blue;
    }
    </style>
</head>

<body>
    <p>本节课将给大家带来传统的<sapn>基于面向的设计模式</sapn>在前端中的应用场景,哪些是已经过时的,哪些是已经在语言中内置的,让大家对<span>设计模式</span>是什么有一个理解。</p>
</body>

</html>

外联

外部式 CSS 样式(也可称为外联式)就是把 CSS 代码写一个单独的外部文件中,这个 CSS 样式文件以 .css 为扩展名,在 <head> 内(不是在 <style> 标签内)使用 <link> 标签将 CSS 样式文件链接到 HTML 文件内,如下面代码:

<link href="base.css" rel="stylesheet" type="text/css" />

注意:

  1. CSS 样式文件名称以有意义的英文字母命名,如 main.css 。

  2. rel="stylesheet" type="text/css" 是固定写法不可修改。

  3. <link> 标签位置一般写在 <head> 标签之内。

三种链接方式的优先级

如果有一种情况:对于同一个元素我们同时用了三种方法设置 CSS 样式,那么哪种方法真正有效呢?考虑以下代码:

index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>css3中三种引入样式优先级</title>
    <link href="style.css" rel="stylesheet" type="text/css">
    <style type="text/css">
    span {
        color: red;
    }
    </style>
</head>

<body>
    <p>本节课将给大家带来传统的<span style="color:pink">基于面向的设计模式</sapn>在前端中的应用场景,哪些是已经过时的,哪些是已经在语言中内置的,让大家对<span>设计模式</span>是什么有一个理解。</p>
</body>
</html>

style.css

span{
   color:blue;
}
  1. 使用内联式 CSS 设置 “超酷的互联网” 文字为粉色。

  2. 然后使用嵌入式 CSS 来设置文字为红色。

  3. 最后又使用外部式设置文字为蓝色(style.css 文件中设置)。

但最终你可以观察到 “基于面向的设计模式” 这个短词的文本被设置为了粉色。因为这三种样式是有优先级的,记住他们的优先级:内联式 > 嵌入式 > 外部式

但是嵌入式 > 外部式有一个前提:嵌入式 CSS 样式的位置一定在外部式的后面。

<link href="style.css" ...> 代码在 <style type="text/css">...</style> 代码的前面(实际开发中也是这么写的)。把它们调换顺序,他们的优先级会变化。

其实总结来说,就是 —— 就近原则(离被设置元素越近优先级别越高)。

但注意上面所总结的优先级是有一个前提:内联式、嵌入式、外部式样式表中 CSS 样式是在的相同权值的情况下。

2 CSS3 选择器

每一条css样式声明(定义)由两部分组成,形式如下:

selector {
    attribute;
}

在 {} 之前的部分就是 “选择器” , “选择器” 指明了 {} 中的 “样式” 的作用对象,也就是 “样式” 作用于网页中的哪些元素。

2.1 标签选择器

标签选择器其实就是 HTML 代码中的标签。如 <html><body><h1><p><img>

例如下面代码:

p {
	font-size: 12px;
	line-height: 1.6em;
}

上面的 CSS 样式代码的作用:为 p 标签设置 12px 字号,行间距设置 1.6em 的样式。

2.2 类选择器

类选择器在 CSS 样式编码中是最常用到的。

语法:

.classname {
	attribute;
}

注意:

  1. 英文圆点开头

  2. 其中类选器名称可以任意起名(但不能起中文)

使用方法:

  1. 使用合适的标签把要修饰的内容标记起来,如下:
<span>胆小如鼠</span>
  1. 使用 class="类选择器名称" 为标签设置一个类,如下:
<span class="stress">胆小如鼠</span>
  1. 设置类选器 CSS 样式,如下:
.stress { /*类前面要加入一个英文圆点*/
	color: red;
}

2.3 ID 选择器

这一小节我们来学习ID选择器了,那么ID选择器如何使用呢?

我们也能实现让div字体变成红色的效果:

技术点的解释:

  1. 使用 ID 选择器,必须给标签添加上 id 属性,为标签设置 id="ID名称" ,而不是 class="calssname"。

  2. ID 选择符的前面是井号 # ,而不是英文圆点 . 。

  3. id 属性的值既为当前标签的 id ,尽量见名思意,语义化。

类和 ID 选择器的区别

相同点:

可以应用于任何元素

不同点:

  1. ID选择器只能在文档中使用一次。与类选择器不同,在一个 HTML 文档中,ID 选择器只能使用一次,而且仅一次。而类选择器可以使用多次。

下面代码是正确的:

 <p>三年级时,我还是一个<span class="stress">胆小如鼠</span>的小女孩,上课从来不敢回答老师提出的问题,生怕回答错了老师会批评我。就一直没有这个<span class="stress">勇气</span>来回答老师提出的问题。</p>

而下面代码是错误的:

 <p>三年级时,我还是一个<span id="stress">胆小如鼠</span>的小女孩,上课从来不敢回答老师提出的问题,生怕回答错了老师会批评我。就一直没有这个<span id="stress">勇气</span>来回答老师提出的问题。</p>
  1. 可以使用类选择器词列表方法为一个元素同时设置多个样式。我们可以为一个元素同时设多个样式,但只可以用类选择器的方法实现,ID 选择器是不可以的(不能使用 ID 词列表)。

下面的代码是正确的:

.stress {
    color: red;
}

.bigsize {
    font-size: 25px;
}

<p>到了<span class="stress bigsize">三年级</span>下学期时,我们班上了一节公开课...</p>

上面代码的作用是为 “三年级” 三个文字设置文本颜色为红色并且字号为 25px 。

下面的代码是不正确的:

#stressid{
    color: red;
}

#bigsizeid{
    font-size: 25px;
}

<p>到了<span id="stressid bigsizeid">三年级</span>下学期时,我们班上了一节公开课...</p>

上面代码不可以实现为 “三年级” 三个文字设置文本颜色为红色并且字号为 25px 的作用。

2.4 子选择器

还有一个比较有用的选择器子选择器,即大于符号 > ,用于选择指定标签元素的第一代子元素。如右侧代码编辑器中的代码:

.food > li {
	border:1px solid red;
}

这行代码会使 class 名为 food 下的子元素 li(水果、蔬菜)加入红色实线边框。

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>子选择器</title>
    <style type="text/css">
    /*添加边框样式(粗细为1px, 颜色为红色的实线)*/

    .food > li {
        border: 1px solid red;
    }
    .first > span {
        border: 1px solid red;
    }
    .first > span > span {
        color: blue;
    }
    </style>
</head>

<body>
    <p class="first">三年级时,<span>我还是一个<span>胆小如鼠</span>的小女孩</span>,上课从来不敢回答老师提出的问题,生怕回答错了老师会批评我。就一直没有这个勇气来回答老师提出的问题。学校举办的活动我也没勇气参加。</p>
    <h1>食物</h1>
    <ul class="food">
        <li>水果
            <ul>
                <li>香蕉</li>
                <li>苹果</li>
                <li></li>
            </ul>
        </li>
        <li>蔬菜
            <ul>
                <li>白菜</li>
                <li>油菜</li>
                <li>卷心菜</li>
            </ul>
        </li>
    </ul>
</body>

</html>

发现子选择器符号还可以叠加。

2.5 后代选择器

包含选择器,即加入空格,用于选择指定标签元素下的后辈元素

.first span {
	color:red;
}

这行代码会使第一段文字内容中的 “胆小如鼠” 字体颜色变为红色。

请注意这个选择器与子选择器的区别,子选择器(child selector)仅是指它的直接后代,或者你可以理解为作用于子元素的第一代后代。

而后代选择器是作用于所有子后代元素。后代选择器通过空格来进行选择,而子选择器是通过 “>” 进行选择。

总结: > 作用于元素的第一代后代,空格 作用于元素的所有后代。

2.6 通用选择器

通用选择器是功能最强大的选择器,它使用一个 * 号指定,它的作用是匹配 HTML 中所有标签元素,如下使用下面代码使用 HTML 中任意标签元素字体颜色全部设置为红色:

* {
	color: red;
}

2.7 伪类选择器

伪类选择符允许给 HTML 不存在的标签(标签的某种状态)设置样式,比如说我们给 HTML 中一个标签元素的鼠标悬停的状态来设置字体颜色:

a:hover {
	color: red;
}

上面一行代码就是为 a 标签鼠标滑过的状态设置字体颜色变红。这样就会使第一段文字内容中的 “胆小如鼠” 文字加入鼠标鼠标悬停时字体颜色变为红色特效。

关于伪选择符:

关于伪类选择符,到目前为止,可以兼容所有浏览器的 “伪类选择符” 就是 a 标签上使用 :hover 了(其实伪类选择符还有很多,尤其是 CSS3 中,但是因为不能兼容所有浏览器,本教程只是讲了这一种最常用的)。其实 :hover 可以放在任意的标签上,比如说 p:hover ,但是它们的兼容性也是很不好的,所以现在比较常用的还是 a:hover 的组合。

2.8 分组选择器

当你想为 HTML 中多个标签元素设置同一个样式时,可以使用分组选择符 , ,如下代码为右侧代码编辑器中的 h1、span 标签同时设置字体颜色为红色:

h1, span {
	color: red;
}

它相当于下面两行代码:

h1 {
	color: red;
}
span {
	color: red;
}

下面例子把第一段全部文字颜色设置为绿色同时把第二段文字中的“简单”文字颜色设置为绿色,同时用到了分组选择器和子选择器:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>分组选择符</title>
    <style type="text/css">
        .first, #second > span {
            color: green;
        }
    </style>
</head>
<body>
    <h1>勇气</h1>
    <p class="first">三年级时,我还是一个<span>胆小如鼠</span>的小女孩,上课从来不敢回答老师提出的问题,生怕回答错了老师会批评我。就一直没有这个勇气来回答老师提出的问题。学校举办的活动我也没勇气参加。</p>
    <p id="second">到了三年级下学期时,我们班上了一节公开课,老师提出了一个很<span>简单</span>的问题,班里很多同学都举手了,甚至成绩比我差很多的,也举手了,还说着:"我来,我来。"我环顾了四周,就我没有举手。</p>
    <img src="http://img.mukewang.com/52b4113500018cf102000200.jpg">
</body>
</html>

3 CSS3 的继承,优先级和重要性

3.1 样式的继承

CSS 的某些样式是具有继承性的,继承是一种规则,它允许样式不仅应用于某个特定 HTML 标签元素,而且应用于其后代。比如下面代码:如某种颜色应用于 p 标签,这个颜色设置不仅应用 p 标签,还应用于 p 标签中的所有子元素文本,这里子元素为 span 标签。

p {
	color: red;
}

<p>三年级时,我还是一个<span>胆小如鼠</span>的小女孩。</p>

结果 p 中的文本与 span 中的文本都设置为了红色。

但注意有一些 CSS 样式是不具有继承性的。如 border:1px solid red;

p {
	border: 1px solid red;
}

<p>三年级时,我还是一个<span>胆小如鼠</span>的小女孩。</p>

在上面例子中它代码的作用只是给 p 标签设置了边框为 1 像素、红色、实心边框线,而对于子元素 span 是没用起到作用的。

3.2 选择器的优先级

之前已经学过了很多 CSS3 选择器了,但是每个选择器是有优先级的。接下来学习 CSS3 中选择器的优先级。

先来看一个例子:

技术点的解释:

  1. 如果一个元素使用了多个选择器,则会按照选择器的优先级来给定样式。

  2. 选择器的优先级依次是: 内联样式 > id选择器 > 类选择器 > 标签选择器 > 通配符选择器

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>css3选择器优先级</title>
    <style type="text/css">
        #mydiv {
            color: orange;
        }
        .d {
            color: yellow;
        }
        div {
            color: green;
        }
        * {
            color: blue;
        }
    </style>
</head>
<body>
    <div class="d" id="mydiv" style="color: red">
        我是一个div
    </div>
</body>
</html>

style="" > # > . > tagname > *

3.3 特殊性

有的时候我们为同一个元素设置了不同的 CSS 样式代码,那么元素会启用哪一个CSS样式呢?下面我们一起来看一下代码:

p {color:red;}
.first {color:green;}
<p class="first">三年级时,我还是一个<span>胆小如鼠</span>的小女孩。</p>

p 和 .first 都匹配到了 p 这个标签上,green是正确的颜色,因为浏览器是根据权值来判断使用哪种 CSS 样式的,权值高的就使用哪种 CSS 样式。

下面是权值的规则:

标签的权值为 1 ,类选择符的权值为 10 ,ID 选择符的权值最高为100。

例如下面的代码:

p{color:red;} /*权值为1*/
p span{color:green;} /*权值为1+1=2*/
.warning{color:white;} /*权值为10*/
p span.warning{color:purple;} /*权值为1+1+10=12*/
#footer .note p{color:yellow;} /*权值为100+10+1=111*/

注意:还有一个权值比较特殊——继承也有权值但很低,有的文献提出它只有 0.1,所以可以理解为继承的权值最低。

3.4 选择器最高层级 !important

我们在做网页代码的时,有些特殊的情况需要为某些样式设置具有最高权值,这时候可以使用 !important 来解决。

如下代码:

p {
	color: red !important;
}
p {
	color:green;
}
<p class="first">三年级时,我还是一个<span>胆小如鼠</span>的小女孩。</p>

这时 p 段落中的文本会显示的 red 红色。

注意: !important 要写在分号的前面

这里注意当网页制作者不设置 CSS 样式时,浏览器会按照自己的一套样式来显示网页。并且用户也可以在浏览器中设置自己习惯的样式,比如有的用户习惯把字号设置为大一些,使其查看网页的文本更加清楚。这时注意样式优先级为:浏览器默认的样式 < 网页制作者样式 < 用户自己设置的样式,但记住 !important 优先级样式是个例外,权值高于用户自己设置的样式。

4 CSS3 字体样式

4.1 字体族

我们可以使用 CSS 样式为网页中的文字设置字体、字号、颜色等样式属性。下面我们来看一个例子,下面代码实现:为网页中的文字设置字体为宋体。

body {
	font-family: "宋体";
}

这里注意不要设置不常用的字体,因为如果用户本地电脑上如果没有安装你设置的字体,就会显示浏览器默认的字体。(因为用户是否可以看到你设置的字体样式取决于用户本地电脑上是否安装你设置的字体。)

现在一般网页喜欢设置 “微软雅黑” ,如下代码:

body {
	font-family: "Microsoft Yahei";
}

body {
	font-family: "微软雅黑";
}

注意:第一种方法比第二种方法兼容性更好一些。

因为这种字体即美观又可以在客户端安全的显示出来(用户本地一般都是默认安装的)。

4.2 字体大小

可以使用下面代码设置网页中文字的字号为 12 像素:

body {
	font-size: 12px;
}

4.3 字体粗细

我们还可以使用 CSS 样式来改变文字的样式:粗体、斜体、下划线、删除线,可以使用下面代码实现设置文字以粗体样式显示出来。

p span {
	font-weight: bold;
}

在这里大家可以看到,如果想为文字设置粗体是有单独的 CSS 样式来实现的,再不用为了实现粗体样式而使用 h1 - h6 或 strong 标签了。

4.4 多种样式

接下来学习设置字体样式 font-style 属性,比如我们想实现以下效果:

如果想实现以上效果,我们可以输入以下代码:

技术点的解释:

  1. font-style 可以设置字体样式,并且有种 3 设置方式。

  2. 正常字体为 normal ,也是 font-style 的默认值。

  3. italic 为设置字体为斜体,用于字体本身就有倾斜的样式。

  4. oblique 为设置倾斜的字体,强制将字体倾斜。

4.5 字体颜色

有时候当我们需要给字体设置颜色,比如实现以下效果:

那么我们可以输入以下代码:

技术点的解释:

  1. color 属性可以设置字体颜色。

  2. color 的值有 3 种设置方式:

  • 英文命令颜色,如:
p {
	color: red;
}
  • RGB颜色:这个与 photoshop 中的 RGB 颜色是一致的,由 R(red)、G(green)、B(blue) 三种颜色的比例来配色。每一项的值可以是 0~255 之间的整数,也可以是 0%~100% 的百分数。如:
p {
	color: rgb(133,45,200);
}

p {
	color: rgb(20%,33%,25%);
}
  • 十六进制颜色:这种颜色设置方法是现在比较普遍使用的方法,其原理其实也是 RGB 设置,但是其每一项的值由 0-255 变成了十六进制 00-ff。
p {
	color: #00ffff;
}

配色表:

三种不同方式设置红色:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>color颜色</title>
    <style type="text/css">
        a.keyvalue {
            color: red;
        }
        a.rgb {
            color: rgb(255, 0, 0);
        }
        a.hexadecimal {
            color: #ff0000ff;
        }
    </style>
</head>

<body>
    <a class="keyvalue">方式一</a>
    <a class="rgb">方式二</a>
    <a class="hexadecimal">方式三</a>
</body>

</html>

4.6 字体样式简写

网页中的字体 CSS 样式代码也有他自己的缩写方式,下面是给网页设置字体的代码:

body{
    font-style:italic;
    font-weight:bold; 
    font-size:12px; 
    line-height:1.5em; 
    font-family:"宋体",sans-serif;
}

这么多行的代码其实可以缩写为一句:

body {
    font:italic bold 12px/1.5em "宋体", sans-serif;
}

注意:

  1. 使用这一简写方式你至少要指定 font-size 和 font-family 属性,其他的属性(如 font-weight、font-style、font-variant、line-height )如未指定将自动使用默认值。

  2. 在缩写时 font-size 与 line-height 中间要加入 “/” 斜扛。

一般情况下因为对于中文网站,英文还是比较少的,所以下面缩写代码比较常用:

body{
    font: 12px/1.5em "宋体", sans-serif;
}

只是有字号、行间距、中文字体、英文字体设置。

5 CSS3 文本样式

5.1 文本修饰

想实现以下效果:

想要实现以上效果,我们可以输入以下代码:

技术点的解释:

  1. text-decoration 可以设置添加到文本的修饰。

  2. text-decoration 默认值为 none ,定义标准的文本。

  3. text-decoration 的值为 underline 为定义文本下的一条线。

  4. text-decoration 的值为 overline 为定义文本上的一条线。

  5. text-decoration 的值为 line-through 为定义穿过文本下的一条线,一般用于商品折扣价。

5.2 首行缩进

中文文字中的段前习惯空两个文字的空白,这个特殊的样式可以用下面代码来实现:

p {
	text-indent: 2em;
}

<p>1922年的春天,一个想要成名名叫尼克卡拉威(托比?马奎尔Tobey Maguire 饰)的作家,离开了美国中西部,来到了纽约。那是一个道德感渐失,爵士乐流行,走私为王,股票飞涨的时代。为了追寻他的美国梦,他搬入纽约附近一海湾居住。</p>

注意:2em的意思就是文字的2倍大小。

5.3 行间间距

这行间距(行高)属性( line-height ),如下代码实现设置段落行间距为 1.5 倍。

p {
	line-height: 1.5em;
}

<p>菲茨杰拉德,二十世纪美国文学巨擘之一,兼具作家和编剧双重身份。他以诗人的敏感和戏剧家的想象为"爵士乐时代"吟唱华丽挽歌,其诗人和梦想家的气质亦为那个奢靡年代的不二注解。</p>

5.4 字符间距

中文字间隔、字母间隔设置:

如果想在网页排版中设置文字间隔或者字母间隔就可以使用 letter-spacing 来实现,如下面代码:

h1{
    letter-spacing: 50px;
}
...
<h1>了不起的盖茨比</h1>

注意:这个样式使用在英文单词时,是设置字母与字母之间的间距。

单词间距设置

如果我想设置英文单词之间的间距呢?可以使用 word-spacing 来实现。如下代码:

h1{
    word-spacing: 50px;
}
...
<h1>welcome to css!</h1>

5.5 文本对齐

想为块状元素中的文本、图片设置居中样式吗?可以使用 text-align 样式代码,如下代码可实现文本居中显示。

h1{
    text-align:center;
}
<h1>了不起的盖茨比</h1>

同样可以设置居左:

h1{
    text-align:left;
}
<h1>了不起的盖茨比</h1>

还可以设置居右:

h1{
    text-align:right;
}
<h1>了不起的盖茨比</h1>

5.6 长度值

长度单位总结一下,目前比较常用到 px(像素)、em、% 百分比,要注意其实这三种单位都是相对单位。

1、像素

像素为什么是相对单位呢?因为像素指的是显示器上的小点(CSS规范中假设“90像素=1英寸”)。实际情况是浏览器会使用显示器的实际像素值有关,在目前大多数的设计者都倾向于使用像素(px)作为单位。

2、em

就是本元素给定字体的 font-size 值,如果元素的 font-size 为 14px ,那么 1em = 14px;如果 font-size 为 18px,那么 1em = 18px。如下代码:

p {
	font-size:12px;
	text-indent:2em;
}

上面代码就是可以实现段落首行缩进 24px(也就是两个字体大小的距离)。

下面注意一个特殊情况:

但当给 font-size 设置单位为 em 时,此时计算的标准以 p 的父元素的 font-size 为基础。如下代码:

html:

<p>以这个<span>例子</span>为例。</p>

css:

p {
	font-size:14px;
}
span {
	font-size:0.8em;
}

结果 span 中的字体“例子”字体大小就为 11.2px(14 * 0.8 = 11.2px)。

3、百分比

p {
	font-size:12px;
	line-height:130%;
}

设置行高(行间距)为字体的130%(12 * 1.3 = 15.6px)。

6 CSS3 盒模型

6.1 元素分类

在讲解 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% (和父元素的宽度一致),除非设定一个宽度。

内联元素

在 HTML 中,<span><a><label><strong><em> 就是典型的内联元素行内元素 inline)元素。

当然块状元素也可以通过代码 display:inline 将元素设置为内联元素

如下代码就是将块状元素div转换为内联元素,从而使 div 元素具有内联元素特点。

 div{
     display:inline;
 }

......

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

内联元素特点:

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

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

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

内联块状元素

内联块状元素(inline-block) 就是同时具备内联元素、块状元素的特点。

代码 display:inline-block 就是将元素设置为内联块状元素。

<img><input>标签就是这种内联块状标签。

内联块状元素特点:

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

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

不占据位置

display:none 设置此元素不会被显示,当想要元素隐藏的时候可以使用此值。

<style type="text/css">
    p {
        display: none;
    }
</style>

<p>我爱学习</p>

6.2 盒模型

6.3 宽度和高度

盒模型宽度和高度和我们平常所说的物体的宽度和高度理解是不一样的,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浏览器下可查看元素盒模型,如下图:

块状元素有一个特点之一:在不设置宽度的情况下,显示为父容器的100%

6.4 背景色

网页中的标签不论是行内元素还是块状元素都可以给它设置一个背景色。

为标签设置背景颜色可以使 background-color:颜色值 来实现。

例子如下:

div {
	background-color: red;
} //为块状元素设置
a {
	background-color: green;
} //为行内元素设置

6.5 边框

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

如下面代码为 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; //前面的井号不要忘掉。
  1. border-width(边框宽度)中的宽度也可以设置为:

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

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

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

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

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

6.6 圆角边框

元素边框的圆角效果可以使用 border-radius 属性来设置。圆角可分为左上、右上、右下、左下。如下代码:

 div {
	 border-radius: 20px 10px 15px 30px;
 }

效果:

也可以分开写:

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

如果四个圆角都为10px;可以这么写:

div {
	border-radius:10px;
}

如果左上角和右下角圆角效果一样为 10px ,右上角和左下角圆角一样为 20px (对角线),可以这么写:

div {
	border-radius:10px 20px;
}

需要特别注意的:一个正方形,当设置圆角效果值为元素宽度一半时,显示效果为圆形。例如:

div {
    width: 200px;
    height: 200px;
    border: 5px solid red;
    border-radius: 100px;
}

效果:

也可以写为百分比50%

div {
    width: 200px;
    height: 200px;
    border: 5px solid red;
    border-radius: 100px;
}

6.7 内边距

元素内容与边框之间是可以设置距离的,称之为 “内边距(填充)” 。

填充也可分为上、右、下、左(顺时针)。如下代码:

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;
}

6.8 外边距

元素与其它元素之间的距离可以使用边界(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 在边框外。

7 CSS3 布局模型

清楚了 CSS3 盒模型的基本概念、 盒模型类型, 我们就可以深入探讨网页布局的基本模型了。

布局模型与盒模型一样都是 CSS3 最基本、 最核心的概念。 但布局模型是建立在盒模型基础之上,又不同于我们常说的 CSS3 布局样式或 CSS3 布局模板。如果说布局模型是本,那么 CSS3 布局模板就是末了,是外在的表现形式。 

CSS3 包含 3 种基本的布局模型,用英文概括为:Flow、Layer 和 Float。

在网页中,元素有三种布局模型:

  1. 流动模型(Flow)
  2. 浮动模型 (Float)
  3. 层模型(Layer)

7.1 流动模型

流动(Flow)是默认的网页布局模式。也就是说网页在默认状态下的 HTML 网页元素都是根据流动模型来分布网页内容的。

流动布局模型具有 2 个比较典型的特征:

第一点,块状元素都会在所处的包含元素内自上而下按顺序垂直延伸分布,因为在默认状态下,块状元素的宽度都为 100% 。实际上,块状元素都会以行的形式占据位置。

第二点,在流动模型下,内联元素都会在所处的包含元素内从左到右水平分布显示。

7.2 浮动模型

块状元素都是独占一行,如果现在我们想让两个块状元素并排显示,设置元素浮动就可以实现。

任何元素在默认情况下是不能浮动的,但可以用 CSS 定义为浮动,如 div、p、table、img 等元素都可以被定义为浮动。如下代码可以实现两个 div 元素一行显示。

div {
    width:200px;
    height:200px;
    border:2px red solid;
    float:left;
}

效果图

同时设置两个元素右浮动也可以实现一行显示。

div {
    width:200px;
    height:200px;
    border:2px red solid;
    float:right;
}

效果图

设置两个元素一左一右可以实现一行显示:

div{
    width:200px;
    height:200px;
    border:2px red solid;
}
#div1{float:left;}
#div2{float:right;}

效果图

7.3 层模型

层布局模型就像是图像软件 PhotoShop 中的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧。但是在网页上局部使用层布局还是有其方便之处的。

如何让 HTML 元素在网页中精确定位,就像图像软件 PhotoShop 中的图层一样可以对每个图层能够精确定位操作。CSS定义了一组定位(positioning)属性来支持层布局模型。

层模型有三种形式:

1、绝对定位 (position: absolute)

2、相对定位 (position: relative)

3、固定定位 (position: fixed)

绝对定位

如果想为元素设置层模型中的绝对定位,需要设置 position:absolute (表示绝对定位),这条语句的作用将元素从文档流中拖出来,然后使用 left、right、top、bottom 属性相对于其最接近的一个具有定位属性的父包含块进行绝对定位。如果不存在这样的包含块,则相对于 body 元素,即相对于浏览器窗口

如下面代码可以实现 div 元素相对于浏览器窗口向右移动 100px ,向下移动 50px 。

div{
    width:200px;
    height:200px;
    border:2px red solid;
    position:absolute;
    left:100px;
    top:50px;
}

效果如下:

设置 div 标签相对于浏览器,(相对于以前位置右上角)向左移动 100px ,向下移动20px 。

div {
    width: 200px;
    height: 200px;
    border: 2px red solid;
    position: absolute;
    right: 100px;
    top: 20px;
}

效果图如下:

相对定位

如果想为元素设置层模型中的相对定位,需要设置 position: relative (表示相对定位),它通过 left、right、top、bottom 属性确定元素在正常文档流中的偏移位置。

相对定位完成的过程是首先按 static (float) 方式生成一个元素(并且元素像层一样浮动了起来),然后相对于以前的位置移动,移动的方向和幅度由 left、right、top、bottom 属性确定,偏移前的位置保留不动。

如下代码实现相对于以前位置向下移动 50px ,向右移动 100px

#div1 {
    width:200px;
    height:200px;
    border:2px red solid;
    position:relative;
    left:100px;
    top:50px;
}

<div id="div1"></div>

效果图:

什么叫做 “偏移前的位置保留不动” 呢?

可以做一个实验,在 div 标签的后面加入一个 span 标签,并在 span 标签中写入一些文字。如下代码:

<body>
    <div id="div1"></div><span>偏移前的位置还保留不动,覆盖不了前面的div没有偏移前的位置</span>
</body>

效果图:

从效果图中可以明显的看出,虽然 div 元素相对于以前的位置产生了偏移,但是 div 元素以前的位置还是保留着,所以后面的 span 元素是显示在了 div 元素以前位置的后面。

固定定位

fixed:表示固定定位,与 absolute 定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身。

由于视图本身是固定的,它不会随浏览器窗口的滚动条滚动而变化,除非你在屏幕中移动浏览器窗口的屏幕位置,或改变浏览器窗口的显示大小,因此固定定位的元素会始终位于浏览器窗口内视图的某个位置,不会受文档流动影响,这与 background-attachment: fixed; 属性功能相同。

以下代码可以实现相对于浏览器视图向右移动 100px ,向下移动 50px 。并且拖动滚动条时位置固定不变。

#div1{
    width:200px;
    height:200px;
    border:2px red solid;
    position:fixed;
    left:100px;
    top:50px;
}
<p>文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本。</p>
....

固定定位可以用来做网页的导航栏。

相对前辈元素定位

使用 position:absolute 可以实现被设置元素相对于浏览器(body)设置定位以后,大家有没有想过可不可以相对于其它元素进行定位呢?

答案是肯定的。使用 position:relative 来帮忙,但是必须遵守下面规范:

  1. 参照定位的元素必须是相对定位元素的前辈元素:
<div id="box1"><!--参照定位的元素-->
    <div id="box2">相对参照元素进行定位</div><!--相对定位元素-->
</div>

从上面代码可以看出 box1 是 box2 的父元素(父元素当然也是前辈元素了)。

  1. 参照定位的元素必须加入 position:relative;
#box1 {
    width:200px;
    height:200px;
    position:relative;        
}
  1. 定位元素加入 position:absolute ,便可以使用 top、bottom、left、right 来进行偏移定位了。
#box2 {
    position:absolute;
    top:20px;
    left:30px;         
}

这样 box2 就可以相对于父元素 box1 定位了(这里注意参照物就可以不是浏览器了,而可以自由设置了)。

7.5 弹性盒模型

flex 属性

先看下面的例子:

实现上图效果,我们需要输入以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>flex布局</title>
    <style type="text/css">
    .box {
        background: blue;
        display: flex;
    }

    .box div {
        width: 200px;
        height: 200px;
    }

    .box1 {
        background: red;
    }

    .box2 {
        background: orange;
    }

    .box3 {
        background: green;
    }
    </style>
</head>

<body>
    <div class="box">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
    </div>
</body>

</html>

上面的代码:

三个块元素设置大小以及背景色,在父容器中添加flex。

技术点的解释:

  1. 设置 display: flex 属性可以把块级元素在一排显示。

  2. flex 需要添加在父元素上,改变子元素的排列顺序。

  3. 默认为从左往右依次排列,且和父元素左边没有间隙。

横轴排列 justify-content

justify-content 属性定义了项目在主轴上的对齐方式。

结合上一节的布局例子进行理解,有五种横轴排列方式,属性值分别为:

 justify-content: flex-start | flex-end | center | space-between | space-around;
  1. flex-start:交叉轴的起点对齐
.box {
	background: blue;
	display: flex;
	justify-content: flex-start;
}

实现效果:

  1. flex-end :右对齐
.box {
	background: blue;
	display: flex;
	justify-content: flex-end;
}

实现效果:

  1. center :居中
.box {
	background: blue;
	display: flex;
	justify-content: center;
}

实现效果:

  1. space-between :两端对齐,项目之间的间隔都相等。
.box {
	background: blue;
	display: flex;
	justify-content: space-between;
}

实现效果:

  1. space-around :每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
.box {
	background: blue;
	display: flex;
	justify-content: space-around;
}

实现效果:

纵轴排列 align-items

align-items 属性定义了项目在交叉轴上的对齐方式。属性值分别为:

align-items: flex-start | flex-end | center | baseline | stretch;

结合下面的样式设置进行理解:

  1. flex-start :默认值,左对齐
.box {
	height: 700px;
	background: blue;
	display: flex;
	align-items: flex-start;
}

实现效果:

  1. flex-end :交叉轴的终点对齐
.box {
	height: 700px;
	background: blue;
	display: flex;
	align-items: flex-end;
}

实现效果:

  1. center : 交叉轴的中点对齐
.box {
	height: 700px;
	background: blue;
	display: flex;
	align-items: center;
}

实现效果:

  1. baseline :项目的第一行文字的基线对齐。
.box {
	height: 700px;
	background: blue;
	display: flex;
	align-items: baseline;
}

三个盒子中设置不同的字体大小。

实现效果:

  1. stretch (默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
.box {
	height: 300px;
	background: blue;
	display: flex;
	align-items: stretch;
}

.box div {
	/*不设置高度,元素在垂直方向上铺满父容器*/
	width: 200px;
}

实现效果:

子元素占比

来学习 flex 属性,设置子元素相对于父元素的占比。

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>flex占比</title>
    <style type="text/css">
    .box {
        height: 300px;
        background: blue;
        display: flex;
    }

    .box div {
        width: 200px;
        height: 200px;
    }

    .box1 {
        flex: 1;
        background: red;
    }

    .box2 {
        flex: 3;
        background: orange;
    }

    .box3 {
        flex: 2;
        background: green;
    }
    </style>
</head>

<body>
    <div class="box">
        <div class="box1">flex:1</div>
        <div class="box2">flex:3</div>
        <div class="box3">flex:2</div>
    </div>
</body>

</html>

可以参考上面的代码,测试效果如下:

技术点的解释:

  1. 给子元素设置 flex 属性,可以设置子元素相对于父元素的占比。

  2. flex 属性的值只能是正整数,表示占比多少。

  3. 给子元素设置了 flex 之后,其宽度属性会失效。

8 CSS 样式设置小技巧

我们在实际工作中常会遇到需要设置水平居中的场景,比如为了美观,文章的标题一般都是水平居中显示的。

这里我们又得分两种情况:行内元素 还是 块状元素 ,块状元素里面又分为定宽块状元素,以及不定宽块状元素。

8.1 行内元素居中

先来了解一下行内元素怎么进行水平居中。

如果被设置元素为文本、图片等行内元素时,水平居中是通过给父元素设置 text-align:center 来实现的。(父元素和子元素:如下面的 HTML 代码中, div 是 “我想要在父容器中水平居中显示” 这个文本的父元素。反之这个文本是 div 的子元素)如下代码:

HTML 代码:

<body>
  <div class="txtCenter">我想要在父容器中水平居中显示。</div>
</body>

CSS 代码:

<style>
  .txtCenter{
    text-align:center;
  }
</style>

8.2 定宽块状元素居中

当被设置元素为 块状元素 时用 text-align:center 就不起作用了,这时也分两种情况:定宽块状元素和不定宽块状元素。

这里先来讲一讲定宽块状元素。(定宽块状元素:块状元素的宽度 width 为固定值)

满足定宽和块状两个条件的元素是可以通过设置 “左右margin” 值为 “auto” 来实现居中的。我们来看个例子就是设置 div 这个块状元素水平居中:

HTML 代码:

<body>
  <div>我是定宽块状元素,哈哈,我要水平居中显示。</div>
</body>

css代码:

<style>
div{
    border:1px solid red;/*为了显示居中效果明显为 div 设置了边框*/
    width:200px;/*定宽*/
    margin:20px auto;/* margin-left 与 margin-right 设置为 auto */
}

</style>

也可以写成:

margin-left:auto;
margin-right:auto;

注意:元素的 “上下 margin” 是可以随意设置的。

8.3 已知宽高实现盒子水平垂直居中

已知宽高实现盒子水平垂直居中通常使用定位完成,例如想要实现以下效果:

我们有如下两个 div 元素

要实现子元素相对于父元素垂直水平居中,我们只需要输入以下代码:

技术点的解释:

  1. 利用父元素设置相对定位,子元素设置绝对定位,那么子元素就是相对于父元素定位的特性。

  2. 子元素设置上和左偏移的值都为50%,是元素的左上角在父元素中心点的位置。效果:

  3. 然后再用 margin 给上和左都给负的自身宽高的一半,就能达到垂直水平居中的效果。

8.4 宽高不定实现盒子水平垂直居中

未知宽高实现盒子水平垂直居中,通常使用定位以及 translate 完成。参考下面例子:

<div class="box">
	<div class="box1">
		文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本
	</div>
</div>

添加样式:

.box {
	border: 1px solid #00ee00;
	height: 300px;
	position: relative;
}

.box1 {
	border: 1px solid red;
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
}

效果如下:

技术点的解释:

  1. 利用父元素设置相对定位,子元素设置绝对定位,那么子元素就是相对于父元素定位的特性。

  2. 子元素设置上和左偏移的值都为 50% 。

  3. 然后再用 CSS3 属性 translate 位移,给上和左都位移 -50% 距离,就能达到垂直水平居中的效果。