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

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

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

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

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

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

新浪

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

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

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

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

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

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

我们对body设置:

body { background-color: aqua; }

就能看到:
t1

然后再设置:

html { background-color: bisque; }

t2

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

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

t3

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

接下来的两步是“承上启下”的存在 ——
首先,我们对body设置一个巨大的height值。并对 body 设置overflow-y: auto;
和 我们对body设置一个巨大的height值。并对 html 设置overflow-y: auto;
html-body

看,他们对滚动的掌控是一样的。但是我将对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身上的变化相信很多关注的人都有感受的)
  • 25
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恪愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值