zoukankan      html  css  js  c++  java
  • 重新发明轮子之jQuery新闻滚动插件

    任务需要,就写了一个jQuery新闻滚动插件jquery.roller.js,功能相对比较简单,可能往后会加入ajax一段时间轮询 动态加载的功能.下面直接给出源代码,如果需要可以直接下载 ,我在源码里给出了注释,有什么不足之处后或者可以改进的地方, 希望能够大家留言探讨...

    效果图(比较朴素):

      1 ;(function($) {
      2     $.fn.roller = function(options) {
      3         var opts = $.extend({}, $.fn.roller.defaults, options),
      4             // 通过循环队列来管理滚动信息
      5             itemQueue = new Array();
      6             
      7         return this.each(function(index) {
      8             
      9             var $div = $(this).addClass('roller-container');
     10             // 用给定的数组进行初始化
     11             if(opts.items && Util.isArray(opts.items)) {
     12                 for(var i = 0, len = opts.items.length; i < len; i++) {
     13                     itemQueue.push($('<div class="roller-item"></div>').append(buildLink(opts.items[i])));
     14                 }
     15             } else {
     16                 //同样可以用页面元素进行初始化
     17             }
     18             
     19             // 把一开始要显示的条目加入容器中
     20             for(i = 0, len = opts.showNum; i < len; i++) {
     21                 if(isUp()) {
     22                     $div.append(itemQueue[i]);
     23                 } else {
     24                     $div.prepend(itemQueue[i]);
     25                 }
     26             }
     27             // 把已经加入容器的条目副本 放到循环队列的尾部
     28             for(i = 0, len = opts.showNum; i < len; i++) {
     29                 var temp = itemQueue.shift();
     30                 itemQueue.push(temp.clone());
     31             }
     32             
     33             // 取得一个滚动元素
     34             var _item = $('.roller-item:first', this),
     35                 // 取得它的外围高度 包括margin
     36                 _outHeight = _item.outerHeight(true),
     37                 // 容器的内容总高度
     38                 totalHeight = _outHeight * parseInt(opts.showNum, 10);
     39             
     40             // 保存初始marginTop值
     41             opts.orginal_marginTop = parseInt(_item.css('margin-top'), 10);
     42             if(isUp()) {
     43                 opts.anim_marginTop = opts.orginal_marginTop - _outHeight - parseInt($div.css('padding-top'), 10);
     44             } else {
     45                 opts.anim_marginTop = opts.orginal_marginTop + _outHeight;
     46             }
     47             
     48             // 初始化容器样式和事件
     49             $div.css({
     50                 'height': totalHeight + 'px',
     51                 'overflow': 'hidden'
     52             }).hover(function() {
     53                 // 鼠标进入时 停止滚动    
     54                 opts.hold = true;
     55             }, function() {
     56                 // 鼠标离开  重新开始滚动
     57                 opts.hold = false;
     58                 startRolling($(this));
     59             }).trigger('mouseleave');
     60             
     61         });
     62         
     63         /**
     64          * 滚动方向判断
     65          */
     66         function isUp() {
     67             if(opts.direction === 'up') return true;
     68             if(opts.direction === 'down') return false;
     69             throw new Error('direction should be "up" or "down"');
     70         }
     71         
     72         /**
     73          * 生成一个jQuery封装的<a/>
     74          */
     75         function buildLink(item) {
     76             var html = item.html;
     77             delete item.html;
     78             return $('<a></a>').attr(item).html(html);
     79         }
     80         
     81         function startRolling($div) {
     82             setTimeout(function() {
     83                 // 是否停止滚动
     84                 if(!opts.hold) { 
     85                     var first = null,
     86                         _funSelf = arguments.callee;
     87                     
     88                     // 当前第一个元素
     89                     first = $div.find('.roller-item:first');
     90                         
     91                     first.animate({marginTop: opts.anim_marginTop}, 
     92                         opts.interval, 
     93                         function() {
     94                             // 从队列中取出下一个条目
     95                             var temp = itemQueue.shift();
     96                             // 把它的副本放到队列的尾部
     97                             itemQueue.push(temp.clone());
     98                             
     99                             if(isUp()) { 
    100                                 // 移除当前第一个元素
    101                                 first.remove();
    102                                 // 把刚取出的条目append到容器中
    103                                 $div.append(temp.hide());
    104                             } else { 
    105                                 // 移除当前最后一个元素
    106                                 $div.find('.roller-item:last').remove();
    107                                 // 让当前第一个元素的marginTop恢复成初始值
    108                                 first.css('margin-top', opts.orginal_marginTop + 'px');
    109                                 // 把刚取出的条目prepend到容器中
    110                                 $div.prepend(temp.hide());
    111                             }
    112                             
    113                             temp.fadeIn(opts.interval - 50);
    114                             // 触发下一个循环
    115                             setTimeout(_funSelf, opts.interval);
    116                     });
    117                 }
    118             }, opts.interval);
    119         };
    120     };
    121     
    122     //工具方法集合
    123     var Util = {
    124         toString: function(v) {
    125             return Object.prototype.toString.apply(v);
    126         },     
    127         // 判断是否是Array
    128         isArray : function(v){
    129             return Util.toString(v) === '[object Array]';
    130         }
    131     };
    132     
    133     // 滚动新闻默认配置
    134     $.fn.roller.defaults = {
    135         interval: 1000,  // 滚动间隔
    136         showNum: 5,      // 一次显示新闻数
    137         hold: false,     // 是否停止滚动
    138         direction: 'up'  // 滚动方向
    139     };
    140 })(jQuery);

    看下页面使用代码

     1 $('#container').roller({
     2      showNum:4,                 //显示个数
     3      interval: 1500,            //滚动的时间间隔
     4     direction: 'down',         //滚动方向
     5      items: [{                   //内容
     6         title: 'ccav滚动新闻1',              //a的title属性 
     7         html: 'ccav滚动新闻1',               //a的innerHTML
     8         target: '_blank',                     //a的target
     9         href: 'http://www.google.com.hk'    //a的href
    10     }, {
    11         title: 'ccav滚动新闻2',
    12         html: 'ccav滚动新闻2',   
    13         target: '_blank',     
    14         href: 'http://www.google.com.hk'
    15     }, {
    16         title: 'ccav滚动新闻3',  
    17         html: 'ccav滚动新闻3',  
    18         target: '_blank',         
    19         href: 'http://www.google.com.hk'
    20     }, {
    21         title: 'ccav滚动新闻4',  
    22         html: 'ccav滚动新闻4',  
    23         target: '_blank',         
    24         href: 'http://www.google.com.hk'
    25     }, {
    26         title: 'ccav滚动新闻5',  
    27         html: 'ccav滚动新闻5', 
    28         target: '_blank',         
    29         href: 'http://www.google.com.hk'
    30     }, {
    31         title: 'ccav滚动新闻6',  
    32         html: 'ccav滚动新闻6',  
    33         target: '_blank',     
    34         href: 'http://www.google.com.hk'
    35     }]
    36 });
  • 相关阅读:
    这些年,产品经理们折腾过的原型工具
    这些年,产品经理们折腾过的原型工具
    这些年,产品经理们折腾过的原型工具
    区块链与微服务天生是一对
    区块链与微服务天生是一对
    区块链与微服务天生是一对
    区块链与微服务天生是一对
    OpenCV和Matlab
    OpenCV和Matlab
    现在最暴利的行业是什么?
  • 原文地址:https://www.cnblogs.com/AndyWithPassion/p/jquery_roller_plugin.html
Copyright © 2011-2022 走看看