DOM算法系列009-判断给定节点是否为块级元素

news2024/12/23 13:42:05

UID: 20221227215215
aliases:
tags:
source:
cssclass:
created: 2022-12-27


块级元素

给定一个节点,如何判定它是否为块级元素呢?

  • 首先,块级元素一定是元素节点,所以它的nodeType === 1
  • 其次,我们思考,有什么节点是一定会是块级元素节点呢?
    • HTML默认的块级元素标签一定会是块级元素节点吗?
    • css设置了display 属性的元素节点一定是块级元素节点吗?

我们先看下MDN对块级元素的定义

HTML(超文本标记语言)中元素大多数都是“块级”元素或行内元素。块级元素占据其父元素(容器)的整个水平空间,垂直空间等于其内容高度,因此创建了一个“块”
默认情况下,块级元素会新起一行。

所以,看一个元素是否为块级元素,需要看它最终在页面渲染时所占据的空间是否为独占一行。

可通过CSS将块级元素设置为非块级元素

但众所周知,css可以改变HTML默认块级元素的渲染行为,我们看个例子:

<body>

    <div class="container" style="width: 100%; height: 100px;  background-color: red;">

        <div class="inline" style="display: inline; color:white; width: 20%; height: 100px; background-color: blue;">

            这是块装元素设置了inline样式

            看看换不换行

        </div>

        <div class="inline" style="display: inline-block; width: 20%; height: 100px; background-color: yellow;">222</div>

        <div class="inline" style="display: inline-block; width: 20%; height: 100px; background-color: green;">333</div>

    </div>

</body>


可以看到,div 标签默认情况下应该是块级元素,但是由于设置了displayinlineinline-block,其渲染结果表现为了行内元素和行内块元素的特征。

所以,通过标签名来判断是否为块级元素,是不可靠的。

最后,就只剩下看元素最终的CSS样式了,如果一个元素的display属性返回值为block,那它一定就是块级元素了。

获取display 属性值

那我们该如何获取到元素的display属性值呢?

我们第一时间应该可以想到,平时我们用来显示某个隐藏元素时用的方法:

document.getElementById(xxx).style.display = 'block';

看一下 MDN 的描述:

原来这个属性智能读取到内联样式,验证一下;

<head>

    <title>Document</title>

    <style>

        .container {

            display: inline;

        }

    </style>

</head>

<body>

    <div id="container" class="container" style="border: 1px solid red;"></div>

</body>

<script>

window.onload = function() {

    const el = document.getElementById('container');

    console.log('[ el.style.border ] >', el.style.border);

    console.log('[ el.style.display ] >', el.style.display);

}

</script>

果然,我们写在head 中的样式没有获取到。

那我们该如何获取全部的样式信息而不只是内联样式呢?

MDN上给了我们答案:

原来要使用window.getComputedStyle这个方法来获取。

通过查阅MDN,了解了它的语法:

let _style_ = window.getComputedStyle(_element,_ [_pseudoElt_]);

它有两个参数,第一个参数就是要获取样式的元素,第二个则是当我们需要获取元素上特定 伪元素的样式时要传入的伪元素类型,比如::after

现在修改一下前一个例子:

window.onload = function() {

    const el = document.getElementById('container');

    console.log('[ el.style.display ] >', window.getComputedStyle(el).display);

}

最终算法

一般情况下,位于window对象上的方法,我们可以省去window前缀而直接调用,但是考虑到给定节点可能位于框架内,此时节点所在window 可能与我们执行判断时所在的window不同,所以,我们还是要先使用前面005-获取当前节点所在的window对象 一文中介绍的方法获取到给定节点所在的window,然后调用该window对象上的getComputedStyle方法才能获取到正确的值。

function isBlockElement(node) {
	const window = getWindow(node); // 该方法实现请参考上面提到的文章
	return node.nodeType === 1 && window.getComputedStyle(el).display === 'block';
}

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

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

相关文章

Redis分布式缓存、秒杀

目录一、单点Redis的问题二、RDB三、AOF四、Redis优化秒杀流程1、秒杀步骤&#xff1a;2、Redis优化秒杀步骤&#xff1a;3、秒杀的lua脚本4、调用秒杀的lua脚本5、通过线程池&#xff0c;操作阻塞队列五、基于Redis实现共享session登录NoSQL数据库进阶实战哪吒精品系列文章一、…

linux常用命令(二)-文件操作

文件创建 - touch 一般使用touch 来创建某个新增的文件 语法 touch [-acfm][文件名]a&#xff1a;改变档案的读取时间记录c&#xff1a;假如目的档案不存在&#xff0c;不会建立新的档案。与 --no-create 的效果一样。f&#xff1a;不使用&#xff0c;是为了与其他 unix 系统…

python的tkinter(图形用户界面)

目录标题什么是图形用户界面&#xff08;GUI&#xff09;Tinter函数和参数说明&#xff08;常用&#xff09;Lable(标签)&#xff1a;效果Button(按钮)效果Entry(文本框)效果Text &#xff08;多行文本框&#xff09;Canvas(画布)效果Message(消息弹窗)效果什么是图形用户界面&…

kaggle学习笔记-otto-baseline4-本地CV的构建

总览 步骤 1 - 生成候选 对于每个测试用户&#xff0c;我们生成可能的选择&#xff0c;即候选人。、我们从 5 个来源生成候选人&#xff1a; 点击、购物车、订单的用户历史记录测试周期间最受欢迎的 20 次点击、购物车、订单具有类型权重的点击/购物车/订单到购物车/订单的共…

中国芯片奇才,仅用三年打破欧美垄断,创造奇迹

有这么一位中国人&#xff0c;打破了欧美长达10年的芯片技术垄断。这位最该追的星&#xff0c;她是谁&#xff1f;又是如何让欧美芯片领域闻风丧胆。早在2017年&#xff0c;芯片国产化已接近50%&#xff0c;然而25g以上芯片却仅有3%&#xff0c;该技术一直掌握在欧美等发达国家…

融云任杰:激活组织生命力 让听见炮火的人做决策 | TGO专访

任杰&#xff0c;融云联合创始人兼首席科学家&#xff0c;TGO 鲲鹏会&#xff08;北京&#xff09;学员&#xff1b;曾就职于微软和神州泰岳等公司&#xff0c;在微软两次获得全球杰出员工奖&#xff0c;曾负责中国联通搭建 WAP 网关、增值业务管理平台&#xff1b;在神州泰岳期…

数据结构(线性表及顺序表)

目录 线性表 线性结构定义 常见线性结构 线性表 顺序表及其实现 顺序结构 顺序表的存储映像图 顺序表seqList及操作的定义&#xff08;seqList.h&#xff09; 顺序表基本操作的实现分析 查找操作 实现代码 插入操作 实现代码 删除操作 实现代码 顺序表应用——…

手绘图说电子元器件-集成电路

集成电路是高度集成化的电子器件,具有集成度高、功能完整、可靠性好、体积小、重量轻、功耗低的特点,已成为现代电子技术中不可或缺的核心器件。 集成电路可分为模拟集成电路和数字集成电路两大类,包括集成运放、时基集成电路、集成稳压器、门电路、触发器、计数器、译码器…

【 uniapp - 黑马优购 | 分类界面 】创建cate分支、数据获取、动态渲染

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

【Lilishop商城】No4-4.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-web端第三方授权联合登录接口开发

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代…

机器学习——支持向量机(SVM)

文章目录1. 优化目标2. 大间距的直观理解3. 大间距分类背后的数学支持向量机&#xff08;Support Vector Machines&#xff09;是广泛应用于工业界和学术界的一种监督学习算法&#xff0c;在学习复杂的非线性方程时提供了一种更为清晰&#xff0c;更加强大的方式。下面从SVM的优…

【nowcoder】笔试强训Day10

目录 一、选择题 二、编程题 2.1井字棋 2.2密码强度等级 一、选择题 1.下列运算符合法的是&#xff08; &#xff09; A. && B. <> C. if D. : 逻辑与&&语法规则&#xff1a;表达式1&&表达式2&#xff0c;其中两个表达式都是布尔表达式…

LeetCode453.最小操作次数使数组元素相等

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路&#x1f4dc;题目描述 给你一个长度为 n 的整数数组&#xff0c;每次操作将会使 n - 1 个元素增加 1 。 返回让数组所有元素相等的最小操作次数。 示例1 输入&#xff1a;nums [1,2,3] 输出&#xff1a…

EduIQ Network LookOut Administrator

EduIQ Network LookOut Administrator 网络了望管理员允许您从屏幕的远端实时监视计算机。您可以随时看到他们在做什么。除了计算机控制&#xff0c;您还可以捕获摩西和键盘用户。使用Network LookOut Administrator软件可以完成一些有用的工作&#xff1a; 远程儿童计算机控制…

记录一次Gstreamer运行报错排查

背景 系统&#xff1a;Ubuntu 20.04 显卡型号&#xff1a;RTX 2060 之前正常运行的Gstreamer的编解码代码&#xff08;有用到显卡硬件加速&#xff09;&#xff0c;突然运行报错。经过一番折腾&#xff0c;最终找到原因&#xff0c;是因为NVIDIA驱动近期更新了&#xff0c;与…

Node.js——模块化(一)

1. 模块化的基本概念 1.1 什么是模块化 1. 编程领域中的模块化 1.2 模块化规范 2. Node.js 中的模块化 2.1 Node.js 中模块的分类 2.2 加载模块 加载自定义模块给相对路径 ./是平级&#xff08;同一文件夹下调用&#xff09; //这是07.test.js代码 // 注意&#xff1a;在使用…

Cypress笔记-连接命令

.each() 作用 遍历数组数据结构&#xff08;具有 length 属性的数组或对象&#xff09; cy.get(.connectors-each-ul>li).each(function($el, index, $list){ //遍历每个li元素console.log($el, index, $list)}).its() 作用 获取对象的属性值 示例代码 cy.get(.conne…

MergeTree概述

概述 Clickhouse 中最强大的表引擎当属 MergeTree &#xff08;合并树&#xff09;引擎及该系列&#xff08;MergeTree&#xff09;中的其他引擎。MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中&#xff0c;数据可以以数据片段的形式一个接着一个的快速写入&am…

DonkeyCar [02] - 软件配置 - 上位机(windows)

前言&#xff1a;在windows下配置Donkey Car的上位机&#xff1a; 1 安装miniconda Python Conda是开源的管理系统&#xff0c;Miniconda是conda的开源最小安装。 Donkey的默认安装版本&#xff0c;3.7&#xff0c;Miniconda已经是 最新的版本&#xff0c;是3.10.8吧&#xf…

IB如何选科更有助于大学申请?

如果你准准备选择就读IB课程体系&#xff0c;IB选科颇为重要的&#xff0c;选课对于提升自己的竞争力是非常重要的&#xff0c;可以说合理的选课&#xff0c;是申请外国大学的奠基石。IB课程不同于其他两种课程体系&#xff0c;它并不以某个国家的课程体系为基础&#xff0c;而…