Affix是BootStrap中的一个很有用的控件,他能够监视浏览器的滚动条的位置并让你的导航始终都在页面的可视区域。一开始的时候,导航在页面中是普通的流式布局,占有文档中固定的位置,当页面滚动的时候,导航就自动变成了固定布局(fixed),始终处于用户的视区,下面来说说他的用法。首先来看看他的实现原理。它是通过实时修改页面元素的class属性来实现的
-
当滚动条滚动以至于导航快要到页面顶部的时候这时候在元素的class中会将affix-top变为affix
以上过程完全有控件自己实现,无须我们干预,我们只需要写好这些状态的css就可以了
如我们可以设置
.affix-top { top:150px; } .affix { top:20px;//通常用bootstrap构建的网站头部都有个导航条 } .affix-bottom { …… }
下面我们看看它的使用方法
1、通过data属性
你只需为需要监听的页面元素添加data-spy="affix"即可。然后使用偏移量来确定一个元素的开和关.
关键代码
<ul class="nav nav-tabs nav-stacked affix" data-spy="affix" data-offset-top="190"> <li class="active"><a href="#one">Tutorial One</a></li> <li><a href="#two">Tutorial Two</a></li> <li><a href="#three">Tutorial Three</a></li> </ul>
其中data-offset-top为处于affix-top状态元素距离页面顶端的位置。当滚动到页面顶端的使用我们可以设置".affix"的样式来重新设置其"top"值。
2、通过javascript调用
示例代码如下:
$('#myNav').affix({ offset: { top: 100,//滚动中距离页面顶端的位置 bottom: function () {//滚动完成时距离页面底部的位置 return (this.bottom = $('.bs-footer').outerHeight(true)) } } })
<ul class="nav nav-tabs nav-stacked affix" id="myNav"> <li class="active"><a href="#one">Tutorial One</a></li> <li><a href="#two">Tutorial Two</a></li> <li><a href="#three">Tutorial Three</a></li> </ul> …… <div class="bs-footer"> </div>
以上似乎已经介绍完了bootstrap中affix的使用,但是在实际使用的过程中我们会发现,当拖动滚动条的时候使用了affix的页面元素的宽度会发生变化,从而导致页面布局的杂乱,所以我们在定义affix的css中最好写死它的宽度如:
.affix{ width:250px; }
这样在视窗足够大的时候是没有任何问题的,但是当拖动改变视窗的大小后会发现布局又变乱了,这个问题困扰了我许久,最后通过分析bootcss的源码我发现该网站在所有使用affix的元素的class中都添加了"hidden-print" "hidden-xs" "hidden-sm"这些属性,用于当屏幕不是符合要求的情况下可以隐藏affix,虽然影响了易用性,但是保证了布局无论在哪种情况下都是整齐的。