上一篇简单总结了一下选择器,如果一个元素被多个选择器选中,元素的样式就会以级联方式被应用到。要搞清最终那个样式被应用到元素上了,首先要明白引用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. Java基础/阿里巴巴Java开发手册

    阿里巴巴Java开发手册 序号 文档名及下载地址 1 阿里巴巴Java开发手册v1.2.0 2 <阿里巴巴Java开发手册>(终极版) 为什么阿里巴巴禁止工程师直接使用日志系统(Log4j ...

  2. SpringBoot(一) -- SpringBoot入门

    一.简介 Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用. 1.快速创建独立运行的Spring项目以及与主流框架集成; 2 ...

  3. ajax传文件用express的multer接住

    html部分: //input type设为file <input type="file" name="file" id="fileInputE ...

  4. HDU 1494 题解(DP)

    题面: 跑跑卡丁车 Problem Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种 加速卡,用这种加 ...

  5. java 注解 Annontation

    什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metada ...

  6. 该项目不知道如何运行配置文件 IIS Express。

    项目右键属性-->调试 -->启动改为项目即可

  7. Waiting for table flush 阻塞查询的问题

    1.此状态表示大量thread正在等待慢查询语句执行完成. 原因: The thread got a notification that the underlying structure for a ...

  8. spring,get请求中带date日期格式参数,后台无法转换的问题

    今天遇到个很奇怪的问题.前端 的查询条件中带有日期范围日期的格式 是 yyyy-MM-dd HH:mm 结果后台报错 org.springframework.validation.BindExcept ...

  9. js超简单冒泡算法

    点击按钮--从大到小排序,可以通过代码中大于号小于号的选择来判定从小到大或者从大到小. <!DOCTYPE html> <html> <head> <titl ...

  10. zip loader

    GS.ZipAssetLoader = function(audioContext) { this.audioContext = audioContext, this.objLoader = new ...