效果:連接兩個(gè)div帶箭頭的虛線,拖動(dòng)div時(shí)保持線條實(shí)時(shí)改變位置保持始終連接
效果圖:
用帶箭頭的虛線將兩個(gè)位置不固定的div連接起來(lái),初聽到這個(gè)需求一頭霧水,傳統(tǒng)的div可以做直線,但斜起來(lái)不太好做,幸虧之前接觸過(guò)svg,里面有一個(gè)line標(biāo)簽,知道起始中止兩個(gè)點(diǎn)的位置,就可以將兩個(gè)點(diǎn)連接起來(lái)了。
至于箭頭,可以這么做先定義箭頭:
將箭頭放在直線上:marker-end="url(#arrow)"
2.確定起始中止兩個(gè)點(diǎn)左上角的位置
需要連接的兩個(gè)div及SVG都相對(duì)于某一個(gè)div.wrap絕對(duì)定位,可以先求得兩個(gè)div左上角相對(duì)與div.wrap坐標(biāo):
//獲取元素左上角相對(duì)于某一元素的的位置 function getElCoordinate(dom) { var t = dom.offsetTop; var l = dom.offsetLeft; var w = dom.offsetWidth; var h = dom.offsetHeight; dom = dom.offsetParent; while (!$(dom).hasClass("wrap")) { t += dom.offsetTop; l += dom.offsetLeft; dom = dom.offsetParent; }; return { top: t,//Y軸坐標(biāo) left: l,//X軸坐標(biāo) width:w,//元素寬度 height:h//元素高度 }; } })3.確定連接點(diǎn)在div上的位置:
分為兩種情況:終點(diǎn)div位于起點(diǎn)div上方,終點(diǎn)div位于起點(diǎn)div下方。
var pos1 = getElCoordinate($(".item1")[0])//起點(diǎn)div的位置 var pos2 = getElCoordinate($(".item2")[0])//終點(diǎn)div的位置 function getPos(pos1, pos2){ //分兩種情況 var x1,y1,x2,y2; if(pos2.top4.確定起止點(diǎn)位置后連線。 function move(){ var pos1 = getElCoordinate($(".item1")[0]) var pos2 = getElCoordinate($(".item2")[0]) var start = getPos(pos1, pos2).start var end = getPos(pos1, pos2).end $("#line").attr({ x1: start.x, y1: start.y, x2: end.x, y2: end.y }) $("#path").attr({ d: "M20,20 L100,100" }) } move()5.兩個(gè)div分別拖動(dòng)并保持線始終連接drag($(".item"), move) function drag(obj,callback) { var dragEles = obj; dragEles.each(function(index, dragEleDom){ var _move = false;//移動(dòng)標(biāo)記 var _x, _y;//鼠標(biāo)離控件左上角的相對(duì)位置 var dragEle = $(dragEleDom) dragEle.click(function () { //alert("click");//點(diǎn)擊(松開后觸發(fā)) }).mousedown(function (e) { _move = true; _x = e.pageX - parseInt(dragEle.css("left")); _y = e.pageY - parseInt(dragEle.css("top")); // dragEle.fadeTo(20, 0.9);//點(diǎn)擊后開始拖動(dòng)并透明顯示 }); $(document).mousemove(function (e) { if (_move) { var x = e.pageX - _x;//移動(dòng)時(shí)根據(jù)鼠標(biāo)位置計(jì)算控件左上角的絕對(duì)位置 var y = e.pageY - _y; dragEle.css({ top: y, left: x });//控件新位置 if(callback){callback()} } }).mouseup(function () { _move = false; dragEle.fadeTo("fast", 1);//松開鼠標(biāo)后停止移動(dòng)并恢復(fù)成不透明 }); }) }梳理下流程:分析需求>確定使用SVG>找到連接點(diǎn)>連線>拖動(dòng)時(shí)保持連線。 源碼托管于github歡迎star
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89619.html
摘要:拖了這么久,現(xiàn)在終于要開始硬著頭皮寫一篇基于的流程圖偽教程文章了。本教程主要講述一個(gè)基于如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的流程圖,更多引發(fā)的思考是,什么項(xiàng)目更適合使用這種模式的框架,以及如何發(fā)揮的價(jià)值。 嚴(yán)重拖延癥,一方面這項(xiàng)目模塊純屬個(gè)人娛樂(lè)。另一方面,流程圖這塊涉及的東西還是蠻多的,這次也只是介紹一些簡(jiǎn)單的部分。拖了這么久,現(xiàn)在終于要開始硬著頭皮寫一篇基于vue+svg的流程圖偽教程文章了。初次獻(xiàn)...
摘要:拖了這么久,現(xiàn)在終于要開始硬著頭皮寫一篇基于的流程圖偽教程文章了。本教程主要講述一個(gè)基于如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的流程圖,更多引發(fā)的思考是,什么項(xiàng)目更適合使用這種模式的框架,以及如何發(fā)揮的價(jià)值。 嚴(yán)重拖延癥,一方面這項(xiàng)目模塊純屬個(gè)人娛樂(lè)。另一方面,流程圖這塊涉及的東西還是蠻多的,這次也只是介紹一些簡(jiǎn)單的部分。拖了這么久,現(xiàn)在終于要開始硬著頭皮寫一篇基于vue+svg的流程圖偽教程文章了。初次獻(xiàn)...
閱讀 2745·2021-09-26 10:19
閱讀 2176·2021-09-24 10:27
閱讀 2553·2021-09-01 10:42
閱讀 2333·2019-08-29 16:09
閱讀 2514·2019-08-29 15:17
閱讀 1479·2019-08-29 15:09
閱讀 663·2019-08-29 11:14
閱讀 2340·2019-08-26 13:25