拖拽滑块自定义滚动条

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Title</title>
  6     <style>
  7         *{
  8             margin: 0;
  9             padding: 0;
 10         }
 11         /*禁止浏览器滚动条*/
 12         html,body{
 13             width: 100%;
 14             height: 100%;
 15             overflow: hidden;
 16         }
 17         
 18         
 19         #wrap{
 20             width: 100%;
 21             height: 100%;
 22             overflow: hidden;
 23             background: pink;
 24             position: relative;
 25         }
 26         /* 内容区内容设置 */
 27      #wrap .content{
 28             position: absolute;
 29             left:0;
 30             top:0;
 31         }
 32         
 33         /* //滑槽设置 */
 34         #wrap .scrollBar{
 35             width: 30px;
 36             height: 100%;
 37             position: absolute;
 38             right: 0;
 39             top: 0;
 40             background: skyblue;
 41             border-left: 1px solid orange;
 42             border-right: 1px solid orange;
 43         }
 44         
 45         /* //滑块设置 */
 46         #wrap .scrollBar .scrollIn{
 47             position: absolute;
 48             top:0;
 49             left:50%;
 50             transform: translateX(-50%);
 51             width: 26px;
 52             /* 不用写死滑块高度 */
 53             /*height: 100px;*/
 54             background: coral;
 55         }
 56     </style>
 57 </head>
 58 <body>
 59 <div id="wrap">
 60     <div class="content"></div>
 61     <!--自定义滚动条结构-->
 62     <!--滑槽-->
 63     <div class="scrollBar">
 64         <!--滑块-->
 65         <div class="scrollIn">
 66 
 67         </div>
 68     </div>
 69 
 70 </div>
 71 
 72 <!-- 思路;1,滑块的宽度动态设置
 73 2.内容区的滚动距离(内容的top值),往页面向上走,是负值 -->
 74 <script type="text/javascript">
 75     window.onload = function () {
 76         //    拖拽目标
 77         var box = document.querySelector('.scrollIn');
 78         var content = document.querySelector('.content'); 
 79 //        通过循环创建内容
 80         for (var i = 0; i < 800; i++) {
 81             content.innerHTML += i + '<br>';
 82         }
 83 //       动态设置滑块高度,不需要在css样式中设置
 84 //       自定义滚动条滑块的万能比例
 85 //        滑块的高度  /  滑槽的高度   =   滑槽的高度  /  内容的高度    =   滑块的滚动距离   /  内容的滚动距离
 86 
 87         // 滑槽的高度  /  内容的高度
 88         var scale = document.documentElement.clientHeight / content.offsetHeight;
 89         //滑块的高度
 90         box.style.height = document.documentElement.clientHeight * scale + 'px';
 91         box.onmousedown = function (event) {
 92             event = event || window.event;
 93             var eleY = box.offsetTop;//元素起始top
 94             var startY = event.clientY;//鼠标按下的y坐标
 95             box.setCapture && box.setCapture();//  低版本开启全局捕获兼容写法
 96             document.onmousemove = function (event) {
 97                 event = event || window.event;
 98                 var endY = event.clientY;//鼠标结束的位置Y
 99                 var disY = endY - startY;//纵向鼠标距离差
100                 var lastY = eleY + disY;//元素最终的top值
101 
102 //              滑块边界值判断
103                 if(lastY > document.documentElement.clientHeight - box.offsetHeight){
104                     lastY = document.documentElement.clientHeight - box.offsetHeight;
105                 }else if(lastY < 0){
106                     lastY = 0;
107                 }
108 //              在滑块移动的同时  还需要修改内容区域的top值
109                 box.style.top = lastY + 'px';
110 //                scale = lastY / 内容区top值(内容区滚动距离)
111 //                lastY   是当前滑块滚动的距离
112                 var contentDis = lastY / scale;
113                 //内容区往上走,滑块往下走
114                 content.style.top = -contentDis + 'px';
115             };
116             document.onmouseup = function () {
117                 document.onmousemove = document.onmouseup = null;
118                 box.releaseCapture && box.releaseCapture();//低版本浏览器 释放全局捕获
119             };
120 //      阻止浏览器默认行为
121             return false;
122         }
123     }
124 </script>
125 </body>
126 </html>

 

鼠标滑轮滚动,控制滑块拖拽(进阶版)

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Title</title>
  6     <style>
  7         *{
  8             margin: 0;
  9             padding: 0;
 10         }
 11         /*禁止浏览器滚动条*/
 12         html,body{
 13             width: 100%;
 14             height: 100%;
 15             overflow: hidden;
 16         }
 17         #wrap{
 18             width: 100%;
 19             height: 100%;
 20             overflow: hidden;
 21             background: pink;
 22             position: relative;
 23         }
 24         #wrap .content{
 25             position: absolute;
 26             left:0;
 27             top:0;
 28         }
 29         #wrap .scrollBar{
 30             width: 30px;
 31             height: 100%;
 32             position: absolute;
 33             right: 0;
 34             top: 0;
 35             background: skyblue;
 36             border-left: 1px solid orange;
 37             border-right: 1px solid orange;
 38         }
 39         #wrap .scrollBar .scrollIn{
 40             position: absolute;
 41             top:0;
 42             left:50%;
 43             transform: translateX(-50%);
 44             width: 26px;
 45             /*height: 100px;*/
 46             background: coral;
 47         }
 48     </style>
 49 </head>
 50 <body>
 51 <div id="wrap">
 52     <div class="content"></div>
 53     <!--自定义滚动条结构-->
 54     <!--滑槽-->
 55     <div class="scrollBar">
 56         <!--滑块-->
 57         <div class="scrollIn">
 58 
 59         </div>
 60     </div>
 61 
 62 </div>
 63 <script type="text/javascript">
 64     window.onload = function () {
 65         //    拖拽目标
 66         var box = document.querySelector('.scrollIn');
 67         var content = document.querySelector('.content');
 68 //        通过循环创建内容
 69         for (var i = 0; i < 200; i++) {
 70             content.innerHTML += i + '<br>';
 71         }
 72 //       动态设置滑块高度
 73 //       自定义滚动条滑块的万能比例
 74 //        滑块的高度  /  滑槽的高度   =   滑槽的高度  /  内容的高度    =   滑块的滚动距离   /  内容的滚动距离
 75         var scale = document.documentElement.clientHeight / content.offsetHeight;
 76         box.style.height = document.documentElement.clientHeight * scale + 'px';
 77         box.onmousedown = function (event) {
 78             event = event || window.event;
 79             var eleY = box.offsetTop;//元素起始top
 80             var startY = event.clientY;//鼠标按下的y坐标
 81             box.setCapture && box.setCapture();//  低版本开启全局捕获兼容写法
 82             document.onmousemove = function (event) {
 83                 event = event || window.event;
 84                 var endY = event.clientY;//鼠标结束的位置Y
 85                 var disY = endY - startY;//纵向鼠标距离差
 86                 var lastY = eleY + disY;//元素最终的top值
 87 
 88 //              滑块边界值判断
 89                 if(lastY > document.documentElement.clientHeight - box.offsetHeight){
 90                     lastY = document.documentElement.clientHeight - box.offsetHeight;
 91                 }else if(lastY < 0){
 92                     lastY = 0;
 93                 }
 94 //              在滑块移动的同时  还需要修改内容区域的top值
 95                 box.style.top = lastY + 'px';
 96 //                scale = lastY / 内容区top值(内容区滚动距离)
 97 //                lastY   是当前滑块滚动的距离
 98 //                 lastY   /  contentDis  =  scale
 99 //                  10     /     5        =   2
100                 var contentDis = lastY / scale;
101                 content.style.top = -contentDis + 'px';
102             };
103             document.onmouseup = function () {
104                 document.onmousemove = document.onmouseup = null;
105                 box.releaseCapture && box.releaseCapture();//低版本浏览器 释放全局捕获
106             };
107 //      阻止浏览器默认行为
108             return false;
109         }
110 //        滚轮逻辑

111 document.addEventListener('mousewheel',scrollMove); //谷歌,ie浏览器绑定 112 document.addEventListener('DOMMousescroll',scrollMove); //火狐浏览器绑定 113 var flag = true; 114 function scrollMove(event) { 115 // console.log('我是滚轮') 116 event = event || window.event; 117 // 判断浏览器 118 if(event.wheelDelta){ 119 // ie/chrome 120 if(event.wheelDelta > 0){ 121 // 122 flag = true; 123 }else{ 124 flag = false; 125 } 126 }else if (event.detail){ 127 // firfox 128 if(event.detail < 0){ 129 // 130 flag = true; 131 }else { 132 // 133 flag = false; 134 } 135 } 136 137 // 到这flag这个变量已经明确的帮我记录下 滚动的方向 开始不同方向的逻辑 138 // if else分支语句 在实际开发当中 使用频率还是高的 139 // if语句的结构清晰 易读 可以处理复杂的逻辑 140 // 三元表达式的使用场景 一行代码 嵌套尽量不要超过3层 不易读 性能确实会比if好一些 141 if(flag){ 142 // 滚轮向上的逻辑 143 // 滚轮往上,滑块应该从当前位置向上 内容就应该向下 144 // 滑块的位置向上 那么我的top就应该减小 145 var scrollDis = box.offsetTop -10; 146 147 //滑块对于页面顶部距离的判断 148 if(scrollDis < 0){ 149 scrollDis = 0; 150 } 151 //滑块的top 152 box.style.top = scrollDis + 'px'; 153 // 内容的偏移 154 var contentDis = scrollDis / scale; 155 //内容区的top 156 content.style.top = -contentDis + 'px'; 157 }else{ 158 // 滚轮向下的逻辑 159 // 滚轮向下,滑块应该从当前位置向下 内容就应该向上 160 // 滑块的位置向下 那么我的top就应该增加 161 var scrollDis = box.offsetTop + 10; 162 if(scrollDis > document.documentElement.clientHeight - box.offsetHeight){ 163 scrollDis = document.documentElement.clientHeight - box.offsetHeight; 164 } 165 box.style.top = scrollDis + 'px'; 166 // 内容的偏移 167 // content的top最大值为0 只要动了滚动条 就一定是负值 168 // 如果搞不定 去浏览器检查工具里边 自己玩一会 就明白了 操作一下content的top 169 var contentDis = scrollDis / scale; 170 //内容区的top 171 content.style.top = -contentDis + 'px'; 172 173 } 174 175 176 } 177 178 179 180 } 181 </script> 182 </body> 183 </html>

 

鼠标滑轮滚动,控制滑块拖拽(进阶优化版)

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Title</title>
  6     <style>
  7         *{
  8             margin: 0;
  9             padding: 0;
 10         }
 11         /*禁止浏览器滚动条*/
 12         html,body{
 13             width: 100%;
 14             height: 100%;
 15             overflow: hidden;
 16         }
 17         #wrap{
 18             width: 100%;
 19             height: 100%;
 20             overflow: hidden;
 21             background: pink;
 22             position: relative;
 23         }
 24         #wrap .content{
 25             position: absolute;
 26             left:0;
 27             top:0;
 28         }
 29         #wrap .scrollBar{
 30             width: 30px;
 31             height: 100%;
 32             position: absolute;
 33             right: 0;
 34             top: 0;
 35             background: skyblue;
 36             border-left: 1px solid orange;
 37             border-right: 1px solid orange;
 38         }
 39         #wrap .scrollBar .scrollIn{
 40             position: absolute;
 41             top:0;
 42             left:50%;
 43             transform: translateX(-50%);
 44             width: 26px;
 45             /*height: 100px;*/
 46             background: coral;
 47         }
 48     </style>
 49 </head>
 50 <body>
 51 <div id="wrap">
 52     <div class="content"></div>
 53     <!--自定义滚动条结构-->
 54     <!--滑槽-->
 55     <div class="scrollBar">
 56         <!--滑块-->
 57         <div class="scrollIn">
 58 
 59         </div>
 60     </div>
 61 
 62 </div>
 63 <script type="text/javascript">
 64     window.onload = function () {
 65         //    拖拽目标
 66         var box = document.querySelector('.scrollIn');
 67         var content = document.querySelector('.content');
 68 //        通过循环创建内容
 69         for (var i = 0; i < 200; i++) {
 70             content.innerHTML += i + '<br>';
 71         }
 72 //       动态设置滑块高度
 73 //       自定义滚动条滑块的万能比例
 74 //        滑块的高度  /  滑槽的高度   =   滑槽的高度  /  内容的高度    =   滑块的滚动距离   /  内容的滚动距离
 75         var scale = document.documentElement.clientHeight / content.offsetHeight;
 76         box.style.height = document.documentElement.clientHeight * scale + 'px';
 77         box.onmousedown = function (event) {
 78             event = event || window.event;
 79             var eleY = box.offsetTop;//元素起始top
 80             var startY = event.clientY;//鼠标按下的y坐标
 81             box.setCapture && box.setCapture();//  低版本开启全局捕获兼容写法
 82             document.onmousemove = function (event) {
 83                 event = event || window.event;
 84                 var endY = event.clientY;//鼠标结束的位置Y
 85                 var disY = endY - startY;//纵向鼠标距离差
 86                 var lastY = eleY + disY;//元素最终的top值
 87 
 88 //              滑块边界值判断
 89                 if(lastY > document.documentElement.clientHeight - box.offsetHeight){
 90                     lastY = document.documentElement.clientHeight - box.offsetHeight;
 91                 }else if(lastY < 0){
 92                     lastY = 0;
 93                 }
 94 //              在滑块移动的同时  还需要修改内容区域的top值
 95                 box.style.top = lastY + 'px';
 96 //                scale = lastY / 内容区top值(内容区滚动距离)
 97 //                lastY   是当前滑块滚动的距离
 98 //                 lastY   /  contentDis  =  scale
 99 //                  10     /     5        =   2
100                 var contentDis = lastY / scale;
101                 content.style.top = -contentDis + 'px';
102             };
103             document.onmouseup = function () {
104                 document.onmousemove = document.onmouseup = null;
105                 box.releaseCapture && box.releaseCapture();//低版本浏览器 释放全局捕获
106             };
107 //      阻止浏览器默认行为
108             return false;
109         }
110 //        滚轮逻辑
111         document.addEventListener('mousewheel',scrollMove);
112         document.addEventListener('DOMMousescroll',scrollMove);
113         var speed = 0;
114         function scrollMove(event) {
115 //          console.log('我是滚轮')
116             event = event || window.event;
117 //            判断浏览器
118             if(event.wheelDelta){
119 //              ie/chrome
120                 if(event.wheelDelta > 0){
121 //
122                     speed = -10;
123                 }else{
124                     speed = 10;
125                 }
126             }else if (event.detail){
127 //                firfox
128                 if(event.detail < 0){
129 //
130                     speed = -10;
131                 }else {
132 //
133                     speed = 10;
134                 }
135             }
136 
137             var scrollDis = box.offsetTop + speed;
138             if(scrollDis > document.documentElement.clientHeight - box.offsetHeight){
139                 scrollDis = document.documentElement.clientHeight - box.offsetHeight;
140             }else if(scrollDis < 0){
141                 scrollDis = 0;
142             }
143             box.style.top = scrollDis + 'px';
144             var contentDis = scrollDis / scale;
145             content.style.top = -contentDis + 'px';
146         }
147 
148     }
149 </script>
150 </body>
151 </html>

 

posted @ 2020-05-14 17:26  全情海洋  阅读(764)  评论(0编辑  收藏  举报