首页 > 其他分享 >手写滑动同步滚动进度条jq插件

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

时间:2023-12-25 17:33:55浏览次数:26  
标签:插件 进度条 wrapX jq width drag let wrap dragX

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

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

swiper.js

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

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         .wrapper{width: 885px; overflow: hidden;background: #fff; padding: 10px 0;}
10         .wrapper ul{transform: translate3d(0px, 0px, 0px);}
11         .wrapper li{float: left; width: 120px; height: 121px; 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;}
12         .wrapper li.active{box-shadow:0 0 0 1px rgba(0,0,0,.05),0 2px 4px 5px rgba(0,0,0,.14);}
13         .wrapper li.end{line-height: 120px;}
14         .wrapper li img{width: 100px; height: 100px;}
15         .progress{position: relative;float: left;width: 755px;height: 10px; margin: 10px 0; border-radius: 4px; background-color: #e6e7e9;}
16         .pro-bar{height: 10px;background-color: #2fb344;border-radius: 4px;}
17         .drag{position: absolute; top:-10px;left:0;}
18         .txt{float: left;font-size: 16px; color: #f76707; line-height: 30px; margin-left: 10px;}
19         .pro-txt{width: 45px;}
20     </style>
21 </head>
22 
23 <body>
24     <div class="swiper">
25         <div class="wrapper">
26             <ul>
27                 <li>
28                     <img src="xxxx.jpg">
29                     <p>第1张图</p>
30                 </li>
31                 <li>
32                     <img src="xxxx.jpg">
33                     <p>第2张图</p>
34                 </li>
35                 <li>
36                     <img src="xxxx.jpg">
37                     <p>第3张图</p>
38                 </li>
39                 <li>
40                     <img src="xxxx.jpg">
41                     <p>第4张图</p>
42                 </li>
43                 。
44                 。
45                 。
46                 <li class="end">END</li>
47             </ul>
48         </div>
49         <div>
50             <div class="txt pro-txt">进度</div>
51             <div class="progress">
52                 <div class="pro-bar"></div>
53                 <div class="drag"><img src="yyyy.png"></div>
54             </div>
55             <div class="txt pro-val"></div>
56         </div>
57     </div>
58 
59     <script type="text/javascript" src="/js/jquery18.js" charset="utf-8"></script>
60     <script type='text/javascript' src='/js/swiper.js'></script>
61     <script type="text/javascript">
62         $('.swiper').swiper();
63         //默认选中第4幅图,也可不用
64         let sc = new $.swiperCalculator($('.wrapper ul'), $('.drag'));
65         sc.initPostion(3);
66     </script>
67 </body>
68 
69 </html>

 

标签:插件,进度条,wrapX,jq,width,drag,let,wrap,dragX
From: https://www.cnblogs.com/desertion/p/17926592.html

相关文章

  • Cost Calculator Builder PRO v3.1.46 已注册 – WordPress 插件
    成本计算器生成器PROv3.1.46:WordPress插件全解析一、插件概述"成本计算器生成器PROv3.1.46"是一款强大的WordPress插件,专为需要创建报价、价格和项目估算表的用户设计。这款插件集成了众多高级功能,可帮助用户高效地管理他们的成本和价格,从而提供准确的报价估算。二、条......
  • Taurus .Net Core 微服务开源框架:Admin 插件【4-5】 - 配置管理-Mvc【Plugin-Admin 后
    前言:继上篇:Taurus.NetCore微服务开源框架:Admin插件【4-4】-配置管理-Mvc【Plugin-CORS跨域】本篇继续介绍下一个内容:系统配置节点:Mvc- Plugin- Admin 后台界面:配置界面如下: 配置说明如下:1、Admin.IsEnable:配置当前后台插件是否可用这是个很危险的开关:如果......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Progress进度条组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Progress进度条组件编辑一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1二、Progress组件进度条也是UI开发最常用的组件之一,进度条组件,用于显示内容加载或操作处理等进度。接口Progress(options:{value:n......
  • 强大的VS插件CodeRush全新发布v23.2——支持并发.NET类型
    CodeRush是一个强大的VisualStudio.NET插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验。CodeRush能帮助你以极高的效率创建和维护源代码。Consume-first申明,强大的模板,智能的选择工具,智能代码分析和创新的导航以及一个无与伦比的重构集,在它们的帮助下能够大大的......
  • 《安富莱嵌入式周报》第329期:圣诞前夕,各种软件井喷式更新,开源600Wh的UPS低压电源,各种
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 圣诞前夕,各种软件井喷式发布新版本视频版:https://www.bilibili.com/video/BV19Q4y1u7Es 1、开源600Wh的UPS低压电源https://pop.fsck.pl/projects/secondlife-ups-Mk......
  • AIKit v4.11.0 – WordPress AI 自动编写器、聊天机器人、写作助手和内容重定向器 / O
    AIKitv4.11.0:WordPress的AI革命一、引言AIKitv4.11.0是一款为WordPress用户精心设计的强大插件,该插件集成了OpenAI的GPT-3技术,为用户提供了前所未有的AI写作和聊天机器人功能。此版本的推出,将WordPress的功能扩展到了全新的领域,利用人工智能技术,让网站内容创作变得更加简单......
  • 推荐给程序员的chrome扩展插件:gitzip for github下载单个GitHub仓库中的文件;json-hand
    推荐清单gitzipforgithub下载单个GitHub仓库中的文件双击文件,勾选文件前面的复选框,可以一次性选择多个文件json-handle格式化json......
  • 从0起步,vscode开发一个插件过程,付简单例子
    开发VSCode插件需要以下步骤:安装开发环境:首先,确保你的本地环境已经安装了Node.js和Git。然后,通过npm安装yo和generator-code脚手架工具。创建插件项目:使用脚手架工具快速生成项目框架。你可以通过运行以下命令来生成插件项目:npminstallyogenerator-code。配置插......
  • python网站创建014:jQuery的引入、选择器和筛选器
    1.下载jQuery之后,那如何使用呢?假如我想操作一个div标签,给这个标签补充文字<!DOCTYPEhtml><html><head><title>初识:JavaScript</title><metacharset="UTF-8"></head><body><!--定义一个无文本的div标签--><div......
  • C++ Qt开发:ProgressBar进度条组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ProgressBar进度条组件的常用方法及灵活运用。ProgressBar(进度条)是在Qt中常用的用户界面组件之一,用......