上一篇简单总结了一下选择器,如果一个元素被多个选择器选中,元素的样式就会以级联方式被应用到。要搞清最终那个样式被应用到元素上了,首先要明白引用CSS代码的几种方式。

CSS代码引用方式

如何应用CSS代码到Html元素上,常见的有下面几种方式

  • 通过Html元素的style属性来指定样式
  • 在Html页面中直接添加style标签
  • 通过link标签来引用外部css文件

sytle属性

想要修改一个元素,最简单的方式就是修改它的style属性,如下栗子:

<div style="color: red;">我是红色</div>

这种方式给元素添加CSS代码有一定的局限性,抛开浏览器解析渲染CSS样式的性能不说,但从DRY原则来看就不太好。每次想修改同类型样式的元素,要逐个修改元素的style属性。

sytle标签

style标签是Html的标准标签,可以在里面直接写CSS代码。

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
.red {
color: red;
}
</style>
</head> <body>
<div class="red">我是红色</div>
</body>

这种引用CSS代码的方式在一定程度上解决了所有CSS代码都分散写在各个元素上的问题,但是不利于CSS代码的整体重用。如果某些class需要在多个Html文件中引用,需要将style标签里的内容复制粘贴到各个Html中。

引用外部CSS文件

通过link标签来引用外部CSS文件。CSS文件可以位于和Html文件同一个服务器上,也可以是互联网上任意的一个地址,例如CDN。

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="style.css">
</head> <body>
<div class="red">我是红色</div>
</body>

style.css

.red {
color: red;
}

这种方式我们可以做到CSS代码的重用,但由于引用了外部文件,浏览器会额外发送一个http请求去加载CSS文件,性能上可能稍微会有一点影响,但以目前浏览器的性能,少量额外的http请求都是可以接受的。

CSS级联样式的应用

回到开头的问题,如果我有两个选择器都选中了某个元素,分别赋予这个元素不同的样式,到底哪个选择器中的样式会被应用呢?看一下如下的栗子:

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
div {
color: red;
}
div {
color: blue;
}
</style>
</head> <body>
<div>我是蓝色</div>
</body>

首先要知道,Html是从头到未顺序加载并解析的。无论是style标签还是CSS外部文件引用都是如此。从例子中可以看到,div中的文字会变成蓝色,即在CSS代码中,在选择器相同的情况下,靠后的CSS代码样式会覆盖掉之前的样式。

再看一个栗子:

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
div p {
color: blue;
}
p {
color: red;
text-decoration: underline;
}
</style>
</head> <body>
<div>
<p>
我是蓝色而且有下划线
</p>
</div>
</body>

这个栗子中,尽管红色字体选择器更靠后但是由于前面的一个选择器更详尽的选中了div元素内的p元素,所以p里面的文字颜色为蓝色,即更详尽的选择器样式覆盖掉了之前的样式。而p选择器里面还添加了文字下划线样式,这个样式被继承了下来,所以最后p元素的文字是蓝色,并且有下划线。

下面来看看使用类选择器是什么效果。

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
.blue {
color: blue;
}
div p {
color: red;
text-decoration: underline;
}
</style>
</head> <body>
<div>
<p class="blue">
我是蓝色而且有下划线
</p>
</div>
</body>

从代码结果中可以清楚的看到,类选择器较元素选择器具有更高的优先级。再来看看id选择器。

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
#blue {
color: blue;
}
.red {
color: red;
text-decoration: underline;
}
</style>
</head> <body>
<div>
<p id="blue" class="red">
我是蓝色而且有下划线
</p>
</div>
</body>

因为id通常是唯一标识一个元素的,所以它的优先级又高于了此前两种选择器。

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
#blue {
color: blue;
}
.red {
color: red;
text-decoration: underline;
}
</style>
</head> <body>
<div>
<p id="blue" class="red" style="color: green;">
我是绿色而且有下划线
</p>
</div>
</body>

最后发现,style属性的优先级最高。所以我们可以通过JavaScript来动态的修改元素的style属性值,如 display: none, 达到修改元素样式的效果,而且不会受到之前任何选择器样式的影响。

CSS样式继承

什么是CSS样式继承,直接上栗子。

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style>
.parent {
color: blue;
}
.child {
font-size: 18px;
}
</style>
</head> <body>
<div class="parent">
<div class="child">
我是蓝色且18个像素
</div>
</div>
</body>

通过栗子发现,子元素child的文字颜色继承自parent的样式,通过Chrome的developer tools也可以清楚的看到。

关于继承,还有一种情况是有些Html元素是不会继承父元素样式的,例如input。需要详尽选定该元素来设置具体的样式。这里就不一一举例了,大家遇到样式不是预期效果的情况,可以通过developer tools来查看到底哪个选择器的样式被应用到了。

总结

  • CSS的代码加载顺序决定了后加载的样式会覆盖先加载的样式。
  • 最终元素的样式会合并所有选中的样式,高优先级的覆盖低优先级的。
  • 样式覆盖的优先级是 id > 详尽选择 > class > 元素。
  • style属性具有最高的样式优先级。
  • 子元素会继承父元素的样式,input等除外。

关于CSS你应该知道的基础知识 - 样式应用篇的更多相关文章

  1. 关于CSS你应该知道的基础知识 - 盒模型篇

    浏览器渲染引擎通过盒模型的方式来布局html元素.我们可以将每一个html元素都看做是一个盒子,每一个盒子都有长和款,多个这样的盒子组成了我们的网页. Margin,Border,Padding 每一 ...

  2. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  3. CSS学习笔记1:基础知识

    CSS规则由两部分组成,选择器和声明     选择器:标签,告诉浏览器哪些标签需要用到这个样式     声明:样式的内容,由一或多对属性:值以:隔开组成,由{}包围,需要多个选择器时以逗号隔开     ...

  4. 大数据基础知识问答----spark篇,大数据生态圈

    Spark相关知识点 1.Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架 dfsSpark基于mapredu ...

  5. 编程必备基础知识|计算机组成原理篇(09):CPU的控制器和运算器

    计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识.关于计算机基础的课程很多,内容繁 ...

  6. c++ 实时通信系统(基础知识TCP/IP篇)

    编写前的基础知识 C/S结构: C/S是Client/Server,即客户端/服务器端架构,一种典型的两层架构.客户端包含一个或多个在用户的电脑上运行的程序服务器端有两种,一种是数据库服务器端,客户端 ...

  7. 大数据基础知识问答----hadoop篇

    handoop相关知识点 1.Hadoop是什么? Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速 ...

  8. 阅读笔记:基础知识(Java篇)

    1. GC机制(垃圾回收机制) 找到垃圾的方法:引用计数法.可达性分析法 回收垃圾的方法:标记清除算法.复制算法.标记整理法.分代算法 2. JVM内存划分 线程私有:程序计数器.JVM虚拟机栈.本地 ...

  9. 【JavaScript 基础知识】一篇关于 JavaScript 一些知识点的总结

    JavaScript 中基础数据类型  数据类型名称  数据类型说明 Undefined 只有一个值,即 undefined ,声明变量的初始值. Null 只有一个值,即 null ,表示空指针,  ...

随机推荐

  1. rac节点挂掉后,vip飘到别的节点,但是业务连接不上报 no listener问题处理

    客户一套rac系统,三节点,其中一个节点的p260主机主板有问题(经常机器重启,好像是这个型号的通病,主板被炒到20W),临时把故障节点的vip作为业务地址用. 首先,查看确定故障节点vip飘到那个节 ...

  2. django中orm多表查询,减少数据库查询操作

    .select_related()   的使用

  3. Nginx环境下设置zblog伪静态方法

    Apache的环境非常简单.可以点击创建 .htaccess就可以了 Nginx环境下设置伪静态,并没有那个一键创建的按钮.只看到了这样的一个提示. 别的环境未测试.宝塔面板中 反正我是没找到. 宝塔 ...

  4. JAVA总结--泛型

    泛型 :程序设计语言的一种特性:将类型参数化: 特征:凡是涉及到强制类型转化的地方,使用泛型均会编译出现问题:泛型仅仅在编译时进行校验,使用泛型的对象,其本质的类型依然不变: ps:不存在泛型数组 一 ...

  5. Java集合:Collection、List、Set、Map、泛型

    1.集合的理解和好处 2.集合的框架体系图 ★ 3.Collection接口的特点和使用 ★ 4.List和Set接口的特点和使用★ 5.List接口的实现类学习★ 6.Set接口的实现类学习★ 7. ...

  6. [Luogu P3825] [NOI2017] 游戏 (2-SAT)

    [Luogu P3825] [NOI2017] 游戏 (2-SAT) 题面 题面较长,略 分析 看到这些约束,应该想到这是类似2-SAT的问题.但是x地图很麻烦,因为k-SAT问题在k>2的时候 ...

  7. Java JDK在Mac下的配置方法

    Java JDK在Mac.Windows下的配置方法 Mac 第一步:下载JDK 官网下载地址 第二步:安装JDK 安装步骤很简单,一直点击下一步即可. 第三步:配置环境变量 打开terminal(终 ...

  8. OpenCV-----Numpy数组

    Nunmpy数组包含: 强大的N维数组对象 复杂的(广播)功能 集成C / C ++和Fortran代码的工具 有用的线性代数,傅立叶变换和随机数功能 遍历与修改数组中的所有像素点 #对所有像素进行循 ...

  9. Pandas 时间序列处理

    目录 Pandas 时间序列处理 1 Python 的日期和时间处理 1.1 常用模块 1.2 字符串和 datetime 转换 2 Pandas 的时间处理及操作 2.1 创建与基础操作 2.2 时 ...

  10. django学习笔记(二)

    上节内容回顾: 1.Django请求生命周期 -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串 -> URL对应关系(匹配) -> 视图函数 -> ...