【问题标题】:How to align set of tspan elements by center?如何按中心对齐 tspan 元素集?
【发布时间】:2019-03-12 21:52:03
【问题描述】:

我在 Google 上搜索了很多如何将 tspan 集对齐的方法,但我需要别的东西。我需要按中心对齐tspan 元素集,并且每个元素都应在左侧与其他元素对齐。

在下面的图片中,您可以看到我想要达到的目标。

JSFiddle

我尝试再添加一个tspan 元素作为其他元素的包装器并将其设置为text-anchor: middle,但它不起作用。

【问题讨论】:

    标签: svg alignment tspan


    【解决方案1】:

    为此,我将使用 JavaScript 将第一个 tspan 的偏移量计算为两个 tspan 元素之间长度差的一半

    let tspans = document.querySelectorAll("tspan");
    let offset = (tspans[1].getComputedTextLength() - tspans[0].getComputedTextLength())/2
    tspans[0].setAttributeNS(null,"dx", -offset)
    svg {
        border: solid 1px blue;
        font-family: monospace;
    }
    <svg viewBox = "0 0 400 100">
        <circle r="3" cx="200" cy="50" fill="red">
        </circle>
    
        <text y="50" text-anchor="middle"><!--
          --><tspan x="200" >First label</tspan><!--
          --><tspan x="200" dy="15">Second long long long label</tspan>
       </text>
    </svg>

    【讨论】:

      【解决方案2】:

      我的目标是在中心对齐不同的tspan 组。感谢@enxaneta 的帮助。当我遇到一些有趣的子缺陷时,我发布了自己的答案。最后一个tspan 行没有左对齐。我看到了 3 或 5 像素的空间。它是由 XML 空间引起的。您需要删除 tspan 元素之间的空格才能解决此问题。

      	let tspans = document.querySelectorAll("tspan");
      	let indexOfLongestRow = 0;
      
      	for(let i = 0; i < tspans.length; i++) {
      		if(tspans[indexOfLongestRow].getComputedTextLength() < tspans[i].getComputedTextLength()) {
      	  	indexOfLongestRow = i;
      	  }
      	}
      
      	console.log(tspans[indexOfLongestRow]);
      
      	for(let i = 0; i < tspans.length; i++) {
      	  	let offset = (tspans[indexOfLongestRow].getComputedTextLength() - tspans[i].getComputedTextLength())/2;
      
      	    console.log(offset);
      
      		tspans[i].setAttributeNS(null, "dx", -offset);
      	}
      svg {
          border: solid 1px blue;
          font-family: monospace;
          font-size: 9px;
      }
      <svg viewBox = "0 0 400 500">
          <circle r="3" cx="200" cy="50" fill="red">
          </circle>
      
         <text y="50" text-anchor="middle">
           <tspan x="200" dy="15">Second long long long label</tspan><tspan x="200" dy="15">This is a longest label that i have here ergrtgrtgregregregerg</tspan><tspan x="200" dy="15">This is a longest label that i have here ergrtgrtgregregregerg</tspan><tspan x="200" dy="15">First label</tspan><tspan x="200" dy="15">First label dfhdfhh</tspan><tspan x="200" dy="15">This is a longest label that i have here ergrtgrtgregregregerg</tspan><tspan x="200" dy="15">First label rth th rthththsrth</tspan><tspan x="200" dy="15">First label rthrth rthrt 5tyjey yejetyj tyjtyj teyjteyj</tspan><tspan x="200" dy="15">First label reghregregregregregrge</tspan></text>
      </svg>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        相关资源
        最近更新 更多