应根据需求选择:需任意父节点用 parentnode,需 html 元素父级用 parentelement;offsetparent 仅用于定位计算,不反映 dom 结构。

要准确获取 DOM 元素的父节点,关键不是“选哪个”,而是**看你要什么类型的父级**:是严格意义上的直接上级节点(可能是文本、注释或 document),还是只关心 HTML 元素层级中的上一级标签。
parentNode 返回所有类型的父节点
parentNode 是 Node 接口的标准属性,适用于任何节点类型。它返回的是该节点在 DOM 树中的直接父级,类型可能是:
- Element(比如
<div>、<code><section></section>) - Document(当元素是根元素,如
的父节点就是document) - DocumentFragment(在模板或 Shadow DOM 场景中可能出现)
- 甚至可能是 Text 节点(极少见,仅在非标准构造下)
- 如果父节点是
<div>、<code><ul></ul>等元素,就返回那个元素 - 如果父节点是
document、DocumentFragment或文本节点,一律返回null - 加空值判断:例如
el.parentElement?.classList.add('active')或if (el.parentElement) { ... } - 需要向上找特定祖先时,改用
el.closest('selector'),它自动遍历 parentElement 直到匹配,比手动循环更可靠 - 若需兼容老浏览器(如 IE11 及以下),
parentElement支持良好,无需 polyfill;closest()则需补丁
这意味着:element.parentNode 永远不会因“不是元素”而返回 null ——只要它有父级,就一定有值;只有在根节点(如 document.documentElement)上调用时才为 null。
parentElement 只返回元素类型的父级
parentElement 是 Element 接口的专属属性,专为 HTML 元素设计。它的行为更“干净”:
日常操作中,你几乎总是想操作“上一级容器标签”,比如点击按钮后高亮整个卡片区域——这时用 parentElement 更安全、语义更明确,避免意外拿到 document 后调用 .classList 报错。
实际使用建议
多数场景下推荐优先用 parentElement,但要注意两点:
别混淆 offsetParent
offsetParent 和前两者完全不同:它不反映 DOM 层级关系,而是用于定位计算,返回**最近的已定位(position ≠ static)祖先元素**,常用于 getBoundingClientRect() 配合。它可能跳过好几层,也可能返回 body 或 null,不能用来做结构遍历或样式控制。











