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 相关文章推荐
IE8 chrome中table隔行换色解决办法
Jul 09 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
javascript事件委托的用法及其好处简析
Apr 04 Javascript
Javascript动画效果(1)
Oct 11 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
Oct 26 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
Nov 03 Javascript
vue的一个分页组件的示例代码
Dec 25 Javascript
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
微信小程序中使用echarts的实现方法
Apr 24 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 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获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
原生JavaScript实现连连看游戏(附源码)
2013/11/05 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
python多线程编程中的join函数使用心得
2014/09/02 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Python变量访问权限控制详解
2019/06/29 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
python代码能做成软件吗
2020/07/24 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
syb养殖创业计划书
2014/01/09 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
2014年创先争优工作总结
2014/12/11 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL