因此,您的页面由各个部分组成,每个部分都有一个唯一的ID或锚点,您希望在滚动时使用当前部分的ID /锚点更新浏览器的URL。
PS我不是在问一个问题,而是分享一个食谱。所有相关的代码示例和演示都在答案中,所以请不要投票反对这个问题。
答案 0 :(得分:2)
Skrollr可以实现这一点!但是你需要帮助他。
首先,创建一个包含页面部分链接的菜单: >
<nav><ul>
<li><a href='#home'>Home</a></li>
<li><a href='#about'>About</a></li>
<li><a href='#goods'>Goods</a></li>
<li><a href='#services'>Services</a></li>
</ul></nav>
使用Skrollr <li>
将每个data-anchor-target
绑定到相应的网页部分(有关信息,请阅读this)。然后添加一些Skrollr过渡:
<li
data-anchor-target="#about"
data--200-center-bottom="opacity: 0.2;"
data--200-center-top="opacity: 1;"
data-200-center-bottom="opacity: 1;"
data-200-center-top="opacity: 0.2;"
>
从现在开始,Skrollr会将skrollable-between
类名应用于那些<li>
元素,其相应的页面部分当前在页面上可见。而且我们会利用这个功能! :d
初始化Skrollr时,您可以为render
参数指定回调。滚动期间将触发此回调。在该回调中,您需要:
skrollable-between
类名的人)。href
属性的值。请注意,Skrollr劫持了在页面加载时将页面滚动到当前项目的vanilla浏览器行为。所以我们必须解决这个问题。更糟糕的是,Skrollr在页面加载时多次执行render
回调,将浏览器的URL哈希值重置为第一页面部分的哈希值。要解决此问题:
click
method插件的skrollr-menu。计时器方法有点难看。如果您有更好的想法,请发表评论here。
您必须解决的另一个问题是Skrollr在滚动期间每秒执行render
次回调数百次。你绝对不希望你的回调运行那么多:这完全没必要,并且会降低浏览器的速度。
所以你需要限制你的回调。如果您碰巧在项目中使用标准库扩展插件,例如Lo-Dash,请使用它的throttle方法。如果你没有,你可以使用微小的jquery.timer-tools插件。
这是一个包含以上所有内容的演示,用舒适的CoffeeScript编写: