js文件
let timer = null;
//匀速运动
//01从左向右走,走向目标
function sport01(obj){
clearInterval(timer);
timer = setInterval(function(){
if(obj.offsetLeft >= 500){
clearInterval(timer);
}else{
obj.style.left = obj.offsetLeft + 10 + 'px';
}
},50)
}
//02从右向左走,走向目标
function sport02(obj){
clearInterval(timer);
timer = setInterval(function(){
if(obj.offsetLeft <= 500){
clearInterval(timer);
}else{
obj.style.left = obj.offsetLeft - 10 + 'px';
}
},50);
}
//03从左向右和从右向左,都能走向目标
//把目标位置,还有加速度都传过来
function sport03(obj,target,speed){
clearInterval(timer);
timer = setInterval(function(){
//这种写法会出现物体在目标边缘抖动的情况
// if(target - obj.offsetLeft <= 0){
// obj.style.left = obj.offsetLeft - speed +'px';
// }else if(target - obj.offsetLeft >= 0){
// obj.style.left = obj.offsetLeft + speed + 'px';
// }else{
// clearInterval(timer);
// }
if(obj.offsetLeft === target){
clearInterval(timer);
}else{
obj.style.left = obj.offsetLeft + speed + 'px';
}
},50)
}
//04从左向右和从右向左,都能走向目标
//传目标位置
function sport04(obj,target){
clearInterval(timer);
timer = setInterval(function(){
//先判断物体现在在目标位置的左还是右,进而确定加速度为正还是为负
var speed = obj.offsetLeft > target ? -10 : 10;
if(obj.offsetLeft === target){
clearInterval(timer);
}else{
obj.style.left = obj.offsetLeft + speed + 'px';
}
},50)
}
//05从左向右和从右向左,都能走向目标,解决加速度和位移差不是整数倍关系问题(物体会在目标位置边缘抖动的问题)
//传目标位置
function sport05(obj,target){
clearInterval(timer);
timer = setInterval(function(){
//先判断物体现在在目标位置的左还是右,进而确定加速度为正还是为负
var speed = obj.offsetLeft > target ? -7 : 7;
if(Math.abs(obj.offsetLeft - target) < Math.abs(speed)){
obj.style.left = target + 'px';
clearInterval(timer);
}else{
obj.style.left = obj.offsetLeft + speed + 'px';
}
},50)
}
//缓冲运动(速度越来越慢)
//06从左向右和从右向左,都能走向目标
//传目标位置
function sport06(obj,target){
clearInterval(timer);
timer = setInterval(function(){
//缓冲运动,速度不是一个固定的值,用物体当前的位置减去目标的位置,再除以一个固定的值,就会得到一个变化的速度,因为当前的位置在不断的变化,所以当前的位置减去目标的位置的差是一个变化的数,且这个数越来越小。
var speed = (target - obj.offsetLeft ) / 8 ;
//处理小数问题 (因为到了最后速度有可能变为一个不变的小数,导致永远到不了目标位置),让小数都取整,每次减1,知道减到目标位置。
// 速度为正的时候,向上取整,为负的时候,向下取整
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
//缓冲一定能到目标位置,判断条件为是否到了目标位置,到了就停止计时器。
if(obj.offsetleft === target + 'px'){
clearInterval(timer);
}else{
obj.style.left = obj.offsetLeft + speed + 'px';
}
},50)
}
let alpha = 100;//假设当前的opacity值为1,因为计算机处理小数有问题,所以先扩大100倍,最终再除以100.
//淡入淡出效果(透明度的变化)
//07鼠标移入,透明度改变
function sport07(obj,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
//计算速度
var speed = (target - alpha) / 8 ;
//处理小数
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(obj.style.opacity === target ){
clearInterval(obj.timer);
}else{
alpha += speed;
obj.style.opacity = alpha / 100;
// obj.style.opacity = alpha / 100 + speed;
obj.style.filter = 'alpha(opacity = ' + alpha + ')';
}
},50)
}
//宽度变化
//08鼠标移入,宽度改变
function sport08(obj,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
//计算速度
var speed = (target - obj.offsetWidth) / 8 ;
//处理小数
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(obj.style.offsetWidth === target ){
clearInterval(obj.timer);
}else{
obj.style.width = obj.offsetWidth + speed + 'px';
}
},50)
}
//宽度变化
//兼容问题 当盒子加了border之后,盒子的宽度就回不去了
//09鼠标移入,宽度改变
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,1)[attr]
}
function sport09(obj,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
//获取当前宽度
var cur = parseInt( getStyle(obj,'width') );//获取回来的宽度有单位,取整,去掉单位。
// var cur = getStyle(obj,'width');
//计算速度
var speed = (target - cur) / 8 ;
//处理小数
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(cur === target ){
clearInterval(obj.timer);
}else{
obj.style.width = cur + speed + 'px';
}
},50)
}
//多物体透明度变化
//多个物体不能共用一个透明度
//10鼠标移入,透明度改变
function sport10(obj,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
//当前透明度
// 获取回来是字符串 '0.5462' 先变为数字parseFloat 再乘以100然后取整
var cur = parseInt(parseFloat(getStyle(obj,'opacity')) * 100 );
//计算速度
var speed = (target - cur) / 8 ;
//处理小数
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(cur === target ){
clearInterval(obj.timer);
}else{
obj.style.opacity = (cur + speed) / 100;
// obj.style.opacity = alpha / 100 + speed;
obj.style.filter = 'alpha(opacity = ' + cur + speed + ')';
}
},50)
}
//多物体各种样式变化
//多个物体不能共用一个透明度
//11鼠标移入,对应属性改变
//需要把要改变的属性传过来
function sport11(obj,attr,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
//当前透明度
// 获取回来是字符串 '0.5462' 先变为数字parseFloat 再乘以100然后取整
var cur = attr === 'opacity' ? parseInt(parseFloat(getStyle(obj,'opacity')) * 100 ) : parseInt( getStyle(obj,attr) );
//计算速度
var speed = (target - cur) / 8 ;
//处理小数
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(cur === target ){
clearInterval(obj.timer);
}else{
if(attr === 'opacity'){
obj.style.opacity = (cur + speed) / 100;
// obj.style.opacity = alpha / 100 + speed;
obj.style.filter = 'alpha(opacity = ' + cur + speed + ')';
}else{
//必须使用[]访问attr属性
obj.style[attr] = cur + speed + 'px';
}
}
},50)
}
应用案例:
1.多物体多属性变化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>18多物体多属性变化</title>
<style>
#box{
width: 100px;
height: 100px;
background: red;
margin: 10px;
border: 1px solid black;
opacity: 1;
filter: alpha(opacity = 100);
/* position: absolute; */
}
</style>
</head>
<body>
<div id="box">变宽</div>
<div id="box">变高</div>
<div id="box">透明</div>
<div id="box">变粗</div>
<div id="box">变大</div>
<script src="js/sport.js"></script>
<script>
var o_box = document.querySelectorAll('#box');
o_box[0].onmouseenter = function(){
sport11(this,'width',400);
}
o_box[0].onmouseout = function(){
sport11(this,'width',100);
}
o_box[1].onmouseenter = function(){
sport11(this,'height',400);
}
o_box[1].onmouseout = function(){
sport11(this,'height',100);
}
o_box[2].onmouseenter = function(){
sport11(this,'opacity',30);
}
o_box[2].onmouseout = function(){
sport11(this,'opacity',100);
}
o_box[3].onmouseenter = function(){
sport11(this,'borderWidth',40);
}
o_box[3].onmouseout = function(){
sport11(this,'borderWidth',1);
}
o_box[4].onmouseenter = function(){
sport11(this,'fontSize',40);
}
o_box[4].onmouseout = function(){
sport11(this,'fontSize',1);
}
</script>
</body>
</html>
2.移入移出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>19仿飞秋</title>
<style>
#box{
width: 200px;
height: 500px;
background-color: pink;
position: absolute;
left: -200px;
top: 100px;
border: 1px solid black;
}
</style>
</head>
<body>
<div id="box"></div>
<script src="js/sport.js"></script>
<script>
var o_box = document.querySelector('#box');
// o_box.onmouseenter = function(){
// sport05(this,0);
// }
// o_box.onmouseout = function(){
// sport05(this,-200);
// }
o_box.onmouseenter = function(){
sport11(this,'left',0);
}
o_box.onmouseout = function(){
sport11(this,'left',-200);
}
</script>
</body>
</html>
3.分享到
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>20分享到</title>
<style>
#box{
width: 200px;
height: 400px;
background-color: pink;
position: absolute;
left: -200px;
top: 100px;
}
#sp{
width: 20px;
height: 70px;
background-color: grey;
position: absolute;
left: 200px;
top: 160px;
}
</style>
</head>
<body>
<div id="box">
<span id="sp">分享到</span>
</div>
<script src="js/sport.js"></script>
<script>
//当鼠标移入span让box出来,鼠标移出span让box回去,会发生抖动现象,利用冒泡的原理,把移入事件加在box上,当鼠标滑入span的时候,冒泡到父级box。
// var o_sp = document.querySelector('#sp');
var o_box = document.querySelector('#box');
o_box.onmouseenter = function(){
sport06(o_box,0);
}
o_box.onmouseout = function(){
sport06(o_box,-200);
}
</script>
</body>
</html>
效果
默认:
鼠标滑入‘分享到’