十三、元素尺寸与位置、节点操作(查找 增加 删除、父节点 子节点 兄弟节点)、阶段案例-智慧园区

定位元素的父(parent::)、兄弟(following-sibling::、preceding-sibling::)节点     最近总是有同学问我做页面自动化时,一些元素总是很难定位,这段时间脚本运行稳定,后面脚本运行越来越不行。我看了他们相关节点的定位,发现他们定位的节点方法过于死板,节点的xpath中含有不定项,后面版本页面改变了以后,原先的xpath就不可用了,导致脚本的不稳定。我经常强调,元素定位的原则就是不变,一定要围绕着一个不变的节点进行定位,xpath写出来一定要够短,越是短的xpath其中出现可变节... 阅读详情

1. 元素尺寸与位置

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>元素的尺寸和位置</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .father {
      position: relative;
      width: 300px;
      height: 300px;
      padding: 5px;
      border: 10px solid red;
      margin: 100px;
      background-color: pink;
    }

    .son {
      width: 100px;
      background-color: purple;
    }

    .box {
      background-color: aqua;
      margin: 100px;
    }
  </style>
</head>

<body>
  <div class="father">
    <div class="son">
      里面包含一些文字
      里面包含一些文字
      里面包含一些文字
    </div>
  </div>
  <div class="box">11</div>

  <!-- 元素尺寸与位置:获得元素的尺寸大小和页面中的位置 -->
  <script>
    /* 
    1. 大小
    ⚫ offsetWidth 和 offsetHeight
    ⚫ 获取元素的自身宽高、包含元素自身设置的宽高、padding、border
    ⚫ 返回的是数字不带单位,并且是只读属性
    */
    const father = document.querySelector('.father')
    const box = document.querySelector('.box')

    console.log(father.offsetWidth, father.offsetHeight)  // 有边框 328 328
    console.log(father.clientWidth, father.clientHeight)  // 无边框 310 310

    box.style.width = father.offsetWidth + 'px'

    /*
    2. 位置
    ⚫ offsetLeft 和 offsetTop
    ⚫ 获取元素距离自己定位父级元素的左、上距离,跟绝对定位类似
    ⚫ 如果父级都没有定位则以浏览器文档为准
    ⚫ 返回的是数字不带单位,并且是只读属性
    */
    const son = document.querySelector('.son')
    console.log(son.offsetLeft, son.offsetTop) // 5 5(父级内边距)

  </script>
</body>

</html>

2. 节点操作

2.1 DOM节点

  <script>
    /*
      DOM节点
      ⚫ DOM树:DOM 将 HTML文档以树状结构直观的表现出来,我们称之为 DOM 树 或者 节点树
      ⚫ 节点(Node)是DOM树(节点树)中的单个点。包括文档本身、元素、文本以及注释都属于是节点。

      ➢ 元素节点(重点): 所有的标签 比如 body、 div; html 是根节点
      ➢ 属性节点: 所有的属性 比如 class属性、href
      ➢ 文本节点: 所有的文本

      利用节点关系可以更好的操作元素(比如查询更方便)
    */
  </script>

2.2 查找节点

2.2.1 查找父节点 parentNode

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>王者荣耀关闭登录案例</title>
  <style>
    .pop {
      display: block;
      visibility: visible;
      position: fixed;
      z-index: 9999;
      left: 50%;
      top: 50%;
      width: 530px;
      height: 254px;
      margin-top: -127px;
      margin-left: -265px;
      background: url(./images/login.webp) no-repeat;
    }

    .close {
      position: absolute;
      right: 0;
      top: 0;
      width: 40px;
      height: 40px;
    }

    @keyframes slideUp {
      to {
        height: 0;
      }
    }

    @keyframes hidden {
      to {
        display: none;
      }
    }

    .hide {
      animation: slideUp .3s linear forwards, hidden .3s .3s forwards;
    }
  </style>
</head>

<body>
  <div class="pop">
    <a href="javascript:;" class="close"></a>
  </div>

  <!-- 查找节点:利用节点关系查找节点,返回的都是对象,找不到返回null -->
  <!-- 需求:点击关闭按钮,关闭弹窗 ==> 点击关闭按钮,关闭父元素 -->
  <script>
    const closeBtn = document.querySelector('.close')
    closeBtn.addEventListener('click', function () {
      // closeBtn.parentNode.classList.add('hide')
      // xx.parentNode 返回最近一级的父节点对象,找不到返回为 null
      this.parentNode.classList.add('hide')
    })
  </script>
</body>

</html>

2.2.2 查找子节点 children

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <ul>
    <li>第1个li</li>
    <li>第2个li</li>
    <li>第3个li</li>
    <li>第4个li</li>
    <li>第5个li</li>
  </ul>

  <ol></ol>

  <!-- 
  子节点查找:children(重点)
    获得所有子元素节点,返回的是一个伪数组
    节点对象.children
  -->
  <script>
    const ul = document.querySelector('ul')
    const ol = document.querySelector('ol')

    // 节点对象.children 找到返回伪数组,找不到返回空数组
    console.log(ul.children) // HTMLCollection(5) [li, 1i, li, 1i, 1i]
    console.log(ol.children) // HTMLCollection []

    // 节点对象.children[index] 找到返回元素节点,找不到返回undefined
    console.log(ul.children[0]) // <li>第1个li</li>
    console.log(ul.children[5]) // undefined
  </script>
</body>

</html>

2.2.3 查找兄弟节点

nextElementSibling
previousElementSibling
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h4>1</h4>
  <p class="p">2</p>
  <span>3</span>

  <!-- 兄弟节点查找 -->
  <script>
    const h4 = document.querySelector('h4')
    const p = document.querySelector('.p')
    const span = document.querySelector('span')

    // 1. 下一个兄弟 节点对象.nextElementSibling
    console.log(p.nextElementSibling) // <span>3</span>
    console.log(span.nextElementSibling) // <script>...< / script >

    // 2. 上一个兄弟 节点对象.previousElementSibling
    console.log(p.previousElementSibling) // <h4>1</h4>
    console.log(h4.previousElementSibling) // null
  </script>
</body>

</html>

2.3 增加节点

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <ul>
    <li>我是默认的li</li>
  </ul>

  <!-- 
  增加节点
    ➢ 创建一个新的节点 document.createElement('标签名')
    ➢ 把创建的新的节点放入到指定的元素内部
      父元素最后一个子节点之后,插入节点元素 element.append()
      父元素第一个子元素的之前,插入节点元素 element.prepend()
  -->
  <script>
    const ul = document.querySelector('ul')

    // 1. 创建节点
    // 创建后直接填充内容(错误) 其返回值 newLi1 会是一个字符串而不是 DOM 元素
    const newLi1 = document.createElement('li').innerHTML = '新增的li1 直接填充内容'
    // 先创建后填充内容(正确)
    const newLi2 = document.createElement('li')
    newLi2.innerHTML = '新增的li2 先创建后填充内容'

    // 2. 添加节点
    // 2.1 最后面添加节点
    ul.append(newLi2)
    // 2.2 最前面添加节点
    ul.prepend(newLi2)
  </script>
</body>

</html>

2.4 删除节点

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div class="remove">这是要删除的 div</div>
  <div class="hide">这是要隐藏的 div</div>

  <!-- 
    删除节点:若一个节点在页面中已不需要时,可以删除它
    element.remove()
    ➢ 把对象从它所属的 DOM 树中删除
    ➢ 删除节点和隐藏节点(display:none)有区别的: 
      隐藏节点还是存在的,但是删除,则从DOM树中删除
      一个标签一会显示一会隐藏 -- 来回切换的,用display或透明度 -- 性能好
  -->
  <script>
    const removeEl = document.querySelector('.remove')
    const hideEl = document.querySelector('.hide')

    // 删除节点
    removeEl.remove()

    // 隐藏节点
    hideEl.style.display = 'none'
    // hideEl.style.opacity = 0
  </script>
</body>

</html>

3. 阶段案例-智慧园区

【Claude Code · VibeCoding】11|需求梳理:云枢智学 / 学员平台 第三章 · 项目实战以「云枢智学」学员平台为例,把业务目标拆成可执行的需求条目。 阅读详情

相关推荐

5分钟搞定Unity+Visual Studio开发环境配置(含C#游戏开发工作负载)

本文提供了一份详细的Unity与Visual Studio开发环境配置指南,帮助开发者在5分钟内完成C#游戏开发工作负载的设置。从Unity Hub安装到Visual Studio关键组件选择,再到常见问题排查,全面覆盖环境搭建的各个环节,显著提升游戏开发效率。

weixin_29014237的博客 248

Day-05 元素尺寸和位置、节点操作、阶段案例

【代码】Day-05 元素尺寸和位置、节点操作、阶段案例。

2402_88640716的博客 401

基恩士数字光纤放大器

在2路输出类型上此为通道开关,并未配备0路类型;设置已搞不清楚不知道怎么办时···完成初始化后,模块重新显示当前值。①无工件时短按[SET]①有工件时短按[SET]各部位的名称和基本操作。可以手动微调设置值。

大小曲奇的博客 1万+

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 140

Cursor插件安装CodeX保姆级教程:从登录到调整面板布局,一步不落

本文提供Cursor编辑器安装CodeX插件的详细教程,涵盖从登录到调整面板布局的全流程。通过优化界面布局和配置参数,帮助开发者提升编码效率,特别适合需要智能代码补全的编程场景。

weixin_42648844的博客 4752

Android音频学习(八)——AudioFlinger线程

在 PlaybackThread 的实现中,Flag 用于标识线程的特殊行为或配置。

miemie2014的博客 1399

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 325

国密系列算法简介

众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目前,这些算法已广泛应用于各个领域中,期待有一天会有采用国密算法的区块链应用出现。其中SM1、SM7算法不公开,调用该...

HardessGod的博客 5776

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

【ESP32接入国产大模型之Deepseek】

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之Deepseek。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘鸣谢B站UP星汇极客ESP32对接DeepSeek API,实现AI大模型交互功能。

vor234的博客 1万+

【论文复现】——基于改进FPFH特征提取的点云模板匹配方法

基于改进FPFH特征提取的点云模板匹配方法 [J]. 应用激光, 2024, 44 (04): 196-204.

点云侠的博客 611

DSH (DeepSeek Harness) Windows 升级安装指南20261107

注意:如果在普通窗口执行 nvm 提示找不到命令,或执行 nvm use 提示 Access is denied,请务必关闭当前窗口,重新打开一个管理员CMD 执行上述完整路径命令。找到 .credentials.yaml,将其重命名为 .credentials.yaml.bak(备份并使其失效)。Node.js Storage Location:可改到非系统盘(如 D:\dev\nvm,避免路径含空格或中文)。打开文件资源管理器,进入 C:\Users<你的用户名>.dsh\。

fengye207161的博客 192

硬核入门!Python爬虫实战:爬取豆瓣读书TOP250,书名+评分+简介,一键生成精美Excel书单(2026避坑版)

通过这个实战,你不仅获得了一份珍贵的豆瓣TOP250书单HTTP请求与响应的本质。HTML解析的核心技巧。反爬虫的基本应对策略。数据清洗与存储的完整流程。爬虫是通往数据世界的一把钥匙。现在,钥匙在你手中,去探索更多有趣的数据吧!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 544

SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在

# SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在 > 这是一套基于 Spring Boot 的服装销售平台源码,配套 `db.sql` 建表脚本,业务覆盖商品展示、购物车、订单流转、收货地址、订单评价、商品评论、在线客服、轮播图和资讯。形态是**前后台双端**:前台是顾客逛的商城,后台是管理员管的控制台。本文带你看清里面有什么、怎么跑

面朝大海 226

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

微信小程序-wxs

在微信开发者工具中右键创建.wxs后缀的文件。每个.wxs文件也是一个独立模块,同样使用导出内容。示例(文件return d;FOO: foo,bar: bar(外联定义参考官方文档)

dreams_dream的博客 342

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

使用echarts模拟甘特图

项目中需按时间段展示不同颜色的数据,通过解析时长并统计各类型总时长,结合预设颜色映射表(含自定义与默认色),动态生成ECharts图表。利用sumByTypeName聚合数据,为每类分配对应颜色,实现图例与柱状图的精准匹配,确保多时段、多类型数据可视化清晰准确。

uuai 28

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【技术专题】JavaScript 网页技术 - JavaScript 流程控制

小锋老师推出《一天学会JavaScript(无废话版)》视频教程,涵盖基础语法、流程控制、函数、数组对象、DOM操作及ES6新特性。内容精炼,配套课件与源码打包下载,助力快速入门。重点讲解if/else、switch、for/while循环、for...of/in遍历及break/continue使用场景,并通过成绩判断实例演示实际应用。适合零基础学习者高效掌握核心技能。

java1234的博客 162

基于 FastAPI+LangChain+LangGraph+Agent+Vue3+MySQL 的房产数据采集与房价预测分析平台

本文介绍一个完整的「房产数据采集+AI房价预测」全栈项目,涵盖FastAPI异步后端、LangGraph Agent智能问答、爬虫采集、机器学习预测与Vue3前端,实现从数据采集到AI交互的闭环。项目融合多技术栈,具备真实业务场景与生产级设计(如降级策略、流式输出、多模型对比),兼具简历亮点与答辩演示优势,可系统性提升工程能力,并附高频面试题解析,是理想的技术综合实践项目。

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 229

Agent 的 ReAct、Plan、Execute、Reflection 模式

本文系统解析 Agent 的 ReAct、Plan、Execute、Reflection 四模式,揭示其核心为“下一步谁定”与“错了怎么发现”两大问题。ReAct 逐步决策,适合动态环境但易冗余;Plan 一次性规划,高效却惧变化;Execute 严格落地,需明确判据与失败策略;Reflection 事后校验,强化纠错闭环。四者协同:外层规划,执行中嵌入思考,每步后反思,连续失败才重规划,构建稳定可控的智能体工作流。

2401_89855466的博客 325

货运APP、货运小程序开发:网络货运平台与同城配送搬家系统实战

本文介绍一套完整的货运平台系统,涵盖货运APP、小程序、网络货运、同城配送、搬家预约等场景,基于SpringBoot+MyBatisPlus+MySQL技术栈,采用uni-app实现多端统一开发,配套TMS运输管理与物流管理系统,支持下单、派单、运输、结算全流程,适用于货运搬家、物流搬运与配送业务,可作为物流软件及TMS系统的参考实现。

juzige03的博客 218

Vue3 低代码移动表单设计器实战(二):缩放画布下的拖拽系统与树状级联数据结构

本文深入剖析Vue3低代码表单设计器在缩放画布下的拖拽失效问题,揭示SortableJS在CSS Transform下坐标崩溃的数学根源。通过自研独立视觉克隆壳层与逆向几何补偿算法,实现精准拖拽;采用扁平数据存储+运行时树状计算结构,解决级联依赖与深克隆难题,确保逻辑一致性与性能优化,为复杂低代码系统提供可复用的工程范式。

NanChen的博客 341

Vue-Router

本文详解前端路由原理与实现,以网易云音乐为例,介绍通过 vue-router 实现页面无刷新切换。核心步骤包括:安装模块、创建路由实例、注册应用、配置页面组件与路由出口。使用 router-link 实现声明式导航,结合 query 和 params 传参,支持模糊与精确匹配激活状态。强调 useRoute(读取参数)与 useRouter(执行跳转)的区别,帮助开发者掌握单页应用路由的核心机制。

2301_79245606的博客 343

LangGraph == 循环结构的实现

这是静态约束,不会参与运行时校验。主要作用是提升代码可读性、通过静态类型检查,同时帮助 LangGraph。也就是说,是否继续重试,在当前实现中主要由大模型决定,而不是由程序逻辑强制保证。因此,如果模型在多次工具调用失败后选择停止重试并生成最终回答,运行图不会阻止它。函数,也不再需要调用 add_conditional_edges()只要大模型持续返回工具调用,流程就会不断回到 llm_node。的缩写,即“推理 + 行动”架构。,运行时只负责判断具体走哪一条路径。

每天都要努力学习哦~~ 347

Vue 前端开发 AI 对话页面:流式消息渲染、文件上传

关键点是不能手动设置 Content-Type 为 multipart/form-data,必须由浏览器自动生成带有 boundary 的请求头,否则后端无法解析。思路:将对象序列化为 JSON 字符串,作为 FormData 的一个普通字段(如 formData.append(‘payload’, JSON.stringify(data))),后端接收该字段后再反序列化。若上传大文件(>10MB),需实现独立的分片上传接口,在提交对话前先获取文件 id 或 url,再随文本发送引用。移除输入框的禁用态;

2402_85729970的博客 388

Flux 架构:一个单向数据流库是怎么跑起来的

状态只有一份 + 数据单向流 + reducer 是纯函数 + 中间件链可组合 + 视图层声明式绑定。这 30 行就是这套思想的最小完整样本:两次useStore订阅、一次拿链式 dispatch、四个按钮对应四种 action(其中一种是 thunk 形态)。

sun_weitao的博客 109

纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS

moejs 是一个纯 Go 编写的高性能 JavaScript 运行时,专为 Go 程序中的插件沙箱场景设计。发布于 2026 年 11 月,由 new-api 维护者 Calcium-Ion 开发,相较 C 版 QuickJS 快 35%,内存占用仅 81 KiB,单次调用仅 6.9 微秒。支持快速复用运行时、零拷贝解析、安全沙箱与 TypeScript 直接编译,通过 test262 80971 个用例零失败。适合高并发插件系统,如 AI 网关钩子处理,已在实际场景中实现请求吞吐量提升 8.6 倍。仓库

前端之虎陈随易 206
上一篇: 十二、正则表达式、元字符、替换修饰符、手势和对话框插件、字符串截取
下一篇: 十四(AJAX)、AJAX、axios、常用请求方法(GET POST...)、HTTP协议、接口文档、form-serialize
bpmf_fff
博客等级 码龄6年 219粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值