简体   繁体   English

缩放不同宽度的图像以适合一行并保持相同的高度

[英]Scale different width images to fit a row and maintain equal height

I have three images which are all different widths , but each the same height . 我有三个不同宽度的图像,但每个图像的高度相同

I want these images to be in a responsive row so that the combined width of these three images is 100% the width of the screen, all of the images have equal height, each image maintains its aspect ratio, and the images are not cropped. 我希望这些图像位于响应行中,这样这三个图像的组合宽度是屏幕宽度的100%,所有图像都具有相同的高度,每个图像保持其纵横比,并且图像不会被裁剪。

One way to do it would be to set a different percentage width for each image in CSS, based upon each image's width according to the others. 一种方法是根据每个图像的宽度根据其他图像为CSS中的每个图像设置不同的百分比宽度。 But I'm curious about a smarter way, probably using JavaScript/jQuery, which would be more efficient for doing this type of thing at a larger scale. 但我对一种更聪明的方式感到好奇,可能使用JavaScript / jQuery,这样可以更有效地进行更大规模的此类事情。

This could work - by using css table layout. 这可以工作 - 通过使用CSS表格布局。

jsFiddle 的jsfiddle

 body { margin: 0; } ul { list-style: none; padding: 0; margin: 0; display: table; border-collapse: collapse; width: 100%; } li { display: table-cell; } img { display: block; width: 100%; height: auto; } 
 <ul> <li><img src="//dummyimage.com/100x100/aaa" /></li> <li><img src="//dummyimage.com/200x100/bbb" /></li> <li><img src="//dummyimage.com/300x100/ccc" /></li> </ul> 

If the source images vary in height, you will have to use JavaScript. 如果源图像的高度不同,则必须使用JavaScript。 Set all of the images to an arbitrary common height and find their combined width at that height. 将所有图像设置为任意公共高度,并在该高度处找到它们的组合宽度。 Then increase the height by multiplying the difference of the target width and the combined width (as a percentage): 然后通过乘以目标宽度与组合宽度的差值(以百分比表示)来增加高度:

 $(window).on("load resize", function () { // wait for the images to complete loading $(".imgRow").each(function () { var row = $(this); var imgs = row.find("img"); imgs.height(1000); var combinedWidth = imgs.get().reduce(function(sum, img) { return sum + img.clientWidth; }, 0); var diff = row.width() / combinedWidth; imgs.height(999 * diff); // 999 allows 1 px of wiggle room, in case it's too wide }); }); 
 .imgRow { clear: left; } .imgRow img { float: left; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="imgRow"> <img src="http://placecage.com/100/300" /> <img src="http://placecage.com/300/300" /> <img src="http://placecage.com/500/300" /> </div> <div class="imgRow"> <img src="http://fillmurray.com/600/300" /> <img src="http://fillmurray.com/200/300" /> <img src="http://fillmurray.com/400/300" /> </div> <div class="imgRow"> <img src="http://nicenicejpg.com/500/300" /> <img src="http://nicenicejpg.com/100/300" /> <img src="http://nicenicejpg.com/300/300" /> </div> <div class="imgRow"> <img src="http://placesheen.com/400/300" /> <img src="http://placesheen.com/600/300" /> <img src="http://placesheen.com/250/300" /> </div> 

My first approach to this would be to create three divs within a container div. 我的第一个方法是在容器div中创建三个div。 Assign a height and a width of 33.33% to each of the three (and a float:left;) and 100% width to the container. 为容器中的每一个(以及浮点数:左;)和100%宽度分配高度和宽度33.33%。 Then set your three images to be the background of those three divs with the correct background properties such as 然后将三个图像设置为具有正确背景属性的三个div的背景,例如

background-size:cover;

It might cut off bits of your images depending on the width of the screen but I don't think you will be able to get around that with images that are not the exact same size. 根据屏幕的宽度,它可能会截断您的图像位,但我不认为您可以使用不完全相同的图像来解决这些问题。

HTML HTML

<div class="container">
   <div class="image" style="background-image: url('/image.jpg');">
   </div>
   <div class="image" style="background-image: url('/image.jpg');">
   </div>
   <div class="image" style="background-image: url('/image.jpg');">
   </div>
</div>

CSS CSS

.container{
   width:100%;
}
.image{
   float:left;
   width:33.33%;
   background-size:cover;
   background-repeat: no-repeat;
}

The gist of the approach I'd take is to figure out how big your frame is, and figure out how wide the sum of your imgs are. 我采取的方法的要点是弄清楚你的框架有多大,并弄清楚你的图像总和有多宽。 Then, using a ratio of those totals, resize each of the images. 然后,使用这些总数的比率,调整每个图像的大小。

$(document).ready(function(){
var frameWidth = $("div.imgs").width()
var totalImgWidths = $("img#img1").width() + $("img#img2").width() + $("img#img3").width()
var ratio = frameWidth / totalImgWidths
var fudge = .95

$("img#img1").width(Math.floor($("img#img1").width() * ratio * fudge) )
$("img#img2").width(Math.floor($("img#img2").width() * ratio * fudge) )
$("img#img3").width(Math.floor($("img#img3").width() * ratio * fudge) )
})

See a quick plunker I quickly wrote up. 看到我迅速写了一个快速的plunker It's not fancy, and it's employing a bit of a fudge factor, so I'm happy if anyone can improve on it. 这不是花哨的,而且它使用了一点软糖因素,所以如果有人能改进它,我很高兴。

You might want to use this a basis for refining a solution: 您可能希望使用此基础来优化解决方案:

https://jsfiddle.net/kb4gg35f/ https://jsfiddle.net/kb4gg35f/

For some reason this does not work as a snippet. 出于某种原因,这不能作为一个片段。 It works as a fiddle, though. 不过,它可以作为一个小提琴。

 var images = $('img'); var accumulatedWidth = 0; var widthResizeFactor; var screenWidth = $('div').width(); var originalSizeArray = []; $(document).ready(function() { for (var i = 0; i < images.length; i++) { var theImage = new Image(); theImage.src = images[i].src; accumulatedWidth += theImage.width; originalSizeArray.push(theImage.width); } widthResizeFactor = screenWidth / accumulatedWidth; for (var i = 0; i < images.length; i++) { images[i].width = originalSizeArray[i] * widthResizeFactor; } }); 
 body { margin: 0; } div:after { content: ""; display: table; clear: left; } img { float: left; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <div> <img src="http://lorempixel.com/100/200" /> <img src="http://lorempixel.com/200/200" /> <img src="http://lorempixel.com/400/200" /> </div> 

Twitter Bootstrap (or any decent CSS framework) has special CSS class pre-defined who do that. Twitter Bootstrap(或任何体面的CSS框架)都有预先定义的特殊CSS类,他们这样做。

See the doc: http://getbootstrap.com/css/#grid 请参阅doc: http//getbootstrap.com/css/#grid

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM