意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

小小小tip:避免滚动条显隐对页面其他元素的影响

来源:佚名 编辑:佚名
2024-01-09 03:58:59


点这里直接到下面看​​解决方案​​

自古以来,滚动条都是用户体验大难关,也在不断进化。一者滚动条样式在浏览器间表现不一致,从而有人提出“顶部阅读进度”方案;二者在window下,滚动条本身是占位的!这就导致了天生考虑响应式的现代页面中元素会受到影响从而“跳动”。
经常有下面的场景的发生:


小小小tip:避免滚动条显隐对页面其他元素的影响

“加载更多”页面懒加载模板页面跳转/路由跳转

共同点都是:从不足一屏到超出一屏。

淘宝网首页使用CSS把页面尺寸布局骨架搭好,再在里面吐数据。
但即使是这样,他们还是做了​​​overflow-x:hidden;​​。一方面是为了遮住横向的“白边”。另一方面也是因为:overflow一个方向设置了hidden,另一个方向会默认变为scroll!

小小小tip:避免滚动条显隐对页面其他元素的影响_javascript

新浪微博也是这样做的。甚至在某个页面直接对html标签设置了​​overflow-y: scroll;​​。

但一直如此的话,势必会提到开头的问题:丑陋的滚动条一直存在。

回到文章开头那段话:“滚动条本身是占位的”。进而我们首先要知道一个区别 ——

整体滚动(整个页面的滚动,body是不是呢?)局部滚动(某个块内的滚动)

可能这并没有什么值得注意的,因为这是笔者自己做的一个区分。毕竟对一个div设置 overflow 为 hidden 以外的值都可以说是「局部滚动」。但是你有没有想过,body也只是一个(特殊的)div…唔,或许也并不那么特殊。

笔者拿张鑫旭大神的一篇文章中的一个例子作为说明(想要详细探究的请移步原文:​​对html与body的一些研究与理解​​)

我们对body设置:

body { background-color: aqua; }

就能看到:

小小小tip:避免滚动条显隐对页面其他元素的影响_css_02

然后再设置:

html { background-color: bisque; }

小小小tip:避免滚动条显隐对页面其他元素的影响_html_03

咦?
接下来再对body元素进行操作:

body {
background-color: aqua;
margin:100px;
border:30px solid #093;
}

小小小tip:避免滚动条显隐对页面其他元素的影响_javascript_04

嗯。nice。笔者这里并没有其他意思,只是想说明:​​body​​​并不等于​​html​​ —— 而在大多数开发时间里,很多人确实会将他们混为一谈。

接下来的两步是“承上启下”的存在 ——

首先,我们对body设置一个巨大的​​height​​​值。并对 body 设置​​overflow-y: auto;​​​ 和 我们对body设置一个巨大的​​height​​值。并对 html 设置​​overflow-y: auto;​

小小小tip:避免滚动条显隐对页面其他元素的影响_overflow_05

看,他们对滚动的掌控是一样的。但是我将对html的设置称为“整体滚动”,因为在我看来,这时候是整个body的位移;而对body的设置仅仅是对内容的完全展示 —— 这说法也许不对,但确实是直观的。



如何做

知道了这一点。我们就有了一个大体的解决思路:考虑到重绘对渲染性能的影响,让滚动条影响到body的偏移比影响到具体某个子元素的排列要好得多。所以,我们的解决方案中必须要着眼于两个点:body和滚动条的Layer!

让需要处理的元素有一个单独的层级是公认的性能缓解方案。我们可以对body这么做:

html {
overflow-y: scroll;
}

:root {
overflow-y: auto;
overflow-x: hidden;
}

:root body {
position: absolute;
}

body {
width: 100vw;
overflow: hidden;
}

一方面,在html层面提前为滚动条预留位置(这样,滚动条的有无也就仅仅是展示与否了,这也是Firefox的处理策略);
另一方面,禁止body内部滚动特性,并且将body整体脱离文档流拿到一个单独的渲染层。

​:root​​​是什么?
​​​:root​​这个 CSS 伪类文档树的根元素。对于 HTML 来说,​​:root​​​表示​​<html>​​​元素,除了更高级别之外,与 html 选择器相同。
它也常被用在css自定义变量的定义上。

分析

目前来说,关于滚动条的解决方案都是要求「提前为滚动条部分预留位置」的。要么就要把滚动条从浏览器层面上脱离文档流。
之前看的张大书中的一种方法:

padding-left: calc(100vw - 100%);

也是如此。而且,考虑到响应式,这行代码需要配合​​@media​​在宽屏下作用。

所以,现在大多数网站,尤其是内容类网站,实际展示的区域都不是“贴边”的。或者干脆直接居中划出一个div —— 比如微信文章在浏览器的展示页。要么,就干脆花里胡哨的把右&下给遮过去。啧啧,也是难为了。

新方案

浏览器支持了一个新属性:​​scrollbar-gutter​​​,用来让出现滚动条时内容不跳动。但,,,支持程度很低很低。不过也算是浏览器厂商为用户体验做的又一次贡献了。​​感兴趣可以移步MDN看下​​


技术圈并不新鲜事2021年,前端技术逐步稳定。拿css来看,新属性频率越来越低、突破性属性占比很高。其中越来越偏向用户体验靠拢。Chrome仍会是响应最及时的浏览器(毕竟“用户体验”、“用户安全”这两件事在Chrome身上的变化相信很多关注的人都有感受的)


本网站发布或转载的文章均来自网络,其原创性以及文中表达的观点和判断不代表本网站。
上一篇: CSS世界Bug般的存在——字母x与“居中” 下一篇: PHP性能优化大全(php.ini)