svg - 根据内部的 png/jpeg 图像调整 SVG 元素的大小
问题描述
试图将我的头包裹在 SVG 上并显示图像。几个小时前我问了一个相关的问题,但我似乎已经设法弄清楚了那部分,现在我一直试图弄清楚视口、视图框和其中的图像标签之间的关系。
我对 viewbox 的第一个理解是它基本上是在定义坐标系。将其设置为“0 0 100 100”意味着“左上角称为 0,0,而 100,100 是右下角坐标”,那么如果您绘制类似矩形的东西,则使用 0-100 到达角落。然后你在它周围使用 css 在容器上设置你想要的大小,并且 SVG 标签内的所有内容都会相应地缩放。
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<div class="container-fluid">
<div class="row" style="height: 100vh;">
<div class="col-2" style="background: pink">
1 of 3
</div>
<div class="col-8 bg-dark">
<p>
A bit of text
</p>
<svg viewBox="0 0 100 100" style="outline: 1px solid red" preserveAspectRatio="xMidYMid meet">
<defs>
<mask id="image-mask" x="0" y="0" width="100" height="100">
<rect x="0" y="0" width="100" height="100" fill="#F000FF" />
<rect x="33" y="0" width="33" height="100" fill="white" />
</mask>
</defs>
<image width="100" height="100" xlink:href="https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Panorama_Gendarmenmarkt-Berlin-Huntke-2008.jpg/640px-Panorama_Gendarmenmarkt-Berlin-Huntke-2008.jpg" mask="url(#image-mask)" />
</svg>
<p>
Some more text
</p>
</div>
<div class="col-2" style="background: orange">
3 of 3
</div>
</div>
</div>
这似乎是非常错误的。
在调整、测试和探索我目前的理解是“如果我想在 SVG 中显示非矢量图像,我是否必须设置视口和图像高度/宽度以匹配图像的纵横比,数字不要只要比例正确就没有关系”。所以我这里的图像是 640x170px。归一化为宽度 100,高度为 26.56。所以我将视口设置为 0 0 100 26.56,图像宽度/高度分别设置为 100 和 26.56:
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<div class="container-fluid">
<div class="row" style="height: 100vh;">
<div class="col-2" style="background: pink">
1 of 3
</div>
<div class="col-8 bg-dark">
<p>
A bit of text
</p>
<svg viewBox="0 0 100 26.56" style="outline: 1px solid red" preserveAspectRatio="xMidYMid meet">
<defs>
<mask id="image-mask" x="0" y="0" width="100" height="100">
<rect x="0" y="0" width="100" height="100" fill="#F000FF" />
<rect x="33" y="0" width="33" height="100" fill="white" />
</mask>
</defs>
<image width="100" height="26.56" xlink:href="https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Panorama_Gendarmenmarkt-Berlin-Huntke-2008.jpg/640px-Panorama_Gendarmenmarkt-Berlin-Huntke-2008.jpg" mask="url(#image-mask)" />
</svg>
<p>
Some more text
</p>
</div>
<div class="col-2" style="background: orange">
3 of 3
</div>
</div>
</div>
这似乎有效,当我调整数字以适应其 100x66.56 的纵横比时,它也适用于注释掉的图像。当涉及到 viewBox 和图像时,我并没有真正找到太多信息,所以我担心的是我很幸运并且猜到了适用于两个示例的东西。
所以我正在寻找的答案是:
- 我的假设正确吗?
- 这是否意味着当我希望能够显示图像的不同纵横比时,我是否必须使用 JavaScript 为每个图像调整视口和图像宽度/高度?
- 有没有更有效的方法来解决这个问题?像“宽度:100%;高度:自动;” 并使其包含图像的所有宽高比?
解决方案
推荐阅读
- .net - 为什么我可以通过 Postman 访问服务,但不能通过 Windows 窗体?
- javascript - 创建 React HOC 时出现以下错误:类型无效——预期的字符串或类/函数,但得到:对象
- spring-boot - cache.period 和 cache.cachecontrol.max-age 有什么区别?
- wpf - 菜单子项样式中的 WPF 设计时数据
- python - 如何使用 Django Rest Framework 交换嵌套数据列表中的两个项目
- ruby - RUBY - 在哈希数组中查找最常见的药物名称
- c# - 如何使用 API Key 调用 TestRail?
- java - 如何根据传入的 UDP 数据包大小动态分配缓冲区大小?
- progressive-web-apps - 使用工作箱而不使用 cdn
- postgresql - PostgreSQL 存储过程可以返回多行吗