更新记录

1.0.0(2026-04-21) 下载此版本

  • 初始版本发布
  • 支持上下滑动展开/收起
  • 支持自定义样式
  • 支持方法调用

平台兼容性

uni-app(3.7.6)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - -

是的,完整示例是 README.md 内容的一部分。我之前输出的代码块被意外截断了,现在重新输出完整的 README.md,你可以直接复制全部内容使用:

# sea-swipe-expand

上下滑动展开/收起的组件,支持微信小程序、APP、H5。

## 特性

- 🖐️ 手势滑动,自然流畅
- 🎨 完全自定义样式
- ✨ 支持展开/收起动画
- 🔧 支持方法调用(open/close/toggle)
- 📱 多端兼容

## 快速开始

```vue
<template>
  <SeaSwipeExpand
    ref="swipeExpand"
    :defaultExpanded="false"
    :bgColor="'#ffffff'"
    :borderRadius="'32rpx'"
    :padding="'30rpx'"
    @change="onChange"
  >
    <template #dragHandle>
      <view class="drag-area">
        <view class="drag-bar"></view>
        <view class="drag-text">
          {{ expanded ? '↓ 收起 ↓' : '↑ 展开 ↑' }}
        </view>
      </view>
    </template>

    <view class="content">
      <view class="item">默认显示内容</view>
      <view class="item" v-if="expanded">展开后显示内容</view>
    </view>
  </SeaSwipeExpand>
</template>

<script>
import SeaSwipeExpand from '@/components/sea-swipe-expand/sea-swipe-expand.vue'

export default {
  components: { SeaSwipeExpand },
  data() {
    return {
      expanded: false
    }
  },
  methods: {
    onChange(val) {
      this.expanded = val
    }
  }
}
</script>

<style>
.drag-area {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 20rpx 0;
}
.drag-bar {
  width: 80rpx;
  height: 8rpx;
  background: #ddd;
  border-radius: 4rpx;
  margin-bottom: 12rpx;
}
.drag-text {
  font-size: 24rpx;
  color: #999;
}
.item {
  padding: 28rpx;
  border-bottom: 1px solid #f0f0f0;
}
</style>

Props

参数 类型 默认值 说明
defaultExpanded Boolean false 默认是否展开
disabled Boolean false 是否禁用滑动
threshold Number 30 滑动触发阈值(px)
maxDistance Number 80 最大滑动距离(px)
damping Number 0.6 阻尼系数(0-1)
duration Number 300 动画时长(ms)
bgColor String 'transparent' 背景色
borderRadius String '0rpx' 圆角
padding String '0' 内容区域内边距
customStyle Object {} 自定义样式
// 一键复制 Props 配置
{
  "defaultExpanded": false,
  "disabled": false,
  "threshold": 30,
  "maxDistance": 80,
  "damping": 0.6,
  "duration": 300,
  "bgColor": "transparent",
  "borderRadius": "0rpx",
  "padding": "0",
  "customStyle": {}
}

事件

事件名 说明 参数
change 展开/收起状态变化 (value: boolean)
expand 展开时触发 -
collapse 收起时触发 -
dragStart 开始拖拽 (event)
dragMove 拖拽移动 { deltaY, distance }
dragEnd 拖拽结束 { deltaY, expanded }
// 一键复制事件监听示例
{
  change: (val) => { console.log(val) },
  expand: () => { console.log('展开') },
  collapse: () => { console.log('收起') },
  dragStart: (e) => { console.log(e) },
  dragMove: (data) => { console.log(data.distance) },
  dragEnd: (data) => { console.log(data.expanded) }
}

方法

方法名 说明
open 展开
close 收起
toggle 切换
getExpanded 获取当前状态
// 一键复制方法调用
this.$refs.seaSwipeExpand.open()
this.$refs.seaSwipeExpand.close()
this.$refs.seaSwipeExpand.toggle()
this.$refs.seaSwipeExpand.getExpanded()

插槽

名称 说明
dragHandle 拖拽手柄区域(必须)
default 内容区域
<!-- 一键复制插槽使用 -->
<SeaSwipeExpand>
  <template #dragHandle>
    <view class="custom-drag">自定义拖拽区域</view>
  </template>
  <view class="custom-content">自定义内容</view>
</SeaSwipeExpand>

完整示例

<!-- 一键复制完整示例 -->
<template>
  <view class="page">
    <SeaSwipeExpand
      ref="myCard"
      :defaultExpanded="false"
      :bgColor="'#ffffff'"
      :borderRadius="'32rpx'"
      :padding="'30rpx'"
      :threshold="30"
      :maxDistance="80"
      :duration="300"
      @change="onChange"
      @expand="onExpand"
      @collapse="onCollapse"
    >
      <template #dragHandle>
        <view class="drag-area">
          <view class="drag-bar"></view>
          <view class="drag-text">
            {{ expanded ? '↓ 收起 ↓' : '↑ 展开 ↑' }}
          </view>
        </view>
      </template>

      <view class="content">
        <view class="item">默认内容 1</view>
        <view class="item">默认内容 2</view>
        <view class="item">默认内容 3</view>
        <view class="item hidden" v-if="expanded">更多内容 4</view>
        <view class="item hidden" v-if="expanded">更多内容 5</view>
      </view>
    </SeaSwipeExpand>

    <view class="buttons">
      <button @click="toggleCard">切换</button>
      <button @click="openCard">展开</button>
      <button @click="closeCard">收起</button>
    </view>
  </view>
</template>

<script>
import SeaSwipeExpand from '@/components/sea-swipe-expand/sea-swipe-expand.vue'

export default {
  components: { SeaSwipeExpand },
  data() {
    return {
      expanded: false
    }
  },
  methods: {
    onChange(val) {
      this.expanded = val
    },
    onExpand() {
      console.log('展开')
    },
    onCollapse() {
      console.log('收起')
    },
    toggleCard() {
      this.$refs.myCard.toggle()
    },
    openCard() {
      this.$refs.myCard.open()
    },
    closeCard() {
      this.$refs.myCard.close()
    }
  }
}
</script>

<style>
.page {
  padding: 30rpx;
  background: #f5f5f5;
}
.drag-area {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 10rpx 0 20rpx;
}
.drag-bar {
  width: 80rpx;
  height: 8rpx;
  background: #ddd;
  border-radius: 4rpx;
  margin-bottom: 12rpx;
}
.drag-text {
  font-size: 24rpx;
  color: #999;
}
.content {
  background: transparent;
}
.item {
  padding: 28rpx 0;
  border-bottom: 1px solid #f0f0f0;
  font-size: 28rpx;
  color: #333;
}
.hidden {
  color: #667eea;
}
.buttons {
  display: flex;
  gap: 20rpx;
  margin-top: 30rpx;
}
button {
  flex: 1;
  font-size: 28rpx;
}
</style>

渐变背景示例

<!-- 一键复制渐变背景示例 -->
<SeaSwipeExpand
  :defaultExpanded="false"
  :borderRadius="'32rpx'"
  :padding="'30rpx'"
  :customStyle="{
    background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)'
  }"
  @change="onChange"
>
  <template #dragHandle>
    <view class="drag-area-white">
      <view class="drag-bar-white"></view>
      <view class="drag-text-white">
        {{ expanded ? '↓ 收起 ↓' : '↑ 展开 ↑' }}
      </view>
    </view>
  </template>
  <view class="content-white">
    <view class="item-white">渐变背景内容</view>
    <view class="item-white" v-if="expanded">更多内容</view>
  </view>
</SeaSwipeExpand>

禁用滑动示例

<!-- 一键复制禁用滑动示例 -->
<SeaSwipeExpand
  :disabled="true"
  :defaultExpanded="true"
  :bgColor="'#ffffff'"
  :borderRadius="'32rpx'"
  :padding="'30rpx'"
>
  <template #dragHandle>
    <view class="drag-area">
      <view class="drag-bar"></view>
      <view class="drag-text">已禁用滑动</view>
    </view>
  </template>
  <view class="content">
    <view class="item">内容固定显示</view>
  </view>
</SeaSwipeExpand>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT License

Copyright (c) 2026 Sea

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.