如何在包含div的内部对齐图像?
示例
在我的示例中,我需要将<img>中的<div>垂直居中与class ="frame“:
<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>

.frame'的高度是固定的,图像的高度是未知的。如果这是唯一的解决方案,则可以在.frame中添加新元素。我试图在Internet Explorer 7及更高版本的WebKit,Gecko上进行此操作。 。



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

    text-align: center;
    margin: 1em 0;
}
img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
} 

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




评论

您好,很抱歉,但是我不同意在这里使用帮助器是最有价值的解决方案。但这不是唯一的方法。其他浏览器也支持。我在stackoverflow.com/a/43308414/7733724和W3C.org上提供了有关信息的解决方案。你可以检查一下。干杯

阅读有关W3C的Centering Things文章将很有用:w3.org/Style/Examples/007/center.en.html

对齐的完美指南css-tricks.com/centering-css-complete-guide

我认为关键是.frame中的行高才能完成这项工作

#1 楼

据我所知,唯一(也是最好的跨浏览器)方式是在两个元素上同时使用inline-block帮助器和height: 100%vertical-align: middle

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




 .frame {
    height: 25px;      /* Equals maximum 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=250px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=25px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=23px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=21px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=19px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=17px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=15px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=13px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=11px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=9px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=7px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=5px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=3px />
</div> 





或者,如果您不想在现代浏览器中添加多余的元素并且不介意使用Internet Explorer表达式,则可以使用伪元素并将其添加到Internet资源管理器使用方便的表达式,每个元素仅运行一次,因此不会出现任何性能问题:

Internet Explorer的:beforeexpression()解决方案:http://jsfiddle.net/kizu / 4RPFa / 4571 /




 .frame {
    height: 25px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    white-space: nowrap;

    text-align: center;
    margin: 1em 0;
}

.frame:before,
.frame_before {
    content: "";
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}

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

/* Move this to conditional comments */
.frame {
    list-style:none;
    behavior: expression(
        function(t){
            t.insertAdjacentHTML('afterBegin','<span class="frame_before"></span>');
            t.runtimeStyle.behavior = 'none';
        }(this)
    );
} 

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






工作原理:



当两个inline-block元素彼此靠近时,可以彼此对齐到另一侧,因此使用vertical-align: middle时,您将得到类似以下的信息: ,您可以在px中设置内部块的高度。
因此,在具有固定高度的块中添加一个em%将使其中的另一个inline-block元素(在您的情况下为height: 100%)垂直对齐。


评论


您可以自己查看:jsfiddle.net/kizu/Pw9NL-只有内联框不会生成框,但是其他所有情况都可以。

– kizu
2011年9月6日下午5:01

很好的答案。我在内联块元素(即.frame和.frame:before之间)之间的空间中挣扎。此处提出的解决方案是在.frame中添加margin-left:-4px。希望这可以帮助。

–米克
13年5月14日在9:07



请注意:不在添加的 帮助器中。在外面我只是没有意识到这一点,就把我的每一缕头发都拉了。

– ryan
2013年12月12日21:50



似乎您还需要添加“空白:nowrap;”。到框架,或者如果图像和辅助跨度之间有换行符,则会遇到问题。我花了一个小时才知道这个解决方案对我不起作用。

– juminoz
2014年1月1日18:59

在我的情况下,我的图像的max-height和max-width都设置为100%,因此图像会缩放容器,并且此方法不起作用。我的解决方案是将这些值更改为90%(在我的情况下还可以;在另一种情况下,您可能需要相应地缩放容器),并在图像的另一侧添加一个辅助对象,以便即使在页面上也可以保留填充双方。

–埃里克·杜贝(EricDubé)
2014年8月18日下午4:14

#2 楼

这可能会有用:

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


评论


如果您还希望水平对齐图像,请添加left:0;正确:0;到img

–詹姆斯·金
13年2月2日,下午3:09

这是不是在IE10中起作用?我有点在整个地方使用

– Max Yari
2015年2月9日在17:28

也对具有position:fixed;的div容器有效(对我而言)

– PJ Brunet
15年5月17日在7:23



谢谢!为我工作!

–亚历山大·马林金
4月7日20:07

这是最好的解决方案

–Fotios Tragopoulos
5月19日9:50

#3 楼

matejkramny的解决方案是一个不错的开始,但是过大的图像比例不正确。

这是我的叉子:

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




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倍),并且仍然保持水平和垂直居中?

–贾斯汀
15年4月20日在17:51

如果要使其垂直对齐底部而不是中间对齐,应修改哪些代码?

– bobo
16-3-16在23:53



@bobo只需删除顶部:0;。这只会导致底部:0;垂直应用。

– jomo
16 Mar 17 '16 at 11:06



最好的答案!

–user315338
2月11日在16:16

#4 楼

三行解决方案:

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


这适用于任何事物。

从这里开始。

评论


前缀:-ms-或-webkit-(转换前)。 w3schools.com/cssref/css3_pr_transform.asp

–乔治·奥皮内尔(Jorge Orpinel)
2015年4月19日在3:03



IE9的前缀,但在IE8及更低版本中根本不起作用:caniuse.com/#search=transform但是我的观点:我不在乎IE8

–统治85
2015年9月2日于12:45

不能使用位置的不错的选择:绝对;因为您需要流动的宽度。

– plong0
17年3月14日在19:03

令我惊讶的是,不需要任何额外元素的真正解决方案就被埋没了这么远。

–阿里斯蒂德斯
17年7月23日在17:30

迄今为止最好的解决方案,甚至比flexbox更好,它支持大多数现代和旧浏览器。请支持这个

– albanx
18年11月25日在10:56

#5 楼

一个纯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;
} 

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





主要内容

// 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


评论


请让我参考这里的指南,该指南甚至适用于IE5(从我到目前为止所读内容中扣除)webmasterworld.com/css/3350566.htm

–马泰
2011年9月5日14:38在

此解决方案是一个不错的开始,但是过大的图像会以错误的比例调整大小。请看我的回答。

– jomo
2013年9月18日在9:54

@HansWürstchen是的,但是重点是居中,是否过大是设计选择。添加更多的CSS =更混乱:)

–马泰
2013年9月27日在13:12

@matejkramny它不会变得过大。如果图像过大,则比例错误。这意味着它的高度已拉伸,并且外观不正确。

– jomo
2013年9月28日15:57

✔哇,这适用于图像溢出(大于包装器)的情况,但不能接受。

–塞德里克·赖兴巴赫
2014年1月7日17:52

#6 楼

对于更现代的解决方案,如果不需要支持旧版浏览器,则可以执行以下操作:




 .frame {
    display: flex;
    /**
    Uncomment 'justify-content' below to center horizontally.
    ✪ Read below for a better way to center vertically and horizontally.
    **/

    /* justify-content: center; */
    align-items: center;
}

img {
    height: auto;

    /**
    ✪ To center this image both vertically and horizontally,
    in the .frame rule above comment the 'justify-content'
    and 'align-items' declarations,
    then  uncomment 'margin: auto;' below.
    **/

    /* margin: 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> 





这是一支钢笔:http://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3e

评论


如果未设置容器的高度,这尤其有用

–戴夫·巴内特(Dave Barnett)
18年5月10日15:47

或自行调整单个项目

–迈克尔
19年5月14日在22:06

align-self的问题是flex项将拉伸父容器的高度。

–里卡多·泽(Ricardo Zea)
19年5月15日在15:49

#7 楼

这样,您可以将图像垂直居中(演示):

div{
  height: 150px; // Internet Explorer 7 fix
  line-height: 150px;
}
img{
  vertical-align: middle;
  margin-bottom: 0.25em;
}


评论


奇怪的是,在我遇到的情况下,我无法获得可接受的答案(我也在裁剪图像时出现溢出:隐藏)。但这完全有效。

–路卡·斯派勒(Luca Spiller)
2013年12月13日在16:25

我只在Chrome中测试过此功能,但线条高度似乎是关键。我将vertical-align属性放在div而不是img上,因为我的img在锚点()中。

–托德·普莱斯(Todd Price)
2014年2月11日在18:19

是的,比公认的解决方案简单得多,并且效果很好。我也在jsfiddle中找到了该解决方案。

–vdboor
14年2月18日在10:10

如果您知道可以满足的身高,那么效果很好

– KrekkieD
2014年6月3日7:04

从我的经验来看,该解决方案仅适用于font-size:div为0。对于相当大的容器,您可能会错过它,但是如果您的div为100px,而img为80px,则它会低几个像素。

–alTus
15年2月28日在17:44

#18 楼

使用纯CSS http://jsfiddle.net/sandeep/4RPFa/72/

尝试此解决方案,也许这是HTML的主要问题。在HTML中定义c lassimage height时,您不会使用引号。

CSS:

.frame {
    height: 25px;      /* Equals maximum 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的间距为3像素到2像素。现在我减少line-height,并且可以正常工作。

CSS:

    .frame {
        height: 25px;      /* Equals maximum image height */
        width: 160px;
        border: 1px solid red;
        margin: 1em 0;
        text-align: center;
        line-height: 22px;
        *:first-child+html line-height:24px; /* For Internet Explorer 7 */
    }

    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属性在不同的浏览器中呈现的方式有所不同。因此,我们必须定义不同的line-height属性浏览器。

检查此示例:http://jsfiddle.net/sandeep/4be8t/11/

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

评论


不起作用(至少在Firefox中)。对于缺少的引号,HTML5中允许这样做(尽管不知道jsfiddle中使用了哪种文档类型)

– Arnaud Le Blanc
2011-09-5 13:40