JavaScript实现图片无缝滚动效果
作者:艾新觉罗 发布时间:2024-05-02 16:10:49
图片无缝滚动就是图片一直不停的滚动,好像没有无穷无尽似的,实际上就是几张图片不停的循环,但是看不出有从最后面切换到最前面的效果,这就是无缝滚动,文字和图片都可以无缝滚动,这里介绍的是图片,文字是同样的原理。
原理
以向上无缝滚动为例,其余几个方向的无缝滚动原理是一样的,点击向上无缝滚动。
设定一个可视区域,超过可视区域的部分隐藏,这里是将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,否则会跳过这个元素把上一级当成父元素。
当向下滚动的距离与list[list.length-1].offsetTop的距离相等时,即图片5已经划过,到了显示图片1的时候,让滚动的距离瞬间为0,进行切换时由于两张图片是一样的,人观看时察觉不到,故形成了无缝滚动。
可以发现这里重叠了一张图片,是因为当最后一张图片滚动完之后要形成循环,可视区域内一定要有图片否则一片空白,这里设定的可视区域就是一张图片的高度,故重复的是图片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重新赋值
}
点击向下无缝滚动
点击向左无缝滚动
点击向右无缝滚动


猜你喜欢
- 在项目中经常会遇到需要将不同的二维码放到一张通用图片上,提供用户下载简单来说,就是利用canvas将同等比例的二维码在图片上叠加,生成海报1
- 前言本文主要给大家介绍了关于使用Python通过subprocess调用adb命令,subprocess包主要功能是执行外部命令(相对Pyt
- 我就废话不多说啦,还是直接看代码吧!list1 = [1,2,3,4]a,b,c,d = list1则a = 1b =2等这种方式只有当左边
- 本文针对ThinkPHP中pathinfo的两种模式、四种路径访问模式和URL重写相关知识进行了总结归纳,分享给大家便于查询和借鉴。具体归纳
- http_request2.py用于发起http请求#读取多条测试用例#1、导入requests模块import requests#从 cl
- 第一种是用urllib模块,下面是例示代码:import urllibstatus=urllib.urlopen("https:/
- 1、linux系统一般自带perl可运行程序在:/usr/bin/perl2、perl测试程序#!/usr/bin/perl -wuse w
- 经常写文章的小伙伴可能会头疼,图片需要一张一张的上传,费劲也耗时,今天就推荐几款超简单的图床工具。图床就是一个在网络上存储图片的地方,目的是
- 单例模式单例是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。单例拥有与全局变量相同的优缺点。 尽管
- 我就废话不多说了,大家还是直接看代码吧!# -*- coding: utf-8 -*-"""Created o
- 本文为大家分享了mysql 8.0.13 安装配置教程,供大家参考,具体内容如下下载下载地址解压解压之后没有my.ini文件(我的端口设置的
- Geany中配置python的方法:一、文件下载并安装1、下载Python下载地址:https://www.python.org/downl
- 近段时间看了一些论坛上面关于分页的ASP程序依然有许多的关注者,但里面只有代码,没有详细的解释,对于初学者来说,这样总是得不到真正的掌握,此
- 本文实例总结了微信小程序实现给嵌套template模板传递数据的方式。分享给大家供大家参考,具体如下:一、template模板调用的数据是单
- 应用场景在嵌入式开发中,常常需要将一个binary文件分割成多个文件,或者将一个binary的某块区域抓成一个单独文件。本篇blog以pyt
- MySQL带AND关键字的多条件查询,MySQL中,使用AND关键字,可以连接两个或者多个查询条件,只有满足所有条件的记录,才会被返回。SE
- 大家都知道,不同字符编码,其在内存占用的字节数不一样。如ASCII编码字符占用1个字节,U
- 前言众所周知,MySQL的存储引擎有MyISAM和InnoDB,锁粒度分别是表锁和行锁。后者的出现从某种程度上是弥补前者的不足,比如:MyI
- 本文用的是sciki-learn库的iris数据集进行测试。用的模型也是最简单的,就是用贝叶斯定理P(A|B) = P(B|A)*P(A)/
- 一扯上文化二字,总觉虚无缥缈、漫无边际,或者老气横秋,如何有趣地利用中华文化的思想和符号,结合现代的元素,使其成为有意思的传播手法,这个问题