A-A+
Jquery+css实现滚动条定位效果
滚动条定位效果其实就是指定的内容定位在指定的范围之内了,这种效果我们可以通过css与javascript来实现了,下面一起来看一个Jquery+css实现滚动条定位效果制作的全过程,具体如下,这是在P项目碰到的一个功能实现,我姑且把它称为滚动条定位。
假设有一个这样的列表组件U,当我点击item7时,U会产生scrollTop值,同时U会被重新渲染。当我刷新页面时或者点击item5,scrollTop会自动变为0(点击item或刷新页面,U均会被重新渲染),而要实现的功能是刷新页面或点击当前可是范围内的其它item时,此组件仍维持当前的状态(scrollTop的值不改变),这需要维护scrollTop值,对滚动条定位。
假设index.js输出的页面的HTML结构是酱紫的:
- <div class = "box">
- <ul class='ul'>
- <li>item1</li>
- <li>item2</li>
- <li>item3</li>
- <li>item4</li>
- <li>item5</li>
- <li>item6</li>
- <li>item7</li>
- <li>item8</li>
- <li>item9</li>
- <li>item10</li>
- <li>item11</li>
- <li>item12</li>
- </ul>
- </div>
因为要维护scrollTop值,我会建立一个scroll.js:
- var scrollTop = {top:0}
- module.exports = extendObj({}, {
- setScrollTop: function(navTop){
- scrollTop = navTop;
- },
- getScrollTop: function(){
- return scrollTop;
- }
- });
当点击item而组件U都会被重新渲染,界面会跟初始化一样,这样,就要记录之前点击的item。item.js代码如下:
- var curItem = {id:0};
- module.exports = extendObj({}, {
- setItem: function(item){
- curItem = item;
- },
- getItem: function(){
- return curItem;
- }
- });
当点击item时,就会更新curItem:
- var curItem = require('./item');
- $(function(){
- $('.ul').on('click','li',function(){
- $(this).addClass('active').siblings().removeClass('active');
- curItem.setItem({id:$(this).index()});
- })
- })
当然,还要监听U组件的scroll事件,去更新scrollTop值(b.js):
- var navTop = require('./scroll.js');
- $('.ul').scroll(function(){
- var scrollTop = $(this).scrollTop();
- navTop.setScrollTop({top: scrollTop});
- });
这样,当点击在当前可视范围内的item,scrollTop值就不会变:
- $('.ul').scrollTop(navTop.getScrollTop().top);
当再次触发U组件的scroll事件时,b.js会更新scrollTop值。但是刷新页面时,所有数据都被初始化了,但在初始化页面中,能根据刷新前最后点击item的id来设置scrollTop:
- //在index.js中
- var curItemId = require('./item').getItem().id;
- var navHeight = $('.ul').height();
- $('.ul').children('li').each(function(){
- if(curItemId === $(this).index()){
- $('.ul').scrollTop($(this).position().top - navHeight);
- }
- });
这样,刷新页面后,U组件的状态仍是刷新之前的状态。需要注意的是,position()是根据最近定位的父元素计算距离的,所以U组件应该相对定位或者绝对定位:
- .box{
- margin: 100px auto;
- width: 200px;
- background-color: #f1f1f1;
- border: 0.5px solid #d3d7da;
- }
- .ul{
- height: 300px;
- margin-top: 12px;
- margin-left: -2px;
- overflow-y: auto;
- overflow-x: hidden;
- position:realtive
- }
- .ul li{
- list-style: none;
- position: relative;
- left: -40px;
- width: 184px;
- height: 32px;
- color: #323232;
- padding: 7px;
- cursor: pointer;
- padding-top: 20px;
- }
- .ul li:hover{
- border-left:2px solid #0087ee
- }
- .ul::-webkit-scrollbar{
- width: 5px;
- height: initial;
- }
- .ul::-webkit-scrollbar-track-piece{
- background-color: #f2f2f2;
- }
- .ul::-webkit-scrollbar-thumb{
- background-color: #c3ccd5;
- border-radius: 20px;
- }
- .active{
- border-left:2px solid #0087ee
- }