前端开发中有一个非常常见且棘手的问题,如果页面顶部有一个固定的导航栏,比如 position 为 fixed 或 sticky 且 top: 0 的导航栏,这必然会导致用户在点击锚点或访问带有 hash 的链接时,定位到的目标被顶部导航栏遮挡。
最早之前,我使用过 JS 监听点击事件和 hash 变化,以及初次的 hash 检查,那太过于沉重 (不够轻量化) ,而监听器还会导致性能问题。
直到,我在 MDN 发现了一个 CSS 属性: scroll-padding 。
根据描述, scroll-padding 可以设置滚动内边距,并且在 MDN 中的描述为
而还有一个叫做
理论达成,也就是说只需要为 :target 设置一个
:target {
scroll-padding-top: 10vh; /* 可根据导航栏高度改变 */
}
这样之后,将会设置当前 hash 指向的 #id 的滑动内边距,或者说是从顶部向下偏移 10vh ,这样就可以避开导航栏区域正确显示内容。