如何缩小图像以适合固定位置的柔韧性盒模式

时间:2019-03-18 20:59:06

标签: css css3 internet-explorer flexbox microsoft-edge

如何缩小图像以适合固定位置的柔韧性盒模式?

在尝试以下操作时,图像与页眉/页脚重叠。它需要适用于IE中的高大图像或宽大图像。

.modal-dialog {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}

.modal-content {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.modal-header {
  background: red;
  margin: 20px;
}

.modal-body {
  background: green;
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  margin: 0 20px;
}

.modal-footer {
  background: blue;
  margin: 20px;
}
<div class="modal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        header
      </div>
      <div class="modal-body">
        <img src="https://via.placeholder.com/900x1200" />
      </div>
      <div class="modal-footer">
        footer
      </div>
    </div>
  </div>
</div>

请注意,这是一个简单的示例,我实际上使用的是复杂的SVG,而不是图像标签,所以我不能使用背景图像。

3 个答案:

答案 0 :(得分:0)

使用图像作为背景:

.modal-dialog {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}

.modal-content {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.modal-header {
  background: red;
  margin: 20px;
}

.modal-body {
  background: green;
  flex: 1;
  /*display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;*/
  margin: 0 20px;
  background-size:contain;
  background-position:center;
  background-repeat:no-repeat;
}

.modal-footer {
  background: blue;
  margin: 20px;
}
<div class="modal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        header
      </div>
      <div class="modal-body" style="background-image:url(https://via.placeholder.com/900x1200)">
      </div>
      <div class="modal-footer">
        footer
      </div>
    </div>
  </div>
</div>

还是考虑因素max-width:100%;max-height:100%

.modal-dialog {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}

.modal-content {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.modal-header {
  background: red;
  margin: 20px;
}

.modal-body {
  background: green;
  flex: 1;
  height:100%; /*to be able to use max-height*/
  min-height:0; /*to allow the shrink*/
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  margin: 0 20px;
}

.modal-footer {
  background: blue;
  margin: 20px;
}
img {
  max-width:100%;
  max-height:100%;
  min-width:0;
  min-height:0;
}
<div class="modal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        header
      </div>
      <div class="modal-body" >
       <img src="https://via.placeholder.com/900x1200)">
      </div>
      <div class="modal-footer">
        footer
      </div>
    </div>
  </div>
</div>

答案 1 :(得分:0)

您可以使用具有最大宽度和position: absolute的旧式max-height

/* for demonstration I have replaced all irrelavant styles with this */
.modal-body {
  width: 80vw;
  height: 60vh;
  margin: 10% auto 0;
  background: green;
}
/* parent must be positioned */
.modal-body {
  position: relative;
}
/* size and center */
.modal-body img {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  max-width: 100%;
  max-height: 100%;
  margin: auto;
}
<div class="modal-body">
  <img src="https://via.placeholder.com/900x1200" />
</div>

答案 2 :(得分:0)

仅是提醒,但默认情况下图像会尝试保持其长宽比,因此只需设置百分比宽度即可使内联图像增长到适当的高度 OR 设置只有高度保持一定百分比才能保持宽度。

关键是只设置一个维度,让浏览器找出其余的维度。

如果您使用适当的HTML结构设置 Inline 大小,则尤其如此。

<div class="modal-body">
    <img src="https://via.placeholder.com/900x1200" width="100%" />
  </div>

现在,您只需使用CSS设置容器的最大宽度,一切都会很愉快。对于img标签的任何使用都应该如此。意思是,如果在img src属性中使用SVG,它将像图像一样起作用。就是说,我相信如果您这样做,就会失去SVG互动。


因此,假设您要实际将SVG放入代码中,则需要对SVG进行一些工作。

请注意大多数SVG如何在标头中具有硬编码的高度和宽度,只需删除硬编码的高度/宽度即可,因为view-box可以保持SVG的正确缩放图像的比例。

<svg width="299px" height="138px" viewBox="0 0 299 138" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="example">
            <rect id="Rectangle" fill="#D8D8D8" x="0" y="0" width="299" height="138"></rect>
            <circle id="Oval" fill="#46BEC6" cx="53" cy="50" r="26"></circle>
            <circle id="Oval-Copy" fill="#46BEC6" cx="105" cy="76" r="26"></circle>
            <circle id="Oval-Copy-2" fill="#46BEC6" cx="165" cy="95" r="26"></circle>
            <circle id="Oval-Copy-3" fill="#46BEC6" cx="217" cy="63" r="26"></circle>
            <circle id="Oval-Copy-4" fill="#46BEC6" cx="269" cy="32" r="26"></circle>
        </g>
    </g>
</svg>



<svg viewBox="0 0 299 138" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="example">
            <rect id="Rectangle" fill="#D8D8D8" x="0" y="0" width="299" height="138"></rect>
            <circle id="Oval" fill="#46BEC6" cx="53" cy="50" r="26"></circle>
            <circle id="Oval-Copy" fill="#46BEC6" cx="105" cy="76" r="26"></circle>
            <circle id="Oval-Copy-2" fill="#46BEC6" cx="165" cy="95" r="26"></circle>
            <circle id="Oval-Copy-3" fill="#46BEC6" cx="217" cy="63" r="26"></circle>
            <circle id="Oval-Copy-4" fill="#46BEC6" cx="269" cy="32" r="26"></circle>
        </g>
    </g>
</svg>


如果您不知道需要设置哪一个(例如动态图像),则需要先使用javascript对其进行测量,然后再应用正确的度量。遵循以下原则:

fixImage(){
  var img = findTheImageInTheDom;
  if (img.width > img.height){
    img.width = "100%";
  } else {
    img.height = "100%";
}