/**
* 滚动HTML集合对象
* @param {Element} container 容器节点
* @param {Number} unitLength 滚动宽度,等于容器内子对象的宽度,子对象宽度必须一致
* @param {Number} speed 每10毫秒移动的像素值
* @param {String} direction 滚动方向(up, down, left, right)
* @param {Number} containerRange 容器可视范围 width - paddingLeft - paddingRight 或者 height - paddingTop - paddingBottom
*/
Scroll = function(container, unitLength, speed, direction, containerRange){
var thisObj = this;
this.getContainer = function(){
return container;
}
var COUNT = 0;
for(var i=0,l=container.childNodes.length;i<l;i++) {
if(container.childNodes[i].nodeType==1)COUNT++;
}
var CONTAINER_INIT_LENGTH = unitLength * COUNT;
var CONTAINER_LENGTH = (CONTAINER_INIT_LENGTH * 2);
var base = {
target: container.style,
readyPos: 0,
scrollTarget: '',
lengthTarget: '',
setPos: function(value){
this.target[this.scrollTarget] = value + 'px';
},
getPos: function(){
return parseInt(this.target[this.scrollTarget]);
},
getMovedLength: function(){
return Math.abs(this.getPos() - this.readyPos);
},
init: function(){
this.target[this.lengthTarget] = CONTAINER_LENGTH + 'px';
},
resetPos: function(){
this.setPos(this.readyPos);
}
}
this.directioner = {
left : {
readyPos: 0,
scrollTarget: "marginLeft",
lengthTarget: "width",
move: function(length){
this.setPos(this.getPos() - length);
}
},
right : {
readyPos: -(CONTAINER_LENGTH - containerRange),
scrollTarget: "marginLeft",
lengthTarget: "width",
move: function(length){
this.setPos(this.getPos() + length);
}
},
up : {
readyPos: 0,
scrollTarget: "marginTop",
lengthTarget: "height",
move: function(length){
this.setPos(this.getPos() - length);
}
},
down : {
readyPos: -(CONTAINER_LENGTH - containerRange),
scrollTarget: "marginTop",
lengthTarget: "height",
move: function(length){
this.setPos(this.getPos() + length);
}
}
}
var obj = this.directioner;
for(var p in base){
for(var adir in obj){
if(!obj[adir].hasOwnProperty(p))
obj[adir][p] = base[p];
}
}
var moveUnitLength = function(callback){
var adir = thisObj.directioner[direction];
if(adir.getMovedLength() == CONTAINER_INIT_LENGTH)adir.resetPos();
thisObj.move(speed, unitLength, direction, function(){
callback();
})
}
/**
* 以对象子项长度为单位,在指定方向上移动对象
* @param {String} direction 移动方向
* @param {Number} perMoveCount 每次移动对象的子项个数
* @param {Function} callback 回调
* 可优化成每次移动小于perMoveCount的 总子节点数的最大公约数
*/
this.moveOnce = function(direction, perMoveCount, callback){
if(isNaN(parseInt(perMoveCount)))perMoveCount = 1;
moveUnitLength(function(){
perMoveCount--;
if(perMoveCount){
moveUnitLength(arguments.callee);
}else{
callback();
}
})
}
/**
* 循环滚动
* @param {Boolean} touchAble 鼠标移入时暂停滚动,移出时恢复滚动
*/
this.scroll = function(touchAble){
var callback = function(){
thisObj.reset(direction);
timer = thisObj.move(speed, CONTAINER_INIT_LENGTH, direction, callback);
}
var timer = this.move(speed, CONTAINER_INIT_LENGTH, direction, callback);
if(touchAble){
container.onmouseover = function(){
if(timer.length){
window.clearInterval(timer.pop());
}else{
timer.push(0);
}
}
container.onmouseout = function(){
timer = thisObj.move(speed, CONTAINER_INIT_LENGTH - thisObj.directioner[direction].getMovedLength(), direction, callback);
}
}
}
/**
* 初始化容器
*/
this.init = function(){
var childNodes = container.innerHTML;
container.style.display = "block";
container.innerHTML = childNodes + childNodes;
this.directioner[direction].init();
this.reset(direction);
}
}
/**
* 重置容器到初始位置
* @param {String} 方向
*/
Scroll.prototype.reset = function(direction){
this.directioner[direction].resetPos();
}
/**
* 在指定方向上以设定速度移动对象设定距离
* @param {Number} speed 每10毫秒移动像素
* @param {Number} distance 移动距离
* @param {String} direction 移动方向
* @param {Function} onMoved 移动后调用
* @return {Number} timer 连续移动的句柄
*/
Scroll.prototype.move= function(speed, distance, direction, onMoved){
if(timer && timer.length){
return;
}
var moveObj = this.getContainer();
var i = Math.abs(distance);
var scroll_px = speed;
var adir = this.directioner[direction];
var handler = function(){
adir.move(scroll_px);
i -= scroll_px;
if(i > 0 && i < scroll_px){
scroll_px = i;
}
if (i == 0) {
if(timer.length){
window.clearInterval(timer.pop());
if(typeof(onMoved) == "function")onMoved();
}
}
}
var timer = [window.setInterval(handler, 10)];
return timer;
}
/*
-------------------------------单击按钮向右滚动示例-------------------------------------
<input id="btnScrollRight" name="" type="button" class="btn_goto"/>
<div style="width:636px;overflow:hidden;">
<div id="scroll_prizes">
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='1' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='2' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='3' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='4' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='5' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='6' width="150" height="150" border="0" alt="" /></a></div>
</div>
</div>
<script>
var mq1 = new Scroll(document.getElementById("scroll_prizes"), 159, 10, "right", 636);
mq1.init();
//mq1.scroll();
var mq1_is_moving = false;
document.getElementById("btnScrollRight").onclick = function(){
//this.moveOnce = function(direction, perMoveCount, callback){
if(mq1_is_moving)return;
mq1_is_moving = true;
mq1.moveOnce("right", 4, function(){
mq1_is_moving = false;
});
}
</script>
-------------------------------循环向上滚动示例-------------------------------------
<div class="co_list" style="height:566px;overflow:hidden;padding:20px 30px">
<div style="height:536px;overflow:hidden;">
<div id="marquee2">
<a href=""><img src="../imgaes/index/co_adv11.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv12.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv13.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv14.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv15.png" width="150" height="55" border="0" alt=""/></a>
</div>
</div>
</div>
<script>
mq2 = new Scroll(document.getElementById("marquee2"), 69, 2, "up", 536);
mq2.init();
mq2.scroll();
</script>
-------------------------------循环向右滚动示例-------------------------------------
<div style="width:615px;overflow:hidden;height:110px;">
<div id="marquee1">
<div class="list">
<img src="../imgaes/index/co_adv11.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv12.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv13.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv14.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv15.png" width="201" height="101" border="0" alt="" />
</div>
</div>
</div>
<script>
var mq1 = new Scroll(document.getElementById("marquee1"), 211, 2, "right", 615);
mq1.init();
mq1.scroll();
</script>
*/
分享到:
相关推荐
针对目前还没有一个通用可配置且支持不同规模的移位寄存器实现方法,利用通用可重构处理器基本运算单元数据流和控制流可配置的特点,充分挖掘移位寄存器中并行流水潜力,在通用可重构处理器上,设计反馈移位寄存器的...
反馈移位寄存器在通用可重构处理器上的配置生成与优化设计主要关注的是如何在可重构处理器平台上高效地实现和优化这种重要的数字逻辑组件。在序列密码算法中,反馈移位寄存器扮演着核心角色,其操作频繁,且结构灵活...
JSP Ajax重构通用模板
《针对粗粒度可重构处理器的通用循环编译技术》 粗粒度可重构处理器是一种融合了高性能和高灵活性特点的新型处理器架构,它由通用处理器和可重构处理单元组成,通过并行执行来提升计算效率。然而,现有的编译技术在...
这些方法不仅有助于提高代码的可读性和可维护性,还能增强程序的可扩展性。 书中强调,重构的动机往往源自于程序设计上的问题,例如难以理解和维护的代码、难以扩展的程序等。通常这些问题不是一次性出现的,而是...
它不仅是一种技术手段,也是一种提高代码可维护性和可扩展性的思维方式。 2. C#和***中的重构实践:书中详细介绍了在C#和***环境中如何进行代码重构,包括使用重构工具和技术来改进现有代码库。 3. 原型到企业级...
自适应可重构通用浮点加速器的设计 本文提出了一种自适应可重构通用浮点加速器(Reconfigurable General-purpose Float-point Accelerator, RGFA),旨在解决当前硬件系统在浮点运算方面的挑战。RGFA 采用“RISC-V+...
- **意义**:通过重构可以提高代码质量、增强软件的可读性和可维护性,同时减少后续开发的风险。 2. **基本原则**: - **小步骤原则**:每次只做一点小改动,确保每一步都是安全的。 - **测试先行**:在进行任何...
2. M1、M2芯片:这些芯片是粗粒度、多重配置的可重构结构,M2作为M1的改进版,提供了更高的灵活性和性能,适用于并行计算和多媒体数据处理等场景。 3. FIPSOC:一种粗粒度结构的FPGA,具备多重配置文件的动态重构...
我用jquery曾经实现过鼠标点击 出现下拉菜单 有点和面包屑 和标签页导航类似 后来参加工作了 公司一直在用vue 所以很多用jqeury写的项目都要用vue来重构 这其中不免碰见了有一些动画效果 虽然很简单 我也曾想着就...
在重构后台管理系统时,有时我们需要实现一些增强用户体验的功能,比如吸顶效果、锚点定位以及滚动时按钮的高亮显示。这些功能在商品管理、内容导航等领域非常常见,尤其在电商网站上,能够帮助用户更便捷地浏览和...
在描述中提到的"对经验模态分解后的各分量IMF进行重构代码,函数可直接调用",意味着这个压缩包中包含了一个名为"EMDchonggou.m"的MATLAB脚本文件,该文件提供了实现IMF重构功能的代码。用户可以直接运行这个函数,...
可重构计算系统是一种先进的计算架构,其核心思想在于将通用处理器(GPU)和专用集成电路(ASIC)的长处结合起来。通用处理器具备高度的软件编程灵活性,能够支持多种计算任务,但其性能受限于执行速度。而专用集成电路...
这通常包括提取函数、移动函数、提取类、替换魔法数字等操作,以增强代码的可读性、可维护性和可扩展性。 在这个C++版本的重构例子中,我们可能会遇到以下一些关键知识点: 1. **C++语法与特性**:C++作为一门强...
嵌入式系统硬件可重构是近年来在信息技术领域中发展迅速的一个关键概念,它涉及到了电子工程、计算机科学以及软件工程等多个学科的交叉应用。本文将深入探讨嵌入式系统硬件可重构的重要性和相关知识点。 首先,理解...
为了解决这一问题,可重构计算系统作为一种新兴的技术应运而生,它不仅继承了通用处理器的灵活性,还兼具了ASIC高效的特点。 #### 二、可重构计算系统概述 **可重构计算系统**是一种新型的计算架构,它通过采用可...
7. **设计模式与重构**:设计模式提供了解决常见问题的通用方案,而重构可以帮助我们将这些模式应用到现有的代码中,提升代码的灵活性和可扩展性。 8. **代码审查**:团队中的代码审查是保证重构质量的关键环节,它...