手写滑动同步滚动进度条jq插件

因需要一种滑动显示内容,并且带可拖动的进度条,即下面这种效果

 找了很多插件,总有地方不能满足需求。于是决定自己手写,下面为完整源码:

swiper.js 

 1 $.swiperCalculator = function (wrap, drag) {
 2     this.wrap = wrap;
 3     this.drag = drag;
 4     this.pWidth = drag.parent().width() - drag.width();
 5     this.num = wrap.children().length - 1;
 6 }
 7 $.extend($.swiperCalculator.prototype, {
 8     setPostion: function (wrapX, dragX) {
 9         this.wrap.css('transform', 'translate3d(' + wrapX + 'px, 0px, 0px)');
10         if (dragX < 0) dragX = 0;
11         if (dragX > this.pWidth) dragX = this.pWidth;
12         this.drag.css('left', dragX + 'px');
13         this.drag.parent().siblings('.pro-val').html(parseInt(dragX / this.pWidth * 100) + '%');
14         this.drag.siblings('.pro-bar').css('width', (dragX + this.drag.width()) + 'px');
15     },
16     initPostion: function (i) {
17         let wrapX, dragX;
18         dragX = i * this.pWidth / this.num;
19         let lWidth = this.wrap.children().outerWidth(true);
20         if (i == 0) wrapX = 0;
21         else if (i == this.num) wrapX = this.wrap.parent().width() - (this.num + 1) * lWidth - 15;
22         else wrapX = dragX - i * lWidth - 5;
23         this.wrap.css('transition-duration', '0.3s').children('li').removeClass('active').eq(i).addClass('active');
24         this.drag.css('transition-duration', '0.3s');
25 
26         this.setPostion(wrapX, dragX);
27     }
28 });
29 
30 let $element, posX, isTouched = false;
31 
32 $.fn.extend({
33     swiper: function () {
34         let $wrap = $(this).find('.wrapper ul');
35         let $li = $wrap.children('li');
36         $wrap.css('width', ($li.length + 1) * $li.outerWidth(true) + 'px').mousedown(function (e) {
37             isTouched = true;
38             if (e.preventDefault) e.preventDefault();
39             else e.returnValue = false;
40 
41             posX = e.pageX;
42             $element = $(this);
43         });
44         $(this).find('.drag').mousedown(function (e) {
45             isTouched = true;
46             if (e.preventDefault) e.preventDefault();
47             else e.returnValue = false;
48 
49             posX = e.pageX;
50             $element = $(this);
51         })
52         return $(this);
53     },
54     mouseMove: function (x) {
55         let $p = $(this).closest('.swiper')
56         let $wrap = $p.find('.wrapper ul');
57         let $drag = $p.find('.drag');
58 
59         let sc = new $.swiperCalculator($wrap, $drag);
60         let dragX = $drag.position().left;
61         if (x == 0) {
62             let i = Math.round(dragX / sc.pWidth * sc.num);
63             sc.initPostion(i);
64         } else {
65             let wrapX;
66             let wWidth = $wrap.width();
67             if ($(this).is($drag)) {
68                 wrapX = -1 * x / sc.pWidth * wWidth;
69             } else {
70                 wrapX = x;
71                 x = -1 * wrapX / wWidth * sc.pWidth;
72             }
73             wrapX += parseFloat($wrap.css("transform").match(/matrix\(([^)]+)\)/)[1].split(", ")[4]);
74             dragX += x;
75 
76             $wrap.css('transition-duration', '0s');
77             $drag.css('transition-duration', '0s');
78             sc.setPostion(wrapX, dragX);
79         }
80     }
81 })
82 
83 $(document).mousemove(function (e) {
84     if (!isTouched) return;
85     if (e.preventDefault) e.preventDefault();
86     else e.returnValue = false;
87 
88     $element.mouseMove(e.pageX - posX)
89     posX = e.pageX;
90 }).mouseup(function (e) {
91     if (!isTouched) return;
92     isTouched = false;
93 
94     $element.mouseMove(0);
95 });

 

test.html

 1 <!DOCTYPE html
 2     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 
 5 <head>
 6     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 7     <title>XXX</title>
 8     <style>
 9         *{margin: 0;padding: 0;}
10         .wrapper{width: 885px; overflow: hidden;background: #fff; padding: 10px 0;}
11         .wrapper ul{transform: translate3d(0px, 0px, 0px);}
12         .wrapper li{list-style: none;float: left; width: 120px; height: 125px; margin: 5px; padding: 10px; text-align: center; box-shadow: 0 0 0 1px rgba(0,0,0,.05), 0 2px 3px rgba(0,0,0,.1);;border-radius: 6px;}
13         .wrapper li.active{box-shadow:0 0 0 1px rgba(0,0,0,.05),0 2px 4px 5px rgba(0,0,0,.14);}
14         .wrapper li.end{line-height: 120px;}
15         .wrapper li img{width: 100px; height: 100px;}
16         .progress{position: relative;float: left;width: 755px;height: 10px; margin: 10px 0; border-radius: 4px; background-color: #e6e7e9;}
17         .pro-bar{width: 30px;height: 10px;background-color: #2fb344;border-radius: 4px;}
18         .drag{position: absolute; top:-10px;left:0;}
19         .txt{float: left;font-size: 16px; color: #f76707; line-height: 30px; margin-left: 10px;}
20         .pro-txt{width: 45px;}
21     </style>
22 </head>
23 
24 <body>
25     <div class="swiper">
26         <div class="wrapper">
27             <ul>
28                 <li class="active">
29                     <img src="xxxx.jpg">
30                     <p>第1张图</p>
31                 </li>
32                 <li>
33                     <img src="xxxx.jpg">
34                     <p>第2张图</p>
35                 </li>
36                 <li>
37                     <img src="xxxx.jpg">
38                     <p>第3张图</p>
39                 </li>
40                 <li>
41                     <img src="xxxx.jpg">
42                     <p>第4张图</p>
43                 </li>
44                 <li>
45                     <img src="xxxx.jpg">
46                     <p>第4张图</p>
47                 </li><li>
48                     <img src="xxxx.jpg">
49                     <p>第4张图</p>
50                 </li><li>
51                     <img src="xxxx.jpg">
52                     <p>第4张图</p>
53                 </li>
54                 <li class="end">END</li>
55             </ul>
56         </div>
57         <div>
58             <div class="txt pro-txt">进度</div>
59             <div class="progress">
60                 <div class="pro-bar"></div>
61                 <div class="drag"><img src="yyyy.png"></div>
62             </div>
63             <div class="txt pro-val">0%</div>
64         </div>
65     </div>
66 
67     <script type="text/javascript" src="/js/jquery18.js" charset="utf-8"></script>
68     <script type='text/javascript' src='/js/swiper.js'></script>
69     <script type="text/javascript">
70         $('.swiper').swiper();
71         //默认选中第4幅图,也可不用
72         let sc = new $.swiperCalculator($('.wrapper ul'), $('.drag'));
73         sc.initPostion(3);
74     </script>
75 </body>
76 
77 </html>

 

posted @ 2023-12-25 17:29  。活着。  阅读(29)  评论(0编辑  收藏  举报