marquee.js
图片无缝滚动工具类
CreateTime--2018年3月7日17:11:03
Author:Marydon
/**
* 图片无缝滚动
* @description
* 将要滚动的图片复制一份作为它的兄弟节点拼接到其身后,
* 通过操作scrollTop和scrollLeft来调节滚动条的距离来实现
*/
function Marquee() {
var object = this;
var container_father;
var container_child;
var container_clone;
var scrolllDirection;
var scrollSpeed; /**
* 界面滚动参数设置
* @param direction
* 滚动方向-没有传参,默认向右滚动
* @param speed
* 滚动速度-没有传参,速度为50毫秒
* @param id_father
* 父(祖父)容器id
* @param id_child
* 子(子孙)容器id
*/
this.init = function(direction, speed, id_father, id_child) {
// 定义克隆容器id
id_clone = "cloneContainer";
// 对子容器进行克隆并拼接到它的后面
$('#' + id_child).clone().attr("id", id_clone).appendTo($('#' + id_child).parent());
container_father = document.getElementById(id_father);
container_child = document.getElementById(id_child);
container_clone = document.getElementById(id_clone); // 滚动方向
scrolllDirection = direction || "right";
// 滚动速度
scrollSpeed = speed || 50;
// 选择滚动方向
switch (scrolllDirection) {
case 'up':
object.MarqueeToTop();
break;
case 'down':
object.MarqueeToDown();
break;
case 'left':
object.MarqueeToLeft();
break;
case 'right':
object.MarqueeToRight();
break;
default:
//object.MarqueeToRight();
break;
}
}; /**
* 向上滚动
*/
this.MarqueeToTop = function () {
var MyMarTop = setInterval(MarqueeTop, scrollSpeed); container_father.onmouseover = function() {
clearInterval(MyMarTop);
} container_father.onmouseout = function() {
MyMarTop = setInterval(MarqueeTop, scrollSpeed);
} function MarqueeTop() {
if (container_father.scrollTop == container_clone.offsetHeight) {
container_father.scrollTop = 0;
} else {
container_father.scrollTop++;
}
} }; /**
* 向下滚动(倒序播放)
*/
this.MarqueeToDown = function () {
var MyMarDown = setInterval(MarqueeDown, scrollSpeed); container_father.onmouseover = function() {
clearInterval(MyMarDown);
} container_father.onmouseout = function() {
MyMarDown = setInterval(MarqueeDown, scrollSpeed);
} function MarqueeDown() {
if (container_father.scrollTop == 0) {
container_father.scrollTop = container_clone.offsetHeight;
} else {
container_father.scrollTop--;
} } }; /**
* 向左滚动
* @description
* 展现在父容器内的是子容器中的图片,然后从第一张图片开始往左滚动(正序播放)
* @achieve
* 通过从左侧滚动过的像素数的递增(0-maxWidth),来实现图片向左移动
*/
this.MarqueeToLeft = function () { var MyMarLeft = setInterval(MarqueeLeft, scrollSpeed); container_father.onmouseover = function() {
clearInterval(MyMarLeft);
} container_father.onmouseout = function() {
MyMarLeft = setInterval(MarqueeLeft, scrollSpeed);
} function MarqueeLeft() {
// 滚动条向右滚动到最大值
//debugger;
if (container_father.scrollLeft == container_clone.offsetWidth) {
container_father.scrollLeft = 0;
} else {
// 滚动条向右移动,图片往左移动
container_father.scrollLeft++;
} } }; /**
* 向右滚动
* @description
展现在父容器内的是克隆容器中的图片,然后图片开始往右滚动(倒序播放)
* @achieve
* 通过从左侧滚动过的像素数的递减(maxWidth-0),来实现图片向右移动
*/
this.MarqueeToRight = function() {
var MyMarRight = setInterval(MarqueeRight, scrollSpeed); // 鼠标悬浮
container_father.onmouseover = function() {
clearInterval(MyMarRight);
}
// 鼠标移出
container_father.onmouseout = function() {
MyMarRight = setInterval(MarqueeRight, scrollSpeed);
} /**
* 右滚动
*/
function MarqueeRight() {
// scrollLeft不会取到负值
if (container_father.scrollLeft == 0) {
container_father.scrollLeft = container_clone.offsetWidth;
} else {
// 滚动条往左移动,图片向右移动
container_father.scrollLeft--;
}
}
};
}
总结:
1.只有scrollLeft和scrollTop,没有scrollRight和scrollDown;
2.scrollLeft和scrollTop有最小值(0)和最大值,最小值改不成负数,最大值达到最大后无法再增;
3.上滚动和左滚动,是正序滚动;下滚动和有滚动,是倒序滚动;
4.无缝滚动实现条件约束,必须遵循:
水平滚动时,父容器的宽度必须<=子容器所有照片的实际宽度之和;
因为scrollLeft的最大值<offsetWidth,会造成以下状况:
左滚动时,当滚动到克隆容器的最后一张照片时,scrollLeft达到最大值,因为不满足if(scrollLeft==offsetWidth)的条件,并且scrollLeft++也无效化,
所以不再滚动;
右滚动时,当滚动到子容器的第一张照片(srollLeft=0)时,重置scrollLeft=offsetWidth,两者所在的点,即父容器所展示的图片不是完全一模一样的图片,
所以给人以不连续的感觉。
垂直滚动时,父容器的高度必须<=子容器所有照片的实际高度之和。
因为scrollTop的最大值<offsetHeight,会造成以下状况:
上滚动时,当滚动到克隆容器的最后一张照片时,scrollTop达到最大值,因为不满足if(scrollTop==offsetHeight)的条件,并且scrollTop++也无效化,
所以不再滚动;
下滚动时,当滚动到子容器的第一张照片(scrollTop=0)时,重置scrollTop=offsetHeight,两者所在的点,即父容器所展示的图片不是完全一模一样的图片,
所以给人以不连续的感觉。
注:想通过padding撑大照片的容器的方法无效。
范例:请移步至下面的推荐文章
相关推荐:
marquee.js的更多相关文章
- jquery.marquee.js - 有点奇怪的跑马灯动画,不过还是加上去了
客户想要一个跑马灯的效果,最终我用了jquery.marquee.js. 这个库很简单就能用. 效果是这样,从左到右,移动速度都不一样. 1. HTML <div class="mar ...
- js实现图片滑动显示效果
js实现图片滑动显示效果 今天用户提出一个需求,要实现一个滑动显示新闻列表的效果,具体就是图片新闻自动滑动显示,鼠标移上去就停止滑动,移开就继续滑动:效果如下: 第一:先用HTML和CSS实现显示,主 ...
- 13年总结js,css,java xml
--------------------------------------javaScript知识点----------------------------- jQuery对象[Object obj ...
- jQuery插件开发之boxScroll与marquee
BoxScroll 常见图片轮播效果的简单实现.可以数字列表控制或者左右按键控制.逻辑很简单,下面的Marquee形成环,这个到了尽头得往回跑,看看注释就知道了. 图片轮播GitHub:https:/ ...
- js 实现图片的无缝滚动
js 实现图片的无缝滚动 CreateTime--2018年3月7日17:18:34 Author:Marydon 测试成功 <!DOCTYPE html> <html> ...
- jquery.marquee
http://aamirafridi.com/jquery/jquery-marquee-plugin#examples <script src="/plugins/marquee/j ...
- vue文字跑马灯效果
https://cdn.bootcss.com/jQuery.Marquee/1.5.0/jquery.marquee.js 兼容vue $("#demo4").marquee({ ...
- 微信小程序-通知滚动小提示
代码地址如下:http://www.demodashi.com/demo/14044.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- Servlet 4.0 入门
Java™ Servlet API 是主流服务器端 Java 的基本构建块,也是 Java EE 技术的一部分,例如,用于 Web 服务的 JAX - RS.JSF (JavaServer Faces ...
随机推荐
- 图形管线之旅 Part 1
原文:<A trip through the Graphics Pipeline 2011> 翻译:往昔之剑 转载请注明出处 你可以找到很多PC图形栈的功能描述,但是通常却不明所以 ...
- JSON APIs and Ajax
1. 通过jQuery来绑定点击事件. 函数 $(document).ready()这个函数中的代码只会在我们的页面加载时候运行一次,确保执行js之前页面所有的dom已经准备就绪. 在$(docume ...
- Spring的安全机制
Spring Security:它提供全面的安全性解决方案,同时在Web请求和方法调用处理身份确认和授权,利用依赖注入和aop技术.主要名词: 1,安全拦截器:相当应用的一把锁,能够阻止对应用程序中保 ...
- [NOI 2011][BZOJ 2434] 阿狸的打字机
传送门 AC自动机 + 树状数组 建成AC自动机后,设end[i]为第i个串的末尾在Trie树上的节点. 可以发现,对于一个询问(x,y),ans等于Trie树上root到end[y]这条链上fail ...
- BZOJ 2212 [Poi2011]Tree Rotations(线段树合并)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2212 [题目大意] 给出一棵二叉树,每个叶节点上有一个权值,现在可以任意交换左右儿子, ...
- BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...
- codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品
1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个学校举行拔河比赛,所有的 ...
- GNU C内联汇编(AT&T语法)
转:http://www.linuxso.com/linuxbiancheng/40050.html 内联汇编提供了可以在C或C++代码中创建汇编语言代码,不必连接额外的库或程序.这种方法对最终程序在 ...
- udev详解
转:http://www.360doc.com/content/10/0215/11/551936_15865336.shtml 如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Li ...
- example of log4cpp properties configuration
log 的优先级别解读,参阅源码 log4cpp-0.3.5rc3/include/log4cpp/Priority.hh 由高到低 EMERGFATALALERTCRITERRORWARNNOTIC ...