JS实现无缝循环marquee滚动效果


Posted in Javascript onMay 22, 2017

无缝循环marquee滚动JS代码实现,兼容IE, FireFox, Chrome,供大家参考,具体内容如下

首先是CSS和HTML如下:

#marquee_zxd {
    border: 1px solid red;
    white-space: nowrap;
    overflow: hidden;
    width: 500px;
    padding-top: 5px;

  }

  #marquee_zxd img {
    height: 100px;
  }

<!-- 横向一定要是span -->
    <div id="marquee_zxd"><span>
      <!-- 内嵌一个div很重要,里面的元素必须是一个整体的移动。另外横移时,必须是行级元素只占自己的空间。 -->
      <div id="marquee_inner" style="position:relative; display: inline-block;">
      <img src="img/duck.png"/>
      <img src="img/donkey.png"/>
      <img src="img/eggbird.png"/>
      <img src="img/elephant.png"/>
      <img src="img/butterfly.png"/>
    </div>
    </span></div>

<script type="text/javascript" src="${cpath}/js/marquee_zxd.js"></script>

下面是JS实现marquee_zxd.js:

/**除了Chrome以外的浏览器可以通过scrollLeft属性控制滚动*/
function scrolleft(obj){
  var $obj = $(obj); 
  //到右边顶端后不会再变
  //var temp = obj.scrollLeft;
  //obj.scrollLeft++;
  var temp = $obj.scrollLeft();
  //console.log(temp);
  $obj.scrollLeft(temp+1);
  //当滚动条到达右边顶端时;或本身长度不够不好滚动(漫出才好滚)
  //if(obj.scrollLeft == temp){
  if($obj.scrollLeft() == temp){
    obj.innerHTML += obj.innerHTML;
    console.log('copy');
  }
  //当滚动条滚动了初始内容的宽度时,滚动条回到最左端,模拟循环
  //if (obj.scrollLeft >= obj.firstChild.offsetWidth)
  //  obj.scrollLeft = 0;
  if ($obj.scrollLeft() >= obj.firstChild.offsetWidth)
    $obj.scrollLeft(0);
}

/**除了Chrome以外的浏览器可以通过scrolleft()滚动*/
function initMarquee(){
  var aaa = document.getElementById('marquee_zxd');
  var MyMar = setInterval(function(){
    scrolleft(aaa);
  }, 20);

  //鼠标移上时清除定时器达到滚动停止的目的
  aaa.onmouseover=function() {clearInterval(MyMar);};
  //鼠标移开时重设定时器
  aaa.onmouseout=function() {MyMar = setInterval(function(){
    scrolleft(aaa);
  }, 20);};
}  


/**Chrome定时器循环函数,通过relative布局的left属性控制滚动*/
function scrolleftChrome($marquee_inner, inner_width){
  var width = parseInt(inner_width);
  var leftPx = $marquee_inner.css("left");
  //兼容IE
  if(leftPx == 'auto')
    leftPx = 0;
  //位置左移
  var left = parseInt(leftPx);    
  left = left - 1;
  //到顶归位
  if(left <= -width)
    left = 0;
  $marquee_inner.css("left", left);
  //console.log(width + ", " + left);
}

/**Chrome浏览器可以通过scrolleftChrome滚动*/
function initMarqueeChrome() {
  //局部变量不污染全局变量空间
  var $marquee_inner = $('#marquee_inner');
  //原内容大小
  var inner_width = $marquee_inner.css('width');
  //复制一份原内容
  var innerHtml = $marquee_inner.html();
  $marquee_inner.html(innerHtml + innerHtml);

  console.log(inner_width);
  //参数采用字符串形式的缺陷:参数不能被周期性改变,参数必须是全局变量
  //var MyMar = setInterval("scrolleftChrome($marquee_inner, inner_width)", 5000);
  var MyMar = setInterval(function(){
    //参数不污染全局变量空间
    scrolleftChrome($marquee_inner, inner_width);
  }, 50);

  var marquee_zxd = document.getElementById('marquee_zxd');
  //鼠标移上时清除定时器达到滚动停止的目的
  marquee_zxd.onmouseover=function() {clearInterval(MyMar);};
  //鼠标移开时重设定时器
  marquee_zxd.onmouseout=function() {
    //参数采用字符串形式的缺陷:参数不能被周期性改变,参数必须是全局变量
    //MyMar = setInterval("scrolleftChrome($marquee_inner, inner_width)", 50);
    MyMar = setInterval(function(){
      //参数不污染全局变量空间
      scrolleftChrome($marquee_inner, inner_width);
    }, 50);
  };
}

$(function(){
  var ua = window.navigator.userAgent; 
  var isIE = window.ActiveXObject != undefined && ua.indexOf("MSIE") != -1; 
  var isFirefox = ua.indexOf("Firefox") != -1; 
  var isChrome = ua.indexOf("Chrome") && window.chrome; 

  if(isChrome){
    initMarqueeChrome();
    console.log("isChrome: initMarqueeChrome");
  }else{
    initMarquee();
    console.log("isChrome: initMarquee");
  }
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Locate a File Using a File Open Dialog Box
Jun 18 Javascript
LazyLoad 延迟加载(按需加载)
May 31 Javascript
JS 各种网页尺寸判断实例方法
Apr 18 Javascript
JS定时关闭窗口的实例
May 22 Javascript
jQuery中after()方法用法实例
Dec 25 Javascript
script标签属性用type还是language
Jan 21 Javascript
js实现简单鼠标跟随效果的方法
Apr 10 Javascript
jQuery实现列表内容的动态载入特效
Aug 08 Javascript
学习javascript面向对象 javascript实现继承的方式
Jan 04 Javascript
JS+html5制作简单音乐播放器
Sep 13 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
JavaScript数组排序小程序实现解析
Jan 13 Javascript
jQuery表单验证之密码确认
May 22 #jQuery
JavaScript实现QQ聊天消息展示和评论提交功能
May 22 #Javascript
单行 JS 实现移动端金钱格式的输入规则
May 22 #Javascript
JavaScript表单验证实现代码
May 22 #Javascript
JQuery 封装 Ajax 常用方法(推荐)
May 21 #jQuery
原生JS实现N级菜单的代码
May 21 #Javascript
Ionic + Angular.js实现图片轮播的方法示例
May 21 #Javascript
You might like
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
PHP 裁剪图片
2021/03/09 PHP
用于table内容排序
2006/07/21 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
Python 元类使用说明
2009/12/18 Python
Python的Django框架中的Context使用
2015/07/15 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
校园安全广播稿
2014/02/08 职场文书
精彩的广告词
2014/03/19 职场文书
安全保证书范文
2014/04/29 职场文书
党员承诺书范文
2014/05/19 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
招标保密承诺书
2015/01/20 职场文书
保研推荐信范文
2015/03/25 职场文书
老乡会致辞
2015/07/28 职场文书
家属联谊会致辞
2015/07/31 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python