HTML中各种 div 位置距离关系

HTML中各种 div 位置距离关系

    • 一. 盒模型图片展示:
    • 二. 位置距离计算属性
    • 三. 应用场景

一. 盒模型图片展示:

在这里插入图片描述

二. 位置距离计算属性

  1. offsetWidth, offsetHeight
    获取盒子的宽度/高度(包括盒子的border,padding和内容width/height),不包括外边距

  2. offsetLeft
    获取盒子当前位置(左上角)距离自己最近定位的父元素左侧的距离,如果没有最近的定位的父元素,则相当于HTML

  3. offsetTop
    获取盒子当前位置距离自己最近定位的父元素顶部的距离,如果没有最近的定位的父元素,则相当于HTML

  4. clientWidth,clientHeight
    获取盒子的可视区域宽度、高度,包括padding在内,不包括border,这里是不包括滚动条的情况,如果有滚动条,发现盒子的宽度(width)从100变成83,可知滚动条的宽度为17px,而且是占据盒子内容的宽度,除了可视宽高,似乎其他都没有影响。
    所谓的可视区域,个人理解就是一个盒子里面,能够展示出被人看见的内容区域

  5. clientLeft
    获取盒子的左边框的宽度,可理解为可视区域和左侧边(这个左侧边不是border)之间的距离

  6. clientTop
    获取盒子的上边框的宽度,可理解为可视区域和上侧边(这个上侧边不是border)之间的距离

  7. scrollWidth,scrollHeight
    获取盒子内容里面元素占据的真正宽度、高度

  8. scrollLeft,scrollTop
    滚动条距离左侧边,上侧边的距离
    滚动条的最大滚动高度为滚动高度(scrollHeight) - 盒子可视高度(clientHeight)

  9. innerWidth,innerHeight
    窗口宽度、高度,也可以理解为window窗口的可视区域宽度、高度

let IH = window.innerHeight
// 标准模式下
if (document.documentElement) {let IH = document.documentElement.clientHeight
// 怪异模式
} else {let IH = document.body.clientHeight
}
  1. clientX & clientY
    鼠标点击或者触屏时,点击位置距离window可视区域左上角的(0, 0)的坐标距离
<div @touchstart="touchStart($event)" @touchmove="touchMove($event)" @touchend="touchEnd($event)"></div>touchStart(e){let info = this.dropDownInfo;info.startX = e.targetTouches[0].clientX;info.startY = e.targetTouches[0].clientY;console.log(e)
},

在这里插入图片描述

  1. pageX & pageY
    正常情况下,window的可视区域的是不变的,所以相对于可视区域的坐标也就不会变,无论怎么点,clientX和clientY都是一样的。但是从page就可以知道,这个是页面坐标,也就是点击的页面距离window可视区域左上角的坐标距离。
    一般可视区域是固定的,但是页面大小就不一定是固定的,如果有滚动条,说面页面大小超过了可视区域,这时候点击滚动隐藏区域,pageX&pageY肯定是大于clientX&clientY

  2. screenX & screenY
    点击的位置距离屏幕的左上角的上左距离
    在这里插入图片描述

三. 应用场景

  1. swiper左右滑动切换列表的内部嵌套slide滑块

    问题:内部slide滑块滑动事件与swiper左右滑动切换事件冲突,影响性能

    解决办法:监听滑块滑到触左、触右,触左时可触发swiper左切换,触右时可触发swiper右切换,除此之外,内部滑动阻止冒泡

<div @scroll="scrollEvent" @touchstart="touchStart($event)" @touchmove="touchMove($event)" class="slide"><div class="slide__item"></div><div class="slide__item"></div><div class="slide__item"></div>
</div>

data() {return {dropDownInfo: {startX: 0,startY: 0,isDropDown: false, // 是否下拉isBorder: false,},leftCanChange: true, // 靠左touch可以触发父级swiper切换事件,默认truerightCanChange: false, // 靠右touch可以触发父级swiper切换事件,默认false}
},
methods: {scrollEvent(e){const slideWidth = e.target.scrollWidth; // 盒子内容里面元素占据的真正宽度const offsetWidth = e.target.offsetWidth; // 盒子的真实宽度,不包括左右margin外边距const scrollLeft = e.target.scrollLeft; // 滚动条滚动的宽度if (scrollLeft <= 0) {// 触左this.leftCanChange = true} else if (scrollLeft + offsetWidth >= slideWidth) {// 触右(滚动条可滚动的宽度 + 盒子的真实宽度 >= 盒子内容元素的真实宽度)this.rightCanChange = true} else {this.leftCanChange = falsethis.rightCanChange = false}},/*** 触摸开始*/touchStart(e){const info = this.dropDownInfo;info.startX = e.targetTouches[0].pageX;info.startY = e.targetTouches[0].pageY;},/*** 触摸滑动时*/touchMove(e){let info = this.dropDownInfo;const X = e.targetTouches[0].pageX - info.startX;const disX = Math.abs(X)const disY = e.targetTouches[0].pageY - info.startY// 左右滑动且列表数据大于1,阻止冒泡触发父级swiper切换if ((disX > disY) && this.options.length > 1) {// 除了触左,右滑 || 触右,左滑不阻止冒泡,防止触发父级swiper切换if (!(this.leftCanChange && X > 0 || this.rightCanChange && X < 0)) {e.stopPropagation();}}},
}
.slide{position: relative;overflow: hidden;overflow-x: auto;white-space: nowrap;-webkit-overflow-scrolling: touch;background: #f5f5f5;
}
.slide__item{display: inline-block;width: 6.58rem;min-height: 3rem;margin: 0 0.08rem;vertical-align: top;background: #ffffff;
}

2. 监听元素是否在可视区

mounted() {window.addEventListener("scroll", this.handleScroll, false);
},
methods: {/*** 页面滚动*/handleScroll(e) {let el = document.getElementById("elementId"); // 需要监听的元素let isVideoVisible = this.$util.isElementVisible(el); }
},
util.js
/*** 元素是否在可视区* @param el* @returns {boolean|boolean | *}*/
function isElementVisible(el) {const rect = el.getBoundingClientRect();const vWidth = window.innerWidth || document.documentElement.clientWidth;const vHeight = window.innerHeight || document.documentElement.clientHeight;const efp = function (x, y) {return document.elementFromPoint(x, y);};if (rect.right < 0 || rect.bottom < 0|| rect.left > vWidth || rect.top > vHeight) return false;return (el.contains(efp(rect.left, rect.top))|| el.contains(efp(rect.right, rect.top))|| el.contains(efp(rect.right, rect.bottom))|| el.contains(efp(rect.left, rect.bottom)));
}

以上代码只对上下滚动监听有用
在一个页面的slide左右滚动滑块中监听的话要用别的方法
**getBoundingClientRect();**获取元素距离浏览器周边的位置的方法

<div @scroll="scrollEvent" class="council__slide"><divv-for="(item, index) in options":key="'list-'+ index"class="council__slide-item"></div>
</div>
.council__slide-box{position: relative;overflow: hidden;overflow-x: auto;white-space: nowrap;-webkit-overflow-scrolling: touch;&::-webkit-scrollbar {width: 0;height: 0;display: none;background: transparent;}
}
.council__slide-item{display: inline-block;width: 6.78rem;height: 3.86rem;border-radius: 0.4rem;overflow: hidden;margin: 0 0.1rem;
}
created () {this.throttleScroll = $util.throttle(this.pageScroll, 100);
},
mounted () {},
methods: {scrollEvent(){this.throttleScroll();},pageScroll () {let el = document.getElementById('playVideo');const rectLeft = el.getBoundingClientRect(); // 获取元素距离浏览器周边的距离// if (Math.abs(rectLeft.left) >= 187) {...}}},
}
<input type="text" id="inp" /><script type="text/javascript">
var box = document.getElementById( "inp" ); 
alert(box.getBoundingClientRect().top); 
alert(box.getBoundingClientRect().right); 
alert(box.getBoundingClientRect().bottom); 
alert(box.getBoundingClientRect().left);
function getRect( elements ){ var rect = elements.getBoundingClientRect(); var clientTop = document.documentElement.clientTop; var clientLeft = document.documentElement.clientLeft; return { // 兼容ie多出的两个px top : rect.top - clientTop, // 距离顶部的位置 bottom : rect.bottom - clientTop, // 距离顶部加上元素本身的高度就等于bottom的位置 left : rect.left - clientLeft, // 距离左边的位置 right : rect.right - clientLeft // 距离右边的位置就是 距离左边的位置加上元素本身的宽度 }; 
}; 
</script>

如何判断元素是否进入可视区域viewport?

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

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

相关文章

Docker运行操作系统环境(BusyBoxAlpineDebian/UbuntuCentOS/Fedora)

目前常用的Linux发行版主要包括Debian/Ubuntu系列和CentOS/Fedora系列。前者以自带软件包版本较新而出名&#xff1b;后者则宣称运行更稳定一些。选择哪个操作系统取决于读者的具体需求。同时&#xff0c;社区还推出了完全基于Docker的Linux发行版CoreOS。 使用Docker&#xff…

poj1681 Painter's Problem高斯消元

链接http://poj.org/problem?id1681 View Code 1 #include <stdio.h> 2 #include <string.h>3 #include <algorithm>4 #include <cmath>5 using namespace std;6 int d[230][230], N, M;7 char s[16][16]; 8 void solve( int n)9 { 10 int x[230…

Mac下关于-您不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。-的删除...

打开 Terminal 应用程序。键入&#xff1a; sudo rm -rf注意&#xff1a;在“-rf”后键入一个空格。没有空格该命令将不能执行。在步骤 6 之前请不要按下 Return 键。打开您的“废纸篓”。从“编辑”菜单中选择“全选”。将“废纸篓”中的所有内容都拖到 Terminal 窗口中。这将…

小程序、vue 新闻上下轮播

小程序、vue 新闻上下轮播vue小程序红色部分&#xff1a;相当于放映机&#xff0c;也就是容器&#xff0c;overflow&#xff1a;hidden绿色内容&#xff1a;相当于胶片&#xff0c;也就是domvue vue的核心之一&#xff0c;数据驱动模版&#xff0c;循环播放映射的数据上就是 […

Cogs 376. [IOI2002]任务安排(后效性DP)

[IOI2002]任务安排 ★☆ 输入文件&#xff1a;batch.in 输出文件&#xff1a;batch.out 简单对比 时间限制&#xff1a;1 s 内存限制&#xff1a;128 MB N个任务排成一个序列在一台机器上等待完成&#xff08;顺序不得改变&#xff09;&#xff0c;这N个任务被分成若干批&am…

ajax.actionlink使用问题

突然发现ajax.actionlink调用的方法全是GET方式的&#xff0c;就算制定了POST也不行&#xff0c;Confirm窗口也弹不出来。。。直接StackOverFlow搜索 ajax.actionlink post not work, 出来一堆结果&#xff0c;有的是因为路由参数不对&#xff0c;有的是回调方法不对&#xff…

JAVA Stack栈和Heap堆的区别(转)

首先分清楚Stack&#xff0c;Heap的中文翻译&#xff1a;Stack—栈&#xff0c;Heap—堆。在中文里&#xff0c;Stack可以翻译为“堆栈”&#xff0c;所以我直接查找了计算机术语里面堆和栈开头的词语&#xff1a;堆存储&#xff1a; heapstorage 堆存储分配&#xff1a; he…

CSDN Markdown编辑器编辑教程

目录快捷键文字样式设置&#xff08;字体, 大小, 颜色, 高亮底色&#xff09;内嵌HTML表格定义列表代码块脚注数学公式UML 图:离线写博客常见颜色[TOC](目录)快捷键 - 加粗 Ctrl B - 斜体 Ctrl I - 引用 Ctrl Q- 插入链接 Ctrl L- 插入代码 Ctrl K- 插入图…

一个奇怪的EL表达式错误

下图是在Struts2的action中写的一个方法 JSP页面代码如下&#xff1a; 在页面访问如下路径&#xff1a;http://localhost:8088/maven_ssh/cust_getCustList 目前推测原因是存到session中的对象键值"custList"和action中方法名getCustList冲突了&#xff1f; 各位怎么…

Ruby 数组

city["北京","上海","天津","重庆"]puts citycityArray.newcity[0]"北京"city[1]"上海"city[2]"天津"city[3]"重庆"puts city city["北京","上海","天津",&qu…

(转) java 复制文件,不使用输出流复制,高效率,文件通道的方式复制文件

public static void fileChannelCopy(File s, File t) {FileInputStream fi null;FileOutputStream fo null;FileChannel in null;FileChannel out null;try {fi new FileInputStream(s);fo new FileOutputStream(t);in fi.getChannel();// 得到对应的文件通道out fo.g…

Mysql中的in和find_in_set的区别?

在mysql中in的使用情况如下&#xff1a; select * from article where 列名 in(值1&#xff0c;值2&#xff0c;值3.....)&#xff1b; select * from article where 值1 in(值1&#xff0c;值2&#xff0c;值3.....)&#xff1b; 在mysql中find_in_set的使用情况如下&#xff…

Vue组件强制刷新(重新渲染)的四种方案对比

文章目录前言一、刷新整个页面二、使用v-if标记三、forceUpdate四、key-changing五、应用场景vue具有缓存的页面的强制刷新进入页面输入框自动聚焦前言 Vue的双向绑定属于自动档&#xff1b;在特定的情况下&#xff0c;需要手动触发“刷新”操作&#xff0c;目前有四种方案可以…

AOJ 0525 Osenbei【穷竭搜索】

AOJ 0525 题意&#xff1a; 有一个烤饼器可以烤r行c列的煎饼&#xff0c;煎饼可以正面朝上&#xff08;用1表示&#xff09;也可以背面朝上&#xff08;用0表示&#xff09;。一次可将同一行或同一列的煎饼全部翻转。现在需要把尽可能多的煎饼翻成正面朝上&#xff0c;问最多能…

wp imei

由于WP8SKD不提供获取机子IMEI的方法&#xff0c;所以无法得到机子IMEI&#xff0c;但是SDK提供一另一个获取唯一ID的方法&#xff0c;在Microsoft.Phone.Info.DeviceExtendedProperties里面的DeviceUniqueId。 通过这个方法可以获得. 参考 wp8sdk有关DeviceExtendedProperties…

css-如何对每行中最后一个元素删除边距?

文章目录前言一、负边距一、nth-child()系列)前言 如何从最后一列的每个元素中删除边距&#xff1f; 在元素宽度不确定的情况下&#xff0c;或者如果屏幕很小或用户调整浏览器大小&#xff0c;则每行排列的个数就不确定 因此&#xff0c;在任何情况下&#xff0c;最后一列中出…

Cntlm安装和配置心得

2019独角兽企业重金招聘Python工程师标准>>> 对于那些使用NTLM进行身份验证的网络代理环境&#xff08;即设置上除需要代理主机和端口之外还需要提供域用户和密码&#xff09;来说&#xff0c;通过代理上网是一件头痛的事情&#xff0c;这主要是因为很多软件不支持N…

vim插件之cscope的安装与配置

本文参考自&#xff1a; http://easwy.com/blog/archives/advanced-vim-skills-cscope/ http://blog.csdn.net/dengxiayehu/article/details/6330200 http://blog.csdn.net/daofengdeba/article/details/7606616 插件介绍&#xff1a; cscope是用来查看源代码的工具&#xff0c…

字符串编辑距离(转载)

Levenshtein Distance (LD, 来文史特距离)也叫edit distance(编辑距离)&#xff0c;它用来表示2个字符串的相似度&#xff0c;LD定义为需要最少多少步基本操作才能让2个字符串相等&#xff0c;基本操作包含3个&#xff1a;插入, 删除, 替换&#xff1b;比如&#xff0c;kiteen和…

css媒体查询(手机、平板、PC)

List item css媒体查询PC端按屏幕尺寸整理? 通过上面的电脑屏蔽及尺寸的例表上我们得到了几个宽度 1024 1280 1366 1440 1680 1920 超小屏幕 手机 (<768px) 小屏幕 平板 (≥768px) 中等屏幕 桌面显示器(≥992px) 大屏幕 大桌面显示器 (≥1200px) /* 超小屏幕&#xff08…