微信小程序实现拖拽的小球

这篇具有很好参考价值的文章主要介绍了微信小程序实现拖拽的小球。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        

目录

前言 

js 

获取微信小程序中获取系统信息

触摸移动事件的处理函数

触摸结束事件的处理函数

 用于监听页面滚动事件

全局参数 

html

CSS


前言 

小程序开发提供了丰富的API和事件处理函数,使得开发者可以方便地实现各种交互功能。其中,拖拽功能是一个在许多应用场景中常见的需求,例如拖拽按钮、拖拽图片等。本文将介绍一个小程序页面中实现拖拽移动元素的功能的代码示例,并解析其实现原理。

js 

这段代码主要是一个小程序页面中实现了拖拽移动元素的功能。具体解释如下:

  1. getSysdata 函数:该函数使用 wx.getSystemInfo 方法获取系统的相关信息,如窗口宽度和高度,并将其存储到 that.data.window 数组中。之后根据一定的比例计算出一个定位值 write,再通过 that.setData 方法将 write 设置为页面的数据,在回调函数中使用 wx.createSelectorQuery 方法获取元素的宽度和高度,存储到 that.data.writesize 数组中。

  2. touchmove 函数:该函数是拖拽过程中触发的事件处理函数。通过获取触摸点的坐标减去元素宽度和高度的一半,再减去页面的滚动距离,得到当前元素的位置。然后判断该位置是否超出屏幕范围,如果超出则将位置设置为边界值。最后通过 that.setData 方法将最新的位置信息存储到页面数据中。

  3. onPageScroll 函数:该函数用于监听页面滚动事件,并将滚动距离存储到 this.data.scrolltop 中。

  4. touchend 函数:该函数是拖拽结束时触发的事件处理函数。首先获取当前元素的位置和窗口的宽度、高度以及元素的大小。如果当前位置在屏幕的左、右、上、下边缘处,则直接返回,不执行回到边缘的逻辑。否则,通过计算最近的水平边缘和垂直边缘的位置,并判断最近的边缘是水平边缘还是垂直边缘,将元素位置设置为最近边缘的位置。最后通过 that.setData 方法将最新的位置信息存储到页面数据中。

获取微信小程序中获取系统信息

这段代码是一个小程序(微信小程序)中的 JavaScript 代码段,用于获取系统信息和元素尺寸,并做一些相关的计算和操作。具体来说,它执行以下操作:

  1. 首先,定义了一个函数 getSysdata,这个函数似乎是用来获取系统信息和元素尺寸的。

  2. 在函数内部,通过调用 wx.getSystemInfo 函数来获取系统信息。这个函数的结果会在 success 回调函数中被处理。

  3. 在 success 回调函数中,将获取到的系统窗口宽高(windowWidth 和 windowHeight)存储在 that.data.window 数组中。

  4. 接下来,根据一定的逻辑计算得到一个名为 write 的数组,其中 write[0] 是系统窗口宽度的某个百分比(that.data.writePosition[0])以像素为单位的值,而 write[1] 则是系统窗口高度的某个百分比(that.data.writePosition[1])以像素为单位的值。

  5. 使用 that.setData 函数来更新小程序的数据,将 write 数组设置为新的数据。在这里还提供了一个回调函数,在这个回调函数中执行如下操作:

    • 使用 wx.createSelectorQuery() 创建一个查询对象。
    • 使用 .select(".kefuBtn") 选择页面中类名为 .kefuBtn 的元素。
    • 调用 .boundingClientRect 方法获取该元素的宽度和高度,并将结果存储在 that.data.writesize 数组中。
    • 最后,通过调用 .exec() 执行上述查询操作。

总之,这段代码用于在微信小程序中获取系统信息(窗口尺寸)和特定元素的尺寸,并进行一些相关的计算和操作,可能是为了适应不同尺寸的设备和显示效果。


  getSysdata: function () {
    var that = this;
    wx.getSystemInfo({
      success: function (e) {
        that.data.window = [e.windowWidth, e.windowHeight];
        var write = [];
        write[0] = (that.data.window[0] * that.data.writePosition[0]) / 100;
        write[1] = (that.data.window[1] * that.data.writePosition[1]) / 100;
        console.log(write, 45);
        that.setData(
          {
            write: write,
          },
          function () {
            // 获取元素宽高
            wx.createSelectorQuery()
              .select(".kefuBtn")
              .boundingClientRect(function (res) {
                console.log(res.width);
                that.data.writesize = [res.width, res.height];
              })
              .exec();
          }
        );
      },
      fail: function (e) {
        console.log(e);
      },
    });
  },

触摸移动事件的处理函数

这段代码是一个用来处理触摸移动事件的函数。当用户在页面上进行触摸移动操作时,该函数会被触发。

代码中的各个部分的功能如下所示:

  1. 首先,通过var that = this;将当前上下文的this对象赋值给变量that,以确保在后续的代码中能够正确访问到页面的数据。

  2. 然后,通过e.touches[0].pageXe.touches[0].pageY获取当前触摸点相对于页面的水平和垂直位置,并将其分别存储在数组position的第一个和第二个元素中。同时,通过减去写作框的宽度的一半(that.data.writesize[0] / 2)和减去垂直滚动的偏移量(this.data.scrolltop)来调整写作框的中心位置。

  3. 接下来,通过that.data.window[0]that.data.window[1]分别获取屏幕的宽度和高度,以便后续判断写作框是否超出屏幕范围。

  4. 使用条件语句判断写作框的水平和垂直位置是否超出屏幕范围。如果水平位置小于0,则将其设为0,以保证写作框不会超出屏幕左侧边界。如果水平位置大于屏幕宽度减去写作框宽度,则将其设为屏幕宽度减去写作框宽度,以保证写作框不会超出屏幕右侧边界。对于垂直位置,也进行了类似的判断和限制。

  5. 最后,通过that.setData()方法将更新后的写作框位置应用到页面上,即将position赋值给write,以使得写作框显示在调整后的位置上。

综上所述,这段代码的主要功能是根据用户的触摸移动操作来调整写作框的位置,并保证写作框不会超出屏幕范围。

  //开始拖拽
  touchmove: function (e) {
    var that = this;
    var position = [
      e.touches[0].pageX - that.data.writesize[0] / 2,
      e.touches[0].pageY - that.data.writesize[1] / 2 - this.data.scrolltop,
    ];

    // 获取屏幕宽高
    var windowWidth = that.data.window[0];
    var windowHeight = that.data.window[1];

    // 判断是否超出屏幕范围
    if (position[0] < 0) {
      position[0] = 0;
    } else if (position[0] > windowWidth - that.data.writesize[0]) {
      position[0] = windowWidth - that.data.writesize[0];
    }

    if (position[1] < 0) {
      position[1] = 0;
    } else if (position[1] > windowHeight - that.data.writesize[1]) {
      position[1] = windowHeight - that.data.writesize[1];
    }

    that.setData({
      write: position,
    });

触摸结束事件的处理函数

这段代码是一个用于处理触摸结束事件的函数。在移动设备的触摸屏上,当用户的手指从屏幕上抬起时,会触发这个事件。代码的目的是确保用户在写字过程中,当触摸结束时,字的位置会自动靠近最近的屏幕边缘。

具体的步骤如下:

  1. 通过touchend事件处理函数来执行以下操作。

  2. 从事件对象中获取当前写字的位置,这个位置信息保存在position变量中。

  3. 获取屏幕的宽度和高度,并将它们分别保存在windowWidthwindowHeight变量中。

  4. 获取写字区域的尺寸,这个尺寸信息保存在writesize变量中。

  5. 如果当前写字位置已经在屏幕的左、右边缘或上、下边缘,那么直接返回,不执行后续的将位置回到边缘的逻辑。

  6. 如果当前写字位置不在边缘,那么计算离当前位置最近的水平边缘和垂直边缘。

  7. 判断最近的边缘是水平边缘还是垂直边缘,通过比较写字位置与屏幕中心的距离来决定。

  8. 如果最近的边缘是水平边缘,将写字位置的水平坐标设置为最近水平边缘的值,使得字能够贴近水平边缘。

  9. 如果最近的边缘是垂直边缘,将写字位置的垂直坐标设置为最近垂直边缘的值,使得字能够贴近垂直边缘。

  10. 最后,更新写字位置的数据,将位置信息设置为回到边缘后的位置。

总之,这段代码的作用是确保在用户停止触摸屏幕后,写字位置会自动靠近离它最近的屏幕边缘,从而使得写字的体验更加舒适和方便。

  touchend: function (e) {
    var that = this;
    var position = that.data.write;
    var windowWidth = that.data.window[0];
    var windowHeight = that.data.window[1];
    var writesize = that.data.writesize;

    // 如果位置在屏幕左、右边缘或上、下边缘,直接返回,不执行回到边缘的逻辑
    if (
      position[0] === 0 ||
      position[0] === windowWidth - writesize[0] ||
      position[1] === 0 ||
      position[1] === windowHeight - writesize[1]
    ) {
      return;
    }

    // 如果位置不是边缘,则自动回到最近的边缘
    var closestHorizontalEdge =
      Math.abs(position[0] - windowWidth / 2) < Math.abs(position[0])
        ? windowWidth - writesize[0]
        : 0;
    var closestVerticalEdge =
      Math.abs(position[1] - windowHeight / 2) < Math.abs(position[1])
        ? windowHeight - writesize[1]
        : 0;

    // 检查最近的边缘是水平边缘还是垂直边缘
    if (
      Math.abs(closestHorizontalEdge - position[0]) <
      Math.abs(closestVerticalEdge - position[1])
    ) {
      position[0] = closestHorizontalEdge;
    } else {
      position[1] = closestVerticalEdge;
    }

    that.setData({
      write: position,
    });
  },

 用于监听页面滚动事件

onPageScroll 函数:该函数用于监听页面滚动事件,并将滚动距离存储到 this.data.scrolltop 中。 

  onPageScroll(e) {
    this.data.scrolltop = e.scrollTop;
  },

全局参数 

  data: {
    // 拖拽参数
    writePosition: [85, 35], //默认定位参数
    writesize: [0, 0], // 元素大小
    window: [0, 0], //屏幕尺寸
    write: [0, 0], //定位参数
    scrolltop: 0, //据顶部距离
  },

html  

这段代码是一个 HTML 的按钮元素,在页面上显示为一个按钮图标。按钮具有以下特性和功能:文章来源地址https://www.toymoban.com/news/detail-651295.html

  • open-type="contact":表示按钮的点击行为,当点击按钮时,会打开客服对话框,用户可以与客服进行沟通。
  • bindtouchmove="touchmove"、catch:touchmove:表示当按钮被触摸移动时触发 touchmove 方法,这个方法可能是由程序定义和实现的。
  • style="left:{{write[0]}}px;top:{{write[1]}}px;":表示按钮的定位样式,left 和 top 样式用于指定按钮的水平和垂直位置。{{write[0]}} 和 {{write[1]}} 是可能由程序动态设置的变量。
  • catch:touchend="touchend":表示当按钮触摸结束时触发 touchend 方法,这个方法可能是由程序定义和实现的。
<button class='kefuBtn' open-type="contact"  bindtouchmove="touchmove" catch:touchmove style="left:{{write[0]}}px;top:{{write[1]}}px;" catch:touchend="touchend">
  <image class="kefu" src="../../iimage/kefu.png" />
</button>

CSS

.kefuBtn {
  position: absolute;
  background-color: transparent;
  border: none;
  outline: none;

  background: #fff !important;
  border-radius: 0rpx;
  padding: 0rpx;
  margin: 0rpx;
  display: inline-block;
  line-height: 1;
  width: 112rpx !important;
  height: 112rpx !important;
  border-radius: 50%;
  box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.15)
}

button::after {
  /*button的边框样式是通过::after方式实现的*/
  border: none;
}

.kefuBtn image {
  width: 112rpx;
  height: 112rpx;
}

到了这里,关于微信小程序实现拖拽的小球的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • django boostrap html实现可拖拽的左右布局,鼠标拖动调整左右布局的大小或占比

          最近需要在Django项目中,实现一个左右布局的html页面,页面框架使用的是boostrap。但这个布局不是简单的左右分栏布局,而是需要实现可以通过鼠标拖拽的方式动态调整左右两侧布局的大小和占比。效果大致如下:         一开始,页面分为左右两块布局:   鼠标放

    2024年02月13日
    浏览(30)
  • 微信小程序图片拖拽排序组件

    图片拖拽排序是一个比较常用的组件,常用于发帖或者评论等内容上传模块,我借鉴了《一款优雅的小程序拖拽排序组件实现》这篇文章的拖拽思路,封装成wx-drag-img发布到npm 实现原理:每个图片初始化我都会封装成一个拖拽的数据结构,然后通过触发touch事件,根据key的变

    2024年02月09日
    浏览(47)
  • 微信小程序获取当前位置,支持位置搜索,拖拽定位

    场景:微信小程序收货地址,导航地址,定位等需求 微信开发者工具示例: 手机调试示例: 附上完整代码(在程序里写入这个方法,写点击事件直接进行方法调用,会自动唤起微信地图页面,如上图所示): 在调试过程中遇到位置授权问题,部分手机无法展示页面,一直停

    2024年02月12日
    浏览(39)
  • 微信小程序中的拖拽和缩放图片功能

    在现代的移动应用开发中,拖拽和缩放功能变得越来越重要。它们不仅使应用程序更具交互性,还为用户提供了更直观、更高效的使用体验。微信小程序作为一个流行的开发平台,也提供了这样的功能。以下是在微信小程序中实现拖拽和缩放图片的步骤和注意事项。 1.设置图

    2024年03月14日
    浏览(41)
  • Qt编写可拖拽的自定义控件

    一直想做一个像卡牌游戏一样的,可以拖动卡片,实现改变位置,顺序交换的效果,今天我们一起来尝试一下。 类名为Card h文件 cpp文件 我们完成了一个很简单的200*400的圆角卡片 在主界面中展示看看 widget.h widget.cpp 运行后的效果: 首先要实现控件拖动,需要有2个要素,1:

    2024年02月11日
    浏览(36)
  • Vue3封装可拖拽的弹窗

    核心代码(复制就可以使用了) 使用方式

    2024年01月19日
    浏览(32)
  • 基于movable-view的微信小程序拖拽排序(含源码)

    目录 一、前言与效果展示 二、源码 1.目录结构 2.drag.wxml文件 3.drag.wxss文件 (1)drag.less (2)drag.wxss  不会使用less的就用这个 4.drag.js文件 5.drag.json文件 三、结语         最近在做一个账本,里面有个功能需要“拖拽排序”,网上的代码我也看不太懂,打算自己写一个。微信

    2024年02月03日
    浏览(30)
  • 封装React组件DragLine,鼠标拖拽的边框改变元素宽度

    原文合集地址如下,有需要的朋友可以关注 本文地址 合集地址 在项目中,设计说想做个面板,其宽度随鼠标拖拽而变化,有最大最小值。基于这个小功能封装一个可拖拽组件,在需要的地方引入即可。 这里只是实现x方向的拖拽,y轴拖拽思路差不多。 既然是鼠标操作,那肯

    2024年02月16日
    浏览(30)
  • zm-org-tree可拖拽的组织树,简易好上手

    目录 1.简介 2.安装及使用 下载包 main.js全局引用 页面使用    数据要求 配合使用 3.基础使用 4.较深入使用 5.修改后的代码如下 一个不算太简易的简易版组织架构图,组件依赖于vue-org-tree, 在此基础上将部分源代码进行优化修改。增加鼠标拖拽和鼠标滚轮缩放,并支持节点拖

    2024年02月12日
    浏览(33)
  • Unity之XR Interaction Toolkit如何在VR中实现一个可以拖拽的UI

    普通的VR项目中,我们常见的UI都是一个3D的UI,放置在场景中的某个位置,方便我们使用射线点击。但是为了更好的体验,我们可能会有跟随头显的UI,或者可拖拽的UI,这样更方便用户去操作。 所以我们今天的需求就是:如何基于XR Interaction Toolkit 插件 在VR中使用手柄射线来

    2024年02月19日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包