要点
借助 CSS overscroll-behavior
属性,开发者可以覆盖
浏览器在滚动至顶部/底部时的默认溢出滚动行为
内容。用例包括停用下拉刷新
移除滚动发光和橡皮筋效果
并阻止网页内容在模态窗口/叠加层下滚动。
背景
滚动边界和滚动链接
<ph type="x-smartling-placeholder">滚动是与网页互动的最基本方式之一, 由于浏览器的奇特之处,某些用户体验模式可能会难以处理 默认行为以一个应用抽屉为例,其中包含大量 用户可能需要滚动浏览的项。到达底部时, 溢出容器会停止滚动,因为已没有其他内容可供浏览。 换言之, 到达“滚动边界”。但请注意,如果用户继续 滚动。抽屉式导航栏后面的内容开始滚动!滚动为 由父级容器接管主页面本身
事实证明,这种行为称为滚动链接;浏览器的默认 行为通常,默认值非常好, 有时并不符合用户预期,甚至无法预料。某些应用可能需要 可在用户到达滚动边界时提供不同的用户体验。
下拉刷新效果
下拉刷新是一种广为流行的直观手势,例如 Facebook 和 Twitter。下拉社交信息流并发布新内容, 以便加载最新发布的帖子。事实上,这种特殊的用户体验 变得如此流行,以至于 Android 版 Chrome 等移动浏览器 效果一样从页面顶部向下滑动可刷新整个页面:
对于 Twitter PWA 等应用,
那么停用原生下拉刷新操作可能就很合理为什么呢?在本课中,
应用,您可能不希望用户意外刷新页面。还有
而且可能会出现双刷新动画!或者
可以更好地自定义浏览器的操作,使其更贴近网站
品牌塑造。遗憾的是,这种类型的自定义
难以理解。开发者最终编写出不必要的 JavaScript 代码,添加
非被动
触摸监听器(阻止滚动),或以 100vw/vh 格式固定整个网页
<div>
(防止页面溢出)。这些解决方法
有据可查的负面评价
对滚动性能的影响。
我们可以做得更好!
隆重推出 overscroll-behavior
overscroll-behavior
属性是一项新的 CSS 功能,用于控制
滚动容器时的行为方式(包括
网页本身)。您可以使用它取消滚动链接、停用/自定义
下拉刷新操作,在 iOS 上停用橡皮筋效果(使用 Safari
实现 overscroll-behavior
)等。
最棒的是,使用 overscroll-behavior
不会产生不利影响
网页性能,比如简介中提到的技巧!
该属性采用三个可能的值:
- auto - 默认值。从元素上发起的滚动可能会传播到 祖级元素。
- contain - 防止滚动链接。滚动不会传播到祖先实体
但会显示节点内的局部效应。例如,滚动发光效果
影响 Android 或 iOS 上的橡皮筋效果,通知用户
滚动边界。注意:使用
html
元素上的overscroll-behavior: contain
可防止滚动 导航操作。 - none - 与
contain
相同,但也可以防止 节点本身(例如 Android 滚动发光或 iOS 橡皮筋)。
我们来深入了解一些示例,了解如何使用 overscroll-behavior
。
防止滚动转义固定位置元素
聊天框场景
<ph type="x-smartling-placeholder">假设有一个固定的聊天框位于页面底部。通过 聊天框是一个独立的组件,可以滚动 与其背后的内容区分开来不过,由于滚动链接的影响, 用户命中聊天中的最后一条消息时,文档开始滚动 历史记录。
对于此应用来说,比较合适的滚动是在
聊天框留在聊天框中。为此,我们可以将
overscroll-behavior: contain
添加到包含聊天消息的元素:
#chat .msgs {
overflow: auto;
overscroll-behavior: contain;
height: 300px;
}
从本质上讲,我们是在逻辑上将聊天框的滚动操作 上下文和主页。最终结果是,当主页面位于主页面时, 用户到达聊天记录的顶部/底部。以 不会传播。
网页重叠式广告情形
“底部滚动”的另一种变体也就是您看到
在固定位置叠加层后面滚动。死掉的赠品
overscroll-behavior
准备好了!浏览器正在尽力提供帮助,但
最终会导致网站看上去有问题
示例 - 带有和不带 overscroll-behavior: contain
的模态窗口:
停用下拉刷新
关闭下拉刷新操作只需一行 CSS。只是要防止
滚动链接。在大多数情况下
<html>
或 <body>
:
body {
/* Disables pull-to-refresh but allows overscroll glow effects. */
overscroll-behavior-y: contain;
}
通过这项简单的添加,我们在 Android Studio 中修复了双拉刷新动画, 聊天框演示 而应实现使用更简洁的加载动画的自定义效果。通过 当收件箱刷新时,整个收件箱也会进行模糊处理:
以下是 完整代码:
<style>
body.refreshing #inbox {
filter: blur(1px);
touch-action: none; /* prevent scrolling */
}
body.refreshing .refresher {
transform: translate3d(0,150%,0) scale(1);
z-index: 1;
}
.refresher {
--refresh-width: 55px;
pointer-events: none;
width: var(--refresh-width);
height: var(--refresh-width);
border-radius: 50%;
position: absolute;
transition: all 300ms cubic-bezier(0,0,0.2,1);
will-change: transform, opacity;
...
}
</style>
<div class="refresher">
<div class="loading-bar"></div>
<div class="loading-bar"></div>
<div class="loading-bar"></div>
<div class="loading-bar"></div>
</div>
<section id="inbox"><!-- msgs --></section>
<script>
let _startY;
const inbox = document.querySelector('#inbox');
inbox.addEventListener('touchstart', e => {
_startY = e.touches[0].pageY;
}, {passive: true});
inbox.addEventListener('touchmove', e => {
const y = e.touches[0].pageY;
// Activate custom pull-to-refresh effects when at the top of the container
// and user is scrolling up.
if (document.scrollingElement.scrollTop === 0 && y > _startY &&
!document.body.classList.contains('refreshing')) {
// refresh inbox.
}
}, {passive: true});
</script>
停用滚动发光和橡皮筋效果
要在到达滚动边界时停用弹跳效果,请使用
overscroll-behavior-y: none
:
body {
/* Disables pull-to-refresh and overscroll glow effect.
Still keeps swipe navigations. */
overscroll-behavior-y: none;
}
完整演示
综上所述,
Chatbox demo 使用
overscroll-behavior
,用于创建自定义下拉刷新动画
以及停用滚动逃离聊天框 widget 的功能。这提供了最优
如果没有 CSS 将难以实现的用户体验
overscroll-behavior
。