跳至内容

滚动区域

增强原生滚动功能以实现自定义的跨浏览器样式。
标签
v1.2.0-beta.50
v1.2.0-beta.49
v1.2.0-beta.48
v1.2.0-beta.47
v1.2.0-beta.46
v1.2.0-beta.45
v1.2.0-beta.44
v1.2.0-beta.43
v1.2.0-beta.42
v1.2.0-beta.41
v1.2.0-beta.40
v1.2.0-beta.39
v1.2.0-beta.38
v1.2.0-beta.37
v1.2.0-beta.36
v1.2.0-beta.35
v1.2.0-beta.34
v1.2.0-beta.33
v1.2.0-beta.32
v1.2.0-beta.31
v1.2.0-beta.30
v1.2.0-beta.29
v1.2.0-beta.28
v1.2.0-beta.27
v1.2.0-beta.26
v1.2.0-beta.25
v1.2.0-beta.24
v1.2.0-beta.23
v1.2.0-beta.22
v1.2.0-beta.21
v1.2.0-beta.20
v1.2.0-beta.19
v1.2.0-beta.18
v1.2.0-beta.17
v1.2.0-beta.16
v1.2.0-beta.15
v1.2.0-beta.14
v1.2.0-beta.13
v1.2.0-beta.12
v1.2.0-beta.11
v1.2.0-beta.10
v1.2.0-beta.9
v1.2.0-beta.8
v1.2.0-beta.7
v1.2.0-beta.6
v1.2.0-beta.5
v1.2.0-beta.4
v1.2.0-beta.3
v1.2.0-beta.2
v1.2.0-beta.1
vue
<script setup lang="ts">
import { ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport } from 'radix-vue'

const tags = Array.from({ length: 50 }).map((_, i, a) => `v1.2.0-beta.${a.length - i}`)
</script>

<template>
  <ScrollAreaRoot
    class="w-[200px] h-[225px] rounded overflow-hidden shadow-[0_2px_10px] shadow-blackA7 bg-white"
    style="--scrollbar-size: 10px"
  >
    <ScrollAreaViewport class="w-full h-full rounded">
      <div class="py-[15px] px-5">
        <div class="text-grass11 text-[15px] leading-[18px] font-semibold">
          Tags
        </div>
        <div
          v-for="tag in tags"
          :key="tag"
          class="text-mauve12 text-[13px] leading-[18px] mt-2.5 pt-2.5 border-t border-t-mauve6"
        >
          {{ tag }}
        </div>
      </div>
    </ScrollAreaViewport>
    <ScrollAreaScrollbar
      class="flex select-none touch-none p-0.5 bg-blackA6 transition-colors duration-[160ms] ease-out hover:bg-blackA8 data-[orientation=vertical]:w-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:h-2.5"
      orientation="vertical"
    >
      <ScrollAreaThumb
        class="flex-1 bg-mauve10 rounded-[10px] relative before:content-[''] before:absolute before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2 before:w-full before:h-full before:min-w-[44px] before:min-h-[44px]"
      />
    </ScrollAreaScrollbar>
    <ScrollAreaScrollbar
      class="flex select-none touch-none p-0.5 bg-blackA6 transition-colors duration-[160ms] ease-out hover:bg-blackA8 data-[orientation=vertical]:w-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:h-2.5"
      orientation="horizontal"
    >
      <ScrollAreaThumb
        class="flex-1 bg-mauve10 rounded-[10px] relative before:content-[''] before:absolute before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2 before:w-full before:h-full before:min-w-[44px] before:min-h-[44px]"
      />
    </ScrollAreaScrollbar>
  </ScrollAreaRoot>
</template>

特性

  • 滚动条位于可滚动内容的顶部,不占用任何空间。
  • 滚动是原生的;没有通过 CSS 转换进行的任何基础位置移动。
  • 仅在与控件交互时才会模拟指针行为,因此键盘控件不受影响。
  • 支持从右到左的方向。

安装

从命令行安装组件。

sh
$ npm add radix-vue

解剖

导入所有部分并将它们拼凑在一起。

vue
<script setup>
import { ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport } from 'radix-vue'
</script>

<template>
  <ScrollAreaRoot>
    <ScrollAreaViewport />
    <ScrollAreaScrollbar orientation="horizontal">
      <ScrollAreaThumb />
    </ScrollAreaScrollbar>
    <ScrollAreaScrollbar orientation="vertical">
      <ScrollAreaThumb />
    </ScrollAreaScrollbar>
    <ScrollAreaCorner />
  </ScrollAreaRoot>
</template>

API 参考

包含滚动区域的所有部分。

道具默认类型
as
'div'
AsTag | 组件

此组件应呈现为的元素或组件。可以被asChild覆盖

asChild
布尔值

将默认呈现的元素更改为作为子元素传递的元素,合并它们的属性和行为。

阅读我们的 组合 指南了解更多详情。

dir
'ltr' | 'rtl'

组合框的阅读方向(如果适用)。
如果省略,则从ConfigProvider全局继承或假设 LTR(从左到右)阅读模式。

scrollHideDelay
600
数字

如果类型设置为scrollhover,则此道具确定用户停止与滚动条交互后隐藏滚动条的时间长度(以毫秒为单位)。
之前。

type
'hover'
'always' | 'scroll' | 'hover' | 'auto'

描述滚动条可见性的性质,类似于 macOS 中的滚动条首选项如何控制原生滚动条的可见性。

auto - 表示滚动条在内容在相应方向上溢出时可见。
always - 表示滚动条始终可见,无论内容是否溢出。
scroll - 表示滚动条在用户沿其相应方向滚动时可见。
hover - 当用户沿其相应方向滚动时,以及当用户将鼠标悬停在滚动区域上时。

方法类型
scrollTop
() => void

将视窗滚动到顶部

scrollTopLeft
() => void

将视窗滚动到左上角

视窗

滚动区域的视窗区域。

道具默认类型
as
'div'
AsTag | 组件

此组件应呈现为的元素或组件。可以被asChild覆盖

asChild
布尔值

将默认呈现的元素更改为作为子元素传递的元素,合并它们的属性和行为。

阅读我们的 组合 指南了解更多详情。

nonce
字符串

nonce属性添加到样式标签中,可用于内容安全策略。
如果省略,则从ConfigProvider全局继承。

滚动条

垂直滚动条。添加第二个带有orientation道具的Scrollbar来启用水平滚动。

道具默认类型
as
'div'
AsTag | 组件

此组件应呈现为的元素或组件。可以被asChild覆盖

asChild
布尔值

将默认呈现的元素更改为作为子元素传递的元素,合并它们的属性和行为。

阅读我们的 组合 指南了解更多详情。

forceMount
布尔值

用于在需要更多控制时强制挂载。当使用 Vue 动画库控制动画时很有用。

orientation
'vertical'
'vertical' | 'horizontal'

滚动条的方向

数据属性价值
[data-state]"visible" | "hidden"
[data-orientation]"vertical" | "horizontal"

拇指

将在ScrollAreaScrollbar中使用的拇指。

道具默认类型
as
'div'
AsTag | 组件

此组件应呈现为的元素或组件。可以被asChild覆盖

asChild
布尔值

将默认呈现的元素更改为作为子元素传递的元素,合并它们的属性和行为。

阅读我们的 组合 指南了解更多详情。

数据属性价值
[data-state]"visible" | "hidden"

垂直和水平滚动条相遇的角落。

道具默认类型
as
'div'
AsTag | 组件

此组件应呈现为的元素或组件。可以被asChild覆盖

asChild
布尔值

将默认呈现的元素更改为作为子元素传递的元素,合并它们的属性和行为。

阅读我们的 组合 指南了解更多详情。

无障碍

在大多数情况下,最好依赖原生滚动并使用 CSS 中提供的自定义选项。当这还不够时,ScrollArea 提供额外的自定义功能,同时保持浏览器的原生滚动行为(以及无障碍功能,如键盘滚动)。

键盘交互

默认情况下支持通过键盘滚动,因为该组件依赖于原生滚动。特定平台之间的特定键盘交互可能有所不同,因此我们不会在此处指定它们,也不会添加特定事件监听器来处理通过键盘事件进行滚动。