jquery 保留SVG文本的纵横比

lo8azlld  于 2022-11-03  发布在  jQuery
关注(0)|答案(3)|浏览(205)

正如我在上一个问题中所解释的,我正在尝试创建一个带有4个按钮的导航div,一个用于向左,一个用于向右,一个用于向下,还有一个用于向上。另外,中间需要有一个OK按钮。
这与下面给出的解释非常吻合:Using CSS and HTML5 to create navigation buttons using trapezoids
我创建的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,它似乎对文本没有太大作用。

问题:如何让标签在改变svg的长宽比时保持它的长宽比?

您可以查看和编辑最小示例:jsFiddle
Paulie_D -评论我的老问题:
至于纵横比,你应该删除宽度和高度100%的值。它们并不是真的需要。SVG会根据div的大小缩放到所需的大小。jsfiddle.net/2qqrL7ng/1
这不是一个选项,因为SVG元素需要响应大小的变化,不能保持纵横比。只有文本需要保持比例,其他一切都应该尽可能响应。
编辑
将perserveAspectRatio的svg参数从“none”切换到“xMidYMid”可以保持SVG的纵横比,但所需的效果是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="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>

/编辑
先谢谢你。

5sxhfpxr

5sxhfpxr1#

我知道这是一个老问题,但我确实找到了一种方法来做什么是要求在纯SVG,没有JS,我已经用它在生产没有问题!
诀窍是定义一个没有viewBox的父<svg>元素,这样它就可以采用容器的尺寸,然后为您想要的不同类型的preserveAspectRatio值定义子<svg>元素!
在下面的代码片段中,我只是使用了问题中使用的SVG,并将所有的<polygon>放在一个<svg viewBox="0 0 100 100" preserveAspectRatio="none">中。
第一个
PS:最终结果甚至可以作为常规图像<img src="./my-weird-responsive-svg.svg" />的src,这使得这个技巧非常健壮!

cbeh67ev

cbeh67ev2#

问题:如何在改变svg的长宽比的同时,使标签保持它的长宽比?
你不能。如果文本是SVG的一部分,它会随SVG缩放。没有办法使SVG的一部分免于缩放。
可能的解决方案:
(1)从SVG中删除文本并将其放置在顶部。例如,在HTML中使用定位的<div>或其他。
(2)使用JS计算SVG的长宽比,并对<text>元素应用逆缩放转换。

k2arahey

k2arahey3#

如果您对当前尺寸有javascript控件(例如,全屏显示,或者只是通过检查用户使用的视口大小),则可以在SVG外部的父div中添加一个简单的类。
然后,为这两种情况设置SVG文本字体大小的样式:当父div有这样的类时(它告诉你你的SVG已经缩放了),当父div没有这样的类时(即SVG是不可缩放的)。如果是这种情况,这个简单的解决方案就可以工作。

.svg_text {font-size: 12px;} /* normal non-scaled SVG */
.case_for_big_screen_thus_SVG_scaled .svg_text {font-size: 6px;} /* this parent class only is added when viewport dimensions make your SVG to be scaled */

相关问题