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 相关文章推荐
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
js检测浏览器版本、核心、是否移动端示例
Apr 24 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
原生js制作简单的数字键盘
Apr 24 Javascript
JQuery核心函数是什么及使用方法介绍
May 03 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
微信小程序 switch组件详解及简单实例
Jan 10 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
jQuery实现的滑块滑动导航效果示例
Jun 04 jQuery
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
Sep 23 Javascript
Vue+TypeScript中处理computed方式
Apr 02 Vue.js
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学习之PHP变量
2006/10/09 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
改变Apache端口等配置修改方法
2008/06/05 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
JavaScript 高效运行代码分析
2010/03/18 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
python实现简单学生信息管理系统
2020/04/09 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
日本航空官方网站:JAL
2019/06/19 全球购物
工程造价专业大专生求职信
2013/10/06 职场文书
给女儿的表扬信
2014/01/18 职场文书
小区推广策划方案
2014/06/06 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
先进典型事迹材料
2014/12/29 职场文书