根本不用插件,实现jQuery横/纵向走马灯

走马灯这么基础的效果,没必要动用jQuery插件,jQuery本身就已经很强大了好么?

概述

首先构建一个静态的ul,然后通过jQuery的.animate()方法来控制ul的margin来实现滚动,横向滚动是控制margin-left,纵向滚动则是控制margin-top。动画执行之后,在回调里巧妙的使用两行语句就OK了。就这么简单。

这个思路的优势:

  • 不借助CSS3,兼容性好。
  • 不借助绝对定位,容易理解。
  • margin-left设置负值属于正当的CSS规范写法,不属于hack,兼容性可以放心。

下面先以横向走马灯为例。

横向走马灯

准备ul列表

由于要保证ul在margin-left为负值的时候被父元素修剪,所以必须给ul搞一个父元素,而且父元素设置overflow:hidden;。基于组件化的考虑,这个父元素应该是本组件的元素之一,所以,单独搞一个父元素比较好。

HTML代码:

<div class="content">
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
  <li>14</li>
  <li>15</li>
  <li>16</li>
  <li>17</li>
  <li>18</li>
  <li>19</li>
  <li>20</li>
  <li>21</li>
  <li>22</li>
  <li>23</li>
  <li>24</li>
</ul>
</div>

CSS代码

.content{
  width: 960px;
  height:120px; /* 高度值一般就是一个li的盒子高度 */
  overflow: hidden;
  border: #333 solid 1px;
  margin: auto;
}

.content ul{
  margin: 0;
  padding: 0;
  width: 200%;  /* 不一定非要200%,只要比100%多出一个li盒子宽度即可,但由于最极端的宽度也就是显示一个li,再多出一个li,一共两个li,所以最合适的值是200% */
  height:100%;
}

.content ul li{
  list-style: none;
  float: left;
  width: 108px;
  height: 108px;
  border: #ccc solid 1px;
  display: block;
  margin: 5px;
}

CSS代码都是最简化的,不解释了。

JS代码

引用jQuery:

<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>

JS:

function scroll() {
    $(".content ul").animate({"margin-left":"-120px"}, function() {
        $(".content ul li:eq(0)").appendTo($(".content ul"));
        $(".content ul").css({"margin-left": 0});
    });
}

var scrolling = setInterval(scroll, 1000);

$('.content').hover(function() {
    clearInterval(scrolling);
}, function() {
    scrolling = setInterval(scroll, 1000);
});

这段JS就好玩了:

先说“-120px”是哪里算出来的:一个li的盒子宽度:108+5+5+1+1=120px。

然后说一下.animate()的参数:

animate(params,[speed],[easing],[fn])
params: 一组包含作为动画属性和终值的样式属性和及其值的集合
speed: 三种预定速度之一的字符串("slow","normal", or "fast")或表示动画时长的毫秒数值(如:1000)
easing: 要使用的擦除效果的名称(需要插件支持).默认jQuery提供"linear" 和 "swing".
fn:在动画完成时执行的函数,每个元素执行一次。

JS的执行过程是:

1、先让ul向左移动120px,简单说就是,让ul以.animate()的默认速度向左移动120px。这一步执行完成之后,界面暂时是这样的,1号li已经出界,由于ul元素是被裁减的,所以1号li被隐藏:

Paste_Image.png

2、执行回调第一句,把ul的第一个li挪到最后。这一步完成之后是这样:

Paste_Image.png

也就是说1号li现在已经到队列的最后了,2号li到ul外了,3号li成了可见的排头兵。不过3号成为排头兵也只是一瞬间的辉煌,实际上人眼根本看不到。为什么是一瞬间的辉煌?往下看:

3、执行回调的第二句。将ul的margin-left重置为0。完成之后是这样:

Paste_Image.png

也就是说,ul又挪回到了原位。2号li成了排头兵。

问题:为什么ul挪到原位,没有感到抖动?
答:因为JS执行的太快了,挪动li的排序和给ul还原位置都是几乎同时的,而且是微秒级别的速度。

问题:想让走马灯向右走怎么办?
答:首先说向右走不符合人眼的观察习惯,我们阅读都是从左往右读的,所以向右走的走马灯很少见。一定要向右走的话:

修改CSS:

.content ul li{
  float: left; /* 这里left改成right */
}

修改JS:.animate({"margin-left":"-120px"})的负号去掉。

纵向的走马灯

纵向的话,设置每多少个li占一行并没有难度,只需要调整li的宽度即可,一行撑不下自然会折行显示。我们以一行四个li为例。

HTML代码

不变。

CSS代码

有两处修改:

1、把li的宽度改成了960/4-1-1-5-5=228px。(如果你想一个li占一行,li的宽度就应该是960-1-1-5-5=948px。)

2、ul的宽度必须是100%。

.content{
  width: 960px;
  height:120px;
  overflow: hidden;
  border: #333 solid 1px;
  margin:auto;
}

.content ul{
  width: 100%;
  height:100%;
  margin: 0;
  padding: 0;
}

.content ul li{
  list-style: none;
  float: left;
  width: 228px;
  height: 108px;
  border:#ccc solid 1px;
  display: block;
  margin: 5px;
}

JS代码

JS代码也是略加改动,除了改成margin-top之外,还有个.slice(0, 4)

function scroll() {
    $(".content ul").animate({"margin-top":"-120px"}, function() {
        $(".content ul li").slice(0,4).appendTo($(".content ul"));
        $(".content ul").css({"margin-top": 0});
    });
}

var scrolling = setInterval(scroll, 1000);

$('.content').hover(function() {
    clearInterval(scrolling);
}, function() {
    scrolling = setInterval(scroll, 1000);
});

问题:我想每两行两行的滚动,怎么办?
答:首先margin-top的值翻倍,然后.slice(0, 4)改成.slice(0, 8)

问题:咱们这个走马灯是走一步停一下,而常见的走马灯是均匀的走,我想匀速走怎么办?
答:往下看。

匀速走的走马灯

以纵向的走马灯为例。HTML代码和CSS代码都不变。JS代码中animate就加两个参数。

JS代码

function scroll() {
    $(".content ul").animate({"margin-top":"-120px"}, 1000, 'linear', function() {
        $(".content ul li").slice(0,4).appendTo($(".content ul"));
        $(".content ul").css({"margin-top": 0});
    });
}
//其他代码略

改动在:.animate()加了两个参数:第一个参数,1000,也就是跟定时器的时间间隔一致,第二个参数,'linear',也就是线性缓动。就这么简单。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,629评论 1 92
  • 通过jQuery,您可以选取(查询,query)HTML元素,并对它们执行“操作”(actions)。 jQuer...
    枇杷树8824阅读 628评论 0 3
  • JQuery 1、JQuery特点 (1)轻量级(2)链式语法(3)简单(4)写的更少,做的更多 2、本地调用: ...
    Lizzy95阅读 245评论 0 1
  • 先起个名字 当然插件得有个名字,而且得有个文件名。按行规: 名字应该是jQuery-xxxx 文件名应该是jQue...
    microkof阅读 300评论 0 2
  • 平心静气,写下这篇文章。 好好问了问自己,我是为了男朋友还是为了自己在和养育二十几年的母亲抗争? 这场没有硝烟的战...
    静水流深091700阅读 230评论 0 0