如何更改父偏移值而不更改其子偏移量?

时间:2012-09-19 11:48:45

标签: javascript jquery svg

我遇到元素定位问题。我有一个div元素,它进一步包含svg路径元素。标记是这样的:

 <div style="position:absolute;" class="svg">
  <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
   <path id="path203" d="M150 0 L75 200 L225 200 Z" />
  </svg>
 </div>

我想在用户鼠标悬停路径时设置路径元素周围的边框。为此,我必须访问path元素的高度和权重,然后将这些值设置为其父div元素的高度和宽度。为此,我使用了getBoundingClientRect()。代码:

 var box = document.getElementById("path203").getBoundingClientRect();
 $("#path203").parents("div.svg").css({ width: box.width + "px", height: box.height + "px" });

这里我的问题没有完全解决,我只得到边框,但div的位置和它的子路径元素不一样都有不同的偏移值。因此,我为父div设置了顶部和左侧:

 var box = document.getElementById("path203").getBoundingClientRect();
 $("#path203").parents("div.svg").offset({ left: box.left + "px", top: box.top });

现在这个div得到了正确的位置,但是它的子路径元素远离它的位置。可能是因为path元素是div元素的子元素。因此,当我们移动div时,它的所有子元素也将同时移动。如何更改父div偏移值而不更改其子元素偏移量?

2 个答案:

答案 0 :(得分:0)

这是你想要实现的目标吗?

<div style="position:absolute;" class="svg">
  <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="302" height="202">
   <path id="path203" d="M150 0 L75 200 L225 200 Z" onmouseover="showRect()" onmouseout="hideRect()" />
   <rect id="border203" fill="none" stroke="black" stroke-width="1"/>
   <script>
     function showRect() {
         var bbox = document.getElementById("path203").getBBox();
         var border = document.getElementById("border203");
         border.x.baseVal.value = bbox.x;
         border.y.baseVal.value = bbox.y;
         border.width.baseVal.value = bbox.width;
         border.height.baseVal.value = bbox.height;
     }
     function hideRect() {
         var border = document.getElementById("border203");
         border.width.baseVal.value = 0;
         border.height.baseVal.value = 0;
     }
   </script>
  </svg>
 </div>

答案 1 :(得分:0)

您可以将svg带到父div之外,并通过$('div.svg')直接访问div。

这是一个小提琴:http://jsfiddle.net/FSQrz/