diff --git "a/mozilla/css/css-\346\240\267\345\274\217\345\237\272\347\241\200/css-\345\261\202\345\217\240\344\274\230\345\205\210\347\272\247\344\270\216\347\273\247\346\211\277.md" "b/mozilla/css/css-\346\240\267\345\274\217\345\237\272\347\241\200/css-\345\261\202\345\217\240\344\274\230\345\205\210\347\272\247\344\270\216\347\273\247\346\211\277.md" new file mode 100644 index 0000000000000000000000000000000000000000..7ae0ddf6fb34aa9af9e08c10043014266a20e80a --- /dev/null +++ "b/mozilla/css/css-\346\240\267\345\274\217\345\237\272\347\241\200/css-\345\261\202\345\217\240\344\274\230\345\205\210\347\272\247\344\270\216\347\273\247\346\211\277.md" @@ -0,0 +1,511 @@ +# 层叠、优先级与继承 + +本文旨在让你理解 CSS 的一些最基本的概念——层叠、优先级和继承——这些概念决定着如何将 CSS 应用到 HTML 中,以及如何解决冲突。 + + +## [冲突规则](https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Styling_basics/Handling_conflicts#%E5%86%B2%E7%AA%81%E8%A7%84%E5%88%99) + +CSS 代表**层叠样式表**(Cascading Style Sheets),理解第一个词*层叠*(cascade)很重要——层叠的表现方式是理解 CSS 的关键。 + +在某些时候,在做一个项目过程中你会发现一些应该产生效果的样式没有生效。通常的原因是你创建了两个应用于同一个元素的规则。与[**层叠**](https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_cascade/Cascade)密切相关的概念是[**优先级**(specificity)](https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_cascade/Specificity),决定在发生冲突的时候应该使用哪条规则。设计元素样式的规则可能不是期望的规则,因此需要了解这些机制是如何工作的。 + +这里也有[**继承**](https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_cascade/Inheritance)的概念,也就是在默认情况下,一些 css 属性继承当前元素的父元素上设置的值,有些则不继承。这也可能导致一些和期望不同的结果。 + +我们来快速地看下正在处理的关键问题,然后依次了解它们是如何相互影响的,以及如何和 CSS 交互的。虽然这些概念难以理解,但是随着不断的练习,你会慢慢熟悉它的工作原理。 + + +### [层叠](https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Styling_basics/Handling_conflicts#%E5%B1%82%E5%8F%A0) + +样式表[**层叠**](https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_cascade/Cascade)——简单的说,就是 CSS 规则的顺序很重要;当应用两条同级别的规则到一个元素的时候,写在后面的就是实际使用的规则。 + +下面的示例中,我们有两个关于 `

` 的规则。`

` 最后显示蓝色——这两个规则来自同一个源,且具有相同的元素选择器,有相同的优先级,所以顺序在最后的生效。 + +```html +

这是我的标题。

+``` + +```css +h1 { + color: red; +} +h1 { + color: blue; +} + +``` + + +### [优先级](https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Styling_basics/Handling_conflicts#%E4%BC%98%E5%85%88%E7%BA%A7) + +浏览器是根据[优先级](https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_cascade/Specificity)来决定当多个规则有不同选择器对应相同的元素的时候需要使用哪个规则。它基本上是一个衡量选择器具体选择哪些区域的尺度: + +* 一个元素选择器不是很具体,则会选择页面上该类型的所有元素,所以它的优先级就会低一些。 +* 一个类选择器稍微具体点,则会选择该页面中有特定 `class` 属性值的元素,所以它的优先级就要高一点。 + +下面我们再来介绍两个适用于 `

` 的规则。下面的 `

` 最后会显示红色——类选择器 `main-heading` 有更高的优先级,因此就会被应用——即使元素选择器顺序在它后面。 + +```html +

这是我的标题。

+``` + +```css +.main-heading { + color: red; +} + +h1 { + color: blue; +} + +``` + + +### [继承](https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Styling_basics/Handling_conflicts#%E7%BB%A7%E6%89%BF) + +继承也需要在上下文中去理解——一些设置在父元素上的 CSS 属性是可以被子元素继承的,有些则不能。 + +举一个例子,如果你设置一个元素的 `color` 和 `font-family`,每个在里面的元素也都会有相同的属性,除非你直接在元素上设置属性。 + +```html +

由于主题颜色被设置为蓝色,因此该颜色会被子元素继承。

+

我们可以通过选择器定位元素来改变颜色,比如这个内容跨越元素。

+ +``` + +```css +body { + color: blue; +} + +span { + color: black; +} + +``` + +一些属性是不能继承的——举个例子如果你在一个元素上设置 [`width`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/width) 为 50% ,所有的后代不会是父元素的宽度的 50% 。如果这个也可以继承的话,CSS 就会很难使用了! + +## [理解这些概念是如何协同工作的](https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Styling_basics/Handling_conflicts#%E7%90%86%E8%A7%A3%E8%BF%99%E4%BA%9B%E6%A6%82%E5%BF%B5%E6%98%AF%E5%A6%82%E4%BD%95%E5%8D%8F%E5%90%8C%E5%B7%A5%E4%BD%9C%E7%9A%84) + +这三个概念一起来控制 CSS 规则应用于哪个元素;在下面的内容中,我们将看到它们是如何协同工作的。有时候会感觉有些复杂,但是当你对 CSS 有更多经验的时候,你就可以记住它们,即便忘记了细节,可以在网上查到,有经验的开发人员也不会记得所有细节。 + + +## [理解继承](https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Styling_basics/Handling_conflicts#%E7%90%86%E8%A7%A3%E7%BB%A7%E6%89%BF) + +我们从继承开始。下面的例子中我们有一个 [`