企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
[TOC] # 1.1 offset概述 offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。 ●获得元素距离带有定位父元素的位置 ●获得元素自身的大小(宽度高度) ●注意:返回的数值都不带单位 offset系列常用属性: | offset系列属性 | 作用 | | --- | --- | | element.offsetParent (元素的属性) | 返回作为该元素带有定位的父级元素如果父级都没有定位则返回body | | element.offsetTop | 返回元素相对带有定位父元素上方的偏移 | | element.offsetLeft | 返回元素相对带有定位父元素左边框的偏移 | | element.offsetWidth | 返回自身包括padding、边框、 内容区的宽度,返回数值不带单位 | | elementoffsetHeight | 返回自身包括padding.边框、内容区的高度,返回数值不带单位 | # 1.2 offset与style区别 (获取元素大小位置,用offset更合适;元素更改值,用style改变) ![](https://img.kancloud.cn/a6/c7/a6c75499593c1e7892d18ad09c8f96e3_1193x328.png) # 案例:获取鼠标在盒子内的坐标 (放大镜 开发 重点) ## 案例分析 ①我们在盒子内点击,想要得到鼠标距离盒子左右的距离。 ②首先得到鼠标在页面中的坐标( e.pageX, e.pageY ) ③其次得到盒子在页面中的距离(box.offsetLeft, box.offsetTop) ④用鼠标距离页面的坐标减去盒子在页面中的距离,得到鼠标在盒子内的坐标 ⑤如果想要移动一下鼠标 ,就要获取最新的坐标,使用鼠标移动事件mousemove ## 代码实验 ~~~ <div class="box"></div> <script> //我们在盒子内点击, 想要得到鼠标距离盒子左右的距离。 //首先得到鼠标在页面中的坐标( e. pageX, e. pageY) //其次得到盒子在页面中的距离(box . offsetLeft, box. offsetTop) //用鼠标距离页面的坐标减去盒子在页面中的距离, 得到鼠标在盒子内的坐标 var box = document.querySelector(' .box' ); box.addEventListener( ' mousemove',function(e) { // console.log(e.pageX); //获得鼠标滑过盒子的坐标 // console.log(e.pageY); // console.log( box.offsetLeft);//获得盒子的坐标 var x = e.pageX - this.offsetLeft; var y = e.pageY - this.offsetTop; this. innerHTML = 'x坐标是' + x + ' y坐标是' + y; }) </script> ~~~ # 案例:模态框拖拽 (可弹出的登录界面) ![](https://img.kancloud.cn/05/a8/05a82b6724d3af05a12976ad27713799_729x602.png) ## 案例分析 弹出框,我们也称为模态框。 1.点击弹出层,会弹出模态框,并且显示灰色半透明的遮挡层。 2.点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层。 3.鼠标放到模态框最上面一行,可以按住鼠标拖拽模态框在页面中移动。 4.鼠标松开,可以停止拖动模态框移动。 ## 案例分析 案例分析 ①点击弹出层,模态框和遮挡层就会显示出来display:block; ②点击关闭按钮,模态框和遮挡层就会隐藏起来display:none; ③在页面中拖拽的原理:鼠标按下并且移动,之后松开鼠标 ④触发事件是鼠标按下mousedown,鼠标移动mousemove鼠标松开mouseup ⑤拖拽过程:鼠标移动过程中,获得最新的值赋值给模态框的left和top值,这样模态框可 以跟着鼠标走了 ⑥鼠标按下触发的事件源是最上面- -行,就是id为title ⑦鼠标的坐标减去鼠标在盒子内的坐标,才是模态框真正的位置。 ⑧鼠标按下,我们要得到鼠标在盒子的坐标。 ⑨鼠标移动,就让模态框的坐标设置为:鼠标坐标减去盒子坐标即可,注意移动事件写到按下事件里面。 鼠标松开,就停止拖拽,就是可以让鼠标移动事件解除 ## 实验代码 ![](https://img.kancloud.cn/0e/e0/0ee00010e0e765cccf3ff7258e7249a9_1263x582.png) # 案例:仿京东放大镜 (重点 开发常用) ![](https://img.kancloud.cn/8c/d1/8cd18c3ec06dfbcef35227204af7bcb4_1116x628.png) ## 样式代码 () 基本样式调完后,输入display:none; ![](https://img.kancloud.cn/2c/19/2c19996e9f687f729ab4c9f0b01b5f8c_526x402.png) 旁边的显示图 ![](https://img.kancloud.cn/04/80/0480f3274303b6ea34711433e15978e4_505x428.png) # 案例分析 ①整个案例可以分为三个功能模块 ②鼠标经过小图片盒子,黄色的遮挡层和大图片盒子显示,离开隐藏2个盒子功能 ③黄色的遮挡层跟随鼠标功能。 ④移动黄色遮挡层,大图片跟随移动功能。 ![](https://img.kancloud.cn/9c/9c/9c9cc580dd2df1af89d4e879eba2f2a5_784x529.png) ## 鼠标在盒子距离计算(父亲没有定位)(重点) ![](https://img.kancloud.cn/2d/b8/2db88d1e2c4419650cbb973c68e19892_799x491.png) ~~~ // 2.鼠标移动的时候,让黄色的盒子跟着鼠标来走 preview_ img.addEventL istener( ' mousemove', function(e) { //(1).先计算出鼠标在盒子内的坐标 var x = e.pageX - this.offsetLeft; var y = e.pageY - this.offsetTop; // console.log(X, y); // (2) 减去盒子高度300的一半是150就是我们mask的最终left 和top值了 mask.style.left = x- mask.offsetWidth / 2 + ' px' ; //鼠标在放大镜中央 重点 mask.style.top = y - mask.offsetHeight / 2 + 'px ' ; //鼠标在放大镜中央 重点 }) ~~~ ## 鼠标的放大镜固定在盒子内部 (重点) ~~~ var maskX = X - mask . offsetWidth / 2; var maskY = y - mask .offsetHeight / 2; // (4) 如果x坐标小于了0就让他停在0的位置 if (maskX <= 0) { maskX = 0; } else if (maskX >= preview_ img.offsetWidth - mask.offsetWidth) { maskX = preview_ img.offsetWidth - mask.offsetWidth; } if(maskY <= 0) { maskY = 0; }else if (maskY >= preview_ img.offsetHeight - mask.offsetHeight) { maskp=review_ img.offsetHeight - mask.offsetHeight ; } mask.style.left = maskX +'px'; mask.style.top = maskY + ' px ' ; }) ~~~ ## 代码实验 ### 1、 ![](https://img.kancloud.cn/ef/00/ef004f4c23174512a448360695c67b0d_1083x485.png) ### 2、黄色盒子跟鼠标走 ![](https://img.kancloud.cn/a4/b7/a4b778e578cb4d61ad299f2c8cb84e85_1018x344.png) ### 3、把鼠标放大镜固定在和盒子 ![](https://img.kancloud.cn/be/e7/bee7749cd193a2403bac2e7a60feb7da_1054x734.png) 下面修改 ![](https://img.kancloud.cn/f5/6a/f56a0076742dab0ffc6415bb671b2dc1_1081x558.png) ### 4、大图片同步移动 ![](https://img.kancloud.cn/a3/e6/a3e6ca92c7554aa6f514a3d7cb6f9e11_1164x614.png) ![](https://img.kancloud.cn/e1/1c/e11c22d6a143394f6680c514e6154121_861x282.png) ![](https://img.kancloud.cn/09/01/090139bde67e5c76415d2ca9dd3a8470_1175x435.png)