【问题标题】:SVG size in comparison to parent container. Why doesn't 100% min-height fill parent?与父容器相比的 SVG 大小。为什么不 100% 最小高度填充父母?
【发布时间】:2018-11-28 16:25:56
【问题描述】:

我在子 DIV 元素中有一个 SVG(屏幕截图中的红色矩形),它位于父 DIV 元素(绿色矩形)内。

.parent {
  position: relative;
  background: green;
  left: 50%;
  transform: translateX(-50%);
  display: inline-block;
  overflow: hidden;  
  height: 400px; 
  width: 270px;
}

.child {
  display: block;
  position: absolute;
  top: 50%;
  left: 50%;
  min-height: 100%;
  min-width: 100%;
  transform: translate(-50%, -50%);

}
<div class="parent">
    <div class="child">

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1"  viewPort="550 0 600 430.95" viewBox="246 0 600 430.95" preserveAspectRatio="xMidYMid meet" >
<rect width="100%" height="100%" fill="red" />
</svg>

 </div>
</div>

我想让 SVG 缩放到与父 DIV 相同的大小,所以我使用了 min-height 属性,我已将其设置为 100%。出于某种原因,子 DIV 中的 SVG 无法缩放到父 DIV 的大小,并且要小得多。我很困惑为什么会这样,并且会认为它会缩放到相同的大小。有谁知道为什么不?

【问题讨论】:

    标签: html css svg


    【解决方案1】:
    1. min-widthmin-height 在这种情况下不起作用,只需使用 widthheight 代替。

    2. 如果您没有为 SVG 指定 height,浏览器将根据 widthviewBox 的纵横比为您计算一个。 width 默认为 "100%",因此宽度将为父宽度 (270px) 的 100%,高度为:

      270 * 430.95 / 600 ~= 194px
      
    3. 将 SVG 的高度设置为 "100%" 将使 SVG 的高度与 div.child 相同,但 preserveAspectRatio="xMidYMid meet" 将意味着 SVG 内容将以 div 为中心。

      .parent {
        position: relative;
        background: green;
        left: 50%;
        transform: translateX(-50%);
        display: inline-block;
        overflow: hidden;  
        height: 400px; 
        width: 270px;
      }
      
      .child {
        display: block;
        position: absolute;
        top: 50%;
        left: 50%;
        height: 100%;
        width: 100%;
        transform: translate(-50%, -50%);
      }
      <div class="parent">
          <div class="child">
      
      <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1"  viewBox="246 0 600 430.95" preserveAspectRatio="xMidYMid meet" width="100%" height="100%">
      <rect width="846" height="100%" fill="red" />
      </svg>
      
       </div>
      </div>
      
         

      如果您希望 SVG 忽略纵横比,并拉伸到 div 的高度,则设置 preserveAspectRatio="none"

    .parent {
      position: relative;
      background: green;
      left: 50%;
      transform: translateX(-50%);
      display: inline-block;
      overflow: hidden;  
      height: 400px; 
      width: 270px;
    }
    
    .child {
      display: block;
      position: absolute;
      top: 50%;
      left: 50%;
      height: 100%;
      width: 100%;
      transform: translate(-50%, -50%);
    }
    <div class="parent">
        <div class="child">
    
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1"  viewBox="246 0 600 430.95" preserveAspectRatio="none" width="100%" height="100%">
    <rect width="846" height="100%" fill="red" />
    </svg>
    
     </div>
    </div>

    PS。没有像 viewPort 这样的 SVG 属性。

    【讨论】:

    • 您好,感谢您的回复!我确实希望保留 SVG 的方面。但是,在您的示例中,即使您使用了 preserveAspectRatio="xMidYMid meet" ,SVG 的纵横比也发生了变化。当我单独查看 SVG 时,它是一个长边位于垂直轴上的矩形,但在您的第一个 sn-p 中,矩形与 X 轴上的长边相反。此外,您在第一个 sn-p 中使用的 SVG 中的“846”值来自哪里?我希望整个 SVG 视图框显示为红色,因此我为红色矩形选择了 100% 的高度和宽度。
    • 如果你想保留纵横比,那么你不能用一个短而宽的 SVG 填充一个又高又窄的 div 而不会切断一些 SVG。如果您同意,请使用preserveAspectRatio="xMidYMid slice"。 846 来自viewBox.x + viewBox.width = (246 + 600)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2012-12-25
    • 2020-12-14
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多