bootstrap 之 affix 附加导航

1,158 阅读3分钟

手头项目需要开发一个API文档页面,怎么样的交互才是好的呢?于是迅速的在大脑中搜索了一下,嗯,何不直接使用affix效果,简单粗暴而又实用🙈

想象总是很美好,很简单的东西却让我栽了大跟头,一起来看看我的心酸历程吧!

一、查阅文档

首先,打开官网传送门,查看affix文档:
affix
看起来很简单嘛,我们直接上手。

二、用法简述

虽然是现成的类库,但是还是有很多细节,大概整理如下:
1.引入类库文件


2.添加控制区域


  
    
  

大规模部署指南 
微信摇一摇周边 
IOS SDK

3.两种激活方式
其一:向元素添加附加导航(Affix)行为,只需要向需要监听的元素添加 data-spy=”affix” 即可。


	
        
      

          

请注意这一行:

    其二:通过js为元素附加导航(Affix)行为。

    $(document).ready(function(){ 
        $("#myAffix").affix({ 
            offset: { 
                top: 25,
                bottom:250
        }); 
        });

    三、碰到问题

    文档很清晰,照着撸了一遍,结果如下图:
    bug
    左侧菜单的红条(active类)并没有切换,那么滚动是如何触发active类在菜单项中切换的呢?我们来继续寻找问题。

    四、解决问题

    查找了好些文档,大致描述都是如“用法简述”中一样,那么问题究竟出在哪里了,是什么触发了active的切换?黄天不负有心人,我找到了这样的描述:


    请留心nav类,这就是问题的所在。你需要为你的元素添加nav类,否则acitve滚动监听肯定无效。

    五、继续深究

    到这里,问题基本就解决了。我可不是那么容易就会善罢甘休的,新问题来了:那导航菜单如果包含二级菜单呢,又该如何操作?

    
        
    
    
                

    看完代码,想必我就不用多说了吧!核心思想就是嵌套,请用心体会;

    到这里你以为完了?图样,图森破!简单使用场景到这里就可以了,但是affix给我们提供了一些事件处理方法,你不想试试?细心的我已经帮你拿来了,如下:
    event
    用法简单赘述一下:

    $(document).ready(function(){
        $('#myAffix').on('affixed.bs.affix', function(){
            console.log('The navigation menu has been affixed. Now it doesn't scroll with the page.');
        });
        });

    六、修复bug

    本来要高高兴兴的去睡觉,结果来回滚动几次,发现滚动到顶部的时候,菜单的active效果丢失了。查看源码之后,发现active类返回顶部被移除了。好吧,你能移除,我就能加回来,刚学的事件方法派上用场了。

    $(document).ready(function(){
        $("#myAffix").affix({
            offset: {
                top: 25,
                bottom:250
        });
        $("#myAffix").on('affixed-top.bs.affix', function(){
            console.log('arrive to the top');
            $(this).children().first().addClass('active');
        });
        });

    加上代码,上下滚动了无数次,嗯,效果还不错~😊

    七、完美收场

    啰啰嗦嗦说了这么些,我觉得还是很有必要的,这里其实我想提供的是一种解决问题的思路。从“拿到需求-查阅文档-亲自尝试-遇到问题-查找问题-解决问题-认真反思-深入了解-解决bug”,整个过程自己觉得受益匪浅,所以分享出来,希望能够帮到遇到同样问题的你。

    参考文档:
    v3.bootcss.com/javascript/…
    tutsme-webdesign.info/bootstrap-3…
    www.tutorialrepublic.com/twitter-boo…
    stackoverflow.com/questions/2…