Element 和 Node的关系是个啥

简介: 说起这个话题要从一个面试题开始,前两天一个朋友发给我的(某团面试题),这个题简单的很,但是估计很多人不能自信的说出结果和原因。

说起这个话题要从一个面试题开始,前两天一个朋友发给我的(某团面试题),这个题简单的很,但是估计很多人不能自信的说出结果和原因。

先看下题目


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box{
        width: 400px;
        border:solid 1px #000;
    }
    img{
        width: 50%;
    }
    </style>
</head>
<body>
    <div class="box">
        <img src="../img/g.jpg"/>
        <img src="../img/g.jpg" />
        <img src="../img/g.jpg" />
    </div>
</body>
</html>

请说出上面代码的显示结果,然后说下原因。

emm.....

其实这个布局的最终目的是想让图片并排显示,但是这样写并不能达到我们想要的结果,还是从细节中考查我们对 DOM 的理解和应用。

问题分析


当然做题是次要的,我们来分析下原因。

先看下效果,下面这个结果应该和你想的差不多吧。

cbf3f4f992a57b5c527bb5708fc76b0a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg

这是什么原因呢?我们都知道 img标签默认是内联元素,除非剩余宽度不足才会换行,代码中我们都设置成为50%,宽度也没有超出呀。

这是因为html中标签后的每个换行也会被当做是一个节点,会进行渲染,也会占用空间,这个节点就是text节点,他不像标签那么形象,可以有具体的表示,他就是换行和空字符串的组合。

既然他是存在的,那我们使用 js 拿到这些节点。

document.getElementsByClassName('box')[0].children

上面的代码应该没什么问题,但是结果里没有我们所说的 text节点。

e10f0d87c9f7cca3ef3150139f2d14ab_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

请看下MDN 里这个方法的说明

ParentNode.children 是一个只读属性,返回 一个Node的子elements ,是一个动态更新的 HTMLCollection

也就是说children属性返回的是elements,然而 text node属于Node,所以没有返回。

所以我们需要使用另外一个方法得到

document.getElementsByClassName('box')[0].childNodes

e6200b42f6d33d4d3845785bb84f53d6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

上面的结果的确得到了text node,但是同时也把 img返回了。

element 和 node 关系


可能你会问 elementnode到底什么区别呢?

一图胜千言

126899e6f712503611007a6016689320_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

从上图中可以很清晰的看到他们的关系,越往上越抽象,越往下越具体,从继承的角度来说Element继承自Node,具有node的方法,同时扩展了很多自己的独有的方法。

所以在Element的一些方法里,是明确区分了Node和Element的,比如说:childNodes, children, parentNode, parentElement等方法。

另外Node表示的是DOM树的结构,在html中,节点与节点之间是可以插入文本的,这个插入的空隙就是TEXT_NODE,也就是我们上题中的情景。

所以总结来说,我们可以把所有的element看作是 node,但是所有的 node 并不是 element

回到题中,我们让 text node显示出来。

给所有的 text node 设置文本

document.getElementsByClassName('box')[0].childNodes.forEach(item=>{
item.nodeType===3?item.appendData('text node'):null
})

701214121639e0e4f17028e2adaa6f4d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg

处理问题


说到这里,我觉得如何解决问题已经不重要了,如果能分析出来,自然就有了解决方法。

最直接的手段就是删除掉 text node。

<div class="box"><img src="../img/g.jpg"/><img src="../img/g.jpg" /><img src="../img/g.jpg" /></div>

搞定!

但这可读性太差了,看着多别扭。

设置字号为0.font-size:0

最后也不一定能过


如果你的回答只说会换行显示,这个也不能说是100%对,因为还少说了一项。

这个空隙呢?

1cb919448c9f3f16e2e96bdcb98b75db_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg

很熟悉吧。

到这里可能面试官就会给过了。好难...ಥ_ಥ

目录
相关文章
|
2月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
本文介绍了Twaver HTML5中的拓扑元素(Element),包括网元(Element)、节点(Node)和连线(Link)的基本概念和使用方法。文章详细解释了Element的属性和方法,并通过示例代码展示了如何在React组件中创建节点、设置节点属性和样式。
45 1
Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
|
3月前
|
JavaScript 前端开发 UED
​基于 vue + element plus + node 实现大文件分片上传,断点续传和秒传的功能!牛哇~
​基于 vue + element plus + node 实现大文件分片上传,断点续传和秒传的功能!牛哇~
|
资源调度 JavaScript 测试技术
Vue 基于node npm & vue-cli & element UI创建vue单页应用
Vue 基于node npm & vue-cli & element UI创建vue单页应用
163 0
|
JSON JavaScript Java
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(三)
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(三)
266 0
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(三)
|
存储 JavaScript Java
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(二)
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(二)
283 0
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(二)
|
前端开发 JavaScript Java
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(一)
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(一)
387 0
单体架构项目 后台管理系统 wan字长文 保姆及教学 Vue.js + Element UI 库 + node.js + axios + java +数据库 男女老少皆可使用(一)
|
JavaScript
DOM 精通了?请问 Node 和 Element 有何区别?
相信我们很多同学都经常会使用到 Node(节点)和 Element(节点)的概念,那么这两者到底有何区别,不知道有多少人能够答得上来这个问题?
253 0
DOM 精通了?请问 Node 和 Element 有何区别?
|
2月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装
|
1月前
|
JavaScript 开发工具 git
已安装nodejs但是安装hexo报错
已安装nodejs但是安装hexo报错
30 2
|
2月前
|
存储 JavaScript 前端开发
Node 版本控制工具 NVM 的安装和使用(Windows)
本文介绍了NVM(Node Version Manager)的Windows版本——NVM for Windows的安装和使用方法,包括如何安装Node.js的特定版本、列出已安装版本、切换使用不同版本的Node.js,以及其他常用命令,以实现在Windows系统上对Node.js版本的便捷管理。
Node 版本控制工具 NVM 的安装和使用(Windows)
下一篇
无影云桌面