在保持纵横比的同时在正方形容器中填充图像

时间:2014-06-09 13:53:39

标签: javascript jquery html css

我正在尝试使用非正方形的随机大小的图像在CSS中制作图像网格。 有没有人有解决方案用图像填充固定大小的div内的所有空间?

参见我的例子(蓝色是固定大小的div,里面的图像是红色的:

Image Example

6 个答案:

答案 0 :(得分:5)

您可以使用css,background-size:cover;

<style>
    .img1 {
        background-image: url(microsoft-logo.png);
    }
    .img2 {
        background-image: url(google-icon.png);
    }
    .img3 {
        background-image: url(Azend_Loggo.png);
    }
    .img-cover {
        width: 50px;
        height: 50px;
        background-size: cover;
        background-position: center;
        background-repeat: no-repeat;
    }
</style>

<div class="img-cover img1">

</div>
<div class="img-cover img2">

</div>
<div class="img-cover img3">

</div>

答案 1 :(得分:3)

使用此CSS规则:

background-size: cover;
background-position: center;

<强> DEMO

答案 2 :(得分:0)

我有一些代码可以执行此操作并允许您设置所需的大小...

<?PHP
function imageResize($image,$maxwidth,$maxheight) {
    $imgData = getimagesize("img/profiles/".$image);    
    $width  = $imgData[0];
    $height = $imgData[1];
    // takes the larger size of the width and height and applies the
    // formula accordingly...this is so this script will work
    // dynamically with any size image
    // First we'll scale down the width since it's the larger of the tw values
    if ($width > $maxwidth) {
        $percentage = ($maxwidth / $width);
        $width = round($width * $percentage);
        $height = round($height * $percentage);
    }
    // Next we'll scale down the height since it's the larger of the tw values
    if ($height > $maxheight) {
        $percentage = ($maxheight / $height);
        $width = round($width * $percentage);
        $height = round($height * $percentage);
    }
    $topMargin = ($maxheight-$height)/2;
    $topMargin .= "px";
    //returns the new sizes in html image tag format...
    // this is so you can plug this function inside an image tag and just get the results
    return "width=\"$width\" height=\"$height\" style=\"margin-top:$topMargin px;\"";
}
?>

然后包含以下内容:

<div id="profile-picture">
    <img src="img/profiles/<?PHP echo $profileImg; ?>" <?PHP echo imageResize($profileImg,238,232); ?> />
</div>

不确定这是否有用..但它对我有用。

答案 3 :(得分:0)

你可以在这个解决方案中尝试下面css的固定div的图像标签你必须遵循的一个条件是,你的图像尺寸应该大于你的div,即如果你的div是100px那么最小图像尺寸应该是100px或更多:

div > img {
 width:100%;
 overflow:hidden;
} 

答案 4 :(得分:0)

看到你用jQuery标记了问题,我将冒昧地建议你为此编写一个小的jQuery插件。这是 JSFiddle demo

// Define plugin 'containImg'
$.fn.containImg = function(){
    this.each(function(){
        // Set variables
        var $t = $(this),
            $p = $t.parent('div'),
            pw = $p.width(),
            ph = $p.height(),
            // Figure if width or height should be 100%
            iw = ( pw / ph >= 1 ) ? 'auto' : '100%',
            ih = ( iw == 'auto' ) ? '100%' : 'auto';
        // Set dimensions
        $t.css({
            'width': iw,
            'height': ih
        });
    });
}

// Call plugin
$('img').containImg();

基本逻辑是,如果图像具有水平拉伸的父div,则需要设置height:100%以填充高度,并width:auto以保持纵横比。如果父div形状是垂直的,则必须将其反转。

如果有人对如何改进代码有意见我会提出建议!

答案 5 :(得分:0)

你可以只使用css但js可以提供帮助,这里遵循我的简单代码。

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">

<html>
<head>
    <title></title>
    <style type="text/css">
        div.image-box{display:block;position:relative;overflow:hidden;width:200px;border:1px solid #ccc;padding:0;height:200px;}
        div.image-box img{width:100%;height:auto;margin:0; padding:0;margin-bottom:-4px;position:absolute;top:0;left:0;}
        div.image-box.horizontal img{height:100%;width:auto;left:50%;}
        div.image-box.vertical img{height:auto;width:100%;top:50%;}
    </style>
</head>

<body>
    <div class="image-box"><img src="https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcS08-IWtcbvcehgeszlD2nI6s-OAungNCsLNIc-f3QjIOkvOq8abg" alt=""></div>
    <div class="image-box"><img src="http://1.bp.blogspot.com/_e-y-Rrz58H4/TUS4qRlRUrI/AAAAAAAABQo/H322eTHRB2s/s1600/Man_Face.jpg" alt=""></div>

    <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $('.image-box').each(function(){
                if($(this).find('img').height() > $(this).find('img').width()){
                    $(this).addClass('vertical');
                    $(this).find('img').css('margin-top','-'+$(this).find('img').height()/2+'px');
                }else{
                    $(this).addClass('horizontal');
                    $(this).find('img').css('margin-left','-'+$(this).find('img').width()/2+'px');
                }
            });
        });

    </script>
</body>
</html>

希望有所帮助