前記: 在工作中,如果自己發現了bug,千萬不要幻想着能夠蒙混過關,別人不會發現,一定要趕在別人發現之前,自己解決掉它!!不然的結果就是,明天上線,今天提出了這個bug,要求修復,然后自己晚上挑燈修改!!~~~~(>_<)~~~~
先說一下遇到的問題:
想要實現的效果是,在A頁面中通過在a的href鏈接(href = 'B.html#b'),鏈到B頁面的b錨點處。
在普通頁面是可以正常實現的,所謂的普通頁面指的是 頁面一次性渲染,不存在js動態加載elements,破壞DOM樹的行為。
現在的問題是,錨點b在頁面B的中間位置,在b下面有個table ,里面的元素是動態添加的,也就是說:
(1)在從A跳到B的過程中,B頁面加載html完成以后,DOM樹渲染完成,但是還未執行js腳本時,錨點已計算好了!
(錨點本來就屬於css領域,所以是先加載html 和 css頁面渲染。寫到這里又想去回顧一下頁面加載,渲染的順序到底是怎樣的了! )
(2)接下來,js阻塞式加載執行,動態添加elements,重新渲染了DOM樹結構。導致錨點發生了偏移,從而看到的頁面定位不對了,往下滾動了!
(由於不知道錨點的實現計算原理到底是怎樣,所以只能描述一下看到的現象)
目前的解決方案是:
使用js,讀取傳過來的hash值:#target,手動的滾動到目標位置;
var hash = window.location.hash;
if ( hash === '#target' )
{
window.location.hash = ''; //防止刷新時,又回到錨點處
window.scrollTo(0, 675);
}
疑慮:目前由於錨點位於頁面的中部,同時錨點的上半個部分的高度是固定的,雖然有動態填充部分,但是高度值不變,所以,可以將滾動到的高度值定死;但是如果以后頁面的上半部分有高度變化的話,滾動位置將不准確了!(就是測試環境和線上環境會略有不同,因為線上會有公共頭部,推送公告信息!)
再來剖析一下錨點的實現原理:
寫在前面的幾句話:
'無滾動則無定位';
'滾動條地目標是滾至錨點元素的頂部,與上邊緣重合'
首先介紹錨點定位的幾種常見方法:
(1)id定位 ,使用id + #id跳轉,可以實現將錨點元素綁定到任意元素上
(2)name定位 , 只能針對a標簽來定位,對其他標簽不能起到定位作用。
(3)萬能的js定位,獲取元素位置,使用scrollInToView(); //准確的說,這種方法不屬於錨點定位
關於scrollIntoView()方法,在原生DOM下好用,但是jquery不支持;
用在我這里,也會滾到目標位置的下面。
不管是上述方法中的哪種方法,當頁面(准確的說應該是父元素)的滾動條沒有或不足時,不發生任何滾動或滾動底部(盡全力了!)
由於js的萬能性,此處不予討論;以下討論錨點定位的實現:
錨點定位的本質是: 修改容器的滾動高度; 也就說父容器無滾動,則錨點定位就會失效。
錨點的應用:
1.與overflow:hidden結合,實現:無js完全用css實現選項卡輪轉切換效果 (這種效果,可以在js掛掉的時候救場,保持圖片的滾動功能)
注:overflow:hidden就是隱藏超出的部分,不出現滾動條;
css3中的:target偽類 + 錨點
URL 帶有后面跟有錨名稱 #,指向文檔內某個具體的元素。這個被鏈接的元素就是目標元素(target element)。
:target 選擇器可用於選取當前活動的目標元素,改變樣式;
如果頁面足夠高的話,會有樣式的改變 同時伴隨着 頁面的滾動。
(偽類的:target的支持情況是:IE6-8是不支持的,其余都支持!未來css強大的征兆!)
參考文章:
http://www.zhangxinxu.com/wordpress/2013/08/url-anchor-html-%E9%94%9A%E7%82%B9%E5%AE%9A%E4%BD%8D%E6%9C%BA%E5%88%B6-%E5%BA%94%E7%94%A8-%E9%97%AE%E9%A2%98/
http://bbs.blueidea.com/thread-2952396-1-1.html
http://www.zhangxinxu.com/wordpress/2010/07/%E9%94%9A%E7%82%B9%E8%B7%B3%E8%BD%AC%E5%8F%8Ajquery%E4%B8%8B%E7%9B%B8%E5%85%B3%E6%93%8D%E4%BD%9C%E4%B8%8E%E6%8F%92%E4%BB%B6/
