黑马程序员UI教程:JS实现自定义滚动条制作步骤
- 格式:doc
- 大小:159.50 KB
- 文档页数:5
jquery.nicescroll.js是一个jquery 插件,需要jquery库的支持,它能够轻松的美化浏览器默认的滚动条,支持水平滚动条。
甚至于强大到它支持盒子、Iframe、文本区域、和文档页滚动条。
那么下面我们来看看兼容性如何:浏览器兼容:火狐4 +,Chrome 5 + Safari 4 + (win/mac),Opera 10 + IE 6+。
移动端兼容:iPad Iphone、Android 2.2 +,黑莓手机与Playbook (WebWorks/表OS)、Windows Phone 7.5 芒果和Windows Phone 8。
兼容性说完后下面我们正式的来学习如何使用吧!使用方法:它是一个jquery 的插件,您需要在代码中引用jquery库从1.5.x 以上版本。
HTML首先我们在#wrap加入一定高度的内容。
一定要出现滚动条,不然看不到效果。
接着我们引入jQuery库和nicescroll插件:jQuery调用niceScroll 滚动条插件非常简单:$('#wrap).niceScroll({cursorcolor: "#ccc",//#CCC 光标颜色cursoropacitymax: 1, //改变不透明度非常光标处于活动状态(scrollabar“可见”状态),范围从1到0touchbehavior: false, //使光标拖动滚动像在台式电脑触摸设备cursorwidth: "5px", //像素光标的宽度cursorborder: "0", // 游标边框css定义cursorborderradius: "5px",//以像素为光标边界半径autohidemode: false //是否隐藏滚动条});以上是盒子显示滚动条的方法,网页滚动条的方法也是一模一样,只需要改变选择的对象即可。
css、js实现⾃定义滚动条的两种⽅式⼀般默认的滚动条会⽐较丑,我们可以利⽤css或者js来实现实现⾃定义滚动条的功能;下⾯就整理2种实现⽅式1、css⾃定义滚动条需要在WebKit平台上才⽀持,代码如下:::-webkit-scrollbar {width: 8px;}::-webkit-scrollbar-track {box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);border-radius: 10px;}::-webkit-scrollbar-thumb {border-radius: 10px;box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);}说明 :-webkit-scrollbar 定位整个滚动条元素。
::-webkit-scrollbar-track 仅针对滚动条轨道。
::-webkit-scrollbar-thumb 瞄准滚动条拇指。
2、原⽣js⾃定义滚动条实现思路:1.外层设置⼀个div,在外层的div⾥⾯设置⼀个特别⾼的div(⾼度为外层5个div的⾼度),在⾼的div⾥⾯设置5个div,每个div的⾼度,都和⽗级的⾼度相同2.在外层div的右侧边框以⾥⾃定义⼀个滚动条,(本⼈⽤div设置样式作为滚动条)3.最外层的div添加onmousewheel事件,使⽤e.wheelDelta来获取每次滑动的距离,若为正数则向上滑动,将每次增加的数,赋给滚动条的top值,若为负数则向下互动,将每次减少的值,赋值给滚动条的top值,并对特别⾼的div作对应的上下平移处理4.注意:滚动条的⾼度需要和⾼的div的⾼度成⽐例滑动代码:<!DOCTYPE html><html><head><meta charset="UTF-8"><title>⾃定义滚轮事件</title><style type="text/css">*{padding: 0;margin: 0;}#wrap{height: 500px;width: 300px;position: relative;/*超出隐藏*/overflow: hidden;margin: 200px auto 0;border: 3px solid black;}#content{width: 300px;/*不需要设置⾼度,可被图⽚撑开*/position: absolute;left: 0;top: 0;border: 1px solid red;}#content > div{width: 294px;/*去除图⽚间的间隙*/vertical-align: top;height: 500px;border: 1px solid red;text-align: center;font-size: 100px;line-height: 500px;}#sliderWrap{height:100% ;width:16px ;background-color: greenyellow;position: absolute;right: 0;top: 0;}#slider{width: 10px;height: 50px;background-color: blue;position: absolute;left: 3px;top: 0px;border-radius: 10px;}</style></head><body><div id="wrap"><div id="content"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div></div><!--右侧滚动条部分--><div id="sliderWrap"><div id="slider"></div></div></div></body><script type="text/JavaScript">var wrapDiv = document.getElementById("wrap");var contentDiv = document.getElementById("content");var sliderWrap = document.getElementById("sliderWrap");var slider = document.getElementById("slider");//设置⽐例//clientHeight - 不包括bordervar scale = wrapDiv.clientHeight / contentDiv.clientHeight;//设置滑块的⾼度var h1 = sliderWrap.clientHeight * scale;//为了合理设置⾼度,设置滑块的最⼩⾼度if (h1 < 50) {h1 = 50;}else if (scale >= 1) {//说明当前内容能过完全显⽰在可视区域内,不需要滚动条sliderWrap.style.display = "none";}//设置滑块的⾼度slider.style.height = h1 +"px";//设置y轴的增量var y = 0;//为wrap添加滚轮事件wrapDiv.onmousewheel = function(e){var event1 = event || eif (event.wheelDelta < 0) {//滑动条向下滚动y += 10;}else if (event.wheelDelta > 0) {//滑动条向上滚动y -= 10;}//y变化时说明在滚动,此时使滚动条发⽣滚动,以及设置content内容部分滚动 //判断极端情况,滑块不能划出屏幕if (y <= 0) {//滑块最多滑到顶部y = 0;}if(y >= sliderWrap.clientHeight - slider.clientHeight){//滑块最多滑到最底部y = sliderWrap.clientHeight - slider.clientHeight;}//更新滑块的位置slider.style.top = y +"px";scale = wrapDiv.clientHeight / contentDiv.clientHeight; contentDiv.style.top = - y / scale +"px";}</script></html>。
gui滚动条的写法GUI滚动条是一种在图形用户界面中常见的控件,用于显示和控制可滚动区域的内容。
滚动条通常用于显示超出显示区域范围的内容,当内容无法全部显示在当前可见区域时,用户可以通过滚动条进行滚动浏览。
在大多数GUI框架中,滚动条的实现通常涉及以下几个方面:布局、事件处理和绘制。
在布局方面,滚动条通常被包含在一个容器控件中,如窗口、面板或滚动区域。
滚动条可以水平或垂直排列,具体取决于可滚动区域的排列方向。
滚动条的位置和尺寸通常会根据可见区域和内容的大小进行计算和设置。
事件处理是滚动条的重要部分,它与用户的交互动作密切相关。
滚动条应该能够处理用户的鼠标点击、拖动和释放事件,以及键盘上的控制命令。
通常,在移动滚动条时会触发滚动事件,应根据滚动事件的参数计算新的可见区域,并相应地更新内容的显示。
在绘制方面,滚动条通常由滑块和轨道组成。
滑块表示当前可见区域在内容中的位置,用户可以通过拖动滑块改变可见区域。
轨道则显示整个内容的范围,用户可以通过点击轨道上的位置直接跳转到相应的内容位置。
滚动条还可以有按钮,用于实现微调滚动的功能。
滑块、轨道和按钮的外观通常可以根据框架的默认样式进行自定义。
在实现滚动条时,可以参考特定GUI框架提供的相关文档和示例代码。
以下是一些常见GUI框架的滚动条实现参考:1. Java Swing:- 官方文档:Java提供了JScrollBar类实现滚动条的功能,可以参考Java的官方文档了解基本用法和示例代码。
2. Python Tkinter:- 官方文档:Tkinter是Python标准库中的GUI库,提供了Scrollbar类用于实现滚动条,可以参考官方文档中的说明和示例代码。
3. C# WinForms:- 官方文档:C# WinForms中提供了ScrollBar控件用于实现滚动条,可以参考官方文档中的使用方法和示例代码。
4. JavaScript:- MDN文档:JavaScript中可以使用原生的滚动条功能或者结合框架使用相应的组件库实现滚动条,可以参考MDN文档中的相关说明和示例。
js实现滚动条⾃动滚动本⽂实例为⼤家分享了js实现滚动条⾃动滚动的具体代码,供⼤家参考,具体内容如下效果类似于直播⽹站的评论,会⼀条接着⼀条向上 go out ;js部分很简单:通过控制scrollTop的值来实现⾃动滚动效果;很重要两点:1、scrollTop的值不可以加单位,谨记!2、⽹页缩放⽐例会影响效果实现(下⾯具体说);scrollTop需要注意的三点:1、如果这个元素没有被溢出,scrollTop为0;2、设置的scrollTop值⼩于0,则scrollTop的值为03、如果设置scrollTop的值超出了这个容器滚动的值,则scrollTop的值为容器最⼤值js部分:(function () {// 获取⽗盒⼦(肯定有滚动条)var parent = document.getElementById('parent');// 获取⼦盒⼦(⾼度肯定⽐⽗盒⼦⼤)var child1 = document.getElementById('child1');var child2 = document.getElementById('child2');// 第⼀个⼦盒⼦内容复制⼀遍给第⼆个⼦盒⼦,产⽣循环视觉,辅助作⽤// 可以注释下这条代码,看会出现什么情况child2.innerHTML = child1.innerHTML;// 设置定时器,时间即为滚动速度setInterval(function () {if(parent.scrollTop >= child1.scrollHeight) {parent.scrollTop = 0;} else {// 如果存在⽹页缩放,很有可能没有效果,但是else部分的代码会执⾏// 原因:刚才讲到的scrollTop三个注意中标黄的⼀条// 设置scrollTop的值⼩于0,即scrollTop被设为0// 可以缩放跑⼀下,然后不刷新的状态下恢复百分之百跑⼀下,再缩放,打印scrollTop的值// 你会发现正常尺⼨执⾏时打印的第⼀个值不是加法,⽽是减法,即scrollTop++增加负值// 这样的话就对应上了scrollTop的注意点了,增加的值⼩于0,就被设为0parent.scrollTop++;}}, 20);})()下⾯是完整demo,拉⾛直接看效果<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><title>autoScroll</title></head><style>.parent {width: 300px;height: 200px;margin: 0 auto;background: #242424;overflow-y: scroll;}/*设置的⼦盒⼦⾼度⼤于⽗盒⼦,产⽣溢出效果*/.child {height: auto;}.child li {height: 50px;margin: 2px 0;background: #009678;}</style><body><div id="parent" class="parent"><div id="child1" class="child"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></div><div id="child2" class="child"></div></div><script type="text/javascript">(function () {var parent = document.getElementById('parent');var child1 = document.getElementById('child1');var child2 = document.getElementById('child2');child2.innerHTML = child1.innerHTML;setInterval(function () {if(parent.scrollTop >= child1.scrollHeight) {parent.scrollTop = 0;} else {parent.scrollTop++;}}, 20);})()</script></body></html>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
js 滚动条方法
JS滚动条方法是用于控制网页中滚动条的JavaScript函数集合。
使用这些方法,您可以在网页上自定义和控制滚动条的行为,以满足您的特定需求。
以下是一些常见的JS滚动条方法:
1. scrollTop():获取或设置页面中垂直滚动条的位置。
2. scrollLeft():获取或设置页面中水平滚动条的位置。
3. scrollTo():将页面滚动到指定的位置。
4. scrollBy():将页面滚动指定的距离。
5. window.innerHeight:获取页面可见区域的高度。
6. window.innerWidth:获取页面可见区域的宽度。
7. document.documentElement.scrollHeight:获取整个文档的高度。
8. document.documentElement.scrollWidth:获取整个文档的宽度。
9. onscroll事件:在滚动条发生滚动时触发。
通过使用这些方法,您可以轻松地实现各种滚动条行为,例如滚动到特定位置、自动滚动以及在滚动时执行其他操作。
- 1 -。
JS实现的页⾯⾃定义滚动条效果本⽂实例讲述了JS实现的页⾯⾃定义滚动条效果。
分享给⼤家供⼤家参考,具体如下:这⾥演⽰⽹页上⽤的滚动条效果,是⼀个⾃定义的滚动条代码,除了上下两个箭头以外,滚动条和⼀般的浏览器基本差不多,⿏标滚轮滚动,滚动条滚动。
html结构很简单,mainBox是外层div,content是内容,滚动条div是js动态⽣成的。
运⾏效果截图如下:在线演⽰地址如下:具体代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>滚动条</title><style type="text/css">*{ margin:0; padding:0;}p{ height:1000px;}#mainBox{ width:400px; height:500px; border:1px #bbb solid; position:relative; overflow:hidden; margin:50px auto;}#content{ height:2500px; position:absolute; left:0; top:0; background:url(///file_images/article/201510/20151026113716032.jpg) }.scrollDiv{ width:18px; position:absolute; top:0; background:#666; border-radius:10px;}</style></head><body><div id="mainBox"><div id="content"></div></div><p></p><script type="text/javascript">var doc=document;var _wheelData=-1;var mainBox=doc.getElementById('mainBox');function bind(obj,type,handler){var node=typeof obj=="string"?$(obj):obj;if(node.addEventListener){node.addEventListener(type,handler,false);}else if(node.attachEvent){node.attachEvent('on'+type,handler);}else{node['on'+type]=handler;}}function mouseWheel(obj,handler){var node=typeof obj=="string"?$(obj):obj;bind(node,'mousewheel',function(event){var data=-getWheelData(event);handler(data);if(document.all){window.event.returnValue=false;}else{event.preventDefault();}});//⽕狐bind(node,'DOMMouseScroll',function(event){var data=getWheelData(event);handler(data);event.preventDefault();});function getWheelData(event){var e=event||window.event;return e.wheelDelta?e.wheelDelta:e.detail*40;}}function addScroll(){this.init.apply(this,arguments);}addScroll.prototype={init:function(mainBox,contentBox,className){var mainBox=doc.getElementById(mainBox);var contentBox=doc.getElementById(contentBox);var scrollDiv=this._createScroll(mainBox,className);this._resizeScorll(scrollDiv,mainBox,contentBox);this._tragScroll(scrollDiv,mainBox,contentBox);this._wheelChange(scrollDiv,mainBox,contentBox);this._clickScroll(scrollDiv,mainBox,contentBox);},//创建滚动条_createScroll:function(mainBox,className){var _scrollBox=doc.createElement('div')var _scroll=doc.createElement('div');var span=doc.createElement('span');_scrollBox.appendChild(_scroll);_scroll.appendChild(span);_scroll.className=className;mainBox.appendChild(_scrollBox);return _scroll;},//调整滚动条_resizeScorll:function(element,mainBox,contentBox){var p=element.parentNode;var conHeight=contentBox.offsetHeight;var _width=mainBox.clientWidth;var _height=mainBox.clientHeight;var _scrollWidth=element.offsetWidth;var _left=_width-_scrollWidth;p.style.width=_scrollWidth+"px";p.style.height=_height+"px";p.style.left=_left+"px";p.style.position="absolute";p.style.background="#ccc";contentBox.style.width=(mainBox.offsetWidth-_scrollWidth)+"px";var _scrollHeight=parseInt(_height*(_height/conHeight));if(_scrollHeight>=mainBox.clientHeight){element.parentNode.style.display="none";}element.style.height=_scrollHeight+"px";},//拖动滚动条_tragScroll:function(element,mainBox,contentBox){var mainHeight=mainBox.clientHeight;element.onmousedown=function(event){var _this=this;var _scrollTop=element.offsetTop;var e=event||window.event;var top=e.clientY;//this.onmousemove=scrollGo;document.onmousemove=scrollGo;document.onmouseup=function(event){this.onmousemove=null;}function scrollGo(event){var e=event||window.event;var _top=e.clientY;var _t=_top-top+_scrollTop;if(_t>(mainHeight-element.offsetHeight)){_t=mainHeight-element.offsetHeight;}if(_t<=0){_t=0;}element.style.top=_t+"px";contentBox.style.top=-_t*(contentBox.offsetHeight/mainBox.offsetHeight)+"px"; _wheelData=_t;}}element.onmouseover=function(){this.style.background="#444";}element.onmouseout=function(){this.style.background="#666";}},//⿏标滚轮滚动,滚动条滚动_wheelChange:function(element,mainBox,contentBox){var node=typeof mainBox=="string"?$(mainBox):mainBox;var flag=0,rate=0,wheelFlag=0;if(node){mouseWheel(node,function(data){wheelFlag+=data;if(_wheelData>=0){flag=_wheelData;element.style.top=flag+"px";wheelFlag=_wheelData*12;_wheelData=-1;}else{flag=wheelFlag/12;}if(flag<=0){flag=0;wheelFlag=0;}if(flag>=(mainBox.offsetHeight-element.offsetHeight)){flag=(mainBox.clientHeight-element.offsetHeight);wheelFlag=(mainBox.clientHeight-element.offsetHeight)*12;}element.style.top=flag+"px";contentBox.style.top=-flag*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";});}},_clickScroll:function(element,mainBox,contentBox){var p=element.parentNode;p.onclick=function(event){var e=event||window.event;var t=e.target||e.srcElement;var sTop=document.documentElement.scrollTop>0?document.documentElement.scrollTop:document.body.scrollTop; var top=mainBox.offsetTop;var _top=e.clientY+sTop-top-element.offsetHeight/2;if(_top<=0){_top=0;}if(_top>=(mainBox.clientHeight-element.offsetHeight)){_top=mainBox.clientHeight-element.offsetHeight;}if(t!=element){element.style.top=_top+"px";contentBox.style.top=-_top*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";_wheelData=_top;}}}}new addScroll('mainBox','content','scrollDiv');</script></body></html>希望本⽂所述对⼤家JavaScript程序设计有所帮助。
JS实现自动滚屏滚动效果对于一些特殊的模板,可能为了展示的更加丰富、全面会在一个页面放置很多图表、表格等内容。
由于内容过多,超出了浏览器窗口的大小导致内容展示不全的情况。
这样我们就需要用到js滚屏效果来解决,下面我们来介绍制作方法。
2. cpt的自动滚屏/滚动编辑下面我们进行如下设置。
2.1 添加加载结束事件点击菜单模板>模板web属性>分页预览设置,选择“为该模板单独设置”,添加一个“加载结束”后事件,如下图所示:js代码如下:注:使用自定义滚动条插件时(1.2版本),需要将代码中的content-container换成scrollDiv1.setTimeout(function(){2.//鼠标点击结束3.$('.content-container').click(function(){4.if(timer){5.clearInterval(timer);6.}7.})8.var h=-1;9.var timer = setInterval(function(){10.//获取当前滚动条高度11.var current = $('.content-container')[0].scrollT op;12.if(current==h){13.//滚动到底端,刷新屏幕,并返回顶端14.clearInterval(timer);15.window.location.reload();16.contentPane.$contentPane.scrollT op(0);17.}18.else19.{20.//以25ms/3.5px的速度滚动21.h=current;22.$('.content-container')[0].scrollT op=h+3.5;23.}24.},25);25.},2000)2.2 保存并预览保存模板,点击分页预览,就会出现上面的自动滚动效果。
前端开发中的自定义滚动条样式技巧前端开发中,滚动条是一个经常出现的组件。
然而,浏览器默认的滚动条样式往往单调且不够美观。
为了提升用户体验,工程师们开始探索如何自定义滚动条样式。
下面将介绍一些自定义滚动条样式的技巧。
1. 使用CSS属性`overflow`来实现滚动条的显示与隐藏。
在CSS中,我们可以将一个元素的`overflow`设置为`scroll`或`auto`来显示滚动条,或者将其设置为`hidden`来隐藏滚动条。
2. 通过使用`::-webkit-scrollbar`伪类来对滚动条进行自定义样式。
这个伪类可以针对WebKit内核浏览器(如Chrome和Safari)进行样式的设置。
例如,我们可以使用`::-webkit-scrollbar`来设置滚动条的宽度、颜色和背景。
3. 使用`::-webkit-scrollbar-track`伪类来设置滚动条的轨道样式。
通过设置这个伪类的背景色或背景图片,我们可以改变滚动条轨道的外观。
4. 通过使用`::-webkit-scrollbar-thumb`伪类来设置滚动条的滑块样式。
我们可以通过设置这个伪类的背景色或背景图片,来改变滚动条滑块的外观。
5. 使用`::-webkit-scrollbar-corner`伪类来设置滚动条的角落样式。
通过设置这个伪类的背景色或背景图片,我们可以改变滚动条角落的外观。
6. 使用`::-webkit-scrollbar-button`伪类来设置滚动条的按钮样式。
通过设置这个伪类的背景色或背景图片,我们可以改变滚动条按钮的外观。
7. 在非WebKit内核的浏览器中,我们可以使用一些JavaScript库来实现对滚动条样式的自定义。
例如,`perfect-scrollbar`是一个非常流行的用于自定义滚动条样式的轻量级库。
它通过提供一组API来改变滚动条的外观,如设置滑块颜色、宽度和高度等。
8. 在自定义滚动条样式时,我们还可以考虑一些交互设计。
js 滚动条实现原理
JavaScript中的滚动条实现原理主要依赖于HTML元素的`scroll`事件以及DOM(Document Object Model)提供的API。
1. 滚动条的HTML元素:在HTML中,滚动条通常由`<body>`或`<div>`元素提供。
当内容超出元素的可见区域时,浏览器会自动添加滚动条。
2. 滚动事件:当滚动条被拖动或内容滚动时,会触发一系列的事件。
例如,`scroll`、`scrollstart`、`scrollend`等。
这些事件可以被JavaScript捕获并
执行相应的代码。
3. DOM滚动条API:DOM提供了一些API来控制滚动条的行为。
例如,
`()`、`()`、``、``等。
这些API允许JavaScript代码直接控制页面的滚动位置。
4. 自定义滚动条:虽然浏览器通常会自动处理滚动条的显示和行为,但也可以通过CSS和JavaScript来自定义滚动条的外观和行为。
例如,可以使用
第三方库(如Perfect Scrollbar、SimpleBar等)来提供更丰富的自定义选项。
以下是一个简单的示例,演示如何使用JavaScript和DOM API来控制滚动条的滚动位置:
```javascript
// 获取body元素
var body = ;
// 设置滚动位置为距离页面顶部100px
= 100;
```
在这个例子中,``表示整个页面的内容区域,`scrollTop`属性用于设置元素的垂直滚动位置。
通过修改这个属性的值,可以控制滚动条的滚动位置。
⿊客内参⼩讲堂三步实现滚动条触动css动画效果现在很多⽹站都有这种效果,我就整理了⼀下,分享出来。
利⽤滚动条来实现动画效果,ScrollReveal.js ⽤于创建和管理元素进⼊可视区域时的动画效果,帮助你的⽹站增加吸引⼒。
只需要给元素增加 data-scroll-reveal 属性,当元素进⼊可视区域的时候会⾃动被触发设置好的动画。
这⾥有⼀个我做的⽰例⽹站。
1、引⼊⽂件<script src="js/scrollReveal.js"></script>2、html页⾯必须给元素加上 data-scroll-reveal 属性,加上之后会执⾏默认的动画效果,你也可以⾃定义改属性以显⽰不同的动画效果,如:<div data-scroll-reveal="enter left and move 50px over 1.33s">⿊客内参的博客园</div><div data-scroll-reveal="enter from the bottom after 1s">ScrollReveal</div><div data-scroll-reveal="wait 2.5s and then ease-in-out 100px">ScrollReveal</div>3、JavaScript<script>if (!(/msie [6|7|8|9]/i.test(erAgent))){(function(){window.scrollReveal = new scrollReveal({reset: true});})();};</script>data-scroll-reveal属性上⾯说了可以⾃定义 data-scroll-reveal 属性,下⾯来看看该属性的关键词和值(可选)。
前端开发实训案例制作网页滚动条样式定制在前端开发中,网页滚动条是一个常见的组件,它为用户提供了方便的页面滚动功能。
然而,浏览器默认的滚动条样式可能并不符合设计需求,因此,对滚动条样式进行个性化定制成为了前端开发的常见任务之一。
本文将介绍一种实训案例,帮助读者了解如何制作并定制网页滚动条样式。
一、准备工作在开始制作网页滚动条样式之前,我们需要准备一些基本的工作环境和素材。
首先,确保我们拥有一个文本编辑器和浏览器进行代码测试和预览。
其次,确定我们需要使用的图像资源,例如滚动条的箭头按钮和滑块等,可以通过各种设计工具进行绘制或者从免费图片库中获取。
最后,准备一个基本的HTML文件作为我们的实验平台。
二、HTML结构与CSS基本样式在HTML文件中,我们需要定义一个具有内容溢出的容器,并使用CSS样式将其设置为可以滚动。
具体步骤如下:1. 创建一个`<div>`元素,并设置一个合适的`id`作为标识符,例如`id="scroll-container"`;2. 在该`<div>`元素内添加一些文本内容,使其超过容器的高度,从而触发滚动条的显示;3. 使用CSS样式为容器设置固定的宽度和高度,例如`width: 500px; height: 300px;`;4. 通过`overflow`属性将容器设置为可以滚动,例如`overflow: auto;`。
实际代码如下所示:```html<!DOCTYPE html><html><head><title>网页滚动条样式定制</title><style>#scroll-container {width: 500px;height: 300px;overflow: auto;}</style></head><body><div id="scroll-container"><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sagittis, diam quis lobortis ultrices, lectus massa ultricies risus, nec ultrices risus dui vel erat. Mauris tincidunt, erat et molestie pulvinar, lorem odio hendrerit nulla, ut pulvinar eros purus a metus. Sed lacinia lacinia mauris, eu fringilla ipsum pulvinar at. Vivamus mi enim, mattis sed iaculis nec, finibus vehicula ligula. Duis efficitur urna et turpis efficitur, eu ultricies velit efficitur. Donec blandit nunc ac est vestibulum, id pellentesque turpis efficitur. Vivamus in urna pretium, hendrerit neque vitae, efficitur tellus. Praesent efficitur pharetra ex. Nunc sit amet nunc consectetur, feugiat sapien vestibulum, condimentum ante. Ut dapibus commodo consectetur. Aliquam luctus bibendum rutrum. Mauris eget pellentesque purus.</p></div></body></html>```三、定制滚动条样式在了解了基本的HTML结构和CSS样式之后,我们可以开始定制滚动条的样式了。
原⽣js实现⾃定义滚动条组件本⽂实例为⼤家分享了js实现⾃定义滚动条组件的具体代码,供⼤家参考,具体内容如下功能需求:1、按照数据结构创建菜单内容,显⽰在页⾯中;2、点击菜单后,显⽰对应的下级菜单内容,如果整体内容溢出,则出现滚动条;3、滚动条的⾼度要随着整体内容⾼度的改变⽽改变。
4、⿏标拖动滚动条,整体内容要随着向上滚动。
5、当⿏标滚动时,滚动条和整体内容也要相应滚动。
来看⼀下效果:默认状态:点击菜单,内容溢出后,出现滚动条;⿏标拖动滚动条,整体内容随着向上滚动:分析:这个案例中包括折叠菜单和滚动条两个组件,所以可以分开来写,然后整合到⼀起。
折叠菜单中要考虑多级菜单出现的情况,使⽤递归来做,数据的结构⼀定要统⼀,⽅便对数据进⾏处理。
滚动条的创建中,有两个⽐例等式,⼀是滚动条的⾼度/外层div⾼度=外层div⾼度/整体内容⾼度;⼆是滚动条的位置/(外层div⾼度-滚动条⾼度)=内容的scrollTop/(整体内容的⾼度-外层div⾼度)当点击折叠菜单后,需要相应地设置滚动条的⾼度。
折叠菜单是在Menu.js⽂件中,滚动条的设置是在ScrollBar.js⽂件中,需要进⾏抛发、监听事件。
监听菜单⿏标滚动的事件,当⿏标滚动时,判断滚轮⽅向,设置滚动条和内容的 top 值,也需要⽤到事件的抛发和监听。
下⾯附上代码:html结构,模拟数据,创建外层容器:<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>scrollBar</title></head><body><script type="module">import Utils from './js/Utils.js';import Menu from './js/Menu.js';import ScrollBar from './js/ScrollBar.js';var arr=[{name:"A",category:[{name:"奥迪",category:[{name:"奥迪A3",href:""},{name:"奥迪A4L",category:[{name:"奥迪A4L-1",href:""}]},{name:"奥迪Q3",href:""},{name:"奥迪Q5L",href:""},{name:"奥迪Q2L",href:""},{name:"奥迪Q7(进⼝)",href:""},{name:"奥迪Q8(进⼝)",href:""},{name:"奥迪Q7新能源",href:""},]},{name:"阿尔法-罗密欧",category:[{name:"Stelvio(进⼝)",href:""},{name:"Giulia(进⼝)",href:""},]}]},{name:"B",category:[{name:"奔驰",category:[{name:"奔驰C级",href:""},{name:"奔驰E级",href:""},{name:"奔驰GLA级",href:""},{name:"奔驰GLC级",href:""},{name:"奔驰A级",href:""},{name:"奔驰E级(进⼝)",href:""},{name:"奔驰A级(进⼝)",href:""},{name:"奔驰B级(进⼝)",href:""},{name:"威霆",href:""},{name:"奔驰V级",href:""},]},{name:"宝马",category:[{name:"宝马5系",href:""},{name:"宝马1系",href:""},{name:"宝马X1",href:""},{name:"宝马X5(进⼝)",href:""},{name:"宝马X6(进⼝)",href:""},]},{name:"本⽥",category:[{name:"竞瑞",href:""},{name:"思域",href:""},{name:"本⽥CR-V",href:""},{name:"本⽥XR-V",href:""},{name:"本⽥UR-V",href:""},{name:"艾⼒绅",href:""},{name:"享域",href:""},{name:"INSPIRE",href:""},{name:"凌派",href:""},{name:"雅阁",href:""},{name:"缤智",href:""},]},{name:"别克",category:[{name:"凯越",href:""},{name:"英朗",href:""},{name:"威朗",href:""},{name:"阅朗",href:""},{name:"君威",href:""},{name:"君越",href:""},{name:"昂科拉",href:""},{name:"昂科威",href:""},{name:"别克GL8",href:""},{name:"别克GL6",href:""},{name:"VELITE",href:""},]}]}]var container;init();function init(){createMenu(arr);createScrollBar();}function createMenu(arr){//创建菜单let menu=new Menu(arr);//创建最外层容器container=Utils.createE("div",{width:"235px",height:"360px",border:"1px solid #ccc",position:"relative",overflow:"hidden"})menu.appendTo(container);Utils.appendTo(container,"body")}function createScrollBar(){//创建滚动条let scrollBar=new ScrollBar(container);scrollBar.appendTo(container);}</script></body></html>Menu.js⽂件,根据数据创建折叠菜单内容:import Utils from './Utils.js';export default class Menu{static SET_BAR_HEIGHT="set_bar_height";static MOUSE_WHEEL_EVENT="mouse_wheel_event";constructor(_list){this.elem=this.createElem(_list);}createElem(_list){if(this.elem) return this.elem;//创建最外层ul容器let ul=Utils.createE("ul",{listStyle:"none",padding:"0px",margin:"0px",width:"235px",height:"360px",color:"#333",fontSize:"14px",userSelect: "none",position:"absolute"});//创建li列表this.createMenu(_list,ul);//ul监听点击事件ul.addEventListener("click",e=>this.clickHandler(e));//ul监听滚轮事件,⽕狐使⽤DOMMouseScroll,其它浏览器使⽤mousewheel ul.addEventListener("mousewheel",e=>this.mouseWheelHandler(e));ul.addEventListener("DOMMouseScroll",e=>this.mouseWheelHandler(e)); return ul;}appendTo(parent){Utils.appendTo(this.elem,parent);}//创建⼀级菜单createMenu(_list,parent){for(let i=0;i<_list.length;i++){let li=Utils.createE("li",{background:"#f5f5f5",borderTop:"1px solid #ddd",lineHeight:"32px",},{data:1,//控制⼀级菜单不能点击折叠})let span=Utils.createE("span",{marginLeft:"14px",fontSize:"18px"},{textContent:_list[i].name})Utils.appendTo(span,li);Utils.appendTo(li,parent);//创建⼦菜单,第三个参数控制⼦菜单是否显⽰this.createSubMenu(_list[i].category,li,0);}}//创建⼦菜单createSubMenu(_subList,_parent,_index){//如果没有⼦菜单,则跳出if(_subList.length===0) return;let subUl=Utils.createE("ul",{listStyle:"none",background:"#fff",padding:"0px",margin:"0px",fontSize:"14px",display:_index===0? "block" : "none"})for(let i=0;i<_subList.length;i++){let subLi=Utils.createE("li",{paddingLeft:"40px",position:"relative",cursor:"pointer"})if(!_subList[i].category){//如果当前菜单没有⼦菜单,则创建a标签,进⾏跳转let subA=Utils.createE("a",{color:"#333",textDecoration:"none",width:"100%",display:"inline-block"textContent:_subList[i].name,href:_subList[i].href || "javascript:void(0)",target:_subList[i].href ? "_blank" : "_self"})Utils.appendTo(subA,subLi);}else{//如果当前菜单有⼦菜单,创建span标签let subSpan=Utils.createE("span",{position:"absolute",left:"20px",top:"8px",border: "1px solid #ccc",display: "inline-block",width: "10px",height: "10px",lineHeight:"8px"},{textContent:_subList[i].category.length>0? "+" : "-"})subLi.textContent=_subList[i].name;Utils.appendTo(subSpan,subLi);}Utils.appendTo(subLi,subUl);//如果当前菜单没有⼦菜单,则跳过下⾯的执⾏if(!_subList[i].category) continue;//将当前菜单的⼦菜单作为参数,进⾏递归this.createSubMenu(_subList[i].category,subLi,1);}Utils.appendTo(subUl,_parent);}clickHandler(e){//如果当前点击的不是li标签或者span,直接跳出if(e.target.nodeName!=="LI" && e.target.nodeName!=="SPAN") return; let targ;if(e.target.nodeName==="SPAN") targ=e.target.parentElement;else targ=e.target;//如果当前点击Li下⾯没有⼦菜单,直接跳出if(targ.children.length<=1) return;//如果当前点击的是⼀级菜单,直接跳出if(targ.data===1) return;//控制当前点击的Li下的ul显⽰隐藏if(!targ.bool) stElementChild.style.display="block";else stElementChild.style.display="none";targ.bool=!targ.bool;//改变span标签的内容this.changeSpan(targ);//抛发事件,改变滚动条的⾼度var evt=new Event(Menu.SET_BAR_HEIGHT);document.dispatchEvent(evt)}changeSpan(elem){if(stElementChild.style.display==="block"){elem.firstElementChild.textContent="-";}else{elem.firstElementChild.textContent="+";}}mouseWheelHandler(e){//阻⽌事件冒泡e.stopPropagation();//⽕狐浏览器判断e.detail,e.detail<0时,表⽰滚轮往下,页⾯往上let tag=e.detail,wheelDir;//其他浏览器判断e.deltaY,e.deltaY<0时,表⽰滚轮往下,页⾯往上 if(tag===0) tag=e.deltaY;if(tag>0){//滚轮往下滚动,页⾯往上⾛wheelDir="down";}else{wheelDir="up";}//抛发事件,将滚轮⽅向传递过去let evt=new Event(Menu.MOUSE_WHEEL_EVENT);evt.wheelDirection=wheelDir;this.elem.dispatchEvent(evt);}ScrollBar.js⽂件,创建滚动条,对滚动条进⾏操作:import Utils from './Utils.js';import Menu from './Menu.js';export default class ScrollBar {bar;conHeight;menuHeight;wheelSpeed=6;barTop=0;static SET_BAR_HEIGHT="set_bar_height";constructor(parent) {this.container = parent;this.menuUl=this.container.firstElementChild;this.elem = this.createElem();//侦听菜单的点击事件,动态改变滚动条的⾼度document.addEventListener(ScrollBar.SET_BAR_HEIGHT,()=>this.setBarHeight());//ul菜单侦听滚轮事件this.menuUl.addEventListener(Menu.MOUSE_WHEEL_EVENT,e=>this.mouseWheelHandler(e)); }createElem() {if (this.elem) return this.elem;//创建滚动条的外层容器let div = Utils.createE("div", {width: "8px",height: "100%",position: "absolute",right: "0px",top: "0px",})this.createBar(div);return div;}appendTo(parent) {Utils.appendTo(this.elem,parent);}createBar(_parent) {if(this.bar) return this.bar;//创建滚动条this.bar = Utils.createE("div", {width: "100%",position: "absolute",left: "0px",top: "0px",borderRadius: "10px",backgroundColor: "rgba(255,0,0,.5)"})//设置滚动条hover状态的样式this.bar.addEventListener("mouseenter",e=>this.setMouseStateHandler(e));this.bar.addEventListener("mouseleave",e=>this.setMouseStateHandler(e));//设置滚动条的⾼度this.setBarHeight();//侦听⿏标拖动事件this.mouseHand = e => this.mouseHandler(e);this.bar.addEventListener("mousedown", this.mouseHand);Utils.appendTo(this.bar, _parent);}setBarHeight() {//外层⽗容器的⾼度this.conHeight = this.container.clientHeight;//实际内容的⾼度this.menuHeight = this.container.firstElementChild.scrollHeight;//如果实际内容的⾼度⼩于⽗容器的⾼度,滚动条隐藏if (this.conHeight >= this.menuHeight) this.bar.style.display = "none";else this.bar.style.display = "block";//计算滚动条的⾼度let h = Math.floor(this.conHeight / this.menuHeight * this.conHeight);this.bar.style.height = h + "px";}setMouseStateHandler(e){//设置滚动条hover状态的样式if(e.type==="mouseenter"){this.bar.style.backgroundColor="rgba(255,0,0,1)";}else{this.bar.style.backgroundColor="rgba(255,0,0,.5)";}}mouseHandler(e) {switch (e.type) {case "mousedown":e.preventDefault();this.y = e.offsetY;document.addEventListener("mousemove", this.mouseHand);document.addEventListener("mouseup", this.mouseHand);break;case "mousemove"://注意:getBoundingClientRect()返回的结果中,width height 都是包含border的var rect = this.container.getBoundingClientRect();this.barTop = e.clientY - rect.y - this.y;//滚动条移动this.barMove();break;case "mouseup":document.removeEventListener("mousemove", this.mouseHand);document.removeEventListener("mouseup", this.mouseHand);break;}}mouseWheelHandler(e){//滚轮事件if(e.wheelDirection==="down"){//滚动往下,菜单内容往上this.barTop+=this.wheelSpeed;}else{this.barTop-=this.wheelSpeed;}//滚动条移动this.barMove();}barMove(){if (this.barTop < 0) this.barTop = 0;if (this.barTop > this.conHeight - this.bar.offsetHeight) this.barTop = this.conHeight - this.bar.offsetHeight; this.bar.style.top = this.barTop + "px";//菜单内容滚动this.menuMove();}menuMove(){//计算内容的滚动⾼度let menuTop=this.barTop/(this.conHeight-this.bar.offsetHeight)*(this.menuHeight-this.conHeight);this.menuUl.style.top=-menuTop+"px";}}Utils.js⽂件,是⼀个⼯具包:export default class Utils{static createE(elem,style,prep){elem=document.createElement(elem);if(style) for(let prop in style) elem.style[prop]=style[prop];if(prep) for(let prop in prep) elem[prop]=prep[prop];return elem;}static appendTo(elem,parent){if (parent.constructor === String) parent = document.querySelector(parent);parent.appendChild(elem);}static randomNum(min,max){return Math.floor(Math.random*(max-min)+min);}static randomColor(alpha){alpha=alpha||Math.random().toFixed(1);if(isNaN(alpha)) alpha=1;if(alpha>1) alpha=1;if(alpha<0) alpha=0;let col="rgba(";for(let i=0;i<3;i++){col+=Utils.randomNum(0,256)+",";}col+=alpha+")";return col;}static insertCss(select,styles){if(document.styleSheets.length===0){let styleS=Utils.createE("style");Utils.appendTo(styleS,document.head);}let styleSheet=document.styleSheets[document.styleSheets.length-1];let str=select+"{";for(var prop in styles){str+=prop.replace(/[A-Z]/g,function(item){return "-"+item.toLocaleLowerCase();})+":"+styles[prop]+";";}str+="}"styleSheet.insertRule(str,styleSheet.cssRules.length);}static getIdElem(elem,obj){if(elem.id) obj[elem.id]=elem;if(elem.children.length===0) return obj;for(let i=0;i<elem.children.length;i++){Utils.getIdElem(elem.children[i],obj);}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
滚动条写法一、自定义滚动条样式1. 使用CSS样式要自定义滚动条的样式,首先需要了解浏览器对滚动条的默认样式的限制。
大多数浏览器只允许修改滚动条的宽度、高度、颜色和背景等基本样式,而不能通过简单的CSS样式来修改滚动条的形状或位置。
为了自定义滚动条的样式,我们需要使用CSS3中的伪元素和伪类来实现。
比如,要修改滚动条的颜色和背景,可以使用以下的CSS代码:```css/* 修改滚动条的颜色和背景 */::-webkit-scrollbar {width: 10px;height: 10px;}/* 修改滚动条的背景颜色 */::-webkit-scrollbar-track {background-color: #f1f1f1;}/* 修改滚动条的滑块颜色 */::-webkit-scrollbar-thumb {background-color: #888;}```这段代码将会修改滚动条的宽度和高度,以及滚动条的背景颜色和滑块的颜色。
使用其他浏览器时,可以分别使用`::-moz-scrollbar`和`::-ms-scrollbar`来实现类似的效果。
2. 使用JavaScript来实现更复杂的样式如果我们想要实现更复杂的滚动条样式,比如修改滑块的形状、添加动画效果等,就需要使用JavaScript来实现。
下面是一个使用JavaScript来实现一个复杂滚动条样式的例子:```css/* 修改滚动条的样式 */::-webkit-scrollbar-thumb {background-color: #888;border-radius: 20px; /* 将滑块改成圆角矩形 */transition: background-color 0.3s; /* 添加过渡效果 */}/* 当滚动条被悬停时修改滑块的颜色 */::-webkit-scrollbar-thumb:hover {background-color: #555;}```这段代码将会给滑块添加一个圆角矩形的样式,并在悬停时修改滑块的颜色。
使用JavaScript实现无限滚动效果随着Web应用程序的不断发展与日益普及,用户对于流畅的体验也提出了更高的要求。
其中,无限滚动效果作为一种常见的交互方式,可以让用户在页面中无需点击翻页按钮,通过滚动鼠标或触摸屏幕即可加载更多内容,提升了用户体验的同时还能提高页面的访问量。
在本文中,我们将使用JavaScript来实现这一功能。
无限滚动效果的原理其实并不复杂,主要通过监听页面的滚动事件,当滚动到页面底部时,自动加载更多内容。
下面,让我们一步一步地来实现这个功能。
首先,我们需要在页面中引入JavaScript文件。
可以通过以下方式:```html<script src="infiniteScroll.js"></script>```接下来,在JavaScript文件中,我们需要监听页面的滚动事件。
代码如下:```javascriptwindow.addEventListener('scroll', function() {var scrollHeight = document.documentElement.scrollHeight;var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;var clientHeight = document.documentElement.clientHeight;if (scrollTop + clientHeight >= scrollHeight) {// 加载更多内容的代码}});```通过上述代码,我们可以获取页面的滚动高度(scrollHeight)、滚动条距离顶部的高度(scrollTop)以及可视区域的高度(clientHeight)。
当滚动条滚动到底部时,即scrollTop + clientHeight >= scrollHeight成立,我们可以在这里编写加载更多内容的代码。
js中滚动条的方法
在JavaScript中,可以使用以下方法来操作滚动条:
1. `()`:将窗口滚动到指定的位置。
它接受两个参数,分别是水平位置和垂直位置。
```javascript
(x-coord, y-coord);
```
2. `()`:相对于当前滚动位置向下或向右滚动窗口。
它也接受两个参数,分别是水平滚动距离和垂直滚动距离。
```javascript
(x-coord, y-coord);
```
3. `()`:与`()`类似,但它接受一个对象作为参数,该对象包含`left`和`top`属性,分别表示水平位置和垂直位置。
```javascript
({left: x-coord, top: y-coord});
```
4. ``和``:这两个属性分别表示窗口的垂直滚动距离和水平滚动距离。
可以设置它们的值来滚动窗口。
```javascript
= y-coord;
= x-coord;
```
5. `()`:将指定的元素滚动到视口中。
它接受一个可选参数,该参数可以是一个对象,包含`behavior`、`block`和`inline`属性,用于控制滚动行为。
```javascript
({behavior: "smooth", block: "center", inline: "nearest"});
```
这些方法可以帮助您在JavaScript中操作滚动条,根据需要滚动窗口或元素。
javascript实现⾃定义滚动条效果在实际项⽬中,遇到上下滚动条和左右滚动条不在⼀个DIV内部,所以某些情况下,右侧滚动条不可见。
但是需要咋同⼀个视⼝内显⽰两个滚动条。
⼀个解决思路是:⾃定义滚动条,隐藏原始滚动条。
⾃定义滚动条scrollbar.jsimport React, { Component } from 'react';import PropTypes from 'prop-types';import '../css/scrollbar.css';const propTypes = {eventBus: PropTypes.object.isRequired,};class ScrollBar extends Component {constructor(props) {super(props);this.state = {isDraging: false,// X: bottom scrollbar offset left, range [0, innerWidth - 100]. When dragging, x is changingx: null,// clickX 表⽰拖动滚动条时,⿏标点击的位置距离滚动条左侧的距离, range [0, 100], When dragging, clickX isn't changingclickX: 0,};}componentDidMount() {this.unsubscribeScrollToColumn = this.props.eventBus.subscribe('set-scrollbar-left', this.setScrollBarLeft);document.addEventListener('mouseup', this.onMouseUp);}componentWillUnmount() {this.unsubscribeScrollToColumn();document.removeEventListener('mouseup', this.onMouseUp);}/*** 这个函数处理联动(界⾯滚动时,触发滚动条滚动)这⾥的100是滚动条的宽度*/setScrollBarLeft = (leftRatio) => {// when bottom scrollbar is dragging, can't set scrollBa leftif (this.state.isDraging) return;this.setState({x: (window.innerWidth - 100) * leftRatio,});}/*** 当⿏标按下,开始拖动,设置当前的位置为初始拖动的位置*/handleMouseDown = (e) => {this.setState({isDraging: true,clickX: e.nativeEvent.offsetX,});}/*** 当⿏标抬起时,停⽌拖拽,设置当前的点击位置是0(这个有没有必要设置)*/onMouseUp = () => {if (this.state.isDraging) {setTimeout(() => {this.setState({ isDraging: false, clickX: 0 });}, 100);}}/*** 当拖拽进⾏时(⿏标按下并开始移动),获取当前的位移,计算新的偏移量* 注意:可以向右滚动,可以向左滚动* 当拖拽进⾏时,应该计算出当前的⽐例,然后Grid⽔平滚动* 现在的问题,如果⿏标拖动时移动到滚动条外部,那么⽆法触发拖动* */onMouseMove = (e) => {e.persist();if (this.state.isDraging) {// 新距离 = 原始距离 + (当前滚动的距离 - 初始滚动的距离)let newX = this.state.x + e.nativeEvent.offsetX - this.state.clickX;newX = Math.min(newX, window.innerWidth - 100); // 最⼤的拖动不能超过右侧边界this.setState({ x: newX });const leftRatio = newX / (window.innerWidth - 100);}}renderBottomToolbar = () => {return (<divclassName="antiscroll-scrollbar antiscroll-scrollbar-horizontal antiscroll-scrollbar-shown" style={{transform: `translateX(${this.state.x}px)`}}draggable="true"onMouseDown={this.handleMouseDown}onMouseMove={this.onMouseMove}onMouseUp={this.onMouseUp}></div>);}// todo: rightToolbar event handlerenderRightToolbar = () => {return (<divclassName="antiscroll-scrollbar antiscroll-scrollbar-vertical antiscroll-scrollbar-shown" ></div>);}render() {return (<div id="scrollOverlay" className="antiscroll-wrap">{this.renderBottomToolbar()}{this.renderRightToolbar()}</div>);}}ScrollBar.propTypes = propTypes;export default ScrollBar;滚动条样式对应的 scrollbar.css#scrollOverlay {display: inline-block;overflow: hidden;position: fixed;left: 0;right: 0;top: 156px;bottom: 0;z-index: 4;pointer-events: none;opacity: .7;}#scrollOverlay .antiscroll-scrollbar {pointer-events: auto;z-index: 2;background-color: hsla(0,0%,0%,0.28);box-shadow: inset 0 0 0 1px hsl(0,0%,100%);border-radius: 5px;}#scrollOverlay .antiscroll-scrollbar-horizontal {height: 12px;width: 100px;position: absolute;bottom: 32px;}#scrollOverlay .antiscroll-scrollbar-vertical {width: 12px;height: 100px;position: absolute;right: 0;}/* 隐藏原始滚动对象的滚动条 */.react-demo::-webkit-scrollbar {width: 0;}滚动条具体使⽤具体使⽤,我们在 Grid 中加⼊这个滚动条import ScrollBar from '../components/scrollbar';// Grid 原⽣滚动,触发回调函数onScroll = () => {// todo: when clientWidth is smaller than innerWidth, don't show bottom scrollBarlet scrollLeftRatio = this._scrollLeft / (clientWidth - window.innerWidth);// 当原⽣DOM左右滚定时,获取当前滚动的⽐例(偏移量/全部宽度),并设置滚动条进⾏滚动this.setScrollLeftRatio(scrollLeftRatio);}setScrollLeftRatio = (scrollLeftRatio) => {this.props.eventBus.dispatch('set-scrollbar-left', scrollLeftRatio);}// 在原始滚动元素中,传⼊eventBus,便于事件传值处理// <ScrollBar eventBus={this.props.eventBus}/>⾃定义滚动条也有很多开源第三⽅组件,我们优先使⽤第三⽅库实现(处理滚动条计算考虑情况较多)以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
1.1 JS实现自定义滚动条
以上效果由html css配合JS 制作一、HTML部分
传智播客网页平面UI设计学院只花一份钱,同时掌握网页、平面、UI、WEB前端四种技能
二、CSS部分
*{
margin:0;
padding:0;
}
.box{
width: 500px;
height: 500px;
position: relative;
margin:100px auto 0;
}
#con{
top:0px;
left: 0px;
width: 460px;
padding:10px;
height: 478px;
overflow: hidden;
position: absolute;
border:1px solid #ccc;
font:normal 20px/2em '微软雅黑';
}
#txt{
top:10px;
left: 10px;
width: 460px;
position: absolute;
}
#scroll{
top:0;
right: 0;
width: 20px;
height: 500px;
position: absolute;
background: lightblue;
}
#bar{
top:0;
left:0;
width: 20px;
height: 40px;
position: absolute;
传智播客网页平面UI设计学院
background: seagreen;
}
三、JS部分
<script type="text/javascript">
// 获取需要的元素
var oCon = document.getElementById( 'con' );
var oTxt = document.getElementById( 'txt' );
var oScroll = document.getElementById( 'scroll' );
var oBar = document.getElementById( 'bar' );
// 定义全局变量
var iTopr,iTopl,iMaxR,iMaxL,iScale;
iTopr = iTopl = 0;
iMaxR = oScroll.offsetHeight - oBar.offsetHeight;
iMaxL = oTxt.offsetHeight - oCon.offsetHeight;
// 实现拖拽功能
function drag(obj,fn){
obj.onmousedown = function(ev){
var e = ev || event;
var disy = e.clientY - this.offsetTop;
obj.setCapture&&obj.setCapture();
document.onmousemove = function(ev){
var e = ev || event;
iTopr = e.clientY - disy;
if( iTopr < 0 ){
iTopr = 0;
}else if( iTopr > iMaxR ){
iTopr = iMaxR;
}
obj.style.top = iTopr+'px';
// 设置左侧内容的top
dragFn(iTopr);
}
document.onmouseup = function(){
传智播客网页平面UI设计学院只花一份钱,同时掌握网页、平面、UI、WEB前端四种技能 document.onmousemove = null;
obj.releaseCapture&&obj.releaseCapture();
}
// 取消鼠标按下复制内容的默认行为,但是IE不支持
// 所以在IE下使用全局捕获来解决。
return false;
}
}
// 实现鼠标滚轮功能
function mouseWheel(obj,fn){
// 给 input 添加滚轮事件
obj.onmousewheel = mouseFn;
// 防止在低版本IE报错,判断一下再添加
if( obj.addEventListener ){
obj.addEventListener('DOMMouseScroll',mouseFn,false);
}
// 定义一个判断滚动方向同时执行滚动操作的函数
function mouseFn(ev){
var e = ev || event;
// 定义一个判断上滚还是下滚的变量
var bFlag = true;
if( e.wheelDelta ){
bFlag = e.wheelDelta >0 ? true : false;
}else{
bFlag = e.detail <0 ? true : false;
}
// 调用功能
fn(bFlag);
// 但是 return false 不能清除通过 addEventListener 绑定的事件
// 此时需要调用相应的功能来清除
e.preventDefault&&e.preventDefault();
// 清除默认的滚动行为
return false;
传智播客网页平面UI设计学院
}
}
// 拖拽滑块时需要完成的操作定义在外部函数中function dragFn(top){
iScale = top/iMaxR;
iTopl = iMaxL*iScale;
oTxt.style.top = -iTopl+'px';
}
// 滚动滚轮时需要完成的操作定义函数function scrollFn(bFlag){
if( bFlag ){ // ↑
iTopr-=10;
}else{
iTopr+=10;
}
if( iTopr < 0 ){
iTopr = 0;
}else if( iTopr > iMaxR ){
iTopr = iMaxR;
}
iScale = iTopr/iMaxR;
iTopl = -iMaxL*iScale;
oBar.style.top = iTopr+'px';
oTxt.style.top = iTopl+'px';
}
// 调用函数
drag(oBar,dragFn);
mouseWheel( oScroll,scrollFn); mouseWheel( oCon,scrollFn );
</script>。