知识点
- $.extend 方法
- jQuery 事件命名空间
- 事件对象属性 : pageX 、 pageY
- 获得原生事件 : e.originalEvent
- 位置方法 : scrollTop、scrollLeft、scrollHeight、scrollWidth 、position
- 滚轮事件的处理 :oEv.wheelDelta 、oEv.deltail
源码地址
演示地址
js
(function(win,doc,$){
function CusScrollBar(options){
this._init(options);
}
$.extend(CusScrollBar.prototype,{
_init:function(options){
var self=this;
self.options={
scrollDir :"y",
contSelector :"",
barSelector :"",
sliderSelector :"",
wheelStep :10,
tabItemSelector:"",
tabActiveClass :"",
anchorSelector :"",
correctSelector:"",
articalSelector:"",
isAnimate :false,
speed :800,
}
$.extend(true,self.options,options || {});
self._initDomEvent();
return self;
},
_initDomEvent:function(){
var opts=this.options;
this.$cont=$(opts.contSelector);
this.$slider=$(opts.sliderSelector);
this.$bar=opts.barSelector ? $(opts.barSelector) : self.$slider.parent();
this.$doc=$(doc);
this.$tabItem=$(opts.tabItemSelector);
this.$anchor=$(opts.anchorSelector);
this.$article=$(opts.articalSelector);
this.$correct=$(opts.correctSelector);
this._initSliderDragEvent()
._bindContScroll()
._bindMouseWheel()
._initTabEvent()
.initArticleHeight();
},
_initSliderDragEvent:function(self){
var slider=this.$slider,
sliderEl=slider[0],
self=this;
if(sliderEl){
var doc=this.$doc,
dragStratPagePosition,
dragStartScrollPosition,
dragContBarRate;
function mousemoveHandler (e){
e.preventDefault;
console.log("mousemove");
if(dragStratPagePosition == null){
return;
}
var dis=e.pageY-dragStratPagePosition;
self.scrollTo(dragStartScrollPosition + dis*dragContBarRate);
}
slider.on("mousedown",function(e){
e.preventDefault();
console.log("mousedown");
dragStratPagePosition=e.pageY;
dragStartScrollPosition=self.$cont[0].scrollTop;
dragContBarRate=self.getMaxScrollPosition() / self.getMaxSliderPosition();+
doc.on("mousemove.scroll",mousemoveHandler).on("mouseup.scroll",function(e){
console.log("mouseup");
doc.off(".scroll");
});
});
}
return self;
},
_bindMouseWheel:function(){
var self=this;
self.$cont.on("mousewheel DOMMouseScroll",function(e){
console.log("mousewheel");
e.preventDefault();
var oEv=e.originalEvent,
wheelRange=oEv.wheelDelta ? -oEv.wheelDelta/120 : (oEv.deltail || 0)/3;
self.scrollTo(self.$cont[0].scrollTop + wheelRange * self.options.wheelStep);
});
return self;
},
_bindContScroll:function(){
var self=this;
self.$cont.on("scroll",function(){
var sliderEl=self.$slider[0];
if(sliderEl){
sliderEl.style.top=self.getSliderPosition() + "px";
}
});
return self;
},
_initTabEvent:function(){
var self=this;
self.$tabItem.on("click",function(e){
e.preventDefault();
var index=$(this).index();
self.changeTabSelect(index);
self.scrollTo(self.$cont[0].scrollTop +self.getAnchorPosition(index),self.options.isAnimate);
});
return self;
},
initArticleHeight:function(){
var self=this,
lastArticle=self.$article.last();
var lastArticleHeight=lastArticle.height(),
contHeight=self.$cont.height();
if(lastArticleHeight < contHeight){
self.$correct[0].style.height=contHeight -
lastArticleHeight-self.$anchor.outerHeight()+"px";
}
},
getAnchorPosition:function(index){
return this.$anchor.eq(index).position().top;
},
changeTabSelect:function(index){
var self=this,
active=self.options.tabActiveClass;
return self.$tabItem.eq(index).addClass(active)
.siblings().removeClass(active);
},
getSliderPosition:function(){
var self=this;
var maxSliderPosition=self.getMaxSliderPosition();
var disContRate=self.$cont[0].scrollTop/self.getMaxScrollPosition();
return Math.min(maxSliderPosition,maxSliderPosition * disContRate);
},
getMaxScrollPosition:function(){
var self=this;
return Math.max(self.$cont.height(),self.$cont[0].scrollHeight)-self.$cont.height();
},
getMaxSliderPosition:function(){
var self=this;
return self.$bar.height() - self.$slider.height();
},
getAllAnchorPosition:function(){
var self=this,
allPositionArr=[];
for(var i=0;i<self.$anchor.length;i++){
allPositionArr.push(self.$cont[0].scrollTop + self.getAnchorPosition(i));
}
return allPositionArr;
},
scrollTo:function(positionVal,isAnimate){
var self=this;
var posArr=self.getAllAnchorPosition();
function getIndex(positionVal){
for(var i=posArr.length-1;i>=0;i--){
if(positionVal>=posArr[i]){
return i;
}else{
continue;
}
}
}
if(posArr.length == self.$tabItem.length){
self.changeTabSelect(getIndex(positionVal));
}
if(isAnimate){
self.$cont.animate({scrollTop:positionVal+"px"},self.options.speed);
console.log("animate:"+self.options.speed);
}else{
self.$cont.scrollTop(positionVal);
console.log("no animate");
}
}
});
win.CusScrollBar=CusScrollBar;
})(window,document,jQuery);
html
<div class="scroll">
<ul class="scroll-tab">
<li class="tab-item tab-active">春天来了li>
<li class="tab-item">夏天来了li>
<li class="tab-item">秋天来了li>
<li class="tab-item">冬天来了li>
ul>
<div class="scroll-wrap">
<div class="scroll-content">
<h3 class="anchor">春天来了h3>
<p class="scroll-ol">
...
<div class="correct-bot">div>
div>
<div class="scroll-bar">
<div class="scroll-slider">div>
div>
div>
div>
<script type="text/javascript" src="js/jquery.js" >script>
<script type="text/javascript" src="js/scroll-bar.js" >script>
<script type="text/javascript">
new CusScrollBar({
contSelector :".scroll-content",
barSelector :".scroll-bar",
sliderSelector :".scroll-slider" ,
wheelStep :"10",
tabItemSelector:".tab-item",
tabActiveClass :"tab-active",
anchorSelector :".anchor",
correctSelector:".correct-bot",
articalSelector:".scroll-ol",
isAnimate :true,
speed :500
});
script>
css
.body,html{
background:#ccc;
}
.scroll{
background:#fff;
width:500px;
height:auto;
margin:50px auto;
}
.scroll-tab{
width:100%;
height:auto;
background:#f5f4f4;
}
.scroll-tab .tab-item{
display:inline-block;
line-height:25px;
text-align:center;
font-size:16px;
padding:3px 10px;
cursor:pointer;
}
.scroll-tab .tab-item.tab-active{
background:#fff;
color:lightseagreen;
border-top:2px solid lightseagreen;
margin-top:-2px;
}
.scroll-wrap{
position:relative;
width:100%;
height:300px;
}
.scroll-wrap .scroll-content{
width:90%;
height:100%;
overflow:hidden;
margin:0 auto;
}
.scroll-content .anchor{
text-align:center;
font-size:20px;
font-weight: bold;
line-height: 50px;
}
.scroll-wrap .scroll-bar{
position:absolute;
top:0px;
right:0px;
height:100%;
width:15px;
background:#e0dede;
}
.scroll-wrap .scroll-slider{
position:absolute;
height:50px;
width:100%;
background:lightseagreen;
cursor:pointer;
}