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

2024-04-03

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

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

有趣的是,这种行为可以通过使用 SVG 作为data:image/svg+xml为了src的属性<img>元素,因此 SVG 似乎不会将其本机尺寸“传递”到其包含的父元素(无论是<svg> or an <img>元素)。

所以,我的问题是,CSS 中是否有任何可靠的方法可以强制 SVG 根据其视图框属性调整其原始大小。我可能可以使用 JS 来暴力破解我的方式,通过阅读viewBox属性和使用固定宽高比黑客 https://stackoverflow.com/questions/1495407/maintain-the-aspect-ratio-of-a-div-with-css以固定宽高比将我的 SVG 显示为背景图像<div>元素,但我尽量避免这样做。我可能误解了浏览器对 SVG 规范的实现,但我似乎找不到解决方法。


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

  • 使用页面顶部的复选框打开/关闭父级的绝对定位
  • select width声明(自动或 100%)<img> or <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>

我认为问题的根本原因是,通过绝对定位,您使父级的宽度计算方法变成shrink-to-fit,而且内容也没有适当的固有宽度,这就是第 22 条陷阱,这可能解释了为什么会回退到“标准”300px 宽度。

正如我们所了解的,您已经经历过https://css-tricks.com/scale-svg/ https://css-tricks.com/scale-svg/已经,而且似乎要添加width and heightSVG 本身的属性可能是为 SVG 提供适当的内在高度的唯一工作方式(在这种特定情况下),以便它可以依次“跨越”其绝对定位的父级。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVG 无法在绝对定位的父级中正确调整大小 的相关文章

  • CSS: *html #id_name

    我有这个代码 html alertBox height 100px modalContainer gt alertBox position fixed 这是由CSS支持的吗 我在其他网站上找到了这段代码 我忘记了链接 html alertB
  • 删除圆形图像周围的边框

    我有一个圆形图像 png 文件 中间是透明的 我需要将图像内的背景设置为纯色 为此 我将背景设为纯色 然后将border radius 50 但这会产生一条丑陋的小白线 有没有办法摆脱这个问题 或者我必须在图像编辑器中手动为图像着色 div
  • 滚动时将菜单栏固定在顶部[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我见过一些网站 当用户向下滚动页面时 会在右侧或左侧弹出一个框 另外 注意到这个模板 http www mvpthemes com m
  • 像在 tumblr 注册页面上那样鬼写

    有谁知道如何创建一个类似 tumblr 的字段 http www tumblr com http www tumblr com 这是一个 URL 字段 其中有一些褪色的文本 然后当您单击它并键入时 它会附加一些文本 tumblr com 您
  • 如何在 Bootstrap 3 的导航栏中添加带有图标的搜索框?

    我正在使用新的 Twitter Bootstrap 3 并尝试放置一个像这样的搜索框 如下 在顶部导航栏中 在 Bootstrap 2 中 可以这样完成
  • 水平滚动的表格上的“粘性”标题......完全不可能?

    经过过去几个小时的研究后 我开始认为这是不可能的 即使在最新的浏览器上也是如此 HTML table具有水平滚动的元素 带有 粘性 thead在顶部 作为垂直滚动的周围网页的一部分 这是我的尝试 a height 100px backgro
  • 为什么此 TTF 字体在我的浏览器中无法使用?

    我下载了一种名为 Clunk 的 TTF 字体 并尝试将其应用于某些文本 这是我正在使用的代码 h1 Test h1 这似乎不起作用 Chrome 给了我两个错误 Failed to decode downloaded font path
  • 如何使整个跨度落入新行?

    这个片段显示了我想要的 http jsfiddle net 945Df 3 http jsfiddle net 945Df 3 div class sup strong a href Rosario Santa Fe Argentina a
  • 如何删除标题中的粗体?

    我有一个标题 h1 THIS IS A HEADLINE h1 如何使短语 THIS IS 不加粗 其余部分不做任何更改 我在文本装饰中找不到任何相关标签 标题看起来很粗体 因为它大尺寸 如果您已应用粗体或想要更改行为 您可以执行以下操作
  • 将特定字形与网络字体一起使用

    使用网络字体 我想使用字体功能设置 CSS 中的选项以及跨度类HTML 中 以便使用字体集中的特定替代字形 我需要以正确的语法使用哪些值 GID Unicode 才能定位特定的目标glyph内glyph备择方案 这些功能使用 OpenTyp
  • PDF 在 Safari 中隐藏 Jquery Modal

    这是与我有关的事情this https stackoverflow com questions 24052681 pdf hide jquery modal in ie问题 在 IE 中 我在对话框中使用 iframe 解决了问题 所以它工
  • 为什么这个 JS 创建的 SVG 在 Chrome 中不起作用?

    考虑这个简单的 SVG SMIL 动画
  • 如何让CSS选择以字符串开头的ID(不是Javascript)?

    如果 HTML 中有这样的元素 id product42 id product43 如何匹配所有以 product 开头的 id 我已经看到了完全使用 javascript 执行此操作的答案 但是如何仅使用 CSS 执行此操作 id pro
  • chrome 中选择选项元素的额外填充

    我有一个选择元素 用户可以在其中选择分类和描述 仅在 Chrome 浏览器中 我有一个额外的填充 无法使用 padding 0 或其他 css 标签删除它 Chrome 的屏幕 https i stack imgur com m3iIb p
  • Bootstrap Affix Nav 导致下面的 Div 向上跳转

    我使用 Bootstrap 的 Affix 函数创建了一个 JSFiddle 以便在向下滚动并且标题移出视图时使导航保持在屏幕顶部 我遇到的问题是 当使用纯 HTML 时 导航下方的文本会过早地跳起来并隐藏在导航后面 查看有问题的代码her
  • CSS3变换:悬停时翻译,带有过渡[重复]

    这个问题在这里已经有答案了 这应该很简单 我的 HTML 中有一堆锚点 如下所示 a href Link 1 a a href Link 2 a a href Link 3 a a href Link 4 a a href Link 5 a
  • 在其他不可滚动的 div 上滚动时如何滚动可滚动的 div?

    我知道这个问题听起来很令人困惑 但这就是我想要做的 在下面的代码片段中 如果用户在绿色 div 上滚动 我希望黄色 div 相应地滚动 就像滚动黄色 div 一样 请注意 黄色 div 有overflow auto 但绿色的则不然 docu
  • 如何在bootstrap中默认隐藏侧边栏?

    我在这里有一个很好的参考 作为 Bootstrap 在设计 Web 表单应用程序时的侧边栏 http startbootstrap com template overviews simple sidebar http startbootst
  • 如何覆盖 bootstrap 表 td 样式?

    我正在使用 Bootstrap 3 3我有一个 HTML 代码如下 div table class table table striped tr td 03 td td 04 td td 05 td td 06 td td 07 td td
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu

随机推荐

  • Django唯一随机作为默认值

    在将某个值指定为默认值时 有什么方法可以检查模型中是否存在该值 如果分配值存在 不唯一 则生成另一个值 阅读评论 def unique rand return Generate a random string with 8 characte
  • 我有两个类型定义,如何确定一个类型是否是另一个的基类型?

    我在 ActionScript 3 中有两个类型定义 Class 类型的引用 我需要确定其中一个是否是另一个的基类型 类或接口 我本来希望像下面这样的东西会起作用 但遗憾的是它没有 var isBaseClass Boolean Mouse
  • 如何从 Golang 访问 C 指针数组

    我正在使用 FFmpeg 为 Windows 平台编写一个应用程序 它是 golang 包装器 goav 但我无法理解如何使用 C 指针来访问数组 我试图获取存储在 AVFormatContext 类中的流以在 go 中使用 并最终将帧添加
  • ToString("0") 与 ToString(CultureInfo.InvariantCulture)

    我想确保我的应用程序中的某些数字在打印时没有任何分隔符 分组等 无论当前环境如何 似乎以下两种方法产生相同的结果 可能还有更多 123456789 ToString 0 123456789 ToString CultureInfo Inva
  • 为什么 Rails 不引发 I18n::MissingInterpolationArgument 异常?

    我创建了一个虚拟 Rails 4 1 5 应用程序来显示 I18ntranslate当未提供要插值的变量时 方法不会引发 I18n MissingInterpolationArgument 仅当提供错误的内容时才会引发该异常 这是预期的行为
  • 从源代码构建 Docker 失败

    从 dotcloud docker git 克隆之后 cd docker sudo make VERBOSE 1 Fetching https net http cookiejar go get 1 https fetch failed u
  • 撤消已推送的合并

    好吧 我弄得有点乱了 显然 在我家里的机器上 开发分支没有更新 我做出了承诺并推动了 结果是实际的 origin develop 分支已合并到我的本地开发分支中 由于某种原因 它被视为不同的分支 一方面 我真的不明白这是怎么发生的 其次 我
  • 通用二叉树节点析构函数问题

    我一直在做一项作业 现在我被有问题的析构函数困住了 我必须创建一个包含所有常用成员函数和一些特殊运算符的通用二叉树 还有一个限制 一切都必须迭代地工作 所以这次没有令人讨厌的递归黑客 BinTreeNode 类的析构函数显然有一些非常错误的
  • Laravel 中 detach() 方法也可以应用于一对多关系吗?

    在 Laravel 文档中 我发现 detach 方法可以分离多对多关系中的所有对象 detach 方法也可以应用于 Laravel 中的一对多关系吗 如果不是 在这种情况下如何分离所有 n 个对象 在多对多关系中 detach 方法仅删除
  • 更改通过文字初始化创建的对象的原型

    假设我只想使用 不是构造函数 我有一个这样的对象 var o name Jack 如果我想创建另一个对象 其原型是o我使用这个语法 var u Object create o console log u name prints Jack u
  • 传递具有可变大小的二维数组

    我正在尝试将二维数组从一个函数传递到另一个函数 然而 数组的大小不是恒定的 尺寸由用户决定 我曾尝试对此进行研究 但运气不佳 大多数代码和解释都是针对数组的恒定大小 在我的函数中A我声明该变量 然后对其进行一些操作 然后必须将其传递给 Fu
  • 如何使用 shell 始终获取下载 tomcat 服务器的最新链接

    我写了一个shell脚本来下载并安装tomcat服务器v 8 5 31 wget http www us apache org dist tomcat tomcat 8 v8 5 31 bin apache tomcat 8 5 31 ta
  • 如何从 f:selectItems 获取标签和值

    我正在开发一个 JSF 页面 该页面有一个基于List
  • 在 hibernate 中使用 where 子句选择查询

    我有班级登录 其中有userId username and password 对于要登录的用户 我正在检查username and password并得到userId If userId不为零则它将引导至主页 我正在尝试在休眠状态下执行此操
  • AWS CodePipeline 并部署到 EKS

    正在开发 AWS CodePipeline 用于构建容器并将其部署到 EKS 集群 AWS CodePipeline 似乎不支持 仅 ECS 对 EKS 的部署操作 我尝试探索其他选项 例如使用 lambda 函数 我找到了以下在 lamb
  • Redmine 和 SVN:如何在提交发生后将修订链接到问题?

    这样我们就成功地将Redmine与SVN集成了 这是一个成熟的集成 已经几个月了 Post commit hook 更新 Redmine 中的存储库 SVN 提交中的评论可以完美地导入到 Redmine 中 它能够在问题和修订 日志时间 整
  • javascript es6 双箭头函数

    我想更好地理解 es6 箭头函数 给出以下示例 export default function applyMiddleware middlewares return createStore gt reducer preloadedState
  • 如何计算 MIDI 文件的时间长度

    我正在使用名为 midas 的有用库的帮助下读取 as3 flash cs5 中的 midi 文件 http code google com p midas3 http code google com p midas3 midi as3 库
  • 实现托管属性处理程序 Shell 扩展的正确方法是什么?

    现在 NET CLR 4 0 支持并行 SxS 操作 现在应该可以编写 shell 托管代码中的扩展 我已经尝试过并成功编码了属性处理程序 实现 IPropertyStore IInitializeWithStream 和 IPropert
  • SVG 无法在绝对定位的父级中正确调整大小

    我遇到一个问题 内联