IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    项目总结(一):滚动条定位

    dwqs发表于 2015-08-28 08:49:05
    love 0

    这是在P项目碰到的一个功能实现,我姑且把它称为滚动条定位。

    假设有一个这样的列表组件U,当我点击item7时,U会产生scrollTop值,同时U会被重新渲染。当我刷新页面时或者点击item5,scrollTop会自动变为0(点击item或刷新页面,U均会被重新渲染),而要实现的功能是刷新页面或点击当前可是范围内的其它item时,此组件仍维持当前的状态(scrollTop的值不改变),这需要维护scrollTop值,对滚动条定位。

    假设index.js输出的页面的HTML结构是酱紫的:

    1. <div class = "box">
    2. <ul class='ul'>
    3. <li>item1</li>
    4. <li>item2</li>
    5. <li>item3</li>
    6. <li>item4</li>
    7. <li>item5</li>
    8. <li>item6</li>
    9. <li>item7</li>
    10. <li>item8</li>
    11. <li>item9</li>
    12. <li>item10</li>
    13. <li>item11</li>
    14. <li>item12</li>
    15. </ul>
    16. </div>

    因为要维护scrollTop值,我会建立一个scroll.js:

    1. var scrollTop = {top:0}
    2. module.exports = extendObj({}, {
    3. setScrollTop: function(navTop){
    4. scrollTop = navTop;
    5. },
    6. getScrollTop: function(){
    7. return scrollTop;
    8. }
    9. });

    当点击item而组件U都会被重新渲染,界面会跟初始化一样:

    这样,就要记录之前点击的item。item.js代码如下:

    1. var curItem = {id:0};
    2. module.exports = extendObj({}, {
    3. setItem: function(item){
    4. curItem = item;
    5. },
    6. getItem: function(){
    7. return curItem;
    8. }
    9. });

    当点击item时,就会更新curItem:

    1. var curItem = require('./item');
    2. $(function(){
    3. $('.ul').on('click','li',function(){
    4. $(this).addClass('active').siblings().removeClass('active');
    5. curItem.setItem({id:$(this).index()});
    6. })
    7. })

    当然,还要监听U组件的scroll事件,去更新scrollTop值(b.js):

    1. var navTop = require('./scroll.js');
    2. $('.ul').scroll(function(){
    3. var scrollTop = $(this).scrollTop();
    4. navTop.setScrollTop({top: scrollTop});
    5. });

    这样,当点击在当前可视范围内的item,scrollTop值就不会变:

    1. $('.ul').scrollTop(navTop.getScrollTop().top);

    当再次触发U组件的scroll事件时,b.js会更新scrollTop值。但是刷新页面时,所有数据都被初始化了,但在初始化页面中,能根据刷新前最后点击item的id来设置scrollTop:

    1. //在index.js中
    2. var curItemId = require('./item').getItem().id;
    3. var navHeight = $('.ul').height();
    4. $('.ul').children('li').each(function(){
    5. if(curItemId === $(this).index()){
    6. $('.ul').scrollTop($(this).position().top - navHeight);
    7. }
    8. });

    这样,刷新页面后,U组件的状态仍是刷新之前的状态。需要注意的是,position()是根据最近定位的父元素计算距离的,所以U组件应该相对定位或者绝对定位:

    1. .box{
    2. margin: 100px auto;
    3. width: 200px;
    4. background-color: #f1f1f1;
    5. border: 0.5px solid #d3d7da;
    6. }
    7. .ul{
    8. height: 300px;
    9. margin-top: 12px;
    10. margin-left: -2px;
    11. overflow-y: auto;
    12. overflow-x: hidden;
    13. position:realtive
    14. }
    15. .ul li{
    16. list-style: none;
    17. position: relative;
    18. left: -40px;
    19. width: 184px;
    20. height: 32px;
    21. color: #323232;
    22. padding: 7px;
    23. cursor: pointer;
    24. padding-top: 20px;
    25. }
    26. .ul li:hover{
    27. border-left:2px solid #0087ee
    28. }
    29. .ul::-webkit-scrollbar{
    30. width: 5px;
    31. height: initial;
    32. }
    33. .ul::-webkit-scrollbar-track-piece{
    34. background-color: #f2f2f2;
    35. }
    36. .ul::-webkit-scrollbar-thumb{
    37. background-color: #c3ccd5;
    38. border-radius: 20px;
    39. }
    40. .active{
    41. border-left:2px solid #0087ee
    42. }
    淡忘~浅思猜你喜欢

    JQuery总结二:DOM遍历和事件处理

    JQuery总结三:DOM完全操作和动画

    JQuery总结四:Ajax和延迟对象

    jQuery实现上传进度条效果

    JQuery总结一:选择器归纳
    无觅

    转载请注明:淡忘~浅思 » 项目总结(一):滚动条定位



沪ICP备19023445号-2号
友情链接