首页 > 其他分享 >uniapp项目实践总结(十)自定义滑动触摸组件

uniapp项目实践总结(十)自定义滑动触摸组件

时间:2023-09-05 21:24:34浏览次数:44  
标签:uniapp name val 100% 组件 滑动 自定义

在 APP 的日常开放过程中,我们经常可以看到上拉刷新、下拉刷新、左滑、右滑、触底加载等效果,那其中的原理是如何呢,又是如何实现的呢,下面就一探究竟。这篇文章主要是讲述自定义滑动触摸组件的方放,兼容网页 H5 端、微信小程序端和 App 端。

目录

  • 准备工作
  • 原理分析
  • 组件实现
  • 实战演练
  • 案例展示

准备工作

  • components新建一个q-swiper文件夹,并新建一个q-swiper.vue的组件;
  • 按照前一篇所说的页面结构,编写好预定的滑动触摸页面;

原理分析

自定义滑动触摸组件就是采用普通的方法进行判断滑动上下左右的距离,从而实现滑动效果。

主要使用到的事件有ontouchstartontouchendonmousedownonmouseup

根据pageXpageYclientXclientY来判断滑动方向从而实现滑动功能。

组件实现

准备工作和原理分析完成后,接下来写一个简单的自定义滑动模块组件。

模板部分

<view
  class="q-swiper"
  @touchstart="handlerStart"
  @touchend="handlerEnd"
  @mousedown="handlerStart"
  @mouseup="handlerEnd">
  <slot name="content">
    <!-- 插槽自定义内容 -->
  </slot>
</view>

样式部分

.q-swiper {
  width: 100%;
  height: 100%;
}

脚本部分

  • 引入依赖包和属性设置
import { reactive } from "vue";

// 滑动信息
const touchInfo = reactive({
  touchX: "",
  touchY: "",
});

// 滑动类型
const touchTypes = reactive({
  left: {
    id: 1,
    name: "左滑",
    val: "left",
  },
  right: {
    id: 2,
    name: "右滑",
    val: "right",
  },
  up: {
    id: 3,
    name: "上滑",
    val: "up",
  },
  down: {
    id: 4,
    name: "下滑",
    val: "down",
  },
});

// 发送事件
const emits = defineEmits(["change"]);
  • 滑动方法定义
// 滑动开始
function handlerStart(e) {
  let { clientX, clientY } = e.changedTouches[0];
  touchInfo.touchX = clientX;
  touchInfo.touchY = clientY;
}

// 滑动结束
function handlerEnd(e) {
  let { clientX, clientY } = e.changedTouches[0];
  let diffX = clientX - touchInfo.touchX,
    diffY = clientY - touchInfo.touchY,
    absDiffX = Math.abs(diffX),
    absDiffY = Math.abs(diffY),
    type = "";
  if (absDiffX > 50 && absDiffX > absDiffY) {
    type = diffX >= 0 ? "right" : "left";
  }
  if (absDiffY > 50 && absDiffX < absDiffY) {
    type = diffY < 0 ? "up" : "down";
  }
  if (type) {
    console.log("滑动信息:", touchTypes[type]);
    emits("change", touchTypes[type]);
  }
}

实战演练

写好滑动组件后,可以在 H5 、小程序和 App 里面使用了,下面是页面模板和脚本使用方法。

模板使用

<q-swiper @change="changeSwiper">
  <template v-slot:content>
    <view class="swiper-box"> 滑动方向:{{ swiperDir.name }} </view>
    <view
      :class="{'swiper-section': true, [swiperDir.val != 'click' ? swiperDir.val : '']: true}"></view>
  </template>
</q-swiper>

样式编写

.swiper-box {
  padding: 30rpx;
  font-size: 24rpx;
}
.swiper-section {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #f99;
  opacity: 0.8;
  transition: all 0.5s;
  &.up {
    transform: translateX(0) translateY(-100%);
  }
  &.down {
    transform: translateX(0) translateY(0);
  }
  &.left {
    transform: translateX(0) translateY(0);
  }
  &.right {
    transform: translateX(100%) translateY(0);
  }
}

脚本使用

鼠标或手指上下左右滑动页面,调用下面方法进行滑动。

  • 定义数据
// 导入依赖
import { reactive } from "vue";

// 滑动方向
let swiperDir = reactive({
  name: "左滑",
  val: "left",
});
  • 方法调用
// 监听事件
function changeSwiper(dir) {
  swiperDir.name = dir.name;
  swiperDir.val = dir.val;
}

案例展示

  • h5 端效果

uniapp-10-swiper-h5.gif

  • 小程序端效果

uniapp-10-swiper-mnp.gif

  • APP 端效果

uniapp-10-swiper-app.gif

最后

以上就是自定义滑动触摸组件的主要内容,有不足之处,请多多指正。

标签:uniapp,name,val,100%,组件,滑动,自定义
From: https://www.cnblogs.com/guanqiweb/p/17680818.html

相关文章

  • [MSSQL]开启/关闭Ad Hoc Distributed Queries组件
    SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowset/OpenDatasource”的访问开启组件:execsp_configure'showadvancedoptions',1reconfigureexecsp_configure'AdHocDistributedQueries',1reconfigure关闭组件:execsp_configur......
  • 解耦---组件模式
    优点:1、代码复用,对比。2、通过使用组件容器对象,可以降低组件之间得耦合。缺点:1、组件之间通信比较复杂。 组件之间通信方式:1、组件容器对象保存组件需要的状态优点:组件之间可以直接从容器对象获取所需要的数据,降低组件之间的耦合缺点:当使用相同的组件容器,但是使......
  • 在uniapp中如何将PDF或者XML文件转化成base64?
    场景:如何将获取到的内网服务器的文件,传给我们的后台,把文件保存下来?1.使用uni.downloadFile()获取到文件的临时路径2.uniapp导入安装的的插件“image-tools”,把临时路径转化成base64传给后台。注意点:如果同时解析多个xml文件,后台可能会接收到乱码的情况,此时需要将base64使用enc......
  • python 组件安装
    1.cx_oracle安装 步骤1:下载组件(cx_Oracle-8.1.0-cp38-cp38-win_amd64.whl)后,放置...Python\Python38\Lib\site-packages目录下,如D:\Programs\Python\Python38\Lib\site-packages 步骤2:CMD,CD至site-packages目录后,执行命令:pipinstall组件名称,如pipinstallcx_Oracle-8.1......
  • 自定义企业培训系统:源码定制与扩展指南
    在现代企业中,持续学习和培训已经成为成功的关键要素之一。企业培训系统的存在已经变得不可或缺,因为它们允许企业为员工提供高质量的培训和教育,以提高他们的技能水平并满足不断变化的业务需求。然而,通用的培训系统可能无法满足每个企业的特定需求,这就是为什么自定义企业培训系统变得......
  • WPF学习 - 自定义窗体(二)
    上一篇文章写了如何创建自定义窗体:使用WindowChrome或者WindowStyle=“None”这两种方式。本文将讲述如何设置窗体的效果(以阴影效果为例),以及在效果模式下,窗体各功能的配合。一、窗体的空间范围:窗体的范围,就是白色区域部分:包括窗体的边框,标题栏,以及内部的空白部分。出了白色......
  • 自定义数据类型UI绑定
    场景:在收货地址列表页面A中,点击一个地址进详情页面B,然后修改地址保存关闭页面B,收货地址A需要同步UI更新修改的信息。机制:1、在SwiftUI中,使用@Binding只能绑定基本数据类型,不能处理自定义数据类型。2、@StateObject和@ObservedObject的监听,在目前的测试中体现的是向下传递。即......
  • a标签下载文件并自定义文件名
     一、href的属性地址必须是和你前端同源情况下<ahref="URL"download="文件名">//download属性也可以设置一个值来规定下载文件的名称。所允许的值没有限制,浏览器将自动检测正确的文件扩展名并添加到文件。注意:只有Firefox和Chrome支持download属性,如果涉及跨域情况下,d......
  • Dynamics 365 Marketing自定义渠道的步骤
    1.创建2个实体:渠道【new_flashinfosmschannel】、消息模板(配置窗体)注意:如果想用标准消息模板,可以不用创建消息模板标准消息模板效果:   2.导出解决方案,往XML增加一个关系【EntityRelationship】https://learn.microsoft.com/zh-cn/dynamics365/marketing/real-time-mark......
  • uni-app 数字输入框组件封装
    (文章目录)前言数字输入框是一个项目中常见的需求,其中的耦合度很高,完全可以将其封装起来使用,在使用的时候传入五个参数,分别为:最大值最小值默认值弹出层的开启与关闭确认后的回传数据一、创建数字输入框文件创建一个文件夹components,在文件夹中创建vue文件dialog二、......