【问题标题】:Centering image inside a div using CSS instead of jquery使用 CSS 而不是 jquery 在 div 中居中图像
【发布时间】:2015-09-25 00:42:42
【问题描述】:

我正在尝试将任何大小的图像放入(始终)方形 div 中,并在父 div 的大小发生变化时保留外观。这就是我正在做的事情:

CSS:

.photo_container {
    width: 250px;
    height: 250px;
    overflow: hidden;
    border-style: solid;
    border-color: green;
    float:left;
    margin-right:10px;
    position: relative;
}

.photo_container a img{
    position:absolute;
}

HTML

<!--p>Photo's height>width </p-->
<div class="photo_container">
    <a href="#">
        <img class="photo"  src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/ECurtis.jpg/224px-ECurtis.jpg" 
style="width:100%; height:auto;">
        </img>
    </a>
</div>

<!--p>Photo's width>height </p-->
<div class="photo_container">
    <a href="#">
        <img class="photo"  src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/220px-Altja_j%C3%B5gi_Lahemaal.jpg" 
style="width:auto; height:100%;left=-100px">
        </img>
    </a>
</div>

Javascript:

// fix image size on load
$(".photo").one("load", function() {
  fixImage($(this));
}).each(function() {
  if(this.complete) $(this).load();
});

// Just to test if everything's working fine
$(".photo").on("click",function(){
   var rand = Math.floor(Math.random() * 200) + 80;  
    $(this).parent().parent().width(rand);
    $(this).parent().parent().height(rand);   
   fixImage($(this));
});

// Brings the photo dead center
function fixImage(obj){
        //alert("something changed");
        var pw = obj.parent().parent().width(); 
        var ph = obj.parent().parent().height();         
        var w = obj.width();
        var h = obj.height();
        console.log(w+"   "+pw);
        if(h>w){
            var top = (h-ph)/2;
            obj.css("top",top*-1);
        }else{
            var left = (w-pw)/2;
            obj.css("left",left*-1);            
        }

}

工作示例:http://jsfiddle.net/vL95x81o/4

如何在不使用 jquery 而只使用 CSS 的情况下做到这一点?如果 div 的大小从不改变,则此解决方案很好。但我正在研究响应式设计,似乎photo_container div 的大小可能需要根据屏幕大小进行更改(通过 CSS)。

以下是裁剪前的照片:

【问题讨论】:

标签: jquery css


【解决方案1】:

你可以这样做:

http://jsfiddle.net/vL95x81o/5/

<!--p>Photo's height>width </p-->
<div class="photo_container">
    <div class="photo photo--1">
    </div>
</div>

<!--p>Photo's width>height </p-->
<div class="photo_container">
    <div class="photo photo--2">
    </div>
</div>

.photo_container {
    width: 250px;
    height: 250px;
    overflow: hidden;
    border-style: solid;
    border-color: green;
    float:left;
    margin-right:10px;
    position: relative;
}

.photo {
    height: 100%;
    width: 100%;
}

.photo--1 {
    background: url('https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/ECurtis.jpg/224px-ECurtis.jpg') no-repeat center center;
    background-size: cover;
}

.photo--2 {
      background: url('https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/220px-Altja_j%C3%B5gi_Lahemaal.jpg') no-repeat center center;
    background-size: cover;
}

我已将 imgs 更改为带有背景图像的 div,并使用背景位置覆盖,图像居中。

【讨论】:

【解决方案2】:

其他人贴的后台解决方案是我最初的想法,但如果你还想使用图片,那么你可以这样做:

CSS:

.photo_container {
    width: 250px;
    height: 250px;
    overflow: hidden;
    border-style: solid;
    border-color: green;
    float:left;
    margin-right:10px;
    position: relative;
}

.photo_container img {
    min-width: 100%;
    min-height: 100%;
    position: relative;
    top: 50%;
    left: 50%;
    transform: translateY(-50%) translateX(-50%);
}

HTML:

<div class="photo_container">
    <a href="#">
        <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/ECurtis.jpg/224px-ECurtis.jpg" />
    </a>
</div>

<div class="photo_container">
    <a href="#">
        <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/220px-Altja_j%C3%B5gi_Lahemaal.jpg" />
    </a>
</div>

这将使内部的任何图像为 100% 高或 100% 宽,具体取决于最短属性,并将它们水平和垂直居中。

编辑

值得注意的是,IE8 或 Opera Mini 不支持转换 - http://caniuse.com/#feat=transforms2d

【讨论】:

  • 酷!这接近我想要的 - 当前结构没有变化。但是我看到图像和左侧边框之间随机出现 1pix 的间隙,用于纵向,在顶部用于横向。知道为什么会这样吗?
  • 我明白你的意思,但前提是 div 的高度或宽度是奇数 - 比如 251px?对此的一个小技巧是设置min-width: 101%;min-height: 101%;,所以总是会有轻微的重叠,但我稍后会看看我是否能找到一种方法来阻止这种情况发生 100%。跨度>
  • 感谢您的解决方案,它就像一个魅力。想提一下,IE8 甚至不支持背景图像,Opera Mini 仅部分支持。所以对于那些我会求助于 jquery。
  • 太好了,很高兴它适合您。我还不能再次查看这个,但如果我有更多信息,我会在这里为你添加回来
【解决方案3】:

使用背景图片。

.photo_container {
    width: 250px;
    height: 250px;
    overflow: hidden;
    border-style: solid;
    border-color: green;
    float:left;
    margin-right:10px;
    position: relative;
}
.photo_container a{
   
  /* Set the background size to cover to scale the image */
  background-size: cover;

  /* Position the image in the center */
  background-position: 50% 50%;

  background-repeat: no-repeat;

    position:absolute;
  width: 100%;
  height: 100%;
}
<!--p>Photo's height>width </p-->
<div class="photo_container">
    <a href="#"  style="background-image: url(https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/ECurtis.jpg/224px-ECurtis.jpg);">
    </a>
</div>

<!--p>Photo's width>height </p-->
<div class="photo_container" >
    <a href="#" style="background-image: url(https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/220px-Altja_j%C3%B5gi_Lahemaal.jpg);">
    </a>
</div>

【讨论】:

    【解决方案4】:

    我在不使用背景图像或 JS 的情况下解决了这个问题。高度来自容器中的 before 标签。填充的 100% 等于宽度的 100%。所以高度总是一样的宽度。

    http://jsfiddle.net/a1rLeq06/

     <!--p>Photo's height>width </p-->
    <div class="photo_container">
        <a href="#">
            <img class="photo"  src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/ECurtis.jpg/224px-ECurtis.jpg" 
    style="width:100%; height:auto;">
            </img>
        </a>
    </div>
    
    <!--p>Photo's width>height </p-->
    <div class="photo_container">
        <a href="#">
            <img class="photo"  src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/220px-Altja_j%C3%B5gi_Lahemaal.jpg" 
    style="width:auto; height:100%;left=-100px">
            </img>
        </a>
    </div>
    

    CSS:

    .photo_container {
        width: 20%;
        display: inline-block;
        overflow: hidden;
        position: relative;
        margin: 10px 0;
    }
    
    .photo_container:before {
        content: '';
        display: block;
        padding-top: 100%;
    }
    
    .photo {
        position: absolute;
        top: 0;
        right: 0;
        left: 0;
        bottom: 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 2012-11-13
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2016-09-25
      • 2018-03-28
      • 2012-01-17
      • 1970-01-01
      相关资源
      最近更新 更多