全面介绍 CSS 属性值计算 —— 掌握它就了解大部分 CSS

news2024/9/22 18:27:39

CSS 的核心之一就在此,直接影响我们开发中的调试和布局!!!

举个 🌰:页面上存在一个 h1 元素,不设置任何样式,但是当我们点开 computed 查看,几乎 MDN 上的 CSS 属性都存在且有值。这里的每一个属性才真正是这个元素在页面上所呈现的样式。换言之,我们在样式表中书写的样式不一定是最终样式。

CSS 属性值的计算过程是某个元素从所有 CSS 属性没有值,到所有 CSS 属性都有值的过程。

1. 确定声明值

作者样式表(开发人员设置的)和浏览器默认样式表中,找到「没有冲突」的样式,直接作为计算后的样式。

2. 层叠 - 解决冲突

在两张表中,找到有冲突的样式,经过三个步骤(顺序不能错)解决冲突:

2.1 比较重要性

! important 的默认样式 > ! important 的作者样式 > 作者样式表 > 默认样式。

2.2 比较特定性(权重)

对每个样式分别计数:style、id、属性、元素。最终选择数量大的。

- id:id 选择器的数量;

- 属性:属性、类、伪类的数量;

- 元素:元素、伪元素的数量。

在 vscode 上会有直接的展示,默认省略 style,因为 style 中,1 表示内联样式,0 表示非内联样式。

2.3 比较源次序

源码中靠后的样式覆盖靠前的样式。

补充,优先级的规则从低到高为:

- 元素选择器:如 p、div。优先级最低。

- 类选择器和伪类选择器:如 .class、:hover。

- ID 选择器:如 #id。优先级较高。

- 内联样式:如 <div style="color: red;">。优先级最高。

- !important:可以强制覆盖其他规则的优先级,但要谨慎使用。

举个 🌰

<p id="section" class="paragraph">段落</p>
#section {
  color: red;
}
.paragraph {
  color: orange;
}
p {
  color: yellow;
}

最终颜色为 red,因为 ID 选择器的优先级高于元素选择器。

3. 继承

对经过了前两步骤之后「仍然没有值」的属性,若「可以继承」的属性,则使用继承。

CSS 中的很多属性是可以被继承的。例如 color 和 font-family 等样式会从父元素传递到子元素。

注意 📢:

- 可继承属性:如 color、font-family、line-height 等。这些属性如果在子元素中没有显式指定,会继承父元素的值。

- 不可继承属性:如 border、margin、padding。这些属性不会从父元素继承。

- inherit 关键字:可以强制任何属性继承父元素的值,即使该属性默认不可继承。

举个 🌰

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .container {
        border: 2px solid #f3ddf3;
        border-radius: 6px;
        color: orchid;
      }
      .paragraph {
        border: inherit;
        border-radius: inherit;
      }
    </style>
  </head>
  <body>
    <div class="container">
      父元素 div
      <p class="paragraph">子元素:强制继承父元素</p>
    </div>
  </body>
</html>

color 属性是自动继承,border 属性是强制继承。继承之前和继承之后:

- initial 关键字:将属性值重置为默认值,通常用于恢复浏览器的默认样式。

举个 🌰

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .container {
        border: 2px solid #f3ddf3;
        border-radius: 6px;
        color: orchid;
        padding: 10px;
        font-size: 26px;
      }
      #div {
        font-size: inherit;
      }
    </style>
  </head>
  <body>
    <div id="div" class="container">恢复浏览器的默认样式</div>
  </body>
</html>

4. 默认值 

最后,对「仍然没有值」的属性,使用 MDN 官网的默认值。 

以上就是 CSS 属性的计算过程,对于页面上所有元素的 CSS 属性都是如此。

浏览器从 CSS 代码到最终的样式渲染过程中,经过多个阶段完成。为了达到视觉上最终的样式,浏览器会解析样式表、继承和应用样式值,最后计算出应用到每个元素的具体样式。

补充一些:

5. 计算值(Computed Value)

经过优先级和继承计算后,浏览器会获得每个元素的计算值。在这个阶段,所有的相对值都会转换为绝对值。例如,em、% 等相对单位会被计算成具体的像素值。 

具体过程:

- 相对单位计算:em 是相对于父元素的字体大小,% 是相对于某个父级元素的尺寸。例如,如果父元素的 font-size 是 16px,那么 2em 相当于 32px。

- 百分比计算:通常用在宽高、边距、位置等属性中,比如 width: 50% 是基于父元素宽度的 50%。

🌰

div {
  width: 50%; /* 计算值取决于父元素的宽度 */
  font-size: 2em; /* 计算值取决于父元素的字体大小 */
}

6. 使用值(Used Value)

使用值是 CSS 属性值的另一个阶段,是在计算值的基础上进一步确定的。例如,在 width  和 height 的计算中,如果内容溢出了容器,浏览器可能会调整某些属性的值。

- 溢出处理:当一个元素内容比容器大时,overflow 属性会决定如何处理,比如裁剪内容或显示滚动条。

div {
  width: 100px;
  height: 50px;
  overflow: scroll; /* 超出范围时,显示滚动条 */
}

7. 实际值(Actual Value)

实际值是元素在显示时真正呈现出来的样式,结合了设备特性和环境(如分辨率、DPI)等因素。在不同的设备上,元素的实际渲染可能会有所不同。

- DPI 和屏幕缩放:在高分辨率设备上,元素可能看起来比低分辨率设备要小,因此实际显示的像素值会有所不同。浏览器会根据设备的 DPI 调整实际显示值。

8. 布局阶段(Layout Phase)

布局阶段是浏览器根据已计算的样式值,计算出每个元素的大小和位置的过程。这个过程通常依赖于 box model(盒模型),以及 display、position 等布局属性。

注意点📢:

1、盒模型:元素的大小由 content、padding、border 和 margin 决定,布局时需要将这些因素考虑在内。

2、流式布局:默认情况下,块级元素会垂直排列,内联元素会水平排列。

3、浮动和清除:float 属性会改变元素在文档流中的行为,而 clear 用于清除浮动对其他元素的影响。

9. 渲染阶段(Rendering Phase)

最后,浏览器将经过布局计算后的元素绘制到页面上。这一步还包括处理 CSS 中的颜色、字体、阴影等视觉效果。

注意点:重绘(Repaint)与回流(Reflow):修改布局属性(如 width、height)会触发回流,而修改视觉属性(如 color)只会触发重绘。回流比重绘消耗更多资源,因此在性能优化中应尽量减少回流的发生。

10. 总结

1、浏览器的默认样式表:浏览器会应用一套默认样式,确保即使不编写样式表,HTML 也有基本的可读性。

2、使用 initial、inherit、unset 等关键字:这些关键字可以帮助控制样式的继承与重置。

- initial:重置为初始值;

- inherit:强制继承父元素的值;

- unset:依据属性是否可继承来决定使用初始值或继承值。

3、动态单位:vh、vw 等单位可以用于动态布局。它们表示相对于视口宽度或高度的值。

div {
  width: 50vw; /* 宽度是视口宽度的 50% */
  height: 100vh; /* 高度是视口高度的 100% */
}

4、相对单位和绝对单位的区别:绝对单位(如 px)在不同设备上表现一致,而相对单位(如 %、em)的行为依赖于父元素或上下文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++高精度计时方法总结(测试函数运行时间)

文章目录 一、clock()函数——毫妙级二、GetTickCount()函数&#xff08;精度16ms左右&#xff09;——毫妙级三、高精度时控函数QueryPerformanceCounter()——微妙级四、高精度计时chrono函数——纳妙级五、几种计时比较六、linux下的计时函数gettimeofday()-未测试参考文献 …

C语言6大常用标准库 -- 4.<math.h>

目录 引言 4. C标准库--math.h 4.1 简介 4.2 库变量 4.3 库宏 4.4 库函数 4.5 常用的数学常量 &#x1f308;你好呀&#xff01;我是 程序猿 &#x1f30c; 2024感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;共同成长&…

《他们的奇妙时光》圆满收官,葛秋谷新型霸总获好评

9月21日&#xff0c;由王枫、张开法执导&#xff0c;周洁琼、葛秋谷领衔主演的奇幻爱情题材都市喜剧《他们的奇妙时光》圆满收官。该剧讲述了意外被游戏角色刑天附体的设计师宋灵灵&#xff0c;为修复游戏漏洞&#xff0c;被迫与能压制刑天的甲方总裁萧然同居&#xff0c;两人在…

LDR6020在索尼PS5 VR2适配器中的应用技术方案探讨

随着虚拟现实&#xff08;VR&#xff09;技术的日益成熟&#xff0c;索尼PlayStation VR2&#xff08;简称PS VR2&#xff09;作为新一代VR设备&#xff0c;凭借其出色的性能和沉浸式体验&#xff0c;成为了游戏界的焦点。为了进一步扩大PS VR2的应用范围&#xff0c;索尼推出了…

深度学习02-pytorch-01-张量的创建

深度学习 pytorch 框架 是目前最热门的。 深度学习 pytorch 框架相当于 机器学习阶段的 numpy sklearn 它将数据封装成张量(Tensor)来进行处理&#xff0c;其实就是数组。也就是numpy 里面的 ndarray . pip install torch1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simp…

LLMs之LCM:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读

LLMs之LCM&#xff1a;《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读 导读&#xff1a;MemLong 是一种新颖高效的解决 LLM 长文本处理难题的方法&#xff0c;它通过外部检索器获取历史信息&#xff0c;并将其与模型的内部检索过程相结合&#xff…

分布式网络存储技术是什么?分布式存储技术有哪些

分布式储存是指将数据分散存储在多个节点上的一种技术。但是你们知道分布式网络存储技术是什么&#xff1f;相比传统的集中式存储&#xff0c;分布式储存具有更高的可靠性和可用性。分布式网络存储是一种将数据分散存储在多个节点或服务器上的架构。 分布式网络存储技术是什么&…

开源 AI 智能名片 S2B2C 商城小程序与营销工具的快速迭代

摘要&#xff1a;本文以开源 AI 智能名片 S2B2C 商城小程序为研究对象&#xff0c;探讨在营销工具快速迭代的背景下&#xff0c;该小程序如何借鉴以拼多多为代表的“小程序拼团”、以蘑菇街为代表的“小程序直播”、以花点时间为代表的“小程序按月订花”等经典案例&#xff0c…

springboot注册和注入组件方式概览

IoC&#xff1a;Inversion of Control&#xff08;控制反转&#xff09; 控制&#xff1a;资源的控制权&#xff08;资源的创建、获取、销毁等&#xff09; 反转&#xff1a;和传统的方式不一样了 DI &#xff1a;Dependency Injection&#xff08;依赖注入&#xff09; 依赖&…

【HTTPS】对称加密和非对称加密

HTTPS 是什么 HTTPS 是在 HTTP 的基础上&#xff0c;引入了一个加密层&#xff08;SSL&#xff09;。HTTP 是明文传输的&#xff08;不安全&#xff09; 当下所见到的大部分网站都是 HTTPS 的&#xff0c;这都是拜“运营商劫持”所赐 运营商劫持 下载⼀个“天天动听“&…

剖析枚举类型的使用与优点

枚举类型顾名思义——就是把所有的值一一列举出来 列如星期 把每一项都列举出来就是枚举 这些可能取值都是有值的&#xff0c;默认从0开始&#xff0c;依次递增1&#xff0c;当然在声明枚举类型的时候也可以赋初值&#xff0c; 要是在某一项赋初值之后&#xff0c;后面的就会…

客户转化预测以及关键因素识别_支持向量机与相关性分析

数据入口&#xff1a;数字营销转化数据集 - Heywhale.com 数据集记录了客户与数字营销活动的互动情况。它涵盖了人口统计数据、营销特定指标、客户参与度指标以及历史购买数据&#xff0c;为数字营销领域的预测建模和分析提供了丰富的信息。 数据说明&#xff1a; 字段说明Cu…

JavaEE: 创造无限连接——网络编程中的套接字

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

Clion使用vcpkg管理C/C++包

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Clion安装vcpkg二、使用步骤1.切换到清单模式2.开始安装包 三、测试代码总结 前言 Linux上的库基本都可以通过apt或yum等包管理工具来在线安装包&#xff…

cgroup基本原理与使用

Linux cgroups是Linux内核中的一项强大功能&#xff0c;允许用户对进程进行**资源限制、优先级控制、监控和隔离。它主要用于管理和控制计算资源的分配&#xff0c;特别是在容器技术&#xff08;如 Docker 和 LXC&#xff09;中得到了广泛应用。 1. Cgroups的基本概念和原理 …

Qwen-2.5 + ClaudeDev + Aider:这套免费的AI编程工具链,简直太棒了!

Qwen-2.5 ClaudeDev Aider&#xff1a;这套免费的AI编程工具链&#xff0c;简直太棒了&#xff01; 原创 Aitrainee AI进修生 &#x1f379; Insight Daily &#x1faba; Aitrainee | 公众号&#xff1a;AI进修生 Hi&#xff0c;这里是Aitrainee&#xff0c;欢迎阅读本…

AI字幕翻译器行业分析:前五大厂商占有大约29.5%的市场份额

AI 字幕翻译器正在彻底改变我们使用不同语言消费媒体的方式&#xff0c;使内容可以普遍访问。这些先进的技术利用机器学习和自然语言处理&#xff0c;将口语对话实时翻译成字幕。这一功能不仅打破了语言障碍&#xff0c;提升了观众的体验&#xff0c;而且还使内容创作者能够毫不…

比 Kimi 更强!用 Claude 仿写头条文章,轻松过原创(附完整指令)

最近&#xff0c;我有个做头条号的朋友跟我吐槽&#xff0c;说每天都要更新内容&#xff0c;经常写文章写到半夜&#xff0c;他已经快撑不住了。我听完实在有点不忍心&#xff0c;就告诉他&#xff0c;其实可以用 AI 来帮忙写头条文章。 朋友一脸怀疑&#xff0c;说“怎么可能&…

消灭病毒gamedemo

DestoryVirus 一、AudioSourceManager using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioSourceManager : MonoBehaviour {public static AudioSourceManager Instance { get; private set; }public SoundPlayer soundPla…

【C++】智能指针模拟实现及详解

目录 什么是智能指针&#xff1a; 为什么要有智能指针&#xff1a; auto_ptr: unique_ptr&#xff1a; shared_ptr&#xff1a; shared_ptr的缺陷&#xff1a; weak_ptr: 什么是智能指针&#xff1a; 概念&#xff1a; 智能指针是一种特殊的类模板&#xff0c;用于自动…