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 相关文章推荐
Dom在ajax技术中的作用说明
Oct 25 Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 Javascript
javascript进行数组追加方法小结
Jun 16 Javascript
推荐一款jQuery插件模板
Jan 09 Javascript
javascript中Array数组的迭代方法实例分析
Feb 04 Javascript
JavaScript 函数的执行过程
May 09 Javascript
动态加载js、css的实例代码
May 26 Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 Javascript
Wireshark基本介绍和学习TCP三次握手
Aug 15 Javascript
jQuery自定义组件(导入组件)
Nov 08 Javascript
12个非常有用的JavaScript技巧
May 17 Javascript
Vue循环中多个input绑定指定v-model实例
Aug 31 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 preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
php生成无限栏目树
2017/03/16 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
jQuery源码分析之Event事件分析
2010/06/07 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
Express.JS使用详解
2014/07/17 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
python事件驱动event实现详解
2018/11/21 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
python with (as)语句实例详解
2020/02/04 Python
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
团工委书记自荐书范文
2013/12/17 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
交通安全标语
2014/06/06 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
MySQL主从切换的超详细步骤
2022/06/28 MySQL