自定义滚动条的滚动容器,支持水平/垂直滚动、渐变遮罩和滚动事件监听。
<template>
<FmScrollArea class="h-64">
<div>长内容...</div>
</FmScrollArea>
</template>| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
horizontal | boolean | false | 是否启用水平滚动 |
scrollbar | boolean | true | 是否显示滚动条 |
mask | boolean | false | 是否显示渐变遮罩 |
class | HTMLAttributes['class'] | - | 容器 CSS 类 |
contentClass | HTMLAttributes['class'] | - | 滚动内容区 CSS 类 |
| 名称 | 说明 |
|---|---|
default | 滚动内容 |
| 事件名 | 参数 | 说明 |
|---|---|---|
onScroll | Event | 滚动时触发 |
| 方法名 | 参数 | 说明 |
|---|---|---|
scrollTo | (scrollNumber: number, behavior?: ScrollBehavior) => void | 滚动到指定位置 |
ref | - | 内部 ScrollArea 引用 |
<template>
<FmScrollArea class="h-64 w-96">
<div class="space-y-2">
<p v-for="i in 50" :key="i">滚动内容 {{ i }}</p>
</div>
</FmScrollArea>
</template><template>
<FmScrollArea horizontal class="w-96">
<div class="flex gap-4">
<div v-for="i in 20" :key="i" class="w-32 h-32 bg-muted flex-center">
项目 {{ i }}
</div>
</div>
</FmScrollArea>
</template><template>
<FmScrollArea :scrollbar="false" class="h-64">
<div>内容(无滚动条)</div>
</FmScrollArea>
</template><template>
<FmScrollArea :mask="true" class="h-64">
<div class="space-y-2">
<p v-for="i in 50" :key="i">内容 {{ i }}</p>
</div>
</FmScrollArea>
</template><template>
<FmScrollArea
:mask="true"
class="h-64"
>
<div>内容</div>
</FmScrollArea>
</template><script setup lang="ts">
function onScroll(event: Event) {
const target = event.target as HTMLElement
console.log('scrollTop:', target.scrollTop)
}
</script>
<template>
<FmScrollArea class="h-64" @on-scroll="onScroll">
<div>滚动内容...</div>
</FmScrollArea>
</template><script setup lang="ts">
const scrollRef = ref<InstanceType<typeof FmScrollArea>>()
function scrollToTop() {
scrollRef.value?.scrollTo(0, 'smooth')
}
function scrollToBottom() {
scrollRef.value?.scrollTo(9999, 'smooth')
}
</script>
<template>
<FmScrollArea ref="scrollRef" class="h-64">
<div class="space-y-2">
<p v-for="i in 50" :key="i">内容 {{ i }}</p>
</div>
</FmScrollArea>
<div class="flex gap-2 mt-4">
<FmButton @click="scrollToTop">回到顶部</FmButton>
<FmButton @click="scrollToBottom">滚动到底部</FmButton>
</div>
</template>height 或 max-height 等限制高度的样式才能触发滚动horizontal 时,内容需要超出容器宽度才能触发水平滚动mask 为 true 时会在内容顶部/底部显示渐变遮罩效果