SVG 그래픽에 툴팁을 추가하는 방법은 무엇입니까?


92

일련의 svg 사각형 (D3.js 사용)이 있고 마우스 오버시 메시지를 표시하고 싶습니다. 메시지는 배경 역할을하는 상자로 둘러싸여 있어야합니다. 둘 다 서로와 직사각형 (상단 및 중앙)에 완벽하게 정렬되어야합니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?

"x", "y", "width"및 "height"속성을 사용하여 svg 텍스트를 추가 한 다음 svg rect를 추가해 보았습니다. 문제는 텍스트의 참조 점이 중간에 있다는 것입니다 (내가 사용한 가운데 정렬되기를 원하기 때문에 text-anchor: middle).하지만 사각형의 경우 왼쪽 상단 좌표이고 텍스트 주위에 약간의 여백을 원했기 때문에 고통.

다른 옵션은 html div를 사용하는 것이 었는데, 텍스트와 패딩을 직접 추가 할 수 있지만 각 직사각형의 절대 좌표를 얻는 방법을 모르기 때문에 좋을 것입니다. 이를 수행하는 방법이 있습니까?


다른 방법이 없다면 나는 추측한다
nachocab

그것이 설계된 것에 대한 마크 업을 사용하는 것이 문제입니까?
Phrogz

그것은 좋은으로 보지 않습니다 단지,하지만 난 당신의 대답에 감사
nachocab

답변:



176

단순히 SVG <title>요소 와 그것이 전달하는 기본 브라우저 렌더링 을 사용할 수 있습니까 ? (참고 : 이것은 html의 div / img / spans에서 사용할 수 있는 속성 과 동일 하지 않으며 라는 title하위 요소 여야합니다. title)

rect {
  width: 100%;
  height: 100%;
  fill: #69c;
  stroke: #069;
  stroke-width: 5px;
  opacity: 0.5
}
<p>Mouseover the rect to see the tooltip on supporting browsers.</p>

<svg xmlns="http://www.w3.org/2000/svg">
  <rect>
    <title>Hello, World!</title>
  </rect>
</svg>

또는 실제로 SVG에 HTML을 표시하려면 HTML을 직접 포함 할 수 있습니다.

rect {
  width: 100%;
  height: 100%;
  fill: #69c;
  stroke: #069;
  stroke-width: 5px;
  opacity: 0.5
}

foreignObject {
  width: 100%;
}

svg div {
  text-align: center;
  line-height: 150px;
}
<svg xmlns="http://www.w3.org/2000/svg">
  <rect/>
  <foreignObject>
    <body xmlns="http://www.w3.org/1999/xhtml">
      <div>
        Hello, <b>World</b>!
      </div>
    </body>      
  </foreignObject>
</svg>

… 그러나 디스플레이를 켜고 끄려면 JS가 필요합니다. 위에 표시된 것처럼 레이블을 올바른 위치에 표시하는 한 가지 방법은 rect와 HTML을 <g>모두 함께 배치 하는 동일한 위치 에 래핑하는 것입니다.

JS를 사용하여 SVG 요소가 화면에있는 위치를 찾으려면을 사용할 수 있습니다 getBoundingClientRect(). 예 : http://phrogz.net/svg/html_location_in_svg_in_html.xhtml


svg 요소에 제목을 삽입하는 것이 잘 작동합니다!
Shivam Aggarwal

2
좋은 대답입니다. 그러나 foreignObject Internet Explorer에서는 지원되지 않습니다
Rehban Khatri 2017-08-22

Firefox에서 SVG 크기는 0x0입니까? 당신은 폭과 높이가 같은 지정해야 할 것 같다<rect width="200" height="50"></rect>
프랭클린 유

2
불행히도 <title>모바일 장치에는 영향을 미치지 않습니다.
jengeb

js를 사용하여 제목을 추가하고 제목을 자식 요소로 추가하려고 할 때. 툴팁 :( 나타나지 않는 경우
Ankur Marwaha

36

내가 찾은 유일한 좋은 방법은 Javascript를 사용하여 툴팁을 이동하는 <div>것입니다. 분명히 이것은 독립형이 아닌 HTML 문서 안에 SVG가있는 경우에만 작동합니다. 그리고 자바 스크립트가 필요합니다.

function showTooltip(evt, text) {
  let tooltip = document.getElementById("tooltip");
  tooltip.innerHTML = text;
  tooltip.style.display = "block";
  tooltip.style.left = evt.pageX + 10 + 'px';
  tooltip.style.top = evt.pageY + 10 + 'px';
}

function hideTooltip() {
  var tooltip = document.getElementById("tooltip");
  tooltip.style.display = "none";
}
#tooltip {
  background: cornsilk;
  border: 1px solid black;
  border-radius: 5px;
  padding: 5px;
}
<div id="tooltip" display="none" style="position: absolute; display: none;"></div>

<svg>
  <rect width="100" height="50" style="fill: blue;" onmousemove="showTooltip(evt, 'This is blue');" onmouseout="hideTooltip();" >
  </rect>
</svg>


3

나는 항상 내 설정과 함께 일반적인 CSS 제목을 사용합니다. 블로그 관리 페이지에 대한 분석을 구축하고 있습니다. 나는 멋진 것이 필요하지 않습니다. 다음은 몇 가지 코드입니다.

let comps = g.selectAll('.myClass')
   .data(data)
   .enter()
   .append('rect')
   ...styling...
   ...transitions...
   ...whatever...

g.selectAll('.myClass')
   .append('svg:title')
   .text((d, i) => d.name + '-' + i);

그리고 크롬 스크린 샷 ...

여기에 이미지 설명 입력


0

HTML + CSS 만 사용하여 무언가를 생각해 냈습니다. 그것이 당신을 위해 일하기를 바랍니다

.mzhrttltp {
  position: relative;
  display: inline-block;
}
.mzhrttltp .hrttltptxt {
  visibility: hidden;
  width: 120px;
  background-color: #040505;
  font-size:13px;color:#fff;font-family:IranYekanWeb;
  text-align: center;
  border-radius: 3px;
  padding: 4px 0;
  position: absolute;
  z-index: 1;
  top: 105%;
  left: 50%;
  margin-left: -60px;
}

.mzhrttltp .hrttltptxt::after {
  content: "";
  position: absolute;
  bottom: 100%;
  left: 50%;
  margin-left: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #040505 transparent;
}

.mzhrttltp:hover .hrttltptxt {
  visibility: visible;
}
<div class="mzhrttltp"><svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 24 24" fill="none" stroke="#e2062c" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-heart"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"></path></svg><div class="hrttltptxt">علاقه&zwnj;مندی&zwnj;ها</div></div>


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.