原生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下过滤数组重复值的代码
Sep 10 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
JS实现self的resend
Jul 22 Javascript
Jquery动态改变图片IMG的src地址示例
Jun 25 Javascript
JS实现单击输入框弹出选择框效果完整实例
Dec 14 Javascript
浅谈JS中String()与 .toString()的区别
Oct 20 Javascript
Bootstrap源码学习笔记之bootstrap进度条
Dec 24 Javascript
vue实现循环切换动画
Oct 17 Javascript
vue-cli设置publicPath小记
Apr 14 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 Javascript
小程序自定义圆形进度条
Nov 17 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面试题(对属性或方法的访问控制)
2012/09/13 PHP
php除数取整示例
2014/04/24 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
php的4种常用运行方式详解
2016/12/22 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
理解Javascript闭包
2013/11/01 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
javascript的BOM
2016/05/03 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
python发腾讯微博代码分享
2014/01/10 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
Django添加sitemap的方法示例
2018/08/06 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
历史专业个人求职信范文
2013/12/07 职场文书
安全教育月活动总结
2014/05/05 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
会计演讲稿范文
2014/05/23 职场文书