自定义滚动条组件封装
HTML部分
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="css/reset.css"/>
<link rel="stylesheet" type="text/css" href="css/index.css"/>
</head>
<body>
<!--自定义滚动条最外层容器-->
<div class="slider-con">
<!--tab容器-->
<ul class="tab-con">
<li class="tab-item active">春天的故事</li>
<li class="tab-item">夏天的故事</li>
<li class="tab-item">秋天的故事</li>
<li class="tab-item">冬天的故事</li>
</ul>
<!--滚动条内容区-->
<div class="slider-text-con">
<div class="slider-text">
<!--春天的故事-->
<div class="spring-story story">
<h3 class="title">春天的故事</h3>
<p class="context">
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
</p>
</div>
<!--夏天的故事-->
<div class="summy-story story">
<h3 class="title">夏天的故事</h3>
<p class="context">
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
</p>
</div>
<!--秋天的故事-->
<div class="qiut-story story">
<h3 class="title">秋天的故事</h3>
<p class="context">
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
</p>
</div>
<!--冬天的故事-->
<div class="win-story story">
<h3 class="title">冬天的故事</h3>
<p class="context">
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
地方海事局和地方了萨芬的拉萨
发货的老师发来的沙发里打开撒
分行贷款来撒会反馈到拉萨发了
多少开发大咖浪费好多啦大萨达
范德萨范德萨发生发生法萨芬的
范德萨范德萨发撒范德萨发生法
废物废物个人感情啊服务器发送
</p>
</div>
</div>
<!--滚动条槽-->
<div class="slider-bar">
<!--滚动条滑块-->
<div class="slider"></div>
</div>
</div>
</div>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script src="js/index.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
</script>
</body>
</html>
-------------------------------------------------------------------------------------------------end
JS逻辑部分
//(function(win,doc,$){
$(function(){
//定义滑块类
function slider( options ){
this._init( options )
};
$.extend(slider.prototype, {
_init:function( options ){
//设置初始配置参数
this.options = {
//滚动的方向 y x
origin:"y",
//滚动条
sliderBarEle:'',
//滚动内容区
sliderContEle:'',
//滚动滑块
sliderEle:'',
//鼠标滑轮滚动一格定义的距离
wheelStep:20,
};
//如果有传参就合并
this.options = options?$.extend(true,this.options,options):this.options
//定义各事件
this._bindEvent();
},
/*
* 获取个节点
*/
_fgetElement:function(){
//tab item
this.$tabItem = $(".tab-item");
//滚动内容区
this.$sliderText = $(".slider-text");
//每篇故事
this.$story = $(".story");
//滚动条
this.$sliderBar = $(".slider-bar");
//滑块
this.$slider = $(".slider");
this.$doc = $(document);
},
/*
* 绑定各事件
*/
_bindEvent:function(){
//获取元素
this._fgetElement();
//获取初始化数据
this._fgetData();
//鼠标事件--
this._fmouseEvent();
//点击切换tab
this._fchangeTab();
//鼠标滚轮事件
this._fmouseWheelEvent();
},
/*
* 获取各元素高度等数据
*/
_fgetData:function(){
//获取内容区可见高度
this.textCanSeeHight = this.$sliderText.height();
//获取内容完整高度
this.textAllHeight = this.$sliderText[0].scrollHeight;
//获取滚动条高度
this.sliderBarHight = this.$sliderBar.height();
//获取滑块高度
this.sliderHeight = this.$slider.height();
//滑块可移动距离
this.sliderCanMoveHeight = this.sliderBarHight - this.sliderHeight;
//内容可移动距离
this.textCanMoveHeight = Math.max(this.textAllHeight,this.textCanSeeHight) - this.textCanSeeHight;//防止出现负数情况
//获取比率
this.rate =this.textCanMoveHeight/this.sliderCanMoveHeight;//内容可移动的距离除以滑块可移动的距离
this.textPlaceArr = this._fgetTextPlace();
},
/*
* 定义鼠标事件
*/
_fmouseEvent:function(){
// var _this = this;
// var isDown = true;
// //绑定鼠标点下事件
// this.$doc.on("mousedown",function(e){
// e.preventDefault();
// var startY = e.pageY;
// if( isDown ){
// $(this).on("mousemove",function(e){
// var endY = e.pageY;
// var ranges = endY - startY;
//
// var canUseRange = _this._filter( ranges );
//
//
// _this.$slider[0].style.top = canUseRange + "px";
//
// _this._fscrollTo( canUseRange/_this.rate );
// var ids = _this._fselectTab( canUseRange/_this.rate );
// _this.$tabItem.eq(ids).addClass("active").siblings().removeClass("active");
//
// });
// }else{
// $(this).off("mousemove")
// }
//
// $(this).on("mouseout",function(e){
// isDown = false;
// })
// })
var slider = this.$slider,
_this = this,
sliderDom = slider[0];//注意 只有dom节点元素才能用if来判断是否存在 jq对象不行
if( sliderDom ){
//定义初始化位置数据
var doc = this.$doc,
startY,//光标相对于文档的初始Y值
contentScrollTop;//获取内容容器相对于边界超出的初始距离
function mouseMove(e){//定义滑块移动时逻辑处理
e.preventDefault();
var ranges = e.pageY - startY;
if( contentInitScrollTop == null ){//容错处理
return;
}
_this.$slider[0].style.top = _this._filter( ranges ) + "px";
_this._fscrollTo( contentInitScrollTop + ranges*_this.rate )//初始距离加上移动后的距离
};
//滑块按下鼠标事件
slider.on("mousedown",function( e ){
e.preventDefault();
startY = e.pageY;//记录鼠标初始位置
contentInitScrollTop = _this.$sliderText[0].scrollTop;//记录内容初始溢出距离
//添加鼠标移动事件、将其挂载在doc上 以便当鼠标移出滑块后还能继续拖动
doc.on("mousemove.sliderMove",mouseMove).on("mouseup",function(){
$(this).off(".sliderMove")
})
})
}
},
/*
* 鼠标滚轮事件
*/
_fmouseWheelEvent:function(){
var _this = this;
_this.$sliderText.on("mousewheel DoMMouseScroll",function(e){
e.preventDefault();
var oEv = e.originalEvent,
//获取鼠标滚轮的滚动次数 火狐浏览器是detail 正数表示向上 且值为3的倍数 其他浏览器为wheelDelta 负数为向上 且为120的倍数
whellRange = oEv.wheelDelta ? - oEv.wheelDelta/120 :(oEv.detail || 0)/3,
//内容滚动的距离
conTextRange = _this.$sliderText[0].scrollTop +_this.options.wheelStep*whellRange;
//同步滑块的距离
_this.$slider[0].style.top = _this._filter( conTextRange/_this.rate ) + "px";
_this._fscrollTo(conTextRange)//累计叠加
})
},
/*
* tab切换逻辑
*/
_fchangeTab:function(){
var _this = this;
this.$tabItem.on("click",function(){
//记录点击的item下标
_this.selectId = $(this).index();
//给选中的tab添加选中样式
$(this).addClass("active").siblings().removeClass("active");
_this._fscrollTo( _this.textPlaceArr[_this.selectId] )
})
},
/*
* _fselectTab 拖动后高亮对应的tab item
*/
_fselectTab:function( range ){
for( var i = this.textPlaceArr.length-1;i >=0; i-- ){
if ( range>=this.textPlaceArr[i] ){
return i;
}
}
},
/*
* 获取文章节点的top值 并保存在数组中
*/
_fgetTextPlace:function(){
var arr = [];
for( var i = 0;i < this.$story.length; i++ ){
arr.push(this.$story.eq(i).position().top)
}
return arr
},
/*
* 改变文章容器的scrollTop值
*/
_fscrollTo:function( param ){
this.$sliderText.scrollTop( param )//设置内容容器溢出上边界距离
},
/*
* 限制滑块滑动的距离在合法范围内
*/
_filter:function( range ){
if( range<0 ){
range = 0;
}else if( range>this.sliderCanMoveHeight ){
range = this.sliderCanMoveHeight
}
return range;
}
});
new slider({
//滚动内容区
sliderContEle:'haha'
});
})
//(window,document,jQuery))
自定义滚动条组件封装相关推荐
- vuejs滚动条_Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
前言 前段时间有给大家分享一个vue桌面端弹框组件,今天再分享最近开发的一个vue pc端自定义滚动条组件. vscroll 一款基于vue2.x开发的网页端轻量级超小巧自定义美化滚动条组件.支持是否 ...
- svelte-scrollbar: 基于svelte.js自定义滚动条组件|svelte3虚拟滚动条
基于svelte3.x构建轻量级自定义pc端虚拟滚动条组件SvelteScrollbar.支持原生滚动条.自动隐藏.垂直+水平滚动.自定义尺寸/颜色及间隔等功能. 在lib目录下新建Scrollbar ...
- 微信小程序自定义标签组件component封装、组件生命周期,组件通信
微信小程序自定义标签组件component封装.组件生命周期,组件通信 本文来说下小程序的自定义标签组件封装. 相比于vue,react的非路由组件,微信小程序的component组件要麻烦些,而且生 ...
- vue 滚动条_轻量级 React.js 虚拟美化滚动条组件RScroll
前几天有给大家分享一个Vue自定义滚动条组件VScroll.今天再分享一个最新开发的React PC端模拟滚动条组件RScroll. vue+pc桌面端模拟滚动条组件VScroll rscroll 一 ...
- js 隐藏滚动条_轻量级 React.js 虚拟美化滚动条组件RScroll
前几天有给大家分享一个Vue自定义滚动条组件VScroll.今天再分享一个最新开发的React PC端模拟滚动条组件RScroll. vue+pc桌面端模拟滚动条组件VScroll rscroll 一 ...
- 滚动条组件 http://www.w3cfuns.com/notes/15098/96195b77bdbcb601590f67f971770bb8.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- H5移动端开发基础(三)自定义滚动条、实战-音悦台
自定义滚动条.实战-音悦台 自定义滚动条 js封装 transform.js tween.js scrollBar.js 音悦台 适配 样式 html js 自定义滚动条 *{margin: 0;pa ...
- html任务3 模拟滚动条,vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件...
/** * @Desc Vue3.0虚拟滚动条组件V3Scroll * @Time andy by 2021-01 * @About Q:282310962 wx:xy190310*/ props: ...
- php 小程序自定义图,微信小程序之如何使用自定义组件封装原生 image 组件
零.问题的由来 一般在前端展示图片时都会碰到这两个常见的需求: 图片未加载完成时先展示占位图,等到图片加载完毕后再展示实际的图片. 假如图片链接有问题(比如 404),依然展示占位图.甚至你还可以增加 ...
最新文章
- 未来网络发展的趋势——IPv6详细讲解与基本配置
- fp5139应用电路图_四款l6599d经典应用电路图详解
- Android 在 NDK 层使用 OpenSSL 进行 RSA 加密
- python - hash类型操作
- http error
- (转)gLFlush()和gLFinish()
- gdb调试多进程和多线程命令
- 对于不是特别擅长Photoshop的人来说,熟悉和运用Photoshop工具提供的各类便捷的快捷键,是有帮助的。...
- mysql weblogic_weblogic连mysql的问题
- Windows新建一个新的磁盘空间:
- linux下安装xz命令
- JavaScript Module Pattern
- PDF417数据容量
- 思科模拟器路由表怎么看_实战思科 Cisco 模拟器 Packet tracer 使用教程详解.pdf
- Java短信平台实战第一天
- iMX6ULL上手体验
- 虚拟机xfs文件系统因根分区爆满损坏修复
- Nlp预处理方法(BPE Byte pair encoding、Normalization、Lemmatisation、Stemming…)
- Oracle中打印99乘法表的13种方法
- Geode中使用PDX序列化最佳实践