css中錨點剖析 & 血淚教訓


前記: 在工作中,如果自己發現了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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM