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 相关文章推荐
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
Feb 22 Javascript
JavaScript入门教程(10) 认识其他对象
Jan 31 Javascript
封装的jquery翻页滚动(示例代码)
Nov 18 Javascript
jQuery实现弹出窗口中切换登录与注册表单
Jun 05 Javascript
Jquery 效果使用详解
Nov 23 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 Javascript
微信小程序开发图片拖拽实例详解
May 05 Javascript
详解vue-router 路由元信息
Sep 13 Javascript
vue计算属性和监听器实例解析
May 10 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
Sep 15 Javascript
vue实现分页的三种效果
Jun 23 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
使用Sphinx对索引进行搜索
2013/06/25 PHP
功能强大的php分页函数
2016/07/20 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
python assert的用处示例详解
2019/04/01 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
如何利用python创作字符画
2022/06/25 Python