一.offset 偏移量
1.使用offest系列相关属性可以动态的得到该元素的位置(偏移),大小等
2.常见属性:如果父元素没定位,以下方法就针对于body而论
| offset系列属性 | 作用 |
|---|---|
| element.offsetParent | 返回作用该元素带有定位的父级元素 如果父级都没有定位则返回body |
| element.offsetTop | 返回元素相对带有定位的父元素上方的偏移 |
| element.offsetLeft | 返回元素相对带有定位的父元素的左边框的偏移 |
| element.offsetWidth | 返回自身包括padding,边框,内容区宽度,返回的数值不带参数 |
| element.offsetHeight | 返回自身包括padding,边框,内容区高度,返回的数值不带参数 |
3.offset和style的区别:
(1)offset:主要用于获得元素的大小位置
- 可以得到任意样式表中的样式
- 获得的数值无单位
- offsetWidth为只读属性,不能赋值
- offsetWidth包含padding,border,width
(2)style:主要用于给元素更改值
- style只能得到行内样式表中的样式
- style.width获得的是带有单位的字符串
- style.width获得的值不包含padding和border
- style.width是可读写属性,可以获取也可以赋值
(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><style>body,html {height: 100%;width: 100%;}.mask {opacity: 0.6;z-index: -11;filter: Alpha;width: 100%;height: 100%;margin: 0;padding: 0;background-color: none;}.box {width: 30%;height: 30%;background-color: black;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);display: none;cursor: move;}.title {width: 100%;height: 50%;background-color: red;}</style><body><div class="mask"><div class="box"><div class="title"></div><button id=closebtn>关闭</button></div><div class="link">点击登录</div></div><script>var mask = document.querySelector(".mask");var closebtn = document.querySelector("#closebtn");var box = document.querySelector(".box");var link = document.querySelector(".link");var title = document.querySelector(".title");link.addEventListener('click',function(e){mask.style.background = "rgba(1,1,1,.2)";box.style.display = "block";})closebtn.addEventListener('click',function(e){mask.style.background = "none";box.style.display = "none";})title.addEventListener('mousedown',function(e){var x = e.pageX - box.offsetLeft;var y = e.pageY - box.offsetTop;document.addEventListener('mousemove',move)function move(e) {box.style.left = e.pageX - x +'px';box.style.top = e.pageY - y + 'px';}document.addEventListener('mouseup',function(){document.removeEventListener('mousemove',move);})})</script></body></html>
案例:仿淘宝放大镜
<!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>Document</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}.preview_img {position: relative;width: 352px;height: 451px;border: 1px solid #ccc;margin:20px 50px ;}.mask {display: none;position: absolute;top: 0;left:0;width: 200px;height: 200px;background-color: #FEDE4F;opacity: 0.3;}.big {display: none;position: absolute;top:20px;left:412px ;width: 352px;height: 451px;border: 1px solid #ccc;overflow: hidden;}.big .big_img {position: absolute;top:0;left: 0;}</style></head><body><div class="preview_img"><img src="./th.jpg" alt=""><div class="mask"></div></div><div class="big"><img src="./th (1).jpg" alt="" class="big_img"></div><script>var preview_img = document.querySelector('.preview_img');var mask = document.querySelector('.mask');var big = document.querySelector('.big');var big_img = document.querySelector('.big_img');preview_img.addEventListener('mouseover',function(){mask.style.display = 'block';big.style.display = 'block';})preview_img.addEventListener('mouseout',function(){mask.style.display = 'none';big.style.display = 'none';})preview_img.addEventListener('mousemove',function(e){var mouseX = e.pageX ;var mouseY = e.pageY ;var boxLeft = preview_img.offsetLeft ;var boxTop = preview_img.offsetTop ;var x = mouseX - boxLeft ;var y = mouseY - boxTop ;var moveX = x - mask.offsetLeft/2 ;var moveY = y - mask.offsetHeight/2;if( moveX <= 0){moveX = 0 ;}else if( moveX >= preview_img.offsetWidth-mask.offsetWidth){moveX = preview_img.offsetWidth-mask.offsetWidth;}if( moveY <= 0){moveY = 0 ;}else if ( moveY >= preview_img.offsetHeight-mask.offsetHeight){moveY = preview_img.offsetHeight-mask.offsetHeight;}mask.style.top = moveY + 'px' ;mask.style.left = moveX + 'px' ;var maskMaxX = preview_img.offsetWidth - mask.offsetWidth;var maskMaxY = preview_img.offsetHeight - mask.offsetHeight ;var bigImgMaxX = big_img.offsetWidth - big.offsetWidth ;var bigImgMaxY = big_img.offsetHeight - big.offsetHeight ;var bigX = moveX * bigImgMaxX / maskMaxX ;var bigY = moveY * bigImgMaxY / maskMaxY ;big_img.style.left = -bigX+'px';big_img.style.top = -bigY +'px';})</script></body></html>
二.client 元素可视区
1.使用client相关属性可以获取元素可视区的相关信息,通过client相关属性可以动态的获得元素的边框大小,元素大学等
2.client相关属性:
| client系列属性 | 作用 |
|---|---|
| element.clientTop | 返回元素上边框大小 |
| element.clientLeft | 返回元素左边框大小 |
| element.clientWidth | 返回自身包括padding,内容区的宽度,不含边框,返回数值不带单位 |
| element.clientHeight | 返回自身包括padding,内容区的高度,不含边框,返回数值不带单位 |
3.立即执行函数:
(1)不用调用,立即执行
(2)写法:(function(){})() 或者 (function(){}())
三.scroll 元素滚动
1.使用scroll系列的相关属性可以动态的得到该元素的大小,滚动距离等
2.scroll相关属性:
| scroll系列属性 | 作用 |
|---|---|
| element.scrollTop | 返回被卷上去的上侧距离,返回的数值不带单位 |
| element.scrollLeft | 返回被卷上去的左侧距离,返回的数值不带单位 |
| element.scrollWidth | 返回自身实际的宽度,不含边框,返回数值不带单位 |
| element.scrollHeight | 返回自身实际的高度,不含边框,返回数值不带单位 |
3.页面的滚动距离通过window.pageXoffset获得
四.动画函数封装
1.概述:
(1)动画实现原理:通过定时器setInterval()不断移动盒子位置
(2)利用定时器重复操作记得加结束条件
(3)给元素添加定位才能使用element.style.left
2.动画函数:
(1)把动画封装成函数,增高复用性
(2)注意传入两个参数,动画对象和移动到的距离
(3)平移函数:
function animate(obj,target){var timer = setInterval(function(){if(obj.opffsetLeft >= target){clearInterval(timer);}obj.style.left = obj.offsetLeft + 1 + 'px';},30)}animate(div,300);
