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 相关文章推荐
firefox浏览器下javascript 拖动层效果与原理分析代码
Dec 04 Javascript
js计算页面刷新的次数
Jul 20 Javascript
Jquery+JSon 无刷新分页实现代码
Apr 01 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
jQuery选择器源码解读(二):select方法
Mar 31 Javascript
jQuery实现简单的点赞效果
May 29 Javascript
js实现下拉菜单效果
Mar 01 Javascript
在vue项目中优雅的使用SVG的方法实例详解
Dec 03 Javascript
在JavaScript中使用严格模式(Strict Mode)
Jun 13 Javascript
JavaScript计算正方形面积
Nov 26 Javascript
原生javascript如何实现共享onload事件
Jul 03 Javascript
uniapp,微信小程序中使用 MQTT的问题
Jul 11 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
php标签云的实现代码
2012/10/10 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
python变量不能以数字打头详解
2016/07/06 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
flask框架中的cookie和session使用
2021/01/31 Python
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js