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 相关文章推荐
jQuery入门第一课 jQuery选择符
Mar 14 Javascript
jQuery实现id模糊查询的小例子
Mar 19 Javascript
jquery动态改变div宽度和高度
Feb 09 Javascript
javascript 用函数实现继承详解
May 28 Javascript
javascript 面向对象function详解及实例代码
Feb 28 Javascript
ES6新特性三: Generator(生成器)函数详解
Apr 21 Javascript
微信小程序 获取二维码实例详解
Jun 23 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
Jun 10 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
Aug 26 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
Oct 20 Javascript
jQuery实现简单飞机大战
Jul 05 jQuery
详解在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 采集程序中常用的函数
2009/12/09 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
python中的sort方法使用详解
2014/07/25 Python
Python with的用法
2014/08/22 Python
详解python:time模块用法
2019/03/25 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
美国网上订购鲜花:FTD
2016/09/23 全球购物
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
PHP面试题附答案
2015/11/28 面试题
Internet体系结构
2014/12/21 面试题
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
教师实习自我鉴定
2013/12/14 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
打架检讨书50字
2014/01/11 职场文书
小学生作文评语大全
2014/04/21 职场文书
临床护理求职信
2014/04/26 职场文书
租车协议书
2015/01/27 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
CSS实现背景图片全屏铺满自适应的3种方式
2022/07/07 HTML / CSS