美文网首页
vue实现遍历渲染可拖拽dom

vue实现遍历渲染可拖拽dom

作者: 柚子硕 | 来源:发表于2021-08-24 16:24 被阅读0次
function drag (el, binding, vnode) {
  el.onmousedown = function (event) {
    const x = event.pageX - el.offsetLeft
    const y = event.pageY - el.offsetTop

    const dragDomWidth = el.offsetWidth
    const dragDomHeight = el.offsetHeight

    const screenWidth = document.body.scrollWidth
    const screenHeight = binding.value || document.body.clientHeight

    const minDragDomLeft = 0
    const maxDragDomLeft = screenWidth - dragDomWidth

    const minDragDomTop = 0
    const maxDragDomTop = screenHeight - dragDomHeight

    document.onmousemove = function (event) {
      let top = event.pageY - y
      let left = event.pageX - x

      if (top < minDragDomTop) {
        top = minDragDomTop
      } else if (top > maxDragDomTop) {
        top = maxDragDomTop
      }

      if (left < minDragDomLeft) {
        left = minDragDomLeft
      } else if (left > maxDragDomLeft) {
        left = maxDragDomLeft
      }

      el.style.left = left + 'px'
      el.style.top = top + 'px'

      vnode.context.$emit('move', {
        top,
        left
      })
    }

    document.onmouseup = function () {
      vnode.context.$emit('drag-end', {
        top: el.style.top,
        left: el.style.left
      })
      document.onmousemove = null
      document.onmouseup = null
    }
  }
}

export default {
  bind: drag
}

组件
<template>
  <div
    v-drag="1080"
    class="points-area-wrap"
    :class="{ animation }"
    :style="pointStyle">
    <span
      v-if="$slots.default"
      class="point-title"
      @click="handleClick"><slot /></span>
    <span
      class="pin"
      @click="handleClick">
      <i class="iconfont icon-ios-pin" />
    </span>
  </div>
</template>

<script>
import drag from '@/directive/drag'

export default {
  name: 'PointsQuYu',
  directives: {
    drag
  },
  props: {
    animation: {
      type: Boolean,
      default: false
    },
    top: {
      type: String,
      default: null
    },
    left: {
      type: String,
      default: null
    },
    right: {
      type: String,
      default: null
    },
    bottom: {
      type: String,
      default: null
    }
  },
  data () {
    return {
      dragged: false
    }
  },
  computed: {
    pointStyle () {
      return {
        top: this.top || 0,
        left: this.left || 0
      }
    }
  },
  created () {
    this.$on('move', () => {
      this.dragged = true
    })
  },
  methods: {
    handleClick () {
      alert('quyu')
      if (!this.dragged) {
        this.$emit('click')
      } else {
        this.dragged = false
      }
    }
  }
}
</script>

<style scoped lang="stylus">
@keyframes bounce {
  25% {
    transform: translateY(10px);
  }

  50%, 100% {
    transform: translateY(0);
  }

  75% {
    transform: translateY(-10px);
  }
}

.points-area-wrap {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  z-index: 1;

  .point-title {
    width: auto;
    height: 25px;
    line-height: 25px;
    font-size: 15px;
    background-color: rgba(22, 65, 255, 0.8);
    border-radius: 24px;
    color: #fff;
    padding: 0 10px;
    cursor: pointer;
  }

  .pin {
    margin-top: 12px;
    width: 30px;
    height: 30px;
    cursor: pointer;

    .iconfont {
      color: #1890ff;
      font-size: 30px;
    }
  }

  &.animation {
    animation: bounce 1s linear infinite;
  }
}
</style>

相关文章

  • vue实现遍历渲染可拖拽dom

    组件

  • vue 弹窗可拖拽

    vue 弹窗可拖拽 通过自定义指令实现

  • 模板

    在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,Vue 能够智能地计算出最少需要重新渲染...

  • vue-语法

    在底层实现上,vue将模版编译成虚拟dom渲染函数。结合响应系统,vue能够智能地计算出最少需要渲染多少组件,并把...

  • vue基础:render函数(渲染函数)

    Vue里的虚拟DOM就是渲染函数生成的, Vue在底层实现中,会将模板编译成渲染函数,当然我们也可以不写模板,直接...

  • HTML5实现拖拽

    实现拖拽效果源元素 - 要拖拽的文件目标元素 - 要拖拽到哪里去 目前实现拖拽效果使用原生DOM就能实现 - 最麻...

  • 模板语法

    Vue使用基于HTML的模板语法 模板编译为虚拟DOM渲染函数 状态改变 Vue计算渲染组件最小代价更新DOM 也...

  • vue 虚拟dom

    vnode => dom虚拟 => 真是dom (vue 初始化渲染) 更新节点

  • Vue 实现可拖拽弹窗

    一、实现原理 1、获取鼠标在div中的位置2、设置 div 的 left 和 top 使其跟随鼠标位置移动,达到拖...

  • vue+node 打造简易商城系统

    vue和react的相同之处 利用虚拟DOM实现快速渲染; 轻量级; 响应式组件; 服务器端渲染; 易于集成路由工...

网友评论

      本文标题:vue实现遍历渲染可拖拽dom

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