2017-01-11 1 views
0

나는 거의 포기. 무엇을 잘못 체크 아웃 (누군가 내 드래그 및 코드 수정을 도와 줄 수 있습니까? 나는 문제가 나는 청취자와 event.targets을 처리하고 방법에 알고 ('가 절반 방식으로 작동 얻을 관리 스 니펫을 시도 (</p> <p>을하지만 난 알아낼 수 없습니다;

목표는 모든 "재고"클래스 요소가 복사 드래그 & 될 수 있는지 확인하는 것입니다 모두 "드래그"클래스 요소는 드래그 &이 삭제 될 수 있습니다

내가 일을 통해 작업을 얻을 수 있었다.. "double click"기본적으로 DragnClick 함수를 클릭하면 draggable 함수가 생성되고 다음으로 드래그 - 트릭을 수행합니다

하지만 한 번의 클릭으로 어떻게 만들 수 있습니까? 드래그 이벤트를 Draggable에 전달하는 방법은 무엇입니까?

//var morphUIon = false; 
 
var morphTarget = null; 
 
var drag = null; 
 
var canvas = {}; 
 
var inventory = {}; 
 
canvas = document.getElementById("canvas"); 
 
inventory = document.getElementById("inventory"); 
 

 
window.onload = function() { 
 
    for (i=0;i<6;i++) { 
 
    document.getElementsByClassName("inventory")[i].addEventListener("mousedown", DragnCopy); 
 
    } 
 
} 
 

 
function DragnCopy(e) { 
 
    e.preventDefault(); 
 
    var copy = e.target.cloneNode(true); 
 
    copy.classList.remove("inventory"); 
 
    copy.classList.add("draggable"); 
 
\t canvas.appendChild(copy); 
 
\t drag = new Draggable(copy); 
 
} 
 

 
function Draggable(elem, event) { 
 
    this.target = elem 
 
    this.clickPoint = this.target.ownerSVGElement.createSVGPoint() 
 
    this.lastMove = this.target.ownerSVGElement.createSVGPoint() 
 
    this.currentMove = this.target.ownerSVGElement.createSVGPoint() 
 
    this.dpath = this.target.getAttribute("d") 
 
    this.subclass = this.target.getAttribute("subclass") 
 
    this.target.pathPoints = parsePathToPoints(this.dpath, this.subclass) 
 
    this.target.addEventListener("dblclick", this) 
 
    this.target.addEventListener("mousedown", this) 
 
    this.handleEvent = function(evt) { 
 
     switch (evt.type) { 
 
      case 'mousedown': 
 
       evt.preventDefault() 
 
       this.clickPoint = globalToLocalCoords(evt.clientX, evt.clientY) 
 
       this.target.classList.add("dragged") 
 
       this.target.ownerSVGElement.addEventListener("mousemove", this.move) 
 
       this.target.ownerSVGElement.addEventListener("mouseup", this.endMove) 
 
       break; 
 
      case 'dblclick': 
 
       evt.preventDefault() 
 
       if (morphTarget) { 
 
        if (morphTarget!=this.target) { 
 
        morphTarget.classList.remove("morphed") 
 
        this.target.classList.add("morphed") 
 
        morphTarget = this.target; 
 
        } else { 
 
        return; 
 
        } 
 
       } else { 
 
        morphTarget = this.target 
 
        this.target.classList.add("morphed") 
 
       } 
 
       //Morph(this.target); 
 
       break; 
 
     } 
 
    } 
 
    this.move = function(evt) { 
 
    evt.preventDefault() 
 
    var p = globalToLocalCoords(evt.clientX, evt.clientY) 
 
    this.currentMove.x = this.lastMove.x + (p.x - this.clickPoint.x) 
 
    this.currentMove.y = this.lastMove.y + (p.y - this.clickPoint.y) 
 
    this.target.setAttribute("transform", "translate(" + this.currentMove.x + "," + this.currentMove.y + ")") 
 
    }.bind(this) 
 
    this.endMove = function(evt) { 
 
    this.lastMove.x = this.currentMove.x 
 
    this.lastMove.y = this.currentMove.y 
 
    this.target.classList.remove("dragged") 
 
    //this.target.setAttribute("pointer-events", "all") 
 
    this.target.ownerSVGElement.removeEventListener("mousemove", this.move) 
 
    this.target.ownerSVGElement.removeEventListener("mouseup", this.endMove) 
 
    }.bind(this) 
 
    function globalToLocalCoords(x, y) { 
 
    var p = elem.ownerSVGElement.createSVGPoint() 
 
    var m = elem.parentNode.getScreenCTM() 
 
    p.x = x 
 
    p.y = y 
 
    return p.matrixTransform(m.inverse()) 
 
    } 
 
} 
 

 
function Morph(elem) { 
 
    console.log(elem); 
 
} 
 

 
function parsePathToPoints(d, sub) { 
 
    var darray = []; 
 
    var pathPoints = {}; 
 
    switch (sub) { 
 
      case 'circle': 
 
       darray = d.replace(/M|A|Z/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       pathPoints.p0 = {"x": darray[0], "y": darray[1]}; 
 
       pathPoints.p1 = {"x": darray[0]+darray[2], "y": darray[1]-darray[3]}; 
 
       pathPoints.p2 = {"x": darray[7], "y": darray[8]}; 
 
       pathPoints.p3 = {"x": darray[0]+darray[2], "y": darray[1]+darray[3]}; 
 
       pathPoints.p4 = {"x": darray[2], "y": darray[3]}; // = radius used in the circle path 
 
       return pathPoints; 
 
      break; 
 
      case 'curve4': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length-2; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       }; 
 
       return pathPoints; 
 
      break; 
 
      case 'curve3': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number) 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       } 
 
       return pathPoints; 
 
      break; 
 
      case 'curve2': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       } 
 
       return pathPoints; 
 
      break; 
 
      case 'curve1': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       } 
 
       return pathPoints; 
 
      break; 
 
      case 'cubic': 
 
       darray = d.replace(/M|C/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
        pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
\t \t \t    } 
 
       return pathPoints; 
 
      break; 
 
    } 
 
} 
 

 
function pointsToPath(pathPoints, pathSubclass) { 
 
    console.log("joining "+pathPoints+"for a "+pathSubclass); 
 
}
html, body { 
 
\t margin: 0; 
 
\t padding: 0; 
 
\t border: 0; 
 
\t overflow:hidden; 
 
\t background-color: #fff; \t 
 
} 
 
svg { 
 
    position: fixed; 
 
\t top:0%; 
 
\t left:0%; 
 
\t width:100%; 
 
\t height:100%; 
 
} 
 
.inventory { 
 
    fill: transparent; 
 
\t stroke: black; 
 
    cursor: move; 
 
} 
 
.draggable { 
 
    fill: transparent; 
 
\t stroke: blue; 
 
    cursor: move; 
 
} 
 
.dragged { 
 
    fill: transparent; 
 
\t stroke: green; 
 
    cursor: move; 
 
} 
 
.morphed { 
 
    fill: transparent; 
 
\t stroke: red; 
 
    cursor: move; 
 
} 
 
.lines { 
 
\t stroke: green; 
 
    stroke-dasharray: 8,5; 
 
    stroke-width: 1; 
 
    opacity: 0.5; 
 
} 
 
path 
 
{ 
 
\t stroke-width: 3; 
 
\t stroke: #000; 
 
\t stroke-linecap: round; 
 
} 
 
path.fill 
 
{ 
 
\t fill: #3ff; 
 
} 
 
#canvasBackground { 
 
\t fill: lightgrey; 
 
} 
 
#inventoryBackground { 
 
\t fill: grey; 
 
} 
 
#morphUIrect { 
 
    fill: none; 
 
    stroke: blue; 
 
    stroke-dasharray: 10,5; 
 
    opacity: 0.1; 
 
} 
 
.label { 
 
    fill: grey; 
 
}
<body> 
 
<svg id="svg" 
 
    height="480" 
 
    width="480" 
 
\t viewbox="0 0 480 580" 
 
\t preserveAspectRatio="xMinYMax meet" 
 
\t xmlns="http://www.w3.org/2000/svg" 
 
\t xmlns:xlink="http://www.w3.org/1999/xlink" 
 
> 
 
<rect id="canvasBackground" width="480" height="480" x="0" y="0" pointer-events="all"/> 
 
<rect id="inventoryBackground" width="480" height="100" x="0" y="480" pointer-events="all"/> 
 

 
<g id="inventory"> 
 
<path class="inventory" subclass="circle" d="M30,530 A35,35 1 1,1 100,530 A35,35 1 1,1 30,530" /> 
 
<path class="inventory" subclass="curve4" d="M125,500 Q155,490 185,500 Q195,530 185,560 Q155,570 125,560 Q115,530 125,500" /> 
 
<path class="inventory" subclass="curve3" d="M245,495 Q275,520 280,560 Q245,570 210,560 Q215,520 245,495" /> 
 
<path class="inventory" subclass="curve2" d="M305,515 Q345,475 385,515 Q345,555 305,515"/> 
 
<path class="inventory" subclass="curve1" d="M305,550 Q345,580 385,550"/> 
 
<path class="inventory" subclass="cubic" d="M420,495 C470,530 380,530 425,565"/> 
 
</g> 
 

 
<g id="canvas"> 
 
</g> 
 
    
 
<g id="morphUI"> 
 
<rect id="morphUIrect" visibility = "visible" x="0" y="0" width="0" height="0"></rect> 
 
<line id="l0" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l1" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l2" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l3" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l4" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l5" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l6" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l7" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<circle id="0" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="1" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="2" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="3" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="4" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="5" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="6" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="7" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="8" visibility = "hidden" class="control" cx="0" cy="0" r="10" _x="0" _y="0"/> 
 
</g> 
 
</svg> 
 
</body>

+0

나도 뭐가 잘못 알아낼 수 없습니다. 예상대로 정확히 작동하지 않는 것을 설명해 주시겠습니까? 나에게이 발췌 문장은 효과가있는 것처럼 보인다. – Thomas

+0

글쎄, 내가 언급 한 목표를 본다.이 발췌문에서 첫 번째 드래그 후에 드래그 가능한 요소를 움직일 수는 없다. –

+0

내가 할 수있는 최선을 다해 편집했습니다. 근본적으로 이제는 드래그 & 복사를하기 위해 2 번의 클릭이 필요한 것을 제외하고는 모든 것이 잘 작동합니다. 먼저 드래그를 시작하려면 두 번째 클릭을 복사하려면 클릭하십시오. 이벤트를 어떻게 병합합니까? 사용자가 처음부터 클릭하여 끌 수 있도록하려면? –

답변

0

당신은 두 개의 별도 mouseDown 이벤트 핸들러를 가지고있다. 인벤토리 항목을 복제 한 후에 만 ​​드래그를 시작하는 두 번째 항목이 추가됩니다.

인벤토리를 클릭 할 때 드래그를 시작하려면 드래그 시작 코드를 첫 번째 마우스 처리기로 옮겨야합니다.

아래의 예제에서는 방금 첫 번째 mousedown 처리기에서 호출하는 'startMove()'함수로 이동했습니다.

//var morphUIon = false; 
 
var morphTarget = null; 
 
var drag = null; 
 
var canvas = {}; 
 
var inventory = {}; 
 
canvas = document.getElementById("canvas"); 
 
inventory = document.getElementById("inventory"); 
 

 
window.onload = function() { 
 
    for (i=0;i<6;i++) { 
 
    document.getElementsByClassName("inventory")[i].addEventListener("mousedown", DragnCopy); 
 
    } 
 
} 
 

 
function DragnCopy(e) { 
 
    e.preventDefault(); 
 
    var copy = e.target.cloneNode(true); 
 
    copy.classList.remove("inventory"); 
 
    copy.classList.add("draggable"); 
 
    canvas.appendChild(copy); 
 
    drag = new Draggable(copy); 
 
    drag.startMove(e); 
 
} 
 

 
function Draggable(elem, event) { 
 
    this.target = elem 
 
    this.clickPoint = this.target.ownerSVGElement.createSVGPoint() 
 
    this.lastMove = this.target.ownerSVGElement.createSVGPoint() 
 
    this.currentMove = this.target.ownerSVGElement.createSVGPoint() 
 
    this.dpath = this.target.getAttribute("d") 
 
    this.subclass = this.target.getAttribute("subclass") 
 
    this.target.pathPoints = parsePathToPoints(this.dpath, this.subclass) 
 
    this.target.addEventListener("dblclick", this) 
 
    this.target.addEventListener("mousedown", this) 
 
    this.handleEvent = function(evt) { 
 
     switch (evt.type) { 
 
      case 'dblclick': 
 
       evt.preventDefault() 
 
       if (morphTarget) { 
 
        if (morphTarget!=this.target) { 
 
        morphTarget.classList.remove("morphed") 
 
        this.target.classList.add("morphed") 
 
        morphTarget = this.target; 
 
        } else { 
 
        return; 
 
        } 
 
       } else { 
 
        morphTarget = this.target 
 
        this.target.classList.add("morphed") 
 
       } 
 
       //Morph(this.target); 
 
       break; 
 
     } 
 
    } 
 
    
 
    this.startMove = function(evt) { 
 
    this.clickPoint = globalToLocalCoords(evt.clientX, evt.clientY) 
 
    this.target.classList.add("dragged") 
 
    this.target.ownerSVGElement.addEventListener("mousemove", this.move) 
 
    this.target.ownerSVGElement.addEventListener("mouseup", this.endMove) 
 
    } 
 

 
    this.move = function(evt) { 
 
    evt.preventDefault() 
 
    var p = globalToLocalCoords(evt.clientX, evt.clientY) 
 
    this.currentMove.x = this.lastMove.x + (p.x - this.clickPoint.x) 
 
    this.currentMove.y = this.lastMove.y + (p.y - this.clickPoint.y) 
 
    this.target.setAttribute("transform", "translate(" + this.currentMove.x + "," + this.currentMove.y + ")") 
 
    }.bind(this) 
 
    this.endMove = function(evt) { 
 
    this.lastMove.x = this.currentMove.x 
 
    this.lastMove.y = this.currentMove.y 
 
    this.target.classList.remove("dragged") 
 
    //this.target.setAttribute("pointer-events", "all") 
 
    this.target.ownerSVGElement.removeEventListener("mousemove", this.move) 
 
    this.target.ownerSVGElement.removeEventListener("mouseup", this.endMove) 
 
    }.bind(this) 
 
    function globalToLocalCoords(x, y) { 
 
    var p = elem.ownerSVGElement.createSVGPoint() 
 
    var m = elem.parentNode.getScreenCTM() 
 
    p.x = x 
 
    p.y = y 
 
    return p.matrixTransform(m.inverse()) 
 
    } 
 
} 
 

 
function Morph(elem) { 
 
    console.log(elem); 
 
} 
 

 
function parsePathToPoints(d, sub) { 
 
    var darray = []; 
 
    var pathPoints = {}; 
 
    switch (sub) { 
 
      case 'circle': 
 
       darray = d.replace(/M|A|Z/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       pathPoints.p0 = {"x": darray[0], "y": darray[1]}; 
 
       pathPoints.p1 = {"x": darray[0]+darray[2], "y": darray[1]-darray[3]}; 
 
       pathPoints.p2 = {"x": darray[7], "y": darray[8]}; 
 
       pathPoints.p3 = {"x": darray[0]+darray[2], "y": darray[1]+darray[3]}; 
 
       pathPoints.p4 = {"x": darray[2], "y": darray[3]}; // = radius used in the circle path 
 
       return pathPoints; 
 
      break; 
 
      case 'curve4': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length-2; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       }; 
 
       return pathPoints; 
 
      break; 
 
      case 'curve3': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number) 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       } 
 
       return pathPoints; 
 
      break; 
 
      case 'curve2': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       } 
 
       return pathPoints; 
 
      break; 
 
      case 'curve1': 
 
       darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
       pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
       } 
 
       return pathPoints; 
 
      break; 
 
      case 'cubic': 
 
       darray = d.replace(/M|C/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
       for (i=0, j=1, o=9; i<darray.length; i+=2, j+=2, o++) { 
 
        pathPoints["p"+(o-9)] = {"x": darray[i], "y": darray[j]}; 
 
\t \t \t    } 
 
       return pathPoints; 
 
      break; 
 
    } 
 
} 
 

 
function pointsToPath(pathPoints, pathSubclass) { 
 
    console.log("joining "+pathPoints+"for a "+pathSubclass); 
 
}
html, body { 
 
\t margin: 0; 
 
\t padding: 0; 
 
\t border: 0; 
 
\t overflow:hidden; 
 
\t background-color: #fff; \t 
 
} 
 
svg { 
 
    position: fixed; 
 
\t top:0%; 
 
\t left:0%; 
 
\t width:100%; 
 
\t height:100%; 
 
} 
 
.inventory { 
 
    fill: transparent; 
 
\t stroke: black; 
 
    cursor: move; 
 
} 
 
.draggable { 
 
    fill: transparent; 
 
\t stroke: blue; 
 
    cursor: move; 
 
} 
 
.dragged { 
 
    fill: transparent; 
 
\t stroke: green; 
 
    cursor: move; 
 
} 
 
.morphed { 
 
    fill: transparent; 
 
\t stroke: red; 
 
    cursor: move; 
 
} 
 
.lines { 
 
\t stroke: green; 
 
    stroke-dasharray: 8,5; 
 
    stroke-width: 1; 
 
    opacity: 0.5; 
 
} 
 
path 
 
{ 
 
\t stroke-width: 3; 
 
\t stroke: #000; 
 
\t stroke-linecap: round; 
 
} 
 
path.fill 
 
{ 
 
\t fill: #3ff; 
 
} 
 
#canvasBackground { 
 
\t fill: lightgrey; 
 
} 
 
#inventoryBackground { 
 
\t fill: grey; 
 
} 
 
#morphUIrect { 
 
    fill: none; 
 
    stroke: blue; 
 
    stroke-dasharray: 10,5; 
 
    opacity: 0.1; 
 
} 
 
.label { 
 
    fill: grey; 
 
}
<body> 
 
<svg id="svg" 
 
    height="480" 
 
    width="480" 
 
\t viewbox="0 0 480 580" 
 
\t preserveAspectRatio="xMinYMax meet" 
 
\t xmlns="http://www.w3.org/2000/svg" 
 
\t xmlns:xlink="http://www.w3.org/1999/xlink" 
 
> 
 
<rect id="canvasBackground" width="480" height="480" x="0" y="0" pointer-events="all"/> 
 
<rect id="inventoryBackground" width="480" height="100" x="0" y="480" pointer-events="all"/> 
 

 
<g id="inventory"> 
 
<path class="inventory" subclass="circle" d="M30,530 A35,35 1 1,1 100,530 A35,35 1 1,1 30,530" /> 
 
<path class="inventory" subclass="curve4" d="M125,500 Q155,490 185,500 Q195,530 185,560 Q155,570 125,560 Q115,530 125,500" /> 
 
<path class="inventory" subclass="curve3" d="M245,495 Q275,520 280,560 Q245,570 210,560 Q215,520 245,495" /> 
 
<path class="inventory" subclass="curve2" d="M305,515 Q345,475 385,515 Q345,555 305,515"/> 
 
<path class="inventory" subclass="curve1" d="M305,550 Q345,580 385,550"/> 
 
<path class="inventory" subclass="cubic" d="M420,495 C470,530 380,530 425,565"/> 
 
</g> 
 

 
<g id="canvas"> 
 
</g> 
 
    
 
<g id="morphUI"> 
 
<rect id="morphUIrect" visibility = "visible" x="0" y="0" width="0" height="0"></rect> 
 
<line id="l0" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l1" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l2" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l3" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l4" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l5" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l6" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<line id="l7" visibility = "hidden" class="lines" x1="0" y1="0" x2="0" y2="0"/> 
 
<circle id="0" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="1" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="2" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="3" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="4" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="5" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="6" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="7" visibility = "hidden" class="control" cx="0" cy="0" r="8"/> 
 
<circle id="8" visibility = "hidden" class="control" cx="0" cy="0" r="10" _x="0" _y="0"/> 
 
</g> 
 
</svg> 
 
</body>

관련 문제