如何判断一个元素在可视区域内(内含案例)

判断一个元素是否在可视区域中,可以使用JavaScript的 IntersectionObservergetBoundingClientRect 方法。以下是两种常见的方式:

1. 使用 getBoundingClientRect() 方法

getBoundingClientRect() 返回元素相对于视口的大小和位置,然后通过检查元素的边界是否在可视区域内进行判断。

function isElementInViewport(el) {const rect = el.getBoundingClientRect();return (rect.top >= 0 &&rect.left >= 0 &&rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&rect.right <= (window.innerWidth || document.documentElement.clientWidth));
}const element = document.querySelector('#my-element');
console.log(isElementInViewport(element));  // true or false

2. 使用 IntersectionObserver API

IntersectionObserver 允许在元素进入或离开视口时进行检测,并且可以自动触发回调函数,适合监听元素的可见性变化。

const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {console.log('Element is in viewport!');} else {console.log('Element is out of viewport!');}});
});const element = document.querySelector('#my-element');
observer.observe(element);

IntersectionObserver 更适合需要持续监控元素在视口中的状态变化的场景,而 getBoundingClientRect 则适用于一次性判断。

案例

下面是一个简单的JavaScript拖拽方块的案例,方块只能在浏览器的可视区域内移动:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>拖拽方块</title><style>#box {width: 100px;height: 100px;background-color: red;position: absolute;top: 50px;left: 50px;cursor: grab;}</style>
</head>
<body><div id="box"></div><script>const box = document.getElementById('box');let isDragging = false;let offsetX, offsetY;box.addEventListener('mousedown', (e) => {isDragging = true;offsetX = e.clientX - box.offsetLeft;offsetY = e.clientY - box.offsetTop;box.style.cursor = 'grabbing';});document.addEventListener('mousemove', (e) => {if (isDragging) {let newLeft = e.clientX - offsetX;let newTop = e.clientY - offsetY;// 限制方块在可视区域内newLeft = Math.max(0, Math.min(newLeft, window.innerWidth - box.offsetWidth));newTop = Math.max(0, Math.min(newTop, window.innerHeight - box.offsetHeight));box.style.left = newLeft + 'px';box.style.top = newTop + 'px';}});document.addEventListener('mouseup', () => {isDragging = false;box.style.cursor = 'grab';});</script>
</body>
</html>

解释:

  1. HTML:创建一个 div 元素作为拖拽方块。
  2. CSS:设置方块的初始大小、位置以及鼠标手势。
  3. JavaScript
    • mousedown:点击方块时开始拖拽,记录鼠标相对于方块的位置。
    • mousemove:鼠标移动时更新方块的位置,但限制其只能在浏览器可视区域内移动。
    • mouseup:鼠标松开时停止拖拽。

这个代码能确保方块在浏览器可视区内进行拖动,不会超出窗口边界。

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

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

相关文章

开放式耳机的优缺点?哪个品牌专业?好用的开放式蓝牙耳机分享

我相信很多想入手的开放式耳机的家人都想知道开放式耳机是什么&#xff0c;开放式耳机有什么优缺点&#xff0c;开放式耳机是不是智商税、值不值得购买以及如果要购买的话&#xff0c;有什么专业的开放式耳机品牌推荐。因为我毕竟是测评过三十多款开放式耳机的数码博主&#xf…

mdm监管锁系统功能说明

普通用户后台功能说明 设备管理 设备列表 添加的设备列表 点击序列号可以进入设备详细信息 可以修改设备使用人的姓名 手机号 分组等 还可以导出报表 设备信息 展示了一些设备信息和可以下发指令 指令说明 指令分为异步和非异步 下发指令是和手机设备有交互&#xff0c;一…

使用默认不可变的Rust变量会踩什么坑

讲动人的故事&#xff0c;写懂人的代码 Rust的变量真的是名不副实。名字中明明有个“变”字&#xff0c;却默认不可变。还美其名曰“不可变变量”。要想让变量名副其实&#xff0c;还必须费心额外加个mut关键字&#xff0c;并必须称其为“可变变量”&#xff0c;才能与前者区分…

【AI人工智能】文心智能体,陪爸妈去旅游,国庆假期不容错过,旅游搭子首选

文章目录 背景创作灵感陪爸妈去旅游简介角色与目标思考路径个性化开场白调优 智能体体验总结和感受 背景 文心智能体平台&#xff0c;开启新一轮活动&#xff0c;超级创造营持续百日活动。 在AI 浪潮席卷的今天&#xff0c;如雨后春笋般丛生的 AI 应用&#xff0c;昭告着时代风…

MySQL优化实战 解决CPU100%

问题表象 在24年初有一个日经问题困扰着我们&#xff0c;每到正点03分DB的CPU开始打满&#xff0c;持续1分钟又恢复正常水平。但由于日常业务交付压力较大且权限限制没有登录DB主机的权限&#xff0c;大家也就得过且过一直没有去认真排查。直到某天我来兴趣了也有时间了&#…

基于51单片机的家用防火防盗控制系统设计

本设计基于51单片机的家用防火防盗控制系统&#xff0c;该系统通过模块间的协同作用实现了对烟雾与天然气浓度的监测、温度监测、人体红外监测、通信传输、声光报警等功能。利用按键模块设置报警的阈值&#xff0c;将处理后的信息与阈值进行对比。判断气体浓度和温度是否超过阈…

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…

C++语言学习(4): identifier 的概念

1. 什么是 identifier identifier 中文意思是标识符&#xff0c;在 cppreference 中明确提到&#xff0c;identifier 是任意长度的数字、下划线、大写字母、小写字母、unicode 字符 的序列&#xff1a; An identifier is an arbitrarily long sequence of digits, underscores…

nginx打包部署前端vue项目全过程【保姆级教程】

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

Python字符串string方法大全及使用方法[1]以及FastAPI框架文件上传的处理-client使用postman

一、Python字符串string方法大全及使用方法[1] 1. Python字符串string方法大全及意义解释 #将字符串的第一个字符转换为大写 capitalize() #返回一个指定的宽度 width 居中的字符串&#xff0c;fillchar 为填充的字符&#xff0c;默认为空格。 center(width, fillchar) #返…

磁编码器磁铁要求和安装要求

总结来说&#xff0c; 磁铁需要是径向两极充磁、牌号N35、直径10mm、高度2.5mm的烧结钕铁硼磁铁。 磁铁的固定套必须是非导磁材料&#xff0c;比如铜、铝、塑料。 磁铁要距离电机轴至少2mm以上。 磁铁距离磁编码芯片0.5~3mm&#xff0c;最好1到2mm。 使用磁编码器的伺服&#…

css设置文本样式属性

目录 1.font-size&#xff1a;字体大小 案例&#xff1a;通过font-size属性设置字体的大小 1.代码 2.效果 2.font-family:字体的展现形式 案例&#xff1a;使用font-family属性设置字体的风格 1.代码实现 2.效果 3. font-weight:字体的粗细 案例&#xff1a;使用font-weight定义…

基于SSM+Vue技术的定制式音乐资讯平台

文未可获取一份本项目的java源码和数据库参考。 一、选题的背景与意义&#xff1a; 随着个人计算机的普及和互联网技术的日渐成熟&#xff0c;网络正逐渐成为人们获取信息及消费的主要渠道。然而在当前这个信息时代&#xff0c;网络中的信息种类和数量呈现爆炸性增长的趋势&a…

爱拼才会赢,甲骨文公司智算中心标配英伟达GPU10万颗

【科技明说 &#xff5c; 科技热点关注】 之前有有外媒消息&#xff0c;甲骨文宣布推出了多款智算集群&#xff0c;可通过甲骨文云基础设施提供AI训练服务&#xff0c;其中最顶级的一款配备了超过10万块的NVIDIA Blackwell GPU。 它一共使用了多达131072万块B200 GPU加速卡&…

单链表及其代码实现

目录 前言单链表1.1 单链表的定义1.2单链表代码实现1.2.1 头文件1.2.2 函数实现文件1.2.3 测试文件1.2.4 野指针问题 总结 前言 本文介绍单链表&#xff0c;主要是创销、增删改查代码实现。 注&#xff1a;文章中函数命名采取STL库。 单链表 1.1 单链表的定义 单链表是链线…

北京市大兴区启动乐享生活 寻味大兴 美食嘉年华 系列促销费活动

北京市大兴区启动乐享生活 寻味大兴 系列促销费活动 区商务局副局长 兰莉 致开幕辞 区餐饮行业协会会长 董志明 介绍活动内容 2024年9月30日&#xff0c;由大兴区商务局主办、大兴区餐饮行业协会承办&#xff0c;并得到高米店街道和大兴绿地缤纷城大力支持的“乐享生活 寻味大…

OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,当初有的问题未解决,目前新版未尝试

OceanBase—02&#xff08;入门篇——对于单副本单节点&#xff0c;由1个observer扩容为3个observer集群&#xff09;——之前的记录&#xff0c;有的问题未解决&#xff0c;新版未尝试 1、前言—安装单副本单节点集群1.1 docker安装OB 2、查看现有集群情况2.1 进入容器&#x…

SOMEIP_ETS_147: SD_Send_triggerEventUINT8_Eventgroup_2

测试目的&#xff1a; 验证DUT在Tester订阅事件组后&#xff0c;能够响应Tester触发的triggerEventUINT8方法&#xff0c;并将TestEventUINT8事件发送到订阅请求中端点选项指定的IP地址和端口。 描述 本测试用例旨在确保DUT能够正确处理事件组的订阅请求&#xff0c;并且在T…

VSOMEIP代码阅读整理(1) - 网卡状态监听

一. 概述 ​ 在routing进程所使用的配置文件中&#xff0c;存在如下配置项目&#xff1a; {"unicast" : "192.168.56.101",..."service-discovery" :{"enable" : "true","multicast" : "224.244.224.245&q…