js 滑块 slider 支持PC和移动端 制作甘特图用

  1 (function () {
  2     'use strict';
  3     var demo = function (options) {
  4         //demo("options") 或者 new demo("options")都可以使用demo方法
  5         if (!(this instanceof demo)) { return new demo(options) };
  6 
  7         // 参数合并 extend方法体在下面
  8         this.options = this.extend({
  9             "minDiv": ""
 10         }, options);
 11         this.init();
 12         //初始化
 13     };
 14     //事件
 15     var ifBool = false; //判断鼠标是否按下
 16     var _currentMinDiv = null;
 17     var _currentvals = null;
 18     var _currentline = null;
 19     var start = function (e) {
 20         e.stopPropagation();
 21         ifBool = true;
 22         _currentMinDiv = this;
 23         _currentvals = this.children[0];
 24         _currentline = this.parentNode;
 25         //console.log("鼠标按下")
 26     }
 27     var move = function (e) {
 28         //console.log("鼠标拖动")
 29         if (ifBool) {
 30             if (!e.touches) {    //兼容移动端
 31                 var x = e.clientX;
 32             } else {     //兼容PC端
 33                 var x = e.touches[0].pageX;
 34             }
 35             var lineDiv_left = getPosition(_currentline).left; //长线条的横坐标
 36             var minDiv_left = x - lineDiv_left; //小方块相对于父元素(长线条)的left值
 37             var linemax = _currentline.attributes["attr_max"].nodeValue
 38             var linemin = _currentline.attributes["attr_min"].nodeValue;
 39             var maxleft = linemax / 100 * (_currentline.offsetWidth - 15);  //最大px
 40             var minleft = linemin / 100 * (_currentline.offsetWidth - 15);  //最小px
 41             if (minDiv_left > maxleft) {
 42                 minDiv_left = maxleft;
 43             }
 44             else if (minDiv_left < minleft) {
 45                 minDiv_left = minleft;
 46             }
 47             //设置拖动后小方块的left值
 48             _currentMinDiv.style.left = minDiv_left + "px";
 49             _currentvals.innerText = parseInt((minDiv_left / (_currentline.offsetWidth - 15)) * 100);
 50             //设置中间的线的颜色
 51             setColor(_currentline);
 52         }
 53     }
 54     var end = function (e) {
 55         //console.log("鼠标弹起")
 56         ifBool = false;
 57     }
 58     demo.prototype = {
 59         init: function () {
 60             this.options.minDiv.addEventListener("touchstart", start);
 61             this.options.minDiv.addEventListener("mousedown", start);
 62             var _this = this;
 63             _this.options.vals = _this.options.minDiv.children[0];
 64             _this.options.line = _this.options.minDiv.parentNode;
 65             _this.options.max = 100;
 66             _this.options.min = 0;
 67             _this.options.minDiv.parentNode.setAttribute('attr_max', 100);
 68             _this.options.minDiv.parentNode.setAttribute('attr_min', 0);
 69             _this.options.isdrop = true;
 70         },
 71         // 参数合并方法体
 72         extend: function (obj, obj2) {
 73             for (var key in obj2) {
 74                 obj[key] = obj2[key];
 75                 //    确保参数唯一
 76             }
 77             return obj
 78         },
 79         setval: function (val, optitle) {
 80             var _this = this;
 81             _this.options.vals.innerText = optitle == undefined ? val : optitle;
 82             var maxleft = _this.options.max / 100 * (_this.options.line.offsetWidth - 15);  //最大px
 83             var minleft = _this.options.min / 100 * (_this.options.line.offsetWidth - 15);  //最小px
 84             var theoryleft = val / 100 * (_this.options.line.offsetWidth - 15);   //理论px
 85             if (theoryleft > maxleft) {
 86                 theoryleft = maxleft;
 87             }
 88             else if (theoryleft < minleft) {
 89                 theoryleft = minleft;
 90             }
 91             //设置点的位置
 92             //_this.options.minDiv.style.left = val / 100 * (_this.options.line.offsetWidth - 15) + "px";
 93             _this.options.minDiv.style.left = theoryleft + "px";
 94             //设置中间线的颜色
 95             setColor(_this.options.line);
 96         },
 97         settitle: function (optitle) {
 98             var _this = this;
 99             _this.options.vals.innerText = optitle;
100         },
101         setmin: function (val) {
102             var _this = this;
103             _this.options.min = val;
104             _this.options.line.setAttribute('attr_min', val);
105         },
106         setmax: function (val) {
107             var _this = this;
108             _this.options.max = val;
109             _this.options.line.setAttribute('attr_max', val);
110         },
111         prodrop: function (isshow) {
112             if (isshow) {
113                 this.options.minDiv.addEventListener("touchstart", start);
114                 this.options.minDiv.addEventListener("mousedown", start);
115             }
116             else {
117                 this.options.minDiv.removeEventListener("touchstart", start);
118                 this.options.minDiv.removeEventListener("mousedown", start);
119             }
120         },
121         showtip: function (isshow) {
122             if (isshow) {
123                 this.options.vals.style.display = "block";
124             }
125             else {
126                 this.options.vals.style.display = "none";
127             }
128         }
129     }
130     //暴露对象
131     window.supslider = demo;
132     //拖动
133     window.addEventListener("touchmove", move);
134     window.addEventListener("mousemove", move);
135     //鼠标松开
136     window.addEventListener("touchend", end);
137     window.addEventListener("mouseup", end);
138 
139     //获取元素的绝对位置
140     function getPosition(node) {
141         var left = node.offsetLeft; //获取元素相对于其父元素的left值var left
142         var top = node.offsetTop;
143         var current = node.offsetParent; // 取得元素的offsetParent
144         // 一直循环直到根元素
145 
146         while (current != null) {
147             left += current.offsetLeft;
148             top += current.offsetTop;
149             current = current.offsetParent;
150         }
151         return {
152             "left": left,
153             "top": top
154         };
155     }
156 
157     //设置中间线的颜色
158     function setColor(line) {
159         var pointL = line.children[1].style.left != "" ? parseFloat(line.children[1].style.left.substr(0, line.children[1].style.left.indexOf("px"))) : 0;
160         var pointR = line.children[2].style.left != "" ? parseFloat(line.children[2].style.left.substr(0, line.children[2].style.left.indexOf("px"))) : 0;
161         var lineHLeft = pointL > pointR ? pointR : pointL;
162         var lineHWidth = pointL > pointR ? (pointL - pointR) : (pointR - pointL);
163         line.children[0].style.left = lineHLeft + "px";
164         line.children[0].style.width = lineHWidth + "px";
165     }
166 }());
  1 <!DOCTYPE html>
  2 <html lang="zh-cn">
  3 
  4 <head>
  5     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6     <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7     <title>鼠标拖动小方块</title>
  8     <style type="text/css">
  9         .lineDiv {
 10             position: relative;
 11             height: 3px;
 12             background: #bfbfbf;
 13             width: 300px;
 14             margin: 50px auto;
 15         }
 16 
 17             .lineDiv .minDiv {
 18                 /*position: absolute;
 19                 top: -5px;
 20                 left: 0;
 21                  15px;
 22                 height: 15px;
 23                 background: green;
 24                 cursor: pointer;*/
 25                 position: absolute;
 26                 top: -8px;
 27                 left: 0;
 28                 width: 12px;
 29                 height: 12px;
 30                 background: #ffffff;
 31                 cursor: pointer;
 32                 border-radius: 15px;
 33                 border: 3px solid rgb(0, 150, 136);
 34             }
 35 
 36                 .lineDiv .minDiv .vals {
 37                     position: absolute;
 38                     font-size: 20px;
 39                     top: -45px;
 40                     left: -10px;
 41                     width: auto;
 42                     height: 35px;
 43                     line-height: 35px;
 44                     text-align: center;
 45                     background: #ccc;
 46                 }
 47 
 48                     .lineDiv .minDiv .vals:after {
 49                         content: "";
 50                         width: 0px;
 51                         height: 0px;
 52                         border-top: 6px solid blue;
 53                         border-left: 6px solid transparent;
 54                         border-right: 6px solid transparent;
 55                         border-bottom: 6px solid transparent;
 56                         display: block;
 57                         margin-left: 11px;
 58                     }
 59 
 60         .layui-slider-tips {
 61             position: absolute;
 62             top: -42px;
 63             z-index: 66666666;
 64             white-space: nowrap;
 65             display: none;
 66             -webkit-transform: translateX(-50%);
 67             transform: translateX(-50%);
 68             color: #FFF;
 69             background: #000;
 70             border-radius: 3px;
 71             height: 25px;
 72             line-height: 25px;
 73             padding: 0 10px;
 74             left: 50%;
 75             display: block;
 76         }
 77 
 78             .layui-slider-tips:after {
 79                 content: '';
 80                 position: absolute;
 81                 bottom: -12px;
 82                 left: 50%;
 83                 margin-left: -6px;
 84                 width: 0;
 85                 height: 0;
 86                 border-width: 6px;
 87                 border-style: solid;
 88                 border-color: #000 transparent transparent;
 89             }
 90 
 91         .layui-slider-bar {
 92             background: rgb(0, 150, 136);
 93             border-radius: 3px;
 94             position: absolute;
 95             height: 100%;
 96         }
 97     </style>
 98 </head>
 99 
100 <body>
101     <center>
102         @*<h3>用鼠标拖动小方块<span id="msg">0</span>%</h3>*@
103     </center>
104     <div id="lineDiv1" class="lineDiv">
105         <div class="layui-slider-bar"></div>
106         <div id="minDiv11" class="minDiv">
107             <div class="layui-slider-tips">0</div>
108         </div>
109         <div id="minDiv12" class="minDiv">
110             <div class="layui-slider-tips">0</div>
111         </div>
112     </div>
113     <div id="lineDiv2" class="lineDiv">
114         <div class="layui-slider-bar"></div>
115         <div id="minDiv21" class="minDiv">
116             <div class="layui-slider-tips">0</div>
117         </div>
118         <div id="minDiv22" class="minDiv">
119             <div class="layui-slider-tips">0</div>
120         </div>
121     </div>
122     <div>
123         <input value="设置50" id="setvalue" onclick="setValue(50)" type="button" />
124         <input value="设置70" id="setvalue" onclick="setValue(70,'20191010')" type="button" />
125         <input value="设置最小20" id="setvalue" onclick="setMin(20)" type="button" />
126         <input value="设置最大50" id="setvalue" onclick="setMax(50)" type="button" />
127         <input value="设置tip" id="setvalue" onclick="setTitle('新tip123~~~')" type="button" />
128         <input value="开启拖拽" id="setvalue" onclick="proDrop(true)" type="button" />
129         <input value="禁止拖拽" id="setvalue" onclick="proDrop(false)" type="button" />
130         <input value="显示tip" id="setvalue" onclick="showTip(true)" type="button" />
131         <input value="隐藏tip" id="setvalue" onclick="showTip(false)" type="button" />
132     </div>
133     <script src="~/scripts/SupSlider.js"></script>
134     <script>
135         function setValue(val, title) {
136             minDiv11.setval(val, title);
137         }
138         function setMin(val) {
139             minDiv11.setmin(val);
140         }
141         function setMax(val) {
142             minDiv11.setmax(val);
143         }
144         function setTitle(val) {
145             minDiv11.settitle(val);
146         }
147         function proDrop(isshow) {
148             minDiv11.prodrop(isshow);
149             minDiv12.prodrop(isshow);
150         }
151         function showTip(isshow) {
152             minDiv11.showtip(isshow);
153             minDiv12.showtip(isshow);
154         }
155         var minDiv11;
156         var minDiv12;
157         var minDiv21;
158         var minDiv22;
159         window.onload = function () {
160             minDiv11 = supslider({ "minDiv": document.getElementById('minDiv11') });
161             minDiv12 = supslider({ "minDiv": document.getElementById('minDiv12') });
162             minDiv21 = supslider({ "minDiv": document.getElementById('minDiv21') });
163             minDiv22 = supslider({ "minDiv": document.getElementById('minDiv22') });
164         }
165     </script>
166 </body>
167 
168 </html>
原文地址:https://www.cnblogs.com/wwfjcy479/p/11819916.html