图片无缝滚动工具类

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. 解决Linux环境下安装xampp之后外部无法连接MySQL的问题

    在Linux系统下,开发PHP一般都是LAMP环境,对于开发环境来讲,没有必要花太大精力去单独配置LAMP环境,采用xampp一键安装包是一个很好的方式.在Linux系统上安装xampp的过程这里就不 ...

  2. Graph Valid Tree -- LeetCode

    Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...

  3. bzoj 1233: [Usaco2009Open]干草堆tower

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  4. git 推送内容到远程新分支

    之前在做项目的时候,自己想将东西传到远程的一个新分支上.自己开始弄的时候稀里糊涂弄上去的也没搞清楚原理,不过自己后来又去试了一下,发现下面这个方法还可以. (1)在本地的一个目录下,git bash ...

  5. Unity 3D 之Playerprefs

    Unity3d提供了一个用于本地持久化保存与读取的类——PlayerPrefs.工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值. 一.PlayerPre ...

  6. C# mvc Request 请求过长报404错误的解决思路分析

    案例 我们需要根据index 页面选取值 然后 在弹出页面展示已经选取的值 但其实Request 超出请求长度,后来经过模式解决了. 分享如下 1.设定 web.config 里面的 在web.con ...

  7. NServiceBus入门:发布事件(Introduction to NServiceBus: Publishing events)

    原文地址:https://docs.particular.net/tutorials/intro-to-nservicebus/4-publishing-events/ 侵删. 这个教程到目前为止,我 ...

  8. GridControl事件

    private void gridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventA ...

  9. Express重定向

    var express = require('express'); var app = express(); app.get('/',function(req,res){ res.redirect(' ...

  10. CSS3 @media 查询,根据屏幕screen大小调节前端显示;媒体查询方法的使用

    ------------------- 1.媒体查询方法在 css 里面这样写 -------------------- @media screen and (min-width: 320px) an ...