Skip to content

快速开始

基础用法

BottomSheet 是一个触摸驱动的底部弹出面板,内置惯性滚动和弹性吸附动画。只需将内容放入默认插槽即可使用。

vue
<script setup>
import { BottomSheet } from '@wyatex/bottom-sheet'
import '@wyatex/bottom-sheet/dist/style.css'
</script>

<template>
  <div class="app">
    <!-- 页面背景内容 -->
    <div class="map">
      ...
    </div>

    <!-- 底部弹出面板 -->
    <BottomSheet>
      <div v-for="n in 20" :key="n" class="item">
        列表项 {{ n }}
      </div>
    </BottomSheet>
  </div>
</template>

BottomSheet 通过 position: absolute 定位,需要确保父容器有定位上下文(如 position: relativefixed)。

无限滚动

通过监听 load-more 事件实现滚动加载:

vue
<script setup>
import { BottomSheet } from '@wyatex/bottom-sheet'
import { ref } from 'vue'
import '@wyatex/bottom-sheet/dist/style.css'

const items = ref([])
const loading = ref(false)

function loadMore() {
  if (loading.value)
    return
  loading.value = true

  setTimeout(() => {
    for (let i = 0; i < 20; i++) {
      items.value.push({ id: items.value.length, text: `项目 ${items.value.length + 1}` })
    }
    loading.value = false
  }, 500)
}
</script>

<template>
  <BottomSheet @load-more="loadMore">
    <div v-for="item in items" :key="item.id" class="item">
      {{ item.text }}
    </div>
    <div v-if="loading" class="loading">
      加载中...
    </div>
  </BottomSheet>
</template>

当内部列表滚动到底部 50px 范围内时,load-more 事件会被触发。

自定义吸附点

默认的三个吸附点按屏幕高度比例自动计算:

吸附点默认值说明
最低点innerHeight * 0.85折叠状态
中间点innerHeight * 0.6初始位置
最高点innerHeight * 0.15完全展开

可通过 minTranslateYmidTranslateYmaxTranslateY props 自定义:

vue
<template>
  <BottomSheet
    :min-translate-y="600"
    :mid-translate-y="400"
    :max-translate-y="100"
  >
    <!-- 内容 -->
  </BottomSheet>
</template>