提问



问题



如何在包含div的内部对齐图像?


实施例



在我的例子中,我需要使用class ="frame垂直居中<div>中的<img>:


<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>


.frame高度固定,图像高度未知。如果那是唯一的解决方案,我可以在.frame中添加新元素。我试图在IE≥7,Webkit,Gecko上执行此操作。


在这里看到jsfiddle [74]

最佳参考


我所知道的唯一(也是最好的跨浏览器)方式是在两个元素上使用inline-block辅助函数height: 100%vertical-align: middle


所以有一个解决方案:http://jsfiddle.net/kizu/4RPFa/4570/[75]




.frame {
    height: 25px;      /* equals max image height */
    width: 160px;
    border: 1px solid red;
    white-space: nowrap; /* this is required unless you put the helper span closely near the img */
    
    text-align: center; margin: 1em 0;
}

.helper {
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}

<div class=frame>
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=250 />
</div>
<div class=frame>
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=25 />
</div>
<div class=frame>
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=23 />
</div>
<div class=frame>
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=21 />
</div>
<div class=frame>
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=19 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=17 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=15 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=13 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=11 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=9 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=7 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=5 />
</div>
<div class=frame>
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=3 />
</div>



这可能很有用:


div {
    position:relative;
    width:200px;
    height:200px;
}
img {
    position:absolute;
    top:0;
    bottom:0;
    margin:auto;
}
.image {
    min-height:50px
}


参考:http://www.student.oulu.fi/~laurirai/www/css/middle/[76]

其它参考1


matejkramny的解决方案是一个良好的开端,但超大图像的比例错误。

这是我的叉子:


演示:https://jsbin.com/lidebapomi/edit?html,css,output [77]







HTML:


<div class="frame">
  <img src="foo"/>
</div>


CSS:


.frame {  
    height: 160px; /*can be anything*/
    width: 160px; /*can be anything*/
    position: relative;
}
img {  
    max-height: 100%;  
    max-width: 100%; 
    width: auto;
    height: auto;
    position: absolute;  
    top: 0;  
    bottom: 0;  
    left: 0;  
    right: 0;  
    margin: auto;
}

其它参考2


3线解决方案:


position: relative;
top: 50%;
transform: translateY(-50%);


这适用于任何事情。


从这里开始。[78]

其它参考3


一个纯粹的CSS解决方案:


http://jsfiddle.net/3MVPM/[79]


CSS:


.frame {  
    margin: 1em 0;  
    height: 35px;
    width: 160px;
    border: 1px solid red;
    position: relative;
}  
img {  
    max-height: 25px;  
    max-width: 160px;  
    position: absolute;  
    top: 0;  
    bottom: 0;  
    left: 0;  
    right: 0;  
    margin: auto;  
    background: #3A6F9A;  
}


关键的东西


// position: relative; - in .frame holds the absolute element within the frame
// top: 0; bottom: 0; left: 0; right: 0; - this is key for centering a component
// margin: auto; - centers the image horizontally & vertically

其它参考4


这样你就可以垂直居中(演示):[80]


div{
  height:150px; //IE7fix
  line-height: 150px;
}
img{
  vertical-align: middle;
  margin-bottom:0.25em;
}

其它参考5


对于那些登陆这篇文章并且对更现代的解决方案感兴趣并且不需要支持旧版浏览器的人,您可以这样做:




.frame {
    display: flex;
    /*Uncomment below to center horizontally*/
    /*justify-content: center;*/
    align-items: center;
}

img {
    height: auto;
}

/* Styling stuff not needed for demo */
.frame {
    max-width: 900px;
    height: 200px;
    margin: auto;
    background: #222;
}
p {
    max-width: 900px;
    margin: 20px auto 0;
}
img {
    width: 150px;
}

<div class="frame">
    <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/9988/hand-pointing.png">
</div>



您可以尝试将PI的CSS设置为display: table-cell; vertical-align: middle;

其它参考6


flexbox!有一个超级简单解决方案


.frame {
    display: flex;
    align-items: center;
}

其它参考7


背景图片解决方案
我一起删除了图像元素并将其设置为div的背景.frame


http://jsfiddle.net/URVKa/2/[81]


这至少适用于IE8,FF6和Chrome13


我检查过,这个解决方案无法缩小大于25px高度的图像。有一个名为background-size的属性确实设置了元素的大小,但是CSS3会与IE7要求冲突。


我建议您重做浏览器优先级并设计最佳浏览器,或者如果您想使用此解决方案,请获取一些服务器端代码来调整图像大小

其它参考8


http://jsfiddle.net/MBs64/[82]


.frame {
    height: 35px;      /* equals max image height */
    width: 160px;
    border: 1px solid red;
    text-align: center; 
    margin: 1em 0;
    display: table-cell;
    vertical-align: middle;
}
img {
    background: #3A6F9A;
    display: block;
    max-height: 35px;
    max-width: 160px;
}


关键属性是display:table-cell;对于.frame。 Div.frame显示为与此内联,因此您需要将其包装在块元素中。


这适用于FF,Opera,Chrome,Safari和IE8 +。


UPDATE


对于IE7,我们需要添加一个css表达式:


*:first-child+html img {
    position: relative;
    top: expression((this.parentNode.clientHeight-this.clientHeight)/2+"px");
}

其它参考9


你可以这样做:


演示



http://jsfiddle.net/DZ8vW/1[83]


CSS



.frame {
    height: 25px;      /* equals max image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center; margin: 1em 0;
    position: relative; /* Changes here... */
}
img {
    background: #3A6F9A;
    max-height: 25px;
    max-width: 160px;
    top: 50%;           /* here.. */
    left: 50%;           /* here... */
    position: absolute; /* and here */
}    


点击


的JavaScript



$("img").each(function(){
    this.style.marginTop = $(this).height() / -2 + "px";
})

其它参考10


你可以尝试下面的代码




.frame{
 display:flex;
 justify-content: center;
 align-items: center;
 width:100%;
} 

<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>



不确定IE,但在Firefox和Chrome下,如果div容器中有img,则以下css应该有效。至少对我来说效果很好:


div.img-container {
    display:table-cell;
    vertical-align: middle;
    height: 450px;
    width: 490px;
}

div.img-container img {
    max-height: 450px;
    max-width: 490px;
}

其它参考11


与纯css一起尝试这个解决方案http://jsfiddle.net/sandeep/4RPFa/72/
可能是你的HTML的主要问题。定义c lass& image height在你的HTML中。 [84]


CSS:


.frame {
    height: 25px;      /* equals max image height */
    width: 160px;
    border: 1px solid red;
    position:relative;
    margin: 1em 0;
    top: 50%;
    text-align: center;
    line-height: 24px;
    margin-bottom:20px;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    line-height:0;
    margin:0 auto;
    max-height:25px;
}


编辑:


当我使用img标签时,它会从top离开3px to 2px空间。现在我减少了line-height和它的工作。
 CSS:


    .frame {
        height: 25px;      /* equals max image height */
        width: 160px;
        border: 1px solid red;
        margin: 1em 0;
        text-align: center;
        line-height:22px;
        *:first-child+html line-height:24px; /* for IE7 */
    }

    img {
        background: #3A6F9A;
        vertical-align: middle;
        line-height:0;    
        max-height:25px;
        max-width:160px;
    }
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .frame {
        line-height:20px; /* webkit browsers */
    }


line-height属性render在不同的浏览器中有所不同。所以;我们必须定义不同的line-height属性浏览器


查看此示例http://jsfiddle.net/sandeep/4be8t/11/[85]


在Firefox和Chrome 中查看关于line-height不同浏览器中不同浏览器输入高度差异的示例

其它参考12


我的解决方案:http://jsfiddle.net/XNAj6/2/[87]


<div class="container">
    <div class="frame">
        <img src="http://jsfiddle.net/img/logo.png" class="img" alt="" />
    </div>
</div>

.container {
    display: table;
    float: left;
    border: solid black 1px;
    margin: 2px;
    padding: 0;
    background-color: black;
    width: 150px;
    height: 150px;
}
.frame {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    border-width: 0;
}
.img {
    max-width: 150px;
    max-height: 150px;
    vertical-align: middle;
}

其它参考13


对我有用的简单方法:


img {
    vertical-align: middle;
    display: inline-block;
    position: relative;
}


非常适合谷歌浏览器。在不同的浏览器上尝试这个。

其它参考14


这适用于现代浏览器(2016年编辑时),如此代码中的演示所示[88]


.frame {
    height: 25px;
    line-height: 25px;
    width: 160px;
    border: 1px solid #83A7D3;          
}
.frame img {
    background: #3A6F9A;
    display:inline-block;
    vertical-align: middle;
}


为图像提供类或使用继承来定位需要居中的图像非常重要。在这个例子中,我们使用.frame img {},以便只有具有.frame类的div包装的图像才会被定位。

其它参考15


如果您可以使用像素大小的边距,只需将font-size: 1px;添加到.frame即可。但请记住,现在在.frame 1em=1px上,这意味着,您还需要设置以像素为单位的边距。


http://jsfiddle.net/feeela/4RPFa/96/[89]


编辑:现在它不再集中在Opera ......


其它参考16


解决方案使用表&表格细胞



有时它应该通过显示为table/table-cell来解决。例如快速标题屏幕。这也是W3推荐的方式。我建议你查看这个名为W3C.org中心的链接[90]


这里使用的提示是:



  • 绝对定位容器显示为表

  • 垂直对齐显示为表格单元格的中心内容





.container {
position:absolute;
display:table;
width:100%;
height:100%;
}
.content {
display:table-cell;
vertical-align:middle;
}

<div class="container">
  <div class="content">
    <h1 style="text-align:center"> PEACE IN THE WORLD </h1>
 </div>
</div> 



用于将图像集中在容器内(可能是徽标),除了这样的一些文本:


[91]


基本上你包装图像




.outer-frame {
  border: 1px solid red;
  min-height: 200px;
  text-align: center; //only for align horizontally
}

.wrapper{
  line-height: 200px;
  border: 2px dashed blue;
  border-radius: 20px;
  margin: 50px
}

img {
//height: auto;
  vertical-align: middle;
}

<div class="outer-frame">
  <div class="wrapper">
    some text
    <img src="http://via.placeholder.com/150x150">
  </div>
</div>



我有同样的问题。这对我有用:


<style type="text/css">
div.parent {
     position: relative;
}

img.child {
    bottom: 0;
    left: 0;
    margin: auto;
    position: absolute;
    right: 0;
    top: 0;
}
</style>

<div class="parent">
    <img class="child">
</div>

其它参考17


使用tabletable-cell方法完成这项工作,特别是因为您也定位了一些旧浏览器,我为您创建了一个片段,您可以运行它并检查结果:


.wrapper {
  position: relative;
  display: table;
  width: 300px;
  height: 200px;
}

.inside {
  vertical-align: middle;
  display: table-cell;
}

<div class="wrapper">
  <div class="inside">
    <p>Centre me please!!!</p>
  </div>
  <div class="inside">
    <img src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
  </div>
</div> 



最好的解决方案是


.block{
    /* decor */
    padding:0 20px;
    background:#666;
    border:2px solid #fff;
    text-align:center;
    /* important */
    min-height:220px;
    width:260px;
    white-space:nowrap;
}
.block:after{
    content:'';
    display:inline-block;
    height:220px; /* the same as min-height */
    width:1px;
    overflow:hidden;
    margin:0 0 0 -5px;
    vertical-align:middle;
}
.block span{
    vertical-align:middle;
    display:inline-block;
    white-space:normal;
}

其它参考18


我一直在玩填充物用于中心对齐。您需要定义顶级外部容器大小,但内部容器应调整大小,并且可以将填充设置为不同的百分比值。


jsfiddle [92]


<div class='container'>
  <img src='image.jpg' />
</div>

.container {
  padding: 20%;
  background-color: blue;
}

img {
  width: 100%;
}

其它参考19


我在这里发布的旧JSFiddle链接不再工作,这可能是downvote的原因。只是为了这是一个有效的答案我仍然想再次发布jQuery解决方案。这适用于已应用v_align类的每个元素。它将在父级中心垂直,并且在重新调整窗口大小时将重新计算。


链接到JSFiddle [93]


$(document).ready(function() {
  // define the class that vertial aligns stuff
  var objects = '.v_align';
  // initial setup
  verticalAlign(objects);

  // register resize event listener
  $(window).resize(function() {
    verticalAlign(objects);
  });
});

function verticalAlign(selector) {
  $(selector).each(function(val) {
    var parent_height = $(this).parent().height();
    var dif = parent_height - $(this).height()
    // should only work if the parent is larger than the element
    var margin_top = dif > 0 ? dif/2 : 0;
    $(this).css("margin-top", margin_top + "px");
  });
}

其它参考20


这个怎么样?


position: absolute;
top: calc(50% - 0.5em);
left: calc(50% - 0.5em);
line-height: 1em;


你可以改变font-size

其它参考21


想要对齐文本/标题之后的图像并且两者都在div中吗?


请参阅JSfiddle或Run Code Snippet。[94]


请确保在所有元素(div,img,title等)上都有ID或类。


对我来说,在所有浏览器上使用此解决方案(对于移动设备,您必须使用以下代码调整代码:@media)。




h2.h2red {
color: red; 
font-size: 14px;
}
.mydivclass {
margin-top: 30px;
display: block;
}
img.mydesiredclass {
margin-right: 10px;  
display: block;  
float: left;/*If you want to allign the text with an image on the same row*/  
width: 100px;
heght: 100px;
margin-top: -40px/*Change this value to adapt to your page*/;
}

<div class="mydivclass">
<br />
<img class="mydesiredclass" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/2000px-Wikipedia-logo-v2-en.svg.png">
<h2 class="h2red">Text alligned after image inside a div by negative manipulate the img postion</h2>
</div>



这段代码对我很有用。


<style>
.listing_container{width:300px; height:300px;font: 0/0 a;}
.listing_container:before { content: ' ';display: inline-block;vertical-align: bottom;height: 100%;}
 .listing_container img{ display: inline-block; vertical-align: middle;font: 16px/1 Arial sans-serif; max-height:100%; max-width:100%;}
<style>

<div class="listing_container">
    <img src="http://www.advancewebsites.com/img/theme1/logo.png">  
 </div>

其它参考22


您可以在div中使用表结构


<div class="frame">
     <table width="100%">
         <tr>
            <td vertical-align="middle" align="center" height="25">
                <img src="https://jsfiddle.net/img/logo.png" >  
            </td>
        </tr>
    </table>
</div>