JS实现侧边栏鼠标经过弹出框+缓冲效果


Posted in Javascript onMarch 29, 2017

可能这个标题起得不够恰当,简单来说就是:当鼠标移到最左侧时,移出一个框。

首先,我们用两个div来简单布局以下页面:

<div id="box">
 <div id="share">分享到</div>
</div>

这个分享框的弹出原理是:把内层div定位到外层div最右侧紧贴,然后把外层div定位到屏幕左外测,left的值与宽度相等,刚好隐藏掉就可以。当鼠标经过时,再通过改变left的值使外层div显示出来。

<script type="text/javascript">
 window.onload=function(){
 var oBox=document.getElementById('box');
 var oShare=document.getElementById('share');
 var timer=null; //定义一个空的定时器
 function startmove(iTarget){
 var speed=0; //定义步长
 clearInterval(timer); //每次调用函数后,先执行关闭定时器的代码,目的是防止多次操作导致计时器叠加出现变速的Bug
 timer=setInterval(function(){
  if(oBox.offsetLeft<iTarget){ //目标值从事件调用函数中传入,当盒子左边距小于目标值时,说明还没移动到指定位置,让步长=10,往右运动
  speed=10;
  }
  else{ //否则就是超过了目标值,让步长=-10,往左运动
  speed=-10;
  }
  if(oBox.offsetLeft==iTarget){ //当盒子左边距等于目标值时,就关闭计时器
  clearInterval(timer);
  }
  else{
oBox.style.left=oBox.offsetLeft+speed+'px'; //盒子左边的距离,即移动的距离,注意加上单位;这个else分支也解决了一个bug:当满足条件停下来后,继续点击还会运动,所以加上else分支
  }
 },30)
 }
 //函数调用  
 oBox.onmouseover=function(){
 startmove(0);
 }
 oBox.onmouseout=function(){
 startmove(-200);
 }
}
</script>

这里要注意的几个点:

1、分析清楚offsetLeft与目标值的关系,什么时候步长为正,什么时候步长为负;

2、offsetLeft获取出来不带单位,所以在设置left的值时要记得加上单位。

容易出现的几个bug:

1、在设置步长时,当步长不能被整除,在关闭计时器的条件上写==,会出现盒子运动不停的bug,改为>=或者修改步长来修复Bug;

2.3、在注释里说明。

缓冲效果

原理:根据计算出的步长进行运动,大于0向左运动,小于0向右运动。缓冲运动不仅视觉上更和谐,而且也更为方便。

<script type="text/javascript">
 window.onload=function(){
 var oBox=document.getElementById('box');
 var timer=null;
 function startmove(iTarget){
  clearInterval(timer);
  timer=setInterval(function(){
  //求步长,为正向右移动,为负向左移动,10为自定义
  var speed=(iTarget-oBox.offsetLeft)/10; 
  //对步长取整,大于0向上取整,小于0向下取整,原因就是正数越来越大,负数越来越小
  speed=speed>0?Math.ceil(speed):Math.floor(speed); 
  //设置left的值
  oBox.style.left=oBox.offsetLeft+speed+'px';
  },30)
 }
 oBox.onmouseenter=function(){
  startmove(0);
 }
 oBox.onmouseleave=function(){
  startmove(-200);
 }
 }
</script>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
分享jQuery封装好的一些常用操作
Jul 28 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
Javascript之图片的延迟加载的实例详解
Jul 24 Javascript
vue监听scroll的坑的解决方法
Sep 07 Javascript
利用nginx + node在阿里云部署https的步骤详解
Dec 19 Javascript
JS脚本加载后执行相应回调函数的操作方法
Feb 28 Javascript
vue组件(全局,局部,动态加载组件)
Sep 02 Javascript
vue-cli 打包使用history模式的后端配置实例
Sep 20 Javascript
pm2启动ssr失败的解决方法
Jun 29 Javascript
微信小程序实现一个简单swiper代码实例
Dec 30 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
Nov 03 Javascript
Mongoose经常返回e11000 error的原因分析
Mar 29 #Javascript
js实现一个简单的数字时钟效果
Mar 29 #Javascript
jquery实现tab键进行选择后enter键触发click行为
Mar 29 #jQuery
Vue2组件tree实现无限级树形菜单
Mar 29 #Javascript
整理关于Bootstrap列表组的慕课笔记
Mar 29 #Javascript
Vue.js 插件开发详解
Mar 29 #Javascript
整理关于Bootstrap过渡动画的慕课笔记
Mar 29 #Javascript
You might like
服务器端解压缩zip的脚本
2006/12/22 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
js tab效果的实现代码
2009/12/26 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
Django的分页器实例(paginator)
2017/12/01 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
Europcar比利时:租车
2019/08/26 全球购物
管理站站长岗位职责
2013/11/27 职场文书
倡议书格式
2014/04/14 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
ubuntu下常用apt命令介绍
2022/06/05 Servers