當咱們在作 SPA 應用的時候,爲了兼容老的瀏覽器(如IE9)咱們不得不放棄 HTML5 browser history api 而只能採用 hash 路由的這種形式來實現前端路由,可是由於 hash 被路由佔據了,致使原本不是問題的錨點功能卻成了一個不大不小的問題。javascript
通過我本身的搜索目前有兩種方式可以解決這個問題,爲了能在 react 生態下面簡單優雅的使用,我專門封裝了一個錨點組件 react-anchor-without-hash,它使用了相似原生 a 標籤的寫法,而且能夠支持滾動的距離和指定滾動的元素,儘量的知足業務的需求。前端
不過在介紹這個組件以前,仍是得先說一下兩種基本的解決方案。java
scrollIntoView 方法可讓當前的元素滾動到瀏覽器窗口的可視區域內。
它的使用方法以下:react
var element = document.getElementById("box");
element.scrollIntoView();
複製代碼
這個 api 兼容 IE8 及以上的瀏覽器,因此能夠放心使用。git
注:IE10 以前的 IE 瀏覽器部分支持,具體請查看Can I Use。github
另外一個方法是使用 scrollTop 這個 api,這個方法的兼容性也是比較好的,這個方法相比於 scrollIntoView
來講須要你本身定義要滾動的元素和要滾動的高度,雖然看起來麻煩一些,可是好處是自由度比較高,試想一下下面的場景:api
scrollIntoView
會變成下面這樣,A 元素顯示到整個瀏覽器視口的最上面,這樣就會和 Header 重合,被遮擋住一部分。scrollTop
去設置 content 滾動距離,好比說是 60px,最後的效果就變成了咱們想要的結果。使用方式以下:瀏覽器
const cont = document.querySelector('#container');
const a = document.querySelector('#a');
cont.scrollTop = a.offsetTop + 60;
複製代碼
以上兩種方式若是想方便的在項目裏面使用多少都須要封裝一下,並且使用起來和原生的 a 標籤形式也相差甚遠。ui
可是若是是在 react 技術棧下,咱們能夠利用組件來封裝一個相似 a 標籤的錨點,這樣在使用形式上,咱們就能更接近於原生的方式,下降使用成本。spa
因而我寫了這個 react 組件,兼容以上兩種方案,讓你可以很是簡單的實現錨點,若是使用了該組件的話,上面的實現方式就會變成下面這樣:
import Anchor from 'react-anchor-without-hash'
// ......
const anchorProps = {
type: 'scrollTop',
container: '#container',
interval: 60
}
<div id="container" style={{position: 'relative', overflow: 'scroll'}}>
<Anchor name="a" {...anchorProps}>
<div>
<h2>This is a</h2>
<div>There are some text...</div>
</div>
</Anchor>
</div>
複製代碼
這時候你只須要在頁面的地址欄輸入: http://somehost/path/#hash?_to=a
頁面就會讓 A 滾動到你想要的位置啦!
github:github.com/kwzm/react-…
demo:kwzm.github.io/react-ancho…
codesandbox: codesandbox.io/embed/react…
歡迎討論和Star!!!