使图像填充剩余的垂直空间,无滚动

Ove*_*ivr 5 html javascript css angularjs angular-material

我有一个标题,段落和单个图像的页面,可以有非常不同的大小/宽高比.

我希望图像适应,以便它可以填充最大可用高度,或受其宽度限制,而不会失去纵横比,也不会导致滚动.

这是我的基本配置:

angular.module("myApp", ["ngMaterial"]);
Run Code Online (Sandbox Code Playgroud)
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.0.0-rc7/angular-material.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-animate.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-aria.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-messages.min.js"></script>

<script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.0.0-rc7/angular-material.min.js"></script>

<div ng-app="myApp" layout="column" layout-fill> 
  <div flex style="background: red;">
    <h1>Title</h1>
    <p>Details. Blablabla.</p> 
  </div>
  <div flex="60" style="background: blue;" object-fit="fill">
    <img id="myImg" ng-src="http://placehold.it/200x400"/>
    <!-- Should work with such extreme case as well -->
    <!-- <img id="myImg" ng-src="http://placehold.it/1000x200" /> -->
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我看了很多SO帖子,网站,博客等等.我无法弄清楚从哪里开始完成这项工作.关于流体图像或响应图像的大多数文章仅涉及可滚动网页.因此,即使是关于该主题的良好参考也会有所帮助.谢谢.

编辑:更新了剪切使用flex布局.如您所见,图像超出了蓝色div界限.我曾经使用过object-fit="content";或者object-fit="fill";似乎没有人限制图像来尊重div界限

Ale*_*lex 1

它可以通过object-fit它不支持IE)和CSS calc它支持大多数浏览器)来完成。

你做了什么?

我用 div( .wrapper) 包裹图像,用 css 计算它的高度calc

height: calc(100vh - 19px - 38px); //100% of viewport - height of p - height of h1
Run Code Online (Sandbox Code Playgroud)

然后通过保持图像的比例来object-fit拟合图像的高度。.wrapper

图片由高处拍摄

height: calc(100vh - 19px - 38px); //100% of viewport - height of p - height of h1
Run Code Online (Sandbox Code Playgroud)
angular.module("myApp", ["ngMaterial"]);
Run Code Online (Sandbox Code Playgroud)
h1,
p {
  padding: 0;
  margin: 0;
}
.wrapper {
  width: 100%;
  height: calc(100vh - 19px - 38px);
}
img {
  object-fit: fill;
  height: 100%;
  max-width: 100%;
  display: block;
  margin: 0 auto;
}
Run Code Online (Sandbox Code Playgroud)

高度较低的图像

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.0.0-rc7/angular-material.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-animate.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-aria.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-messages.min.js"></script>

<script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.0.0-rc7/angular-material.min.js"></script>

<div ng-app="myApp" layout="column" layout-align="center center" style-parent>
  <h1>Title</h1>
  <p>Details. Blablabla.</p>
  <div class="wrapper">
    <img id="myImg" ng-src="http://placehold.it/200x400" /> 
    <!-- Should work with such extreme case as well -->
    <!-- <img id="myImg" ng-src="http://placehold.it/1000x200" /> -->
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)
angular.module("myApp", ["ngMaterial"]);
Run Code Online (Sandbox Code Playgroud)
h1,
p {
  padding: 0;
  margin: 0;
}
.wrapper {
  width: 100%;
  height: calc(100vh - 19px - 38px);
}
img {
  object-fit: fill;
  height: 100%;
  max-width: 100%;
  display: block;
  margin: 0 auto;
}
Run Code Online (Sandbox Code Playgroud)