Skip to content

useScrollableArea

@astryxdesign/core v0.7.1 · useScrollableArea

使用方法 ​

给调用方自己搭的结构加上一套标准的、跟着书写方向走的滚动行为。一个轴要真的能用,得同时满足两件事:这一轴算出来的 overflow 是能滚的,并且内容和盒子差得超过共用的 1px 容差。视口和内容盒两块都在观察范围里。

把 viewport 当函数 ref 绑到滚动的那块上,把 content 绑到装内容的盒子上。viewportAttrs 里是 role、aria-label、tabindex,还有按当前测量结果写出的 data-scroll-*;viewportStyle 里是 overflow 和 overscroll-behavior。名字和角色用 label、role 给,或者用 keyboardAccess 说清键盘从哪里进来。量出来的状态会登记成「滚动归属」,嵌套的滚动区域和焦点委托靠它分清哪一层在滚。视口藏起来、尺寸为 0 时量不出来,保留上一次的结果。选项是按响应式读取的,所以组件的 props 也可以直接传进来,后面变了也会跟着更新。

ts
import { useScrollableArea } from '@astryx-vue/core'
vue
<script setup lang="ts">
import { useScrollableArea } from '@astryx-vue/core'

const { content, viewport, viewportAttrs, viewportStyle } = useScrollableArea({
  axis: 'block',
  label: '更新日志',
})
</script>

<template>
  <div :ref="viewport" v-bind="viewportAttrs" :style="viewportStyle">
    <div :ref="content">
      很长很长的内容
    </div>
  </div>
</template>

建议 ​

指引做法
Doviewport 和 content 两个都绑上。内容盒是真的在观察的,溢出变化才跟得上。
Do给这块区域一个简短的 label。视口只有在真的能滚的时候才进键盘顺序。
Doaxis 写你真正想滚的方向,只有两个方向都要滚时才用 both。
Dooverscroll 保持 allow,除非手势滑到头就该停在这个盒子上。
Don't自己在视口上写 overflow。viewportStyle 会按测量结果在 clip 和 auto 之间挑。
Don't再套一层 overflow 容器。一块视口应该独占滚动。