为一名职业web前端,我们需要对网页上常见的交互都要具备手写js的能力,或者js比较复杂如果习惯jquery也可以。最近切图网一个客户项目中遇到了图片滚动效果,因客户要求,写了3个不同的版本,留作备注和分享。
1,右箭头,点击一下移动一个单元,当移动到最后一个单元的时候,在点击右箭头,回到第一个单元
/*图片滚动*/
$('.imgroll').each(function(){
$(this).find('li:first').addClass('selected');
})
$('.imgroll .next').click(function(){
var f=$(this).parent();
var l=(f.find('li').size()-4) * 258;
//console.log(parseInt(f.find('ul').css('margin-left')) + '-' + l);
if(parseInt(f.find('ul').css('margin-left')) > -l){
f.find('ul').stop().animate({'marginLeft':'-=258'})
}
else{
f.find('ul').stop().animate({'marginLeft':0})
}
});
$('.imgroll .prev').click(function(){
var f=$(this).parent();
var l=(f.find('li').size()-4) * 258;
//console.log(parseInt(f.find('ul').css('margin-left')) + '-' + l);
if(parseInt(f.find('ul').css('margin-left')) < 0){
f.find('ul').stop().animate({'marginLeft':'+=258'})
}
else{
f.find('ul').stop().animate({'marginLeft':0})
}
})
2,点击右箭头,移动一个单元,当移动到最后一个单元的时候,点击右箭头无效。
/*图片滚动*/
$('.imgroll').each(function(){
$(this).find('li').each(function(){
$(this).attr('data-index',$(this).index());
})
})
$('.imgroll .next').click(function(){
// 将整个ul设置动画方式负移位,制造图片左移的效果,然后设置移位为0,将第一张图片获取补到最后,到这里整个图片左移效果完成
var f=$(this).parent();
//console.log(f.find('li:eq(3)').data('index')+1 + '-----'+ f.find('li').size());
if(f.find('li:eq(3)').data('index')+ 1==f.find('li').size()){
return false;
}
f.find('ul').animate({'marginLeft':-258},function(){
$(this).css('marginLeft',0).find('li:first').appendTo($(this));
});
});
$('.imgroll .prev').click(function(){
var f=$(this).parent();
if(f.find('li:first').data('index')==0){
return false;
}
// 同上
f.find('ul').css('marginLeft',-258).find('li:last').prependTo(f.find('ul'));
f.find('ul').animate({'marginLeft':0});
})
3,最常规的写法,参见切图框架 slicy 。
http://www.slicy.cn
原文地址:http://www.qietu.cn/thread-15196-1-1.html (切图社区)
加微信公众号:qietuwang (限做前端的人)
景:
想要实现图片持续滚动,既然使用js,就千万不要加css动画、过渡等相关样式,如果想要滚动的平滑一下,可以一像素一像素的感动,则很平滑,如果加了过渡动画,当图片重置为0时,会有往回倒的动画效果,跟预期不符。
原理:
图片滚动原理同图片轮播原理,同样也适用于文字滚动等一系列滚动,通过复制最后一张图片或最后一堆文字插入第一行,或复制第一张图片或一堆文字插入在结尾,来实现无缝拼接,前提:1、必须是没有设置过渡动画的,2、重置为0的时候与当前已经滚动到的高度对于图片的位置而言肉眼看上去没变化。
实现:
html主要包含三块:
1、最外层盒子,用来展示滚动图的区域,overflow:hidden;
2、滚动的盒子,主要改变该盒子的定位值,来实现滚动,里面包含所有要滚动的图片或文字
3、包含图片或文字的盒子。
代码:
class Roll {
constructor(opts) {
this.elem=opts.elem; // 图片包含滚动长度的元素的
this.elemBox=opts.elemBox; //图片展示区域元素,为了获取展示区域的高度
this.direction=opts.direction;
this.time=opts.time;
this.init();
this.roll=this.roll.bind(this)
this.startRoll=this.startRoll.bind(this)
this.stopRoll=this.stopRoll.bind(this)
}
init(){
this.elemHeight=this.elem.offsetHeight;
this.elemHtml=this.elem.innerHTML;
this.elem.innerHTML=this.elem.innerHTML + this.elemHtml+ this.elemHtml;
this.speed;
// 如果向上滚或者向左滚动每次减1,向下滚或者向右滚动每次加1
if(this.direction==='top' || this.direction==='left'){
this.speed=-1;
}else{
this.speed=1;
}
}
roll(){
switch (this.direction) {
case "top":
// 如果滚动的盒子的top值超出元素的高度,则置为0
if(Math.abs(this.elemBox.offsetTop) >=this.elemHeight){
this.elemBox.style.top=0;
}else{
this.elemBox.style.top=this.elemBox.offsetTop + this.speed + 'px';
}
break;
case "bottom":
// 如果滚动的盒子的bottom值超出元素的高度,则置为0
if(Math.abs(this.elemBox.offsetBottom) >=this.elemHeight){
this.elemBox.style.bottom=0;
}else{
this.elemBox.style.bottom=this.elemBox.offsetBottom + this.speed + 'px';
}
break;
case "left":
// 如果滚动的盒子的left超出元素的高度,则置为0
if(Math.abs(this.elemBox.offsetLeft) >=this.elemHeight){
this.elemBox.style.left=0;
}else{
this.elemBox.style.left=this.elemBox.offsetLeft + this.speed + 'px';
}
break;
case "right":
// 如果滚动的盒子的right超出元素的高度,则置为0
if(Math.abs(this.elemBox.offsetRight) >=this.elemHeight){
this.elemBox.style.right=0;
}else{
this.elemBox.style.right=this.elemBox.offsetRight + this.speed + 'px';
}
break;
default:
// 默认向上滚动,如果滚动的盒子的top超出元素的高度,则置为0
if(Math.abs(this.elemBox.offsetTop) >=this.elemHeight){
this.elemBox.style.top=0;
}else{
this.elemBox.style.top=this.elemBox.offsetTop + speed + 'px';
}
}
}
stopRoll(){
clearInterval(this.scrollTimer)
}
startRoll(){
this.scrollTimer=setInterval(this.roll,this.time)
}
}
原文链接:https://www.php.cn/js-tutorial-448891.html
*请认真填写需求信息,我们会在24小时内与您取得联系。