当前位置:首页 > uni-app

uniapp半屏拖拽

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

实现半屏拖拽的基本思路

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

核心代码示例

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

uniapp半屏拖拽

<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. 拖拽范围计算

    uniapp半屏拖拽

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

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

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

进阶优化

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

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

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

相关文章

uniapp 如何封装request请求

uniapp 如何封装request请求

封装 request 请求的核心思路 在 UniApp 中封装请求通常基于 uni.request,通过统一处理 URL、参数、header 和拦截逻辑提升代码复用性。以下是一个完整封装方案: 创建…

uniapp商场

uniapp商场

uniapp 商城开发指南 开发环境搭建 安装HBuilderX作为开发工具,确保已安装Node.js和npm。创建uniapp项目时选择模板,推荐使用官方提供的商城模板或插件市场中的商城模板。…

uniapp 编辑

uniapp 编辑

uniapp 编辑功能实现方法 在uniapp中实现编辑功能通常涉及表单处理、数据绑定和状态管理。以下为常见实现方式: 表单数据双向绑定 使用v-model指令实现表单元素与数据的双向绑定:…

eeui uniapp

eeui uniapp

关于 EEUI 和 UniApp 的解析 EEUI 和 UniApp 是两个不同的跨平台开发框架,均用于快速构建多端应用。以下是它们的核心特点和对比分析: EEUI 框架特点 EEUI 是一个基…

uniapp 销售日报

uniapp 销售日报

实现销售日报功能的步骤 数据收集与整理 销售日报需要收集每日销售数据,包括销售额、订单数量、商品类别等。数据可以从后端API获取或本地数据库存储。使用uni.request调用接口获取数据,确保数据结…

uniapp显示不全

uniapp显示不全

uniapp显示不全的常见原因及解决方法 页面布局问题 检查页面布局是否超出屏幕范围,确保根元素或外层容器设置正确的宽度和高度。使用flex布局或百分比单位适应不同屏幕尺寸。 滚动区域未设置 在需要…