Html CSS:当不知道 div 的固定大小时垂直对齐 div

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7206640/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-29 10:17:50  来源:igfitidea点击:

CSS: Vertically align div when no fixed size of the div is known

htmlcssvertical-alignment

提问by Oleg Tarasenko

How do I align a <div>which contains an image (or flash) vertically with CSS. Height and width are dynamic.

如何<div>使用 CSS 垂直对齐包含图像(或 Flash)的 a。高度和宽度是动态的。

采纳答案by NGLN

This is a pure CSS2 solution for horizontally and vertically centering without known sizes of either container nor child. No hacks are involved. I discovered it for this answerand I also demonstrated it in this answer.

这是一个纯 CSS2 解决方案,用于水平和垂直居中,无需已知容器和子级的大小。不涉及黑客行为。我为这个答案发现了它,我也在这个答案中演示了它。

The solutionis based on vertical-align: middlein conjunction with line-height: 0, which parent has a fixed line-height.

该解决方案基于与vertical-align: middle结合使用line-height: 0,其中父级具有固定的行高。

The HTML:

HTML:

<span id="center">
    <span id="wrap">
        <img src="http://lorempixum.com/300/250/abstract" alt="" />
    </span>
</span>

And the CSS:

和 CSS:

html,
body {
    height: 100%;
    width: 100%;
    padding: 0;
    margin: 0;
    overflow: hidden;
}
#center {
    position: relative;
    display: block;
    top: 50%;
    margin-top: -1000px;
    height: 2000px;
    text-align: center;
    line-height: 2000px;
}    
#wrap {
    line-height: 0;
}
#wrap img {
    vertical-align: middle;
}

Tested on Win7 in IE8, IE9, Opera 11.51, Safari 5.0.5, FF 6.0, Chrome 13.0.

在 IE8、IE9、Opera 11.51、Safari 5.0.5、FF 6.0、Chrome 13.0 的 Win7 上测试。

The only caveat is IE7, for which the two innermost elements have to declared at one line, as demonstrated in this fiddle:

唯一需要注意的是 IE7,它的两个最里面的元素必须在一行中声明,如这个小提琴所示

<span id="center">
    <span id="wrap"><img src="http://lorempixum.com/300/250/abstract" alt="" /></span>
</span>

Note that the span's are also required for IE7. In every other browser, the span's may be div's.

请注意,IE7 也需要跨度。在所有其他浏览器中,跨度可能是 div。

回答by kizu

You can do this by using inline-blocks, one with height: 100%(and same heights for HTMLand BODY) and vertical-align: middle.

您可以通过使用内嵌块,一个有做到这一点height: 100%(和相同高度的HTMLBODY)和vertical-align: middle

Example 1: http://jsfiddle.net/kizu/TQX9b/(a lot of content, so it's full width)

示例 1:http: //jsfiddle.net/kizu/TQX9b/(内容很多,所以是全宽)

Example 2: http://jsfiddle.net/kizu/TQX9b/2/(an image with any size)

示例 2:http: //jsfiddle.net/kizu/TQX9b/2/(任意大小的图像)

In this example I use spans, so It would work in IE without hacks, if you'd like to use divs, don't forget to add in Conditional Comments for IE .helper, .content { display: inline; zoom: 1; }, so inline-blocks would work for block elements.

在这个例子中,我使用了spans,所以它可以在 IE 中工作而没有 hacks,如果你想使用divs,不要忘记为 IE 添加条件注释.helper, .content { display: inline; zoom: 1; },所以内联块将适用于块元素。

回答by Chris

In addition to the other answers here, the CSS3 flexible box modelwill, amongst other things, allow you to achieve this.

除了这里的其他答案之外,CSS3 灵活框模型还可以让您实现这一目标。

You only need a single container element. Everything inside it will be laid out according to the flexible box model rules.

您只需要一个容器元素。它里面的所有东西都将根据灵活的盒子模型规则进行布局。

<div class="container">
    <img src="/logo.png"/>
</div>

The CSS is pretty simple, actually:

CSS 非常简单,实际上:

.container { 
    display: box;
    box-orient: horizontal;
    box-pack: center;
    box-align: center;
}

I've omitted vendor-prefixed rules for brevity.

为简洁起见,我省略了供应商前缀规则。

Here's a demo in which the img is always in the centre of the page: http://jsfiddle.net/zn8bm/

这是一个 img 始终位于页面中心的演示:http: //jsfiddle.net/zn8bm/

Note that Flexbox is a fledgling specification, and is only currently implemented in Safari, Chrome and Firefox 4+.

请注意,Flexbox 是一个刚刚起步的规范,目前仅在 Safari、Chrome 和 Firefox 4+ 中实现。

回答by rcl

I would recommend this solution by Bruno: http://www.brunildo.org/test/img_center.html

我会推荐布鲁诺的这个解决方案:http: //www.brunildo.org/test/img_center.html

However, I ran into a problem w/ his solution w/r/t webkit. It appears that webkit was rendering a small space at the top of the divif the empty spanwas allowed to be there. So, for my solution I only add the empty span if I detect the browser to be IE (If someone figures out how to get rid of the space, let me know!) So, my solution ends up being:

但是,我遇到了一个问题,他的解决方案 w/r/t webkit。div如果span允许空白存在,则 webkit 似乎在顶部呈现了一个小空间。所以,对于我的解决方案,如果我检测到浏览器是 IE,我只添加空跨度(如果有人想出如何摆脱空间,请告诉我!)所以,我的解决方案最终是:



HTML:

HTML:

<div class="outerdiv">
    <img src="..." /> 
</div>

CSS:

CSS:

.outerdiv {
    display: table-cell;
    width: 200px;
    height: 150px;
    text-align: center;
    vertical-align: middle;
}
.ie_vertical_align * {
    vertical-align: middle;
}
.ie_vertical_align span {
    display: inline-block;
    height: 150px;
    width: 0;
}

And if I detect the browser to be IE I add an empty span element before the imgtag and a css style so it looks like:

如果我检测到浏览器是 IE,我会在img标签和 css 样式之前添加一个空的 span 元素,因此它看起来像:

<div class="outerdiv ie_vertical_align">
    <span></span>
    <img src="..." /> 
</div>


Here's a JSFiddlewith this code.

这是带有此代码的JSFiddle

回答by duri

Du?an Janovsky, Czech web developer, has published a cross-browser solution for this some time ago. Read http://www.jakpsatweb.cz/css/css-vertical-center-solution.html

捷克 Web 开发人员 Du?an Janovsky 不久前为此发布了跨浏览器解决方案。阅读http://www.jakpsatweb.cz/css/css-vertical-center-solution.html

回答by Artyom

If you don't care about IE7 and below, you don't have to use multiple nested divs. If you have a div that you want to align vertically, that div is within some container (even if the container is your <body>). Therefore, you can specify display: table-celland vertical-align: middleon the container, and then your div will be vertically centered.

如果你不关心 IE7 及以下,你不必使用多个嵌套的 div。如果您有一个要垂直对齐的 div,则该 div 位于某个容器内(即使该容器是您的<body>)。因此,您可以在容器上指定display: table-cellvertical-align: middle,然后您的 div 将垂直居中。

However, if you do care about IE7 and below, you will need an additional container to make it work (yes, via a hack).

但是,如果您确实关心 IE7 及更低版本,则需要一个额外的容器来使其工作(是的,通过 hack)。

Take a look at this fiddle. It displays correctly in IE6-9 and other major browsers. #container2is present solely for IE7 and below, so if you don't care about them, you can remove it as well as the IE-specific conditional styles.

看看这个小提琴。它在 IE6-9 和其他主要浏览器中正确显示。#container2仅适用于 IE7 及以下版本,因此如果您不关心它们,则可以将其以及 IE 特定的条件样式删除。

回答by Benjamin Udink ten Cate

Set the image as background of the div and align it center

将图像设置为 div 的背景并将其居中对齐

回答by RetroCoder

try the 50% padding trick:

尝试 50% 填充技巧:

<html>

<body style="width:50%; height: 50%;">
<div style="display:block; display:inline-block; layout-grid:line; 
     text-align:center; vertical-align:bottom; 
     padding: 50% 0 50% 0">test</div>
</body>

</html>

回答by tmsimont

This is possible if you know the height of the image or flash object to be centered. You don't need to know the container's height/width, but you do need to know the contained height/width.

如果您知道要居中的图像或闪光对象的高度,则这是可能的。您不需要知道容器的高度/宽度,但您需要知道包含的高度/宽度。

It's possible using float, clear and negative margins. Example: www.laurenackley.comhomepage.

可以使用浮动、清除和负边距。示例:www.laurenackley.com主页。

html

html

<div id='container'><!-- container can be BODY -->
  <div id='vertical-center'>&nbsp;</div>
  <div id='contained-with-known-height'>
    <p>stuff</p>
  </div>  
</div>

css

css

#vertical-center{
  height:50%;
  width:1px;
  float:left;
  margin-bottom:-50px;/** 1/2 of inner div's known height **/
}

#contained-with-known-height{
  height:100px;
  clear:left;
  margin:0 auto;/** horizontal center **/
  width:700px;
  text-align:left;
}
#container{/** or body **/
  text-align:center;
  /** width and height unknown **/
}

If you don't know the inner elements width/height. You are out of luck with <div>. BUT -- table cells(<td>) do support vertical-align:middle;If you can't get it done with the div stuff above, go with a table inside the container, and put the div you are centering inside a td with vertical-align middle.

如果您不知道内部元素的宽度/高度。你运气不好<div>。但是 -表格单元格( <td>) 确实支持vertical-align:middle;如果您无法使用上面的 div 内容完成它,请在容器内放置一个表格,并将您要居中的 div 放在垂直对齐中间的 td 内。