图片无缝滚动工具类

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的更多相关文章

  1. jquery.marquee.js - 有点奇怪的跑马灯动画,不过还是加上去了

    客户想要一个跑马灯的效果,最终我用了jquery.marquee.js. 这个库很简单就能用. 效果是这样,从左到右,移动速度都不一样. 1. HTML <div class="mar ...

  2. js实现图片滑动显示效果

    js实现图片滑动显示效果 今天用户提出一个需求,要实现一个滑动显示新闻列表的效果,具体就是图片新闻自动滑动显示,鼠标移上去就停止滑动,移开就继续滑动:效果如下: 第一:先用HTML和CSS实现显示,主 ...

  3. 13年总结js,css,java xml

    --------------------------------------javaScript知识点----------------------------- jQuery对象[Object obj ...

  4. jQuery插件开发之boxScroll与marquee

    BoxScroll 常见图片轮播效果的简单实现.可以数字列表控制或者左右按键控制.逻辑很简单,下面的Marquee形成环,这个到了尽头得往回跑,看看注释就知道了. 图片轮播GitHub:https:/ ...

  5. js 实现图片的无缝滚动

      js 实现图片的无缝滚动 CreateTime--2018年3月7日17:18:34 Author:Marydon 测试成功 <!DOCTYPE html> <html> ...

  6. jquery.marquee

    http://aamirafridi.com/jquery/jquery-marquee-plugin#examples <script src="/plugins/marquee/j ...

  7. vue文字跑马灯效果

    https://cdn.bootcss.com/jQuery.Marquee/1.5.0/jquery.marquee.js 兼容vue $("#demo4").marquee({ ...

  8. 微信小程序-通知滚动小提示

    代码地址如下:http://www.demodashi.com/demo/14044.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  9. Servlet 4.0 入门

    Java™ Servlet API 是主流服务器端 Java 的基本构建块,也是 Java EE 技术的一部分,例如,用于 Web 服务的 JAX - RS.JSF (JavaServer Faces ...

随机推荐

  1. 图形管线之旅 Part 1

    原文:<A trip through the Graphics Pipeline 2011> 翻译:往昔之剑   转载请注明出处   你可以找到很多PC图形栈的功能描述,但是通常却不明所以 ...

  2. JSON APIs and Ajax

    1. 通过jQuery来绑定点击事件. 函数 $(document).ready()这个函数中的代码只会在我们的页面加载时候运行一次,确保执行js之前页面所有的dom已经准备就绪. 在$(docume ...

  3. Spring的安全机制

    Spring Security:它提供全面的安全性解决方案,同时在Web请求和方法调用处理身份确认和授权,利用依赖注入和aop技术.主要名词: 1,安全拦截器:相当应用的一把锁,能够阻止对应用程序中保 ...

  4. [NOI 2011][BZOJ 2434] 阿狸的打字机

    传送门 AC自动机 + 树状数组 建成AC自动机后,设end[i]为第i个串的末尾在Trie树上的节点. 可以发现,对于一个询问(x,y),ans等于Trie树上root到end[y]这条链上fail ...

  5. BZOJ 2212 [Poi2011]Tree Rotations(线段树合并)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2212 [题目大意] 给出一棵二叉树,每个叶节点上有一个权值,现在可以任意交换左右儿子, ...

  6. BZOJ 4883 [Lydsy2017年5月月赛]棋盘上的守卫(最小生成环套树森林)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4883 [题目大意] 在一个n*m的棋盘上要放置若干个守卫. 对于n行来说,每行必须恰好 ...

  7. codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品

    1959 拔河比赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 一个学校举行拔河比赛,所有的 ...

  8. GNU C内联汇编(AT&amp;T语法)

    转:http://www.linuxso.com/linuxbiancheng/40050.html 内联汇编提供了可以在C或C++代码中创建汇编语言代码,不必连接额外的库或程序.这种方法对最终程序在 ...

  9. udev详解

    转:http://www.360doc.com/content/10/0215/11/551936_15865336.shtml 如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Li ...

  10. example of log4cpp properties configuration

    log 的优先级别解读,参阅源码 log4cpp-0.3.5rc3/include/log4cpp/Priority.hh 由高到低 EMERGFATALALERTCRITERRORWARNNOTIC ...