当前位置: 首页 > news >正文

全面解析:HTML页面的加载全过程(四)--浏览器渲染之样式计算

主线程遍历得到的 DOM 树,依次为树中的每个节点计算出它最终的样式,称之为 Computed Style。

通过前面生成的DOM 树和 CSSOM 树,遍历 DOM 树,为每一个 DOM 节点,计算它的所有 CSS 属性,最后会得到一棵带有样式的 DOM 树–也叫“渲染树 Render Tree”

在这里插入图片描述

可在控制台查看样式计算

在这里插入图片描述

属性值的计算过程

1、确定声明值

声明值就是 “自己所书写的 CSS 样式+浏览器内置的样式表” 相加得到全部的声明值,并且将部分值进行转换

如:color: red;转换为`color: rgb(255, 0, 0);

​ font-size: 2em;转换为font-size: 14px;`。

2、层叠冲突

在确定声明值时,声明的样式规则发生了冲突,解决冲突,下面这三个步骤:

(一)比较源的重要性

样式有三种来源:

1. 浏览器默认样式(用户代理样式):浏览器会有一个基本的样式表来给任何网页设置默认样式
2. 网页设计者定义的样式(页面作者样式):即外联样式、内部样式、style行内样式等
3. 控制台调试样式(用户样式):浏览器的用户在开发者模式里使用自定义样式表定制使用体验

对应的重要性顺序依次为:网页设计者定义的样式 > 用户样式 > 浏览器默认样式

(二)比较优先级–权重

如果在同一源中出现了样式声明冲突,则比较其优先级。

权重的等级

!important,权重最大,会覆盖页面内任何位置定义的元素样式。
内联样式,写在标签中的,权重为1000
ID选择器,权重为0100
类、伪类、属性选择器,权重为0010
标签、伪元素选择器,权重为0001
通配符、子选择器、相邻选择器等,权重为0000

我手写了计算权重的方法:
在这里插入图片描述

案例1
<ul id="nav" class="nav"><li class="active" id="bb"><a href=""></a></li>
</ul>ul#nav li.active a   权值为(0,1,1,3);`ul li.active a` 权值为(0,0,1,3);---一个伪类,三个标签`ul.nav li.active a` 的权值为(0,0,2,3);`
如是行内样式(内联样式),权值为(1,0,0,0) ;某项 CSS 属性后面带 `!important` 时,权值最大。

案例2

都是设置文字颜色,应该以哪个为主?

<!DOCTYPE html>
<html lang="en">
<head>	<style>/* 权重 0,0,1,1 */.nav a {color: red;}/*  权重 0,0,1,0  */.blog {color: yellow;}/*  权重 0,0,2,0 */.nav .blog {color: blue;}</style>
</head>
<body><div class="nav"><a href="" class="blog">java</a><a href="">python</a><a href="">css</a><a href="">ruby</a></div>
</body>
</html>

分析:

0011>0010 以红色为主

0020>0011 以蓝色为主

在这里插入图片描述

案例3

<!DOCTYPE html>
<html lang="en">
<head><style>a{color: yellow;} /*权重:0,0,0,1*/div a{color: green;} /*权重:0,0,0,2*/.demo a{color: black;} /*权重:0,0,1,1*/.demo input[type="text"]{color: blue;} /*权重:0,0,2,1*/.demo *[type="text"]{color: grey;} /*权重:0,0,2,0*/#d1 a{color: orange;} /*权重:0,1,0,1*/div#d1 a{color: red;} /*权重:0,1,0,2*/</style>
</head>
<body><a href="">第一</a> <div class="demo"><input type="text" value="第二" /><a href="">第三</a></div><div id="d1"><a href="">第四</a></div>
</body>
</html>

分析:

#d1 a和div#d1 a 设置相同的属性,但0101<0102 以红色为主

在这里插入图片描述

(三)比较次序----重要:如权重值相同,“就近原则

后声明的样式会覆盖先声明的样式。

p{/* 会被覆盖 */color: yellow;
}p{    color: green;
}

3、使用继承

对于每一个 DOM 节点,都会去计算它的所有 CSS 属性。

对于未声明的属性,并不是直接使用默认值,而是使用继承值。

<div><p>java</p>
</div>
div{color: red;
}

这里<p>标签会继承来自<div>color: red样式。

继承原则

  • 就近原则,谁近就继承谁的,与权重无关。
  • 大部分字体相关的属性都是可继承的

4、使用默认值

如果最后仍不能确定属性值,则使用浏览器默认值。

在这里插入图片描述

http://www.lryc.cn/news/490311.html

相关文章:

  • #Verilog HDL# 谈谈代码中如何跨层次引用
  • LeetCode 每日一题 2024/11/18-2024/11/24
  • 客户流失分析综述
  • 基于51单片机的红包抽奖proteus仿真
  • cangjie (仓颉) vscode环境搭建
  • 阿里云私服地址
  • HTMLCSS:3D金字塔加载动画
  • shell编程(2)(3)
  • DFT专家分析scan insertion时使用EDT的策略
  • Apple Vision Pro开发003-PolySpatial2.0新建项目
  • 分公司如何纳税
  • 在 Ubuntu 系统上安装 npm 环境以及 nvm(Node Version Manager)
  • 深度优先搜索(dfs)题目合集
  • 性能监控利器:Ubuntu 22.04 上的 Zabbix 安装与配置指南
  • 性能测试的宏观分析:全面提升系统表现的关键
  • ctfshow
  • 【分享一个vue指令】鼠标放置提示指令v-tooltip
  • 掌握 Spring 事务管理:深入理解 @Transactional 注解
  • 字符三角形
  • 【LLM】一文学会SPPO
  • 如何通过ChatGPT提高自己的编程水平
  • NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案
  • python之使用django框架开发web项目
  • ChatGPT 桌面版发布了,如何安装?
  • ubuntu 配置 多个 git 客户端 账户
  • React Native的界面与交互
  • autogen+ollama+litellm实现本地部署多代理智能体
  • InstantStyle容器构建指南
  • 百度主动推送可以提升抓取,它能提升索引量吗?
  • A045-基于spring boot的个人博客系统的设计与实现