html实现段落左右无缝滚动,原生javascript实现无缝滚动

实现javascript的无缝滚动需要掌握基本的定位和运动知识

逐步分析图片的无缝滚动是怎么实现的

HTML的基本结构如下

  • 1.jpg
  • 2.jpg
  • 3.jpg
  • 4.jpg

CSS样式:

#moving {

width: 600px;

height: 370px;

background-color: #ccc;

position: relative;

margin: 30px auto 0;

overflow: hidden;

}

#moving ul {

position: absolute;

left: 0;

top: 0;

}

#moving ul li {

list-style: none;

float: left;

}

#control {

width:300px;

margin: 20px auto;

}

#control input {

margin-left: 30px;

width: 50px;

}

要实现图片窗口整体的无缝滚动(我们需要通过定时器定时改变

  • 的位置,于是我们有下面的片段来实现:

oUl.style.left = oUl.offsetLeft + speed + 'px';

speed对应定时器时间段内移动的距离,oUl指ul

开始这样做能实现基本的运动,但是图片总是数量有限的,当最后一张图片滚动展示完毕后,后面就没有了内容。那么我们如何克服这个困难,让滚动一直持续循环下去呢?

为了达到这种效果,我们可以克隆同样的ul结构,并且拼接在一起,比如:

oUl.innerHTML += oUl.innerHTML;

注意不要漏了在ul加入overflow:hidden,否则可能会两栏显示

但是这样做还是不够的,图片总会播放完,但是我们不可能复制成千上万分一样的ul结构

这时候需要一点小技巧

当左段ul(为了阐述方便,分为两段,左段为原始,右段为复制的那份)滚动完成,右段的开头即将离开图片窗口的时候,将整个ul拉回到原始位置。如果是向右运动,那么当左端的开头第一张图片到左边尽头时,整个ul拉回到起始位置

function move(){

if(oUl.offsetLeft < -oUl.offsetWidth/2){ //向左滚动时滚动完左段后马上将它拉回来

oUl.style.left = '0';

}

if(oUl.offsetLeft > 0){

oUl.style.left = -oUl.offsetWidth/2 + 'px'; //向右滚动时最后一段已经到尽头

}

oUl.style.left = oUl.offsetLeft + speed + 'px';

}

以下是javascript部分

window.onload = function(){

var oMove = document.getElementById('moving');

var oUl = oMove.getElementsByTagName('ul')[0];

var aLi = oUl.getElementsByTagName('li');

var oCtr = document.getElementById('control');

var oLeft = document.getElementById('left');

var oRight = document.getElementById('right');

var speed = null;

oUl.innerHTML += oUl.innerHTML; //两段一样的内容

oUl.style.width = aLi[0].offsetWidth*aLi.length + "px"; //两段ul宽度不够,第二段会掉下去

oLeft.onclick = function(){

return speed = -3;

}

oRight.onclick = function(){

return speed = 3;

}

function move(){

if(oUl.offsetLeft < -oUl.offsetWidth/2){ //向左滚动时滚动完第一段后马上将它拉回来

oUl.style.left = '0';

}

if(oUl.offsetLeft > 0){

oUl.style.left = -oUl.offsetWidth/2 + 'px'; //向右滚动时最后一段已经到尽头

}

oUl.style.left = oUl.offsetLeft + speed + 'px';

}

var timer = setInterval(move,30);

oMove.onmouseover = function(){

clearInterval(timer);

};

oMove.onmouseout = function(){

timer = setInterval(move,30);

};

var btn = document.getElementById("stop");

btn.onclick = function(){

clearInterval(timer); //stop按键停止运动,如果在点击后将鼠标先移入图片再移出会重新开启

}

}

以上是智能社课程学习内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用QPlainTextEdit实现分段加载后,要实现虚拟滚动条需要以下步骤: 1. 获取每个段落的高度 在分段加载时,需要获取每个段落的高度,可以通过QFontMetrics类获取字体信息,然后计算每个段落的高度。 2. 设置QPlainTextEdit的滚动条范围 根据所有段落的高度计算出QPlainTextEdit的滚动条范围,然后设置QPlainTextEdit的滚动条范围。 3. 实现虚拟滚动 在QPlainTextEdit的滚动事件中,根据滚动条的位置,计算出需要显示的段落范围,然后只显示这些段落,其余的段落不显示。 4. 更新QPlainTextEdit的滚动条 在显示新的段落后,需要重新计算QPlainTextEdit的滚动条范围,并更新滚动条的位置。 以下是代码示例: ```python class MyPlainTextEdit(QPlainTextEdit): def __init__(self, parent=None): super().__init__(parent) self.__line_height = 0 self.__total_height = 0 self.__visible_lines = 0 self.__scrollbar = self.verticalScrollBar() self.__scrollbar.valueChanged.connect(self.__on_scrollbar_value_changed) def setLineHeight(self, height): self.__line_height = height def setTotalHeight(self, height): self.__total_height = height self.__visible_lines = self.height() // self.__line_height self.__scrollbar.setRange(0, self.__total_height - self.height()) def updateScrollBar(self): self.__visible_lines = self.height() // self.__line_height self.__scrollbar.setRange(0, self.__total_height - self.height()) def __on_scrollbar_value_changed(self, value): start_line = value // self.__line_height end_line = min(start_line + self.__visible_lines, len(self.document().blockCount())) self.blockSignals(True) self.document().setBlockCount(0) for i in range(start_line, end_line): self.document().setBlockCount(i + 1) self.blockSignals(False) self.updateScrollBar() ``` 在代码中,setLineHeight方法用于设置每个段落的高度,setTotalHeight方法用于设置QPlainTextEdit的总高度,updateScrollBar方法用于更新QPlainTextEdit的滚动条,__on_scrollbar_value_changed方法用于处理滚动事件。在__on_scrollbar_value_changed方法中,根据滚动条的位置计算需要显示的段落范围,然后只显示这些段落,其余的段落不显示。最后调用updateScrollBar方法更新滚动条。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值