这是https://stackoverflow.com/questions/29105120/preserve-aspect-ratio-for-svg-text-and-react-to-javascript-touch-events的编辑副本,我将删除它,因为它提出了两个相关但技术上不同的问题。
正如我在上一个问题中已经解释的那样,我正在尝试制作一个导航div,其中包括4个按钮,一个向左,一个向右,另一个向下,还有一个向上。此外,中间需要有一个确定按钮。
这个解释非常好,可以使用CSS和HTML5创建导航按钮,如https://www.w3schools.com/howto/howto_css_buttons.asp所述。
我创建了SVG:
<div class="function height3x svg-container" style="height: 112px; width: 200px;">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="mySVG" width="100%" height="100%" viewBox="0 0 100 100" preserveAspectRatio="none" style="background-color: whitesmoke">
<g class="function" id="keyboard_btn_24">
<polygon id="ok" points="25,25 75,25 75,75 25,75"></polygon>
<text id="ok_text" x="39" y="55">OK</text>
</g>
<g class="function" id="keyboard_btn_25">
<polygon id="up" stroke="black" stroke-width="0.1" points="0,0 100,0 65,35 35,35"></polygon>
<text x="42" y="20"></text>
</g>
<g class="function" id="keyboard_btn_26">
<polygon id="right" stroke="black" stroke-width="0.1" points="100,0 100,100 65,65 65,35"></polygon>
<text x="81" y="53"></text>
</g>
<g class="function" id="keyboard_btn_27">
<polygon id="down" stroke="black" stroke-width="0.1" points="0,100 35,65 65,65 100,100"></polygon>
<text x="42" y="91"></text>
</g>
<g class="function" id="keyboard_btn_28">
<polygon id="left" stroke="black" stroke-width="0.1" points="0,0 35,35 35,65 0,100"></polygon>
<text x="5" y="53"></text>
</g>
</svg>
</div>
但我有两个问题似乎无法解决。
首先:虽然我希望SVG具有响应性,但我不想在保持字体纵横比的情况下缩放文本。
我已经尝试过(不成功的)preserveAspectRatio,它似乎对文本没有什么作用。
问题:如何使<text>
标签保持其纵横比,同时改变SVG的纵横比?
您可以查看和编辑最小示例:jsFiddle
Paulie_D-评论了我的旧问题:
至于纵横比,您应该删除宽度和高度100%的值。它们并不是真正需要的。 SVG将根据div大小缩放到所需大小。-jsfiddle.net/2qqrL7ng/1–
这不是一个选项,因为SVG元素需要响应无法保持纵横比的大小更改。只有文本需要保持比例,其他所有内容都应尽可能具有响应性。
编辑
将perserveAspectRatio的svg参数从“none”切换到“xMidYMid”可以保持SVG的纵横比,但期望的效果是SVG本身不保持其纵横比,而是-tags保持。这意味着以下内容不是解决方案:<div class="function height3x svg-container" style="height: 112px; width: 200px;">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="mySVG" width="100%" height="100%" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" style="background-color: whitesmoke">
<g class="function" id="keyboard_btn_24">
<polygon id="ok" points="25,25 75,25 75,75 25,75"></polygon>
<text id="ok_text" x="39" y="55">OK</text>
</g>
<g class="function" id="keyboard_btn_25" preserveAspectRatio="xMidYMid">
<polygon id="up" stroke="black" stroke-width="0.1" points="0,0 100,0 65,35 35,35"></polygon>
<text x="42" y="20"></text>
</g>
<g class="function" id="keyboard_btn_26">
<polygon id="right" stroke="black" stroke-width="0.1" points="100,0 100,100 65,65 65,35"></polygon>
<text x="81" y="53"></text>
</g>
<g class="function" id="keyboard_btn_27">
<polygon id="down" stroke="black" stroke-width="0.1" points="0,100 35,65 65,65 100,100"></polygon>
<text x="42" y="91"></text>
</g>
<g class="function" id="keyboard_btn_28">
<polygon id="left" stroke="black" stroke-width="0.1" points="0,0 35,35 35,65 0,100"></polygon>
<text x="5" y="53"></text>
</g>
</svg>
</div>
/编辑
提前致谢。
<g>
元素上使用preserveAspectRatio="xMidYMid"。你想要做到的唯一方法是在javascript中计算纵横比并对文本元素应用反向变换。 - Robert Longson<div>
中使用两个单独的SVG子元素,一个带有文本,其preserveAspectRatio="xMidYMid",另一个则没有。 - Robert Longson