美文网首页
vue.js封装多列布局拖拽(grid布局)

vue.js封装多列布局拖拽(grid布局)

作者: 六时未至 | 来源:发表于2020-12-09 09:30 被阅读0次

先看效果

多列布局拖拽
组件有替换重排两种方式,默认是重排方式,类似于手机九宫格的重排。
组件主要实现思路:计算出每个可拖拽组件的可移动范围,移动之后计算出目标位置的index,如果方式为重排,重新排列数组顺序;如果为替换,则直接替换数组中拖拽组件原始位置,以及最终位置的两个数据
使用方式比较简单,给出展示数据以及列数即可,如下:
<template>
  <uni-drag-group :column="3" :drag-data-list.sync="dragDataList" @drag-start="dragStart" @drag-end="dragEnd">
    <template v-slot:default="dragData"><div class="drag-data-div" >这是{{ dragData.data }}数据</div></template>
  </uni-drag-group>
</template>
<script>
export default {
  data: function() {
    return {
      dragDataList: ['1', '2', '3', '4', '5', '6']
    }
  },
  methods: {
    dragStart: function(event) {
      this.$message({
        type: 'info',
        message: `拖拽开始,通过console可以查看event参数, ${JSON.stringify(event)}`
      })
      console.info('拖拽开始', event)
    },
    dragEnd: function(event, dragList) {
      this.$message({
        type: 'info',
        message: `拖拽结束,通过console可以查看event参数, ${JSON.stringify(event)}, ${dragList}`
      })
      console.info('拖拽结束', event, dragList)
    }
  }
}
</script>
<style scoped>
.drag-data-div {
  background-color: green;
  color: #FFFFFF;
  width: 100px;
  height: 100px;
  line-height: 100px;
}
</style>

下面给出主要计算拖拽组件可移动范围的代码:完整代码请戳这里:传送门

// 计算当前元素可移动的区域
  getRangeOfEl: function(moveEl) {
      const index = parseInt(moveEl.style.gridArea.split(' / ')[0].split('-')[1])
      const res = {}
      const currentColummn = index % this.column
      res.minX = -((moveEl.offsetWidth + 5) * currentColummn)
      res.maxX = (this.column - currentColummn - 1) * (moveEl.offsetWidth + 5)
      const allRow = Math.ceil(this.dragList.length / this.column)
      const currentRow = Math.floor(index / this.column)
      res.minY = -((moveEl.offsetHeight + 5) * currentRow)
      res.maxY = (allRow - currentRow - 1) * (moveEl.offsetHeight + 5)
      return res
  },
// 计算最终目标位置的index值
getIndexOfMoveEL: function(moveEl) {
      const x = parseInt(moveEl.style.left.split('px')[0])
      const y = parseInt(moveEl.style.top.split('px')[0])
      const index = parseInt(moveEl.style.gridArea.split(' / ')[0].split('-')[1])
      let nowIndex = 0
      if (x < 0) {
        nowIndex = index - (Math.round(Math.abs(x) / moveEl.offsetWidth))
      } else {
        nowIndex = index + (Math.round(Math.abs(x) / moveEl.offsetWidth))
      }
      if (y < 0) {
        nowIndex = nowIndex - (Math.round(Math.abs(y) / moveEl.offsetHeight)) * this.column
      } else {
        nowIndex = nowIndex + (Math.round(Math.abs(y) / moveEl.offsetHeight)) * this.column
      }
      return { nowIndex, index }
  },

相关文章

  • vue.js封装多列布局拖拽(grid布局)

    先看效果 组件有 和 两种方式,默认是重排方式,类似于手机九宫格的重排。 组件主要实现思路:计算出每个可拖拽组件的...

  • css最佳布局方案Grid布局

    Grid网格布局 首先元素布局方式选择grid grid-template-columns分配一行里面占的列数bo...

  • 页面架构

    布局解决方案 水平居中布局 垂直居中布局 水平垂直都居中的布局 多列布局 多列等分布局 多列等高布局 在多列布局的...

  • Vue3.0实现拖拽布局

    最近遇到个需求需要对页面布局进行拖拽然后改变布局,保存布局 插件 首先,我们选择的插件是vue-grid-layo...

  • RecycleView相关

    多布局 List布局和Grid布局切换 解决与下拉刷新冲突

  • CSS3开发常用核心技能

    基础网页布局 布局分类 一列布局 两列布局 三列布局 多列布局 一列布局: 二列布局: 三列布局: ⚠️ midd...

  • 【融职培训】Web前端学习 第2章 网页重构16 grid布局

    一、grid布局概述 grid布局与flex布局对比 grid布局可以为网页提供更强大的布局功能,它与flex布局...

  • 九种常见的布局方式DEMO

    代码下载:百度云链接 提取码:227g 目录: Flex布局 grid布局 两列自适应布局 圣杯布局 双飞翼布局 ...

  • Grid布局相关属性

    定义display:grid或inline-grid开启子元素的Grid布局。 不同于flex布局,grid布局是...

  • 2020-02-03

    六、栅格布局方式Grid 众人云,Grid布局是CSS中最强的布局方式。Grid 布局与 Flex 布局有一定的相...

网友评论

      本文标题:vue.js封装多列布局拖拽(grid布局)

      本文链接:https://www.haomeiwen.com/subject/hobcgktx.html