JavaScript实现图片无缝滚动效果


Posted in Javascript onJuly 07, 2017

图片无缝滚动就是图片一直不停的滚动,好像没有无穷无尽似的,实际上就是几张图片不停的循环,但是看不出有从最后面切换到最前面的效果,这就是无缝滚动,文字和图片都可以无缝滚动,这里介绍的是图片,文字是同样的原理。

原理

以向上无缝滚动为例,其余几个方向的无缝滚动原理是一样的,点击向上无缝滚动。

JavaScript实现图片无缝滚动效果

设定一个可视区域,超过可视区域的部分隐藏,这里是将nav部分作为可视区域,ul#img是中包含所有的图片,实现无缝滚动的关键地方在这:

if(nav.scrollTop==list[list.length-1].offsetTop){
    nav.scrollTop=0
  }else{
    nav.scrollTop++;
  }

这里的nav.scrollTop是指当前的可视对象nav的顶端与正在显示的对象ul#img的顶端的距离,通俗一点来说,就是滚动条向下滚动的距离;list[i]就是要显示的图片列表,list[list.length-1]是指最后一张图片,list[list.length-1].offsetTop是指最后一张图片的顶部到它的父元素的顶部的距离,这个距离是不变固定的,父元素的position必须不能是static(默认的),而且也不能是div,否则会跳过这个元素把上一级当成父元素。

JavaScript实现图片无缝滚动效果

当向下滚动的距离与list[list.length-1].offsetTop的距离相等时,即图片5已经划过,到了显示图片1的时候,让滚动的距离瞬间为0,进行切换时由于两张图片是一样的,人观看时察觉不到,故形成了无缝滚动。

JavaScript实现图片无缝滚动效果

可以发现这里重叠了一张图片,是因为当最后一张图片滚动完之后要形成循环,可视区域内一定要有图片否则一片空白,这里设定的可视区域就是一张图片的高度,故重复的是图片1,如果比一张图片高度要大,则需按顺序多重复几张图片列表的图片。

html部分

四个方向:向上、向下、向左、向右的无缝滚动的html部分是一样的,就表现的部分是一样的,即

<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>无缝滚动</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
  <nav>
    <ul id="img">
      <li><img src="../images/img1.jpg" alt="img1"></li>
      <li><img src="../images/img2.jpg" alt="img2"></li>
      <li><img src="../images/img3.jpg" alt="img3"></li>
      <li><img src="../images/img4.jpg" alt="img4"></li>
      <li><img src="../images/img5.jpg" alt="img5"></li>
      <li><img src="../images/img1.jpg" alt="img1"></li>
    </ul>
  </nav>
  <script type="text/javascript" src="script.js"></script>
  </body>
  </html>

这里需要注意以下:设定的是5张720*405尺寸图片的循环滚动,但是要实现无缝滚动需在后面重复的添加几张图片,具体几张要根据可视区域是图片高度(向上,向下滚动)或宽度(向左,向右滚动)的几倍来确定,我这里设置可视区域的宽度为405px,故只需要重复一张即可,若假设是500px,则需重复两张,类似这样计算。

css部分

这里以向上滚动为例,其余四个方向的样式是类似的,只有些许地方不一样。这里需要注意几点:

1、nav是可视区域,一定要设置宽高,而且overflow要设置为hidden,否则移动不了;

2、ul#img的position要设置,否则默认为static,会影响offsetTop属性,因为父元素的position不能为static,否则会跳过该元素往上一级寻找;

3、要设置ul#img里面的li元素,否则图片上下都会有2px的空白,影响滚动时的效果。

向上、向下滚动样式

两者样式一样。ul#img的高度要是所有图片的总高度,但是由于li本来就是块级元素是由上往下排列的,不设置ul#img的高度也可以,但是向左或向右移动时,必须设置ul#img的宽度为所有图片的总宽度,这里为保持一致就设置了高度为所有图片的总高度;

*{
    padding: 0;
    margin: 0;
  }
  nav {
    width: 720px;
    height: 405px; /*设置可见部分的高度*/
    margin: 40px auto;
    border: 5px solid #eee;
    overflow: hidden;
  }
  #img{
    width: 720px;
    height:2430px;/*设置可见部分的高度*/
    position: relative;/*默认是static*/
  }
  #img li{
    width: 720px;
    height:405px;/*不设置则上下都会有2px的空白*/
  }

向上左、向右滚动样式

两者样式一样。向左、向右滚动时要用float:left让li元素在一行并排显示,而没有用display:inline-block是因为图片这样显示会有空隙,是因为行内元素产生的间隔,故用浮动。这里必须要设置ul#img的宽度为图片的总宽度。

*{
    padding: 0;
    margin: 0;
  }
  nav {
    width: 720px;
    height: 405px; /*设置可见部分的高度*/
    margin: 40px auto;
    border: 5px solid #eee;
    overflow: hidden;
  }
  #img{
    width: 4320px;
    height:405px;/*设置可见部分的高度*/
    position: relative;/*默认是static*/
  }
  #img li{
    width: 720px;
    height:405px;
    float:left;
  }

JavaScript部分

这里以向上滚动为例,JavaScript代码很简单,往下的滚动就是改变一下scrollTop就行,而左右方向就是将scrollTop变成scrollLeft,offsetTop换成offsetLeft就行。

var nav=document.getElementsByTagName('nav')[0];
  var list=document.getElementById('img').getElementsByTagName('li');
  function scroll() {
    if(nav.scrollTop==list[list.length-1].offsetTop){
      nav.scrollTop=0;
    }else{
      nav.scrollTop++;
    }
  }
  var timer= setInterval(scroll,10);

  nav.onmouseover=function(){
    clearInterval(timer);
  };
  nav.onmouseout=function () {
    timer=setInterval(scroll,10);//必须得对timer重新赋值
  }

点击向下无缝滚动
点击向左无缝滚动
点击向右无缝滚动

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

Javascript 相关文章推荐
Input 特殊事件onpopertychange和oninput
Jun 17 Javascript
javascript小数计算出现近似值的解决办法
Feb 06 Javascript
javascript各浏览器中option元素的表现差异
Apr 07 Javascript
基于jquery的无刷新分页技术
Jun 11 Javascript
js不完美解决click和dblclick事件冲突问题
Jul 16 Javascript
ie9 提示'console' 未定义问题的解决方法
Mar 20 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
Nov 05 Javascript
轻松实现js图片预览功能
Jan 18 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
Vuejs实现带样式的单文件组件新方法
May 02 Javascript
一步步教会你微信小程序的登录鉴权
Apr 09 Javascript
微信小程序轮播图swiper代码详解
Dec 01 Javascript
详解在Vue中如何使用axios跨域访问数据
Jul 07 #Javascript
微信小程序联网请求的轮播图
Jul 07 #Javascript
微信小程序点击控件修改样式实例详解
Jul 07 #Javascript
利用C/C++编写node.js原生模块的方法教程
Jul 07 #Javascript
利用types增强vscode中js代码提示功能详解
Jul 07 #Javascript
protractor的安装与基本使用教程
Jul 07 #Javascript
vue.js实例todoList项目
Jul 07 #Javascript
You might like
PHP生成UTF8文件的方法
2010/05/15 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
JS 毫秒转时间示例代码
2013/09/22 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
django 中QuerySet特性功能详解
2019/07/25 Python
python+django+rest框架配置创建方法
2019/08/31 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
小学数学课后反思
2014/04/23 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
学校捐书活动总结
2015/05/08 职场文书
老干部座谈会主持词
2015/07/03 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript