原生javascript-无间缝滚动,封装
目前支持的是竖向与横向滚动
http://lgy.1zwq.com/marScroll/
现在分析下无间缝实现的基本思路(竖向例子):
HTML结构:
- <div id="marScroll">
- <ul>
- <li>01</li>
- <li>02</li>
- <li>03</li>
- <li>04</li>
- <li>05</li>
- </ul>
- </div>
CSS:
- <style type="text/css">
- ul,li{padding:;margin:;}
- #marScroll{height: 60px;overflow: hidden;}
- #marScroll li{height: 20px;line-height: 20px;font-size: 14px;}
- </style>
(1)首先需要判断里面的内容高度ul结构是否高于外层div#marScrolll,则才进行无间缝滚动:
- // 写在匿名函数里面,防止全局变量污染
- (function(){
- var target = document.getElementById('marScroll'),
- oUl = target.getElementsByTagName('ul')[0];
- // 内容少,则直接退出此函数
- if(oUl.offsetHeight<target.offsetHeight) return;
- })();
(2)无间缝就是内容的无限滚动展示,那么先需要复制里面的内容,然后通过外层的scrollTop++属性,用setInterval 函数进行循环执行
- target.innerHTML += target.innerHTML;
- /* 判断每次滚动的距离等于第一个ul的高度时,设置scrollTop为0,然后如此的循环操作就是无间滚动了
- ---------------------------------------------------------------------------------------------*/
- // 把功能函数抽离出来,方便调用
- var fn = function(){
- if(target.scrollTop == oUl_h){
- target.scrollTop = 0;
- }else{
- target.scrollTop++;
- }
- }
- // setInterval 循环
- var timer = setInterval(function(){
- fn();
- },30);
(3)鼠标经过此内容块时,就停止滚动
- // hover
- target.onmouseover = function(){
- clearTimeout(timer);
- }
- target.onmouseout = function(){
- timer = setInterval(function(){
- fn();
- },30);
- }
例子JS总代码:
- // 写在匿名函数里面,防止全局变量污染
- (function(){
- var target = document.getElementById('marScroll'),
- oUl = target.getElementsByTagName('ul')[0],
- oUl_h = oUl.offsetHeight;
- // 内容少,则直接退出此函数
- if(oUl_h<target.offsetHeight) return;
- target.innerHTML += target.innerHTML;
- /* 判断每次滚动的距离等于第一个ul的高度时,设置scrollTop为0,然后如此的循环操作就是无间滚动了
- ---------------------------------------------------------------------------------------------*/
- // 把功能函数抽离出来,方便调用
- var fn = function(){
- if(target.scrollTop == oUl_h){
- target.scrollTop = 0;
- }else{
- target.scrollTop++;
- }
- }
- // setInterval 循环
- var timer = setInterval(function(){
- fn();
- },30);
- // hover
- target.onmouseover = function(){
- clearTimeout(timer);
- }
- target.onmouseout = function(){
- timer = setInterval(function(){
- fn();
- },30);
- }
- })();
已经完成了个简单的竖向无间缝,为了满足更多的需求,建议封装成可以,竖向,横向,多次调用的函数。
以下是个人的封装,线上例子:
http://lgy.1zwq.com/marScroll/
- function GyMarquee(opt){
- this.opt = opt;
- if(!document.getElementById(this.opt.targetID)) return;
- this.target = document.getElementById(this.opt.targetID);
- this.dir = this.opt.dir == 'crosswise'?'crosswise':'vertical';
- this.effect = this.opt.effect == 'scroll'?'scroll':'marque';
- this.scrollHeight = this.opt.scrollHeight;
- this.init();
- }
- GyMarquee.prototype = {
- marquee:function(){
- var _that = this,
- direction = 'scrollTop',
- judge = this.target.scrollHeight,
- timer = null;
- if(this.dir == 'crosswise'){
- direction = 'scrollLeft';
- judge = this.itemLen*this.opt.itemWidth;
- this.targetChild.style.width = this.itemLen*this.opt.itemWidth*2 + 'px';
- }
- var doFn = function(){
- if(_that.target[direction] == judge){
- _that.target[direction] = 0;
- }
- _that.target[direction]++;
- }
- timer = setInterval(function(){
- doFn();
- },38);
- this.target.onmouseover = function(){
- if(timer) clearTimeout(timer);
- }
- this.target.onmouseout = function(){
- timer = setInterval(function(){
- doFn();
- },38);
- }
- },
- scrollDo:function(){
- var can = true,
- _that = this;
- this.target.onmouseover=function(){can=false};
- this.target.onmouseout=function(){can=true};
- new function (){
- var stop=_that.target.scrollTop%_that.scrollHeight==0&&!can;
- if(!stop)_that.target.scrollTop==parseInt(_that.target.scrollHeight/2)?_that.target.scrollTop=0:_that.target.scrollTop++;
- setTimeout(arguments.callee,_that.target.scrollTop%_that.scrollHeight?20:2500);
- };
- },
- getByClassName:function(className,parent){
- var elem = [],
- node = parent != undefined&&parent.nodeType==1?parent.getElementsByTagName('*'):document.getElementsByTagName('*'),
- p = new RegExp("(^|\\s)"+className+"(\\s|$)");
- for(var n=0,i=node.length;n<i;n++){
- if(p.test(node[n].className)){
- elem.push(node[n]);
- }
- }
- return elem;
- },
- init:function(){
- var val = 0;
- if(this.dir =='crosswise'&&this.effect=='marque'&&this.opt.itemName!=''){
- this.itemLen = this.target.getElementsByTagName(this.opt.itemName).length;
- val = this.itemLen*this.opt.itemWidth;
- }else{
- val = this.target.scrollHeight;
- }
- var holderHTML = this.target.innerHTML;
- this.target.innerHTML = '<div class="J_scrollInner">'+holderHTML+'</div>';
- this.targetChild = this.getByClassName('J_scrollInner',this.target)[0];
- var attr = this.dir == 'vertical'?'offsetHeight':'offsetWidth';
- if(val>this.target[attr]){
- if(this.effect == 'scroll'){
- this.scrollDo();
- }else{
- this.marquee();
- }
- this.targetChild.innerHTML += this.targetChild.innerHTML;
- }
- }
- }
原生javascript-无间缝滚动,封装的更多相关文章
- 原生javascript 基础动画函数封装(二)
<!DOCTYPE html> <html> <head> <title></title> <style type="tex ...
- 原生javascript 基础动画函数封装(一)
<!DOCTYPE html> <html> <head> <title></title> <style type="tex ...
- javascript-无间缝滚动,封装
原生javascript-无间缝滚动,封装 目前支持的是竖向与横向滚动 http://lgyweb.com/marScroll/ 现在分析下无间缝实现的基本思路(竖向例子): HTML结构: 1 &l ...
- 原生JavaScript 封装ajax
原生JavaScript 封装ajax function myajax(options){ //新建一个局部对象 用来存放用户输入的各种参数 var opt={ type:options.type ...
- 原生javascript封装动画库
****转载自自己发表于牛人部落专栏的文章**** 一.前言 本文记录了自己利用原生javascript构建自己的动画库的过程,在不断改进的过程中,实现以下动画效果: 针对同一个dom元素上相继发生的 ...
- 原生JavaScript封装的jsonp跨域请求
原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...
- 原生javascript写的侧栏跟随效果
浏览网站时经常看到有的网站上,当一个页面很长的时候,设定侧栏内容会跟随滚动条滚动,我们把这种效果叫做“侧栏跟随滚动”.这种特效对提高网站浏览量.文章点击率.广告点击量都有一定效果. 侧栏跟随滚动的实现 ...
- js原生 + jQuery实现页面滚动字幕
js原生/jQuery实现页面滚动字幕效果 17:45:49 在新闻列表或者文章列表信息等页面中很容易要求实现字幕滚动的效果,以下为简单的实现页面中滚动字幕的效果 1.jQuery实现页面滚动字幕效果 ...
- 原生javascript实现老.虎机抽奖点名demo源码思路解析
想着使用原生Javascript做一个随机点名的小应用, 也可以做抽奖使用. html简单化,人名单可以通过js生成并处理. 可以非常随意的添加修改人名字. 应用想带点特效,比如老.虎机转动的特效. ...
随机推荐
- Oblect类之hashCode和equals
1.hashCode的默认实现.显然是一个本地方法. 2.equals的默认实现.默认equals在比较两个对象时,是看他们是否指向同一个地址的.“==”操作比较的是两个变量的值是否相等,对于引用型变 ...
- vue2+koa2+mongodb分页
后端 const Koa = require('koa2'); const Router = require('koa-router'); const Monk = require('monk');/ ...
- 中线,基线,垂直居中vertical-align:middle的一些理解
基线:小写字母xxxxx的下边缘线就是我们的css基线:一般的行内元素都是vertical-align: baseline;默认设置: x-height:就是指小写字母xxxx的高度,下边缘线到上边缘 ...
- vue-cli中的.babelrc文件介绍
转载自:http://www.cnblogs.com/ye-hcj/p/7071850.html { // 此项指明,转码的规则 "presets": [ //个人认为多此一举 [ ...
- python之路 django2
Django请求生命周期 首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端 路由系统 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规 ...
- python、pip、whl安装和使用
1 python的安装 首先,从python的官方网站 www.python.org下载需要的python版本,地址是这个: http://www.python.org/ftp/python/2.7. ...
- Windos 系统网络连接 调优
1.运行进入注册表:regedit 2.进入注册表指定路径 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters ...
- chrome 获得点击按钮时的事件
初次了解浏览器高级点的功能,原来这么强 想了解点击一个网页的按钮时触发了什么事件,firefox chrome确实很强大,基本可以监控所有内容 以chrome为例: 在按钮上 右键检查 或者 F12 ...
- Jquery15 插件
学习要点: 1.插件概述 2.验证插件 3.自动完成插件 4.自定义插件 插件(Plugin)也成为 jQuery 扩展(Extension),是一种遵循一定规范的应用程序接口编写出来的程序.目前 j ...
- 【读书笔记】《深入浅出nodejs》第二章 模块机制
1.什么是模块? 指在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位:或指大型软件系统的一部分. ----<百度百科> 2.JavaScr ...