原生JavaScript实现幻灯片效果


Posted in Javascript onFebruary 19, 2021

当我们制作一个页面时,尤其是制作一个首页时,通常会设计一个可以链接到整个网站的其他主体页面的导航栏,或者一段网站的介绍文字中会包含这页面的跳转,通常情况会使用title属性为这些跳转链接添加一些解释性的文字,但是我们可以通过制作一个幻灯片的demo,加强用户的体验性。当用户的鼠标移动到某一链接时,下方会出现对应的图片预览,这样即美化页面,又大大增加了整个网站的交互性,下面就让我们一起制作一个漂亮的幻灯片脚本吧。

准备:在制作脚本之前,需要制作一张图片,这张图片应该展示了所有预览效果,如下图:

原生JavaScript实现幻灯片效果

index.html

制作有序列表,添加一些页面链接

<body>
 <h1>简单动画制作</h1>
 <p>连接跳转目标展示</p>
 <ol id="list">
 <li>
 <a href="list1.html" >First</a>
 </li>
 <li>
 <a href="list2.html" >Second</a>
 </li>
 <li>
 <a href="list3.html" >Third</a>
 </li>
 </ol>
 <!--动态添加的图片展示区域>-->
<script src="script.js"></script>
</body>

style.css

为这个导航栏添加一些样式

ol{
 padding-left: 20px;
}
ol li{
 display: inline;
 margin-right: 10px;
}
#view{
 width: 600px;
 height: 200px;
 position: absolute;
}
#slideShow{
 width: 200px;
 height: 200px;
 overflow: hidden;
 position: relative;
}

script.js

实现思路:

在建立脚本之前,我们先整理一下思路,确定我们要做什么?
1. 新建一些节点用来展示预览图片
2. 为a标签添加onmouseover事件
3. 通过setTimeout()函数,和对图片元素left、top偏移量(获取设置的left top属性时 要转换称整型)的移动完成动画效果

/*共享load*/
function addLoadEvent(fun){
 var oldLoad = window.onload;
 if(typeof oldLoad != "function"){
  window.onload = fun;
 }else{
  window.onload = function(){
   oldLoad();
   fun();
  }
 }
}

/*insertAfter*/
function insertAfter(newNode,oldNode){
 var parent = oldNode.parentNode;
 if(parent.lastChild == oldNode){
  parent.appendChild(newNode);
 }else{
  parent.insertBefore(newNode,oldNode.nextSibling);
 }
}

function show(){
 /*向后兼容*/
 if(!document.getElementById) return false;
 if(!document.getElementsByTagName) return false;
 if(!document.createElement) return false;

 /*获取列表清单*/
 var list = document.getElementById("list");

 /*创建图片展示区域*/
 /*外层div*/
 var div = document.createElement("div");
 div.setAttribute("id","slideShow");
 /*img*/
 var img = document.createElement("img");
 img.setAttribute("id","view");
 img.setAttribute("src","image.jpg");
 img.setAttribute("alt","图片预览");
 /*添加 使用insertAfter()函数 保证div紧跟在list列表之后*/
 insertAfter(div,list);
 div.appendChild(img);

 /*绑定事件*/
 var a = list.getElementsByTagName("a");
 a[0].onmouseover =function(){
  moveElement("view",0,0,10);
 };
 a[1].onmouseover = function(){
  moveElement("view",-200,0,10);
 };
 a[2].onmouseover = function(){
  moveElement("view",-400,0,10);
 };
}


/*移动
*参数的含义:图片所在元素的id;图片应该向左移动的偏移量;上偏移量;时间
*/
function moveElement(elementID,left,top,interval){
 /*向后兼容*/
 if(!document.getElementById) return false;
 if(!document.getElementById(elementID)) return false;

 /*获取图片*/
 var img = document.getElementById(elementID);

 /*判断当前元素是否已经处在一个动画函数中
 *防止动画堆积
 */
 if(img.moveNow){
  /*清楚堆栈中的动画*/
  clearTimeout(img.moveNow);
 }

 /*判断元素是否设置了left和top*/
 if(!img.style.left){
  img.style.left = "0px";
 }
 if(!img.style.top){
  img.style.top = "0px";
 }


 /*获取图片当前位置
 *此时获取的值是字符串格式,使用parseInt()强制转化为字符串*/
 var oldLeft = parseInt(img.style.left);
 var oldTop = parseInt(img.style.top);

 /*将当前位置与目标位置做比较*/
 if(oldLeft == left && oldTop == top){
  return true;
 }

 /*为了保证用户体验,当移动的距离较大时应该移动的快一些
 *当移动的距离比较小时,可以适当慢一些
 *根据相差的距离判断移动的距离,每次移动相差距离的1/10
 */
 /*dist变量用于存储当前偏移量与目标偏移量的距离*/
 var dist = 0;
 if(oldLeft < left){
  /*ceil()向上取整 防止小数 以及小于1的情况*/
  dist = Math.ceil((left-oldLeft)/10);
  oldLeft = oldLeft+dist;
 }
 if(oldLeft > left){
  dist = Math.ceil((oldLeft-left)/10);
  oldLeft = oldLeft - dist;
 }
 if(oldTop < top){
  dist = Math.ceil((top-oldTop)/10);
  oldTop = oldTop+dist;
 }
 if(oldTop > top){
  dist = Math.ceil((oldTop-top)/10);
  oldTop = oldTop - dist;
 }

 /*移动*/
 img.style.left = oldLeft+"px";
 img.style.top = oldTop+"px";

 /*调用函数*/
 var result = "moveElement('"+elementID+"',"+left+","+top+","+interval+")";
 /*将执行动画的函数,设置成这个元素的一个属性*/
 img.moveNow = setTimeout(result,interval);
}

addLoadEvent(show);

最后执行效果

原生JavaScript实现幻灯片效果

此时,当我们将鼠标移动到不同列表项时,列表下的图片就会移动到对应的预览图位置。

到此,一个简单的幻灯片demo就制作完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript继承方式实例
Oct 29 Javascript
iframe 上下滚动条如何默认在下方实现原理
Dec 10 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
利用jQuery中的ajax分页实现代码
Feb 25 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
May 17 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
Jun 17 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
Aug 05 Javascript
angular ng-repeat数组中的数组实例
Feb 18 Javascript
细说webpack源码之compile流程-入口函数run
Dec 26 Javascript
puppeteer库入门初探
Jan 09 Javascript
js实现上传图片到服务器
Apr 11 Javascript
JavaScript 实现继承的几种方式
Feb 19 #Javascript
JavaScript 生成唯一ID的几种方式
Feb 19 #Javascript
JavaScript实现打字游戏
Feb 19 #Javascript
JS+CSS实现动态时钟
Feb 19 #Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 #Javascript
原生微信小程序开发中 redux 的使用详解
Feb 18 #Javascript
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 #Vue.js
You might like
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
javascript中检测变量的类型的代码
2010/12/28 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python计算程序运行时间的方法
2014/12/13 Python
使用python实现生成用户信息
2017/03/20 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python web框架中实现原生分页
2019/09/08 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
个人简历中的自我评价怎么写
2014/01/26 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
公司委托书格式范文
2014/04/04 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
2014年幼师工作总结
2014/11/22 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
经销商会议开幕词
2016/03/04 职场文书