vue自定義拖拽指令

創(chuàng)建完項目

1水由、main.js代碼

import Vue from 'vue'
import App from './App.vue'
import router from "./router/index.js";
import "@/assets/css/common.css";

Vue.config.productionTip = false

Vue.directive('drag', {
  bind: function (el, binding) {
    let oDiv = el;   //當前元素
    oDiv.onmousedown = function (e) {
      stopDefault()
      // 允許拖拽的最大距離
      let maxWidth = window.innerWidth - parseInt(window.getComputedStyle(oDiv).width)
      let maxHeight = window.innerHeight - parseInt(window.getComputedStyle(oDiv).height)

      //鼠標按下,計算當前元素距離可視區(qū)的距離
      let disX = e.clientX - oDiv.offsetLeft;
      let disY = e.clientY - oDiv.offsetTop;
      document.onmousemove = function (e) {
        //通過事件委托赛蔫,計算移動的距離 
        let l = e.clientX - disX;
        let t = e.clientY - disY;
        //移動當前元素  
        l = l >= maxWidth ? maxWidth : l <= 0 ? 0 : l;
        t = t >= maxHeight ? maxHeight : t <= 0 ? 0 : t;

        oDiv.style.left = l + 'px';
        oDiv.style.top = t + 'px';
        
      };
      document.onmouseup = function (e) {
         //將此時的位置傳出去
        let x = e.pageX >= maxWidth ? maxWidth : e.pageX <= 0 ? 0 : e.pageX;
        let y = e.pageY >= maxHeight ? maxHeight : e.pageY <= 0 ? 0 : e.pageY;
        binding.value({ x, y }, el)
        document.onmousemove = null;
        document.onmouseup = null;
      };
    };
  }
})

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

//阻止瀏覽器的默認行為 
function stopDefault(e) {
  //阻止默認瀏覽器動作(W3C) 
  if (e && e.preventDefault)
    e.preventDefault();
  //IE中阻止函數(shù)器默認動作的方式 
  else
    window.event.returnValue = false;
  return false;
}

2砂客、拖拽的組件

drag.vue

<template>
  <div class="dragContent" v-drag="drag" ref="drag">
    <slot></slot>
  </div>
</template>
<script>
export default {
  data() {
    return {}
  },
  mounted() {},
  methods:{
    drag(val, el) {
      this.$refs.drag.style.left = val.x;
      this.$refs.drag.style.top = val.y;
      console.log(val, el)
      this.$emit('confirmPoint',val)
    }
  }
}
</script>
<style lang="less" scoped>
.dragContent {
  position: fixed;
  top: 0;
  left: 0;
}
</style>

3、項目中調(diào)用

<template>
  <div>
    <h1>我是Index</h1>
    <div class="content">
      <div class="menu">
        <drag @confirmPoint="confirmPoint">
          <div class="block">拖我</div>
        </drag>
      </div>
      <div class="menuContent"></div>
    </div>
  </div>
</template>
<script>
import drag from '@/components/drag.vue'
export default {
  components: { drag },
  data() {
    return {}
  },
  mounted() {},
  methods: {
    confirmPoint(val, el) {
      console.log(val, el)
    }
  }
}
</script>

<style lang="less" scoped>
h1 {
  width: 100%;
  height: 30px;
  line-height: 30px;
  text-align: center;
  color: red;
}
.content {
  width: 100%;
  height: calc(100vh - 30px);
  display: flex;
  flex-direction: row;
  .menu {
    width: 150px;
    height: 100%;
    background: lightblue;
    .block {
      width: 50px;
      height: 50px;
      background: red;
      cursor: pointer;
    }
  }
  .menuContent {
    flex: 1;
    height: 100%;
    background: lightgray;
  }
}
</style>

4濒募、項目結(jié)構(gòu)

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鞭盟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瑰剃,更是在濱河造成了極大的恐慌齿诉,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晌姚,死亡現(xiàn)場離奇詭異粤剧,居然都是意外死亡,警方通過查閱死者的電腦和手機挥唠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門抵恋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宝磨,你說我怎么就攤上這事弧关。” “怎么了唤锉?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵世囊,是天一觀的道長。 經(jīng)常有香客問我窿祥,道長株憾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任晒衩,我火速辦了婚禮嗤瞎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘听系。我一直安慰自己贝奇,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布靠胜。 她就那樣靜靜地躺著弃秆,像睡著了一般届惋。 火紅的嫁衣襯著肌膚如雪髓帽。 梳的紋絲不亂的頭發(fā)上菠赚,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音郑藏,去河邊找鬼衡查。 笑死,一個胖子當著我的面吹牛必盖,可吹牛的內(nèi)容都是我干的拌牲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼歌粥,長吁一口氣:“原來是場噩夢啊……” “哼塌忽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起失驶,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤土居,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嬉探,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擦耀,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年涩堤,在試婚紗的時候發(fā)現(xiàn)自己被綠了眷蜓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡胎围,死狀恐怖吁系,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情白魂,我是刑警寧澤汽纤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站碧聪,受9級特大地震影響冒版,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逞姿,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一辞嗡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滞造,春花似錦续室、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽明郭。三九已至,卻和暖如春丰泊,著一層夾襖步出監(jiān)牢的瞬間薯定,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工瞳购, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留话侄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓学赛,卻偏偏與公主長得像年堆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盏浇,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容