当前位置:首页 > uni-app

uniapp半屏拖拽

2026-03-05 11:57:06uni-app

实现半屏拖拽的基本思路

在UniApp中实现半屏拖拽效果,通常结合<movable-area><movable-view>组件完成。通过动态调整<movable-view>的位置和高度,结合触摸事件监听,实现拖拽交互。

核心代码示例

以下是一个基础的半屏拖拽实现代码:

<template>
  <view>
    <!-- 拖拽区域容器 -->
    <movable-area class="drag-area">
      <!-- 可拖拽视图,设置y轴方向拖拽 -->
      <movable-view 
        class="drag-view" 
        direction="vertical" 
        :y="yPosition" 
        @change="onDragChange"
        @touchend="onDragEnd"
      >
        <!-- 拖拽手柄(可选) -->
        <view class="drag-handle"></view>
        <!-- 内容区域 -->
        <view class="content">
          <!-- 页面内容 -->
        </view>
      </movable-view>
    </movable-area>
  </view>
</template>

<script>
export default {
  data() {
    return {
      yPosition: 0,  // 初始位置
      screenHeight: 0,
      minY: 0,       // 最小拖拽位置
      maxY: 0        // 最大拖拽位置
    };
  },
  mounted() {
    // 获取屏幕高度并计算拖拽范围
    uni.getSystemInfo({
      success: (res) => {
        this.screenHeight = res.windowHeight;
        this.maxY = res.windowHeight * 0.6; // 最大拖到60%高度
      }
    });
  },
  methods: {
    onDragChange(e) {
      this.yPosition = e.detail.y;
    },
    onDragEnd() {
      // 拖拽结束后判断位置,自动吸附到顶部或底部
      if (this.yPosition > this.screenHeight * 0.3) {
        this.yPosition = this.maxY; // 吸附到底部
      } else {
        this.yPosition = this.minY; // 吸附到顶部
      }
    }
  }
};
</script>

<style>
.drag-area {
  width: 100%;
  height: 100vh;
  position: fixed;
  bottom: 0;
}
.drag-view {
  width: 100%;
  height: 70vh; /* 初始高度 */
  background-color: #fff;
  border-top-left-radius: 16rpx;
  border-top-right-radius: 16rpx;
}
.drag-handle {
  width: 80rpx;
  height: 8rpx;
  background-color: #ddd;
  margin: 20rpx auto;
  border-radius: 4rpx;
}
</style>

关键点说明

  1. movable-areamovable-view

    • movable-area为拖拽容器,需设置固定宽高(如100vh)。
    • movable-view设置direction="vertical"限制垂直拖拽,通过y属性动态控制位置。
  2. 拖拽范围计算

    • 通过uni.getSystemInfo获取屏幕高度,动态计算maxY(如屏幕高度的60%)。
  3. 吸附效果

    • @touchend事件中判断当前拖拽位置,若超过阈值则自动吸附到预设位置(如顶部或底部)。
  4. 样式优化

    uniapp半屏拖拽

    • 拖拽手柄(.drag-handle)增强交互提示,圆角和背景色提升视觉体验。

进阶优化

  • 动画过渡:通过CSS的transition属性或UniApp的animationAPI实现平滑吸附动画。
  • 动态内容高度:根据拖拽位置动态调整内容区域高度,如使用calc(100vh - ${yPosition}px)
  • 手势限制:通过@touchmove事件拦截水平滑动,避免与页面滚动冲突。

通过上述方法,可快速实现类似微信小程序半屏弹窗的拖拽效果。

标签: 拖拽uniapp
分享给朋友:

相关文章

vue实现拖拽改变尺寸

vue实现拖拽改变尺寸

Vue 实现拖拽改变尺寸的方法 使用原生 HTML5 拖拽 API 通过监听 mousedown、mousemove 和 mouseup 事件实现拖拽改变尺寸。创建一个可拖拽的边界元素,调整目标元素的…

uniapp部署到服务器

uniapp部署到服务器

部署准备 确保本地开发环境已完成项目构建,生成静态文件(H5端为/dist/build/h5目录)。检查服务器环境是否安装Nginx/Apache等Web服务软件,并配置好域名解析。 上传文件 通过…

uniapp分享到facebook

uniapp分享到facebook

使用uniapp分享到Facebook的方法 在uniapp中实现分享到Facebook功能,可以通过调用原生插件或使用第三方SDK。以下是具体实现方式: 安装Facebook SDK插件 在uni…

uniapp如何赋值

uniapp如何赋值

uniapp 赋值方法 在 uniapp 中,赋值操作可以通过多种方式实现,具体取决于数据类型和场景。 数据绑定赋值 在模板中使用 {{}} 进行数据绑定,通过修改 data 中的值实现动态更新。…

uniapp实现标题栏渐变

uniapp实现标题栏渐变

实现标题栏渐变的方法 在UniApp中实现标题栏渐变效果,可以通过修改页面的导航栏样式或使用自定义导航栏来实现。以下是几种常见的方法: 方法一:使用原生导航栏渐变 通过修改pages.json中的…

uniapp特性

uniapp特性

uniapp的核心特性 跨平台开发 uniapp支持一套代码编译到多个平台,包括iOS、Android、H5、微信小程序、支付宝小程序、百度小程序、字节跳动小程序等。开发者无需为不同平台单独编写代码。…