一.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);