gpt4 book ai didi

css - SVG 无法在绝对定位的父级中正确调整大小

转载 作者:技术小花猫 更新时间:2023-10-29 11:11:58 24 4
gpt4 key购买 nike

我遇到了内联 <svg> 的问题元素不会拉伸(stretch)到其原始大小,如其 viewBox 中所声明的那样属性,当它包装在绝对定位的父级中时:

  • 使用 width: 100%似乎只强制 SVG 拉伸(stretch)到浏览器定义的默认大小 300px .这也会导致 <img>不适合其原始尺寸。
  • 使用 width: auto导致 SVG 完全折叠成 0px x 0px 的尺寸,但是 <img>现在调整为原始尺寸

有趣的是,可以通过将 SVG 用作 data:image/svg+xml 来复制此行为。对于 src <img> 的属性元素,因此 SVG 似乎不会将其原生尺寸“传递”给包含它的父元素(无论是 <svg> 还是 <img> 元素)。

所以,我的问题是,在 CSS 中是否有任何可靠的方法可以强制 SVG 根据其 View 框属性调整到其原始大小。通过阅读 viewBox,我可能可以使用 JS 来暴力破解我的方式。属性和 use the fixed aspect ratio hack以固定纵横比将我的 SVG 显示为背景图像 <div>元素,但我尽量避免这样做。我可能误解了浏览器对 SVG 规范的实现,但我似乎找不到解决方法。


我的问题可以在下面的代码片段中重现。您可以:

  • 使用页面顶部的复选框打开/关闭父级的绝对定位
  • 选择width <img> 上的声明(自动或 100%)或 <svg>元素

// The JS logic below is only used to dynamically set styles based on checkbox/select changes, has nothing to do with SVG layout

// Change positioning strategy
document.getElementById('absPosToggle').addEventListener('change', function() {
var parents = document.querySelectorAll('.parent');

if (this.checked) {
for (var i = 0; i < parents.length; i++) {
parents[i].classList.remove('no-absolute-positioning');
}
} else {
for (var i = 0; i < parents.length; i++) {
parents[i].classList.add('no-absolute-positioning');
}
}
});

// Change width declaration of <svg>/<img> elements
document.getElementById('widthSetting').addEventListener('change', function() {
var images = document.querySelectorAll('img, svg');
var value = this.options[this.selectedIndex].value;

if (value === '100%') {
for (var i = 0; i < images.length; i++) {
images[i].classList.add('width--100');
}
} else {
for (var i = 0; i < images.length; i++) {
images[i].classList.remove('width--100');
}
}
});
body {
margin: 0;
padding: 50px 0 0 0;
}

form {
position: fixed;
top: 0;
left: 0;
right: 0;
display: block;
background-color: #fff;
z-index: 1;
padding: 5px;
}

.wrapper {
width: 100%;
height: 250px;
background-color: #eee;
margin-bottom: 10px;
position: relative;
text-align: center;
}

.parent {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

.parent.no-absolute-positioning {
position: relative;
top: 0;
left: 0;
transform: none;
}

img,
svg {
display: block;
width: auto;
}

img.width--100,
svg.width--100 {
width: 100%;
}
<form>
<label><input type="checkbox" id="absPosToggle" checked />Toggle absolute positioning</label><br />
<label for="widthSetting">Set svg/img widths to:</label><select id="widthSetting">
<option value="auto">Auto</option>
<option value="100%">100%</option>
</select>
</form>

<!-- <img> -->
<div class="wrapper">
<div class="parent">
<img src="https://via.placeholder.com/500x150/173755/ffffff" />
</div>
<span>This is an <code>&lt;img&gt;</code> element</span>
</div>

<!-- Inline <svg> -->
<div class="wrapper">
<div class="parent">
<svg viewBox="0 0 500 150" xmlns="http://www.w3.org/2000/svg"><rect x="0" y="0" width="500" height="150" fill="#b13131" /><g transform="translate(250, 75)"><text fill="#ffffff" style="text-anchor: middle; font-size: 50; font-family: Arial;" dy="0.35em">500 x 150</text></g></svg>
</div>
<span>This is an inline <code>&lt;svg&gt;</code> element</span>
</div>

<!-- <img> with SVG as data:image -->
<div class="wrapper">
<div class="parent">
<img src="data:image/svg+xml;charset=utf8,%3Csvg%20viewBox=%220%200%20500%20150%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Crect%20x=%220%22%20y=%220%22%20width=%22500%22%20height=%22150%22%20fill=%22#b13131%22%20/%3E%3Cg%20transform=%22translate(250,%2075)%22%3E%3Ctext%20fill=%22#ffffff%22%20style=%22text-anchor:%20middle;%20font-size:%2050;%20font-family:%20Arial;%22%20dy=%220.35em%22%3E500%20x%20150%3C/text%3E%3C/g%3E%3C/svg%3E"
/>
</div>
<span>This is an <code>&lt;img&gt;</code> element with SVG as data:image</span>
</div>

最佳答案

我认为问题的根本原因在于,通过绝对定位,父级的宽度计算方法变成了shr​​ink-to-fit,并且内容也没有适当的固有宽度,这有点像陷阱 22,这可能解释了回落到“标准”300 像素宽度的原因。

正如我们发现的,您已经通过了https://css-tricks.com/scale-svg/已经,并且似乎将 widthheight 属性添加到 SVG 本身可能是(在这种特定情况下)为 SVG 提供适当的固有高度的唯一工作方式,这样它就可以依次“扩展”其绝对定位的父级。

关于css - SVG 无法在绝对定位的父级中正确调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46804249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com