整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JAVA笔记(三十一):层叠样式表CSS常用总结

JAVA笔记(三十一):层叠样式表CSS常用总结

叠样式表 CSS

1.CSS介绍:

引题:

  • 网站中的所有页面的标题都是黑色

  • 老板需要将页面中的所有的标题改为红色

定义:

  • Cascade Style Sheet 层叠样式表

  • html 在一个网页中负责的事情是一个页面的结构

  • css(层叠样式表) 在一个网页中主要负责了页面的数据样式。

优势:

  • 使得页面的结构和表现分离

2.CSS引入方式:

行内样式:

  • <h2 style="color:#0F0">Hello World</h2>

内部样式:

内部样式

外部样式:

外部样式

优先级问题???

行内样式 > 内部样式 > 外部样式 就近原则

link和@import引入外部样式的区别???

link与@import区别

3.CSS选择器

作用:选择器的作用就是找到对应的数据进行样式化

格式:选择器{ 属性:属性值; }

常见的选择器

4.伪类和伪元素:

它们允许应用的样式用于文档不存在的结构上,或者是通过当前元素的状态甚至是文档自身的状态而推断的某些东西上。伪类选择器就是对元素处于某种状态下进行样式的。

<a>标签的伪使用

案例尝试

5.常用操作属性

背景与文本

表格

边框

6.盒子模型

盒子模型就是把一个html边框比作成了一个盒子的边框,盒子模型要做用于操作数据与边框之间的距离或者 是边框与边框之间的距离。

盒子模型主要是用于操作内边距(padding)与外边距(margin)

盒子模型

尝试代码

绝对定位与相对定位区别:

position: absolute;绝对定位:绝对定位是相对于元素最近的已定位的祖先元素(即是设置了绝对定位或者相对定位的祖先元素)。如果元素没有已定位的祖先元素,那么它的位置则是相对于最初的包含块(body)。

绝对定位本身与文档流无关,因此不占空间,普通文档流中的元素的布局就当绝对定位的元素不存时一样,所以 它们可以覆盖页面上其他的元素,且可以通过z-index属性来控制这些层的对方顺序。

绝对定位

position: relative;相对定位:相对定位是相对于元素在文档中的初始位置——首先它出现在它所在的位置上(即不设置position时的位置,然后通过设置垂直或水平位置,让这个元素“相对于”它的原始起点进行移动;

注意,在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其它框。

相对定位

PS:这里只是对css的简单使用总结,里面还有很多技术,可以参考菜鸟教程,W3CSCHOOL等在线教程

往 css 优先级中存在的问题

如果我们的页面上存在非常多的样式,譬如有我们开发页面的时候的自定义样式,也有引入的组件库样式。这时候样式将会非常混乱难以管理。

当我们想覆盖一些本身非我们书写的样式时候,往往不得不通过使用优先级权重更高的样式名,去覆盖那些样式。

同时,当样式优先级感到难以控制时,开发者习惯滥用 !important 去解决,这又循环导致了后续更混乱的样式结构。

基于让 CSS 得到更好的控制和管理的背景,CSS @layer 应运而生。

何为 CSS @layer?

CSS Cascade Layers,也叫做CSS级联层,是Cascading and Inheritance Level5 规范中新增了一个新的 CSS 特性。

@layer声明了一个 级联层, 同一层内的规则将级联在一起, 这给予了开发者对层叠机制的更多控制。语法也非常简单,看这样一个例子:

@layer utilities {

  /* 创建一个名为 utilities 的级联层 */

}

这样,我们就创建一个名为 utilities 的 @layer 级联层。

@layer语法

@layer规则可以通过三种方式其一来创建级联层。第一种方法如上方代码所示,它创建了一个块级的@规则,其中包含作用于该层内部的CSS规则。

@layer utilities {

  .padding-sm {

    padding: .5rem;

  }




  .padding-lg {

    padding: .8rem;

  }

}

一个级联层同样可以通过 @import 来创建,规则存在于被引入的样式表内:

@import(utilities.css) layer(utilities);

你也可以创建带命名的级联层,但不指定任何样式。例如,单一的命名层:

@layer utilities

或者,多个命名层也可以被同时定义。例如:

@layer theme, layout, utilities

这一做法很有用,因为层最初被指定的顺序决定了它是否有父级层。对于声明而言,如果同一声明在多个级联层中被指定,最后一层中的将优先于其他层。

因此,在上面的例子中,如果 theme 层和 utilities 层中存在冲突的规则,那么 utilities 层中的将优先被应用。

即使 utilities 层中规则的 优先级低于 theme 层中的,该规则仍会被应用。一旦级联层顺序建立之后,优先级和出现顺序都会被忽略。

这将使创建CSS选择器变得更加简单,因为你不需要确保每一个选择器都有足够高的优先级来覆盖其他冲突的规则,你只需要确保它们出现在一个顺序更靠后的级联层中。

:在已经声明级联层的名字后,它们的顺序随即被确立,你可以重复声明某级联层的名字来向其添加CSS规则。这些样式将被附加到该层的末尾,且级联层之间的顺序不会改变。

其他不属于任何一级联层的样式将被集中到同一匿名层,并置于所有层的前部,这意味着任何级联层内定义的规则都将覆盖外部声明的规则。

嵌套层

级联层允许嵌套,例如:

@layer framework {

  @layer layout {




  }

}

向 layout 层内部的 framework 层附加规则,只需用 . 连接这两层。

@layer framework.layout {

  p {

    margin-block: 1rem;

  }

}

匿名层

如果创建了一个级联层但并未指定名字,例如:

@layer {

  p {

    margin-block: 1rem;

  }

}

那么则称为创建了一个匿名层。除创建后无法向其添加规则外,该层和其他命名层功能一致。

标准语法

@layer [ <layer-name># | <layer-name>?  {

  <stylesheet>

} ]

@layer如何使用

创建级联层

级联层可以通过多种方式声明:

1、使用@layer 块规则,并立即为其分配样式:

@layer reset {

  * { /* Poor Man's Reset */

    margin: 0;

    padding: 0;

  }

}

2、使用规则@layer 语句,没有指定任何样式:

@layer reset;

3、将@import 与layer关键字或layer()函数一起使用

@import(reset.css) layer(reset);

以上每一个都创建了一个名为 的级联层reset。

管理级联层

级联层会按它们声明的顺序排序。

在下面的例子中,我们建立四个级联层:reset,base,theme,和utilities。

@layer reset { /* 创建级联层 “reset” */

  * {

    margin: 0;

    padding: 0;

  }

}




@layer base { /* 创建级联层 “base” */

  …

}




@layer theme { /* 创建级联层 “theme” */

  …

}




@layer utilities { /* 创建级联层 “utilities” */

  …

}

按照它们的声明顺序,层顺序变为:

reset
base
theme
utilities

重复使用级联层名称时,样式将附加到现有级联层。级联层的顺序保持不变,因为只有第一次的出现已经确定顺序:

@layer reset { /* 创建第一个级联层 “reset” */

  …

}




@layer base { /* 创建第二个级联层 “base” */

  …

}




@layer theme { /* 创建第三个级联层 “theme” */

  …

}




@layer utilities { /* 创建第四个级联层 “utilities” */

  …

}




@layer base { /* 会将样式添加至级联层“base” */

  …

}

重新使用级联层名称时层顺序保持不变的使@layer 语法变得更加方便和严谨。使用它,可以预先建立图层顺序,然后将所有 CSS 附加到它:

@layer reset;     /* 创建第一个级联层 “reset” */

@layer base;      /* 创建第二个级联层 “base” */

@layer theme;     /* 创建第三个级联层“theme” */

@layer utilities; /* 创建第四个级联层 “utilities” */




@layer reset { /* 添加样式至级联层 “reset” */

  …

}




@layer theme { /* 添加样式至级联层  “theme” */

  …

}




@layer base { /* 添加样式至级联层  “base” */

  …

}




@layer theme { /* 添加样式至级联层  “theme” */

  …

}

当然你可以用更短的语法来声明级联层,

@layer reset, base, theme, utilities;

从上面可以看出,多个级联层被声明时,最后一个级联层的声明会获胜。像这样,

@import(reset.css) layer(reset); /* 第一个级联层 */




@layer base { /* 第二个级联层 */

  form input {

    font-size: inherit; 

  }

}




@layer theme { /*第三个级联层 */

  input {

    font-size: 2rem;

  }

}

按以往CSS级联来进行分析的话,form input(多层级)的优先级会大于input,但是由于级联层所起的作用,@layer theme的input会取胜。

级联层嵌套

级联层支持嵌套使用,如下:

@layer base { /* 第一个级联层*/

  p { max-width: 70ch; }

}




@layer framework { /* 第二个级联层 */

  @layer base { /* 第二级联层的嵌套子级联层1 */

    p { margin-block: 0.75em; }

  }




  @layer theme { /* 第二级联层的嵌套子级联层2 */

    p { color: #222; }

  }

}

在这个例子中有两个级联外层:

base
framework

该framework层本身也包含两层:
base
theme

如果要将样式附加到嵌套级联层,需要使用以下全名来引用它,

@layer framework {

  @layer default {

     p { margin-block: 0.75em; }

  }




  @layer theme {

    p { color: #222; }

  }

}




@layer framework.theme {

  /* 这些样式会被添加到@layer framework层里面的theme层 */

  blockquote { color: rebeccapurple; }

}

@media与@layer

@media (min-width: 30em) {

  @layer layout {

    .title { font-size: x-large; }

  }

}




@media (prefers-color-scheme: dark) {

  @layer theme {

    .title { color: white; }

  }

}

如果第一个@media (min-width: 30em)匹配(基于视口尺寸),则layout级联层层将在图层顺序中排在第一位。如果只有@media (prefers-color-scheme: dark)匹配,theme则将是第一层。

如果两者匹配,则图层顺序将为layout, theme。如果没有匹配,则不定义层。


、CSS的层叠

CSS的全称是

Cascading Style Sheets,

中文翻译为“层叠样式表”

1、声明冲突

● 什么是声明冲突?

举个栗子:

【1】代码:

【2】显示效果:

通过上述栗子,我们可以看出什么是“声明冲突”。

所谓“声明冲突”就是同一样式多次应用到同一元素

● 怎么解决声明冲突?

冲突 !=错误

通过CSS层叠解决声明冲突,浏览器会自动处理。


2、层叠

● 层叠的三部曲


● 比较重要性(优先级)

先了解几个概念:

① 样式表的分类:

I、用户样式表

浏览器的用户提供。

II、作者样式表

网页开发者提供。

III、默认样式表

浏览器自身提供。

② 重要声明与普通声明

属性值后跟上! important 就表示这是一条重要声明,反之则是普通声明

注意:一般不建议使用! important ,在实际开发中,需求在不断变化,重要声明可能变成普通申明。

③ 重要性(优先级)从高到低:

  • 用户样式表中的重要声明
  • 作者样式表中的重要声明
  • 作者样式表中的普通声明
  • 用户样式表中的普通声明
  • 浏览器默认样式表中的声明

重要性(优先级)高的会替换重要性(优先级)的样式。


● 比较特殊性

比较特殊性,看选择器的适用范围的大小。

总体规则:选择器选中的范围越窄越特殊。

越特殊的样式会被最终应用。

特殊性从高到低:内联样式——id选择器——类选择器——元素选择器——通配符选择器

在比较特殊性时,每个冲突的声明会生成四位数(a b c d)来比较特殊性,值越大,越特殊。

千位:如果是内联样式,记1,否则记0。

看下面

百位:等于选择器中id选择器的数量

十位:等于选择器中所有类选择器属性选择器伪类选择器的数量

个位:等于选择器中所有元素选择器伪元素选择器的数量


● 比较源次序

当CSS样式的重要性和特殊性都相同时

比较源次序,简单说就是最后出现的声明胜出,其他的淘汰。


3、小试牛刀

● html代码

● css代码


二、CSS的继承与非继承

当元素的一个继承属性 (inherited property)没有指定值时,则取父元素的同属性的计算值 computed value。只有文档根元素取该属性的概述中给定的初始值(initial value)(这里的意思应该是在该属性本身的定义中的默认值)。

通常,跟文字内容相关的属性都能被继承。

1、继承属性的一个典型例子就是 color 属性。给出以下样式规则:

p { color: green; }
<p>This paragraph has <em>emphasized text</em> in it.</p>

…文本 "emphasized text" 就会呈现为绿色,因为 em 元素继承了 p 元素 color 属性的值,而没有获取 color 属性的初始值(这个 color 值用于页面没有指定 color 时的根元素)。

2、非继承属性的一个典型例子就是 border 属性。给出以下样式规则:

 p { border: medium solid; }
 <p>This paragraph has <em>emphasized text</em> in it.</p>

…文本 "emphasized text" 就没有边框,因为 border-style 属性的初始值为none

3、如何查看一个元素是默认继承还是默认不继承?

● 查看权威网站:

https://developer.mozilla.org/zh-CN/docs/Web/HTML

● 比如查看background是否默认继承

4、特殊CSS属性值

- inherit:手动(强制)继承,将父元素的值取出应用到该元素

- initial:初始值,将该属性设置为默认值


三、 CSS渲染过程

1、CSS渲染过程

确定声明值

参考样式表中没有冲突的声明,作为CSS属性值

层叠冲突

对样式表有冲突的声明使用层叠规则,确定CSS属性值

使用继承

仍然没有值的属性,若可以继承,则继承父元素的值

使用默认值

对仍然没有值的属性,使用默认值

2、小试牛刀

问题:

a元素中的“”显示的是什么颜色?

p元素中的“Python大星”显示的是什么颜色?

why?欢迎评论区留言。


四、上一集

>>>《Python Web全栈之旅04--Web前端●走入CSS的世界》