上一篇简单总结了一下选择器,如果一个元素被多个选择器选中,元素的样式就会以级联方式被应用到。要搞清最终那个样式被应用到元素上了,首先要明白引用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. 【ABAP系列】SAP VA01屏幕增强(user-exit)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP VA01屏幕增强(user- ...

  2. 内网渗透 - 提权 - Windows

    MS提权 MS16- MS16- 提权框架 Sherlock 信息收集 ifconfig -a cat /etc/hosts arp -a route -n cat /proc/net/* ping扫 ...

  3. [10期]浅谈SSRF安全漏洞

    引子:SSRF 服务端请求伪造攻击 很多web应用都提供从其他服务器上获取数据的功能.使用用户指定的URL,web应用可以从其他服务器获取图片,下载文件,读取文件内容等. 这个功能被恶意使用的话,可以 ...

  4. framebuffer设备驱动分析

    一.设备驱动相关文件 1.1. 驱动框架相关文件 1.1.1. drivers/video/fbmem.c a. 创建graphics类.注册FB的字符设备驱动 fbmem_init(void) { ...

  5. 01背包(第k优解)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. 从ES6重新认识JavaScript设计模式: 装饰器模式

    1 什么是装饰器模式 向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式(Decorator Pattern),它是作为现有的类的一个包装(Wrapper). 可以将装饰器理解 ...

  7. Django重点之url别名

    django重点之url别名[参数名必须是name,格式是name="XXX] 不论后台路径如何进行修改路径,前台访问的路径不变,永远是alias, 这样方便开发 前台根据 {{ url & ...

  8. 前端开发HTML&css入门——常用的标签以及一个小练习

    meta标签 <!doctype html> <html> <head> <meta charset="utf-8" /> < ...

  9. 基于 VirtualApp 结合 whale hook框架实现hook第三方应用

    要点 1. whale hook framework 使用示例: 2. 参考项目:VirtualHook: 3. 按照 VirtualHook 修改 VirtualApp: 4. 编写 hook pl ...

  10. python __str__repr__ 区别

    __str__ __repr__ 两个内置函数都是调试常用的函数, 对象直接调用时会调用 __repr__的内容, __str__需要print一下对象才可以 两个函数的内容有时会写成相同内容   _ ...