ChatGPT解决这个技术问题 Extra ChatGPT

How can I vertically center a div element for all browsers using CSS?

I want to center a div vertically with CSS. I don't want tables or JavaScript, but only pure CSS. I found some solutions, but all of them are missing Internet Explorer 6 support.

<body>
    <div>Div to be aligned vertically</div>
</body>

How can I center a div vertically in all major browsers, including Internet Explorer 6?

@MarcoDemaio Don't people constantly frown upon tables for layouts on here?
@Chud37: it depends what you have to do, tables for layout are generally not versatile and long to type in code, with css you can easily change a 2 cols layout into a 3/4/5 sols layout etc. But in this case is different, using dozens of css tips-and-tricks for such a simple task that could be accomplished with a perfect cross-browser table, it's like attempting to enter in your house through the window instead of using the door.
In case people don't care about older browser support: davidwalsh.name/css-vertical-center
css-vertical-center.com there are some solutions with browser compatibility information
Here is lots of ways to do it css-tricks.com/centering-css-complete-guide

P
Peter Mortensen

Below is the best all-around solution I could build to vertically and horizontally center a fixed-width, flexible height content box. It was tested and worked for recent versions of Firefox, Opera, Chrome, and Safari.

.outer { display: table; position: absolute; top: 0; left: 0; height: 100%; width: 100%; } .middle { display: table-cell; vertical-align: middle; } .inner { margin-left: auto; margin-right: auto; width: 400px; /* Whatever width you want */ }

The Content

Once upon a midnight dreary...

View A Working Example With Dynamic Content

I built in some dynamic content to test the flexibility and would love to know if anyone sees any problems with it. It should work well for centered overlays also -- lightbox, pop-up, etc.


D
DrupalFever

The simplest way would be the following three lines of CSS:

1) position: relative;

2) top: 50%;

3) transform: translateY(-50%);

Following is an example:

div.outer-div { height: 170px; width: 300px; background-color: lightgray; } div.middle-div { position: relative; top: 50%; -webkit-transform: translateY(-50%); -ms-transform: translateY(-50%); transform: translateY(-50%); }

Test text


note: doesn't work correct if the height of the outer div is set with "min-height: 170px"
Interferes with z-index
doesn't work when height of outer div is 100%. Then only works with position: absolute;.
I had found this solution elsewhere first, but extra kudos to this particular answer for mentioning the -webkit-transform variant in particular, which I needed to make this method work in phantomjs... ended hours of struggling so thank you!
This is the best answer. This is incredibly simple, messes with the least amount of existing work and functions on everything as far back as IE9 which nobody even uses anymore. Lets get this guy some more upvotes!
P
Peter Mortensen

One more I can't see on the list:

.Center-Container {
  position: relative;
  height: 100%;
}

.Absolute-Center {
  width: 50%;
  height: 50%;
  overflow: auto;
  margin: auto;
  position: absolute;
  top: 0; left: 0; bottom: 0; right: 0;
  border: solid black;
}

Cross-browser (including Internet Explorer 8 - Internet Explorer 10 without hacks!)

Responsive with percentages and min-/max-

Centered regardless of padding (without box-sizing!)

height must be declared (see Variable Height)

Recommended setting overflow: auto to prevent content spillover (see Overflow)

Source: Absolute Horizontal And Vertical Centering In CSS


P
Peter Mortensen

Now the Flexbox solution is a very easy way for modern browsers, so I recommend this for you:

.container { display: flex; align-items: center; justify-content: center; height: 100%; background: green; } body, html { height: 100%; }

Div to be aligned vertically


If you've got a navbar, you can tweak the height using height: calc(100% - 55px) or whatever the height of your navbar is.
i also had to remove margins/padding from body
Works well with float. Thanks.
Please note that this will potentially behave weird on "newer older" mobile safari browsers. The recommended use instead of height is flex-basis on the .container class
@NineMagics How does one do that?
P
Peter Mortensen

Actually, you need two div's for vertical centering. The div containing the content must have a width and height.

#container { position: absolute; top: 50%; margin-top: -200px; /* Half of #content height */ left: 0; width: 100%; } #content { width: 624px; margin-left: auto; margin-right: auto; height: 395px; border: 1px solid #000000; }

Centered div

Here is the result.


it's an old trick... top 50% and the top margin negative half the height for the inner div
it's assuming you have a fixed height for div. don't work when div can change height.
P
Peter Mortensen

Edit 2020: only use this if you need to support old browsers like Internet Explorer 8 (which you should refuse to do 😉). If not, use Flexbox.

This is the simplest method I found and I use it all the time (jsFiddle demo here).

Thank Chris Coyier from CSS Tricks for this article.

html, body{ height: 100%; margin: 0; } .v-wrap{ height: 100%; white-space: nowrap; text-align: center; } .v-wrap:before{ content: ""; display: inline-block; vertical-align: middle; width: 0; /* adjust for white space between pseudo element and next sibling */ margin-right: -.25em; /* stretch line height */ height: 100%; } .v-box{ display: inline-block; vertical-align: middle; white-space: normal; }

This is how I've been doing it for some time

Support starts with Internet Explorer 8.


Refusing support for old browsers, the solution for me was not flexbox but grid system. It was a bit annoying for me center content in a container that, when it becames too small in height, needed to show scrollbar, and the centered content was loosing out the scroll area with all other methods. In the container i just use: { display: grid; align-items: center; } Hope this helps someone.
R
RevanthKrishnaKumar V.

After a lot of research I finally found the ultimate solution. It works even for floated elements. View Source

.element {
    position: relative;
    top: 50%;
    transform: translateY(-50%); /* or try 50% */
}

This does works really well, provided you remember that the container element must have an implicit or explicit height; jsfiddle.net/14kt53un A minor gotcha to those who are relatively new to CSS.
Out of all the answers, this is the most simplest! I hope others see your answer too! Thank you! By the way, 50% worked for me (not -50%)
That was incredible. After hours of searching, this one worked for me. I had to use translateY(50%) I am sure why, but it worked. In my case, the parent was created by AEM Forms Engine, and I can only control certain child elements.
R
Reggie Pinkham

Use the CSS Flexbox align-items property to achieve this.

html, body { height: 100%; } body { display: flex; align-items: center; }

This is centered vertically


Note justify-content: center will center items horizontally as well
P
Peter Mortensen

To center the div on a page, check the fiddle link.

#vh { margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0; } .box{ border-radius: 15px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.4); padding: 25px; width: 100px; height: 100px; background: white; }

Div to be aligned vertically

Another option is to use flex box, check the fiddle link.

.vh { background-color: #ddd; height: 400px; align-items: center; display: flex; } .vh > div { width: 100%; text-align: center; vertical-align: middle; }

Div to be aligned vertically

Another option is to use a CSS 3 transform:

#vh { position: absolute; top: 50%; left: 50%; /*transform: translateX(-50%) translateY(-50%);*/ transform: translate(-50%, -50%); } .box{ border-radius: 15px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.4); padding: 25px; width: 100px; height: 100px; background: white; }

Div to be aligned vertically


@ArmelLarcier That's incorrect. Relative units are percentages %, ems and rems. Absolute or fixed values are pixels or points. What you're referring to is "it only works with a declared height". Howevever, although this method described by Moes does require a height, when you declare it in relative units, percentage is the best, no matter how much content is inside the centered DIV that DIV will expand vertically to fit its content. That's the beauty of this method. The other good thing is that this method works in IE8/9/10 in case someone still needs to support those browsers.
@ricardozea I don't mean to play stubborn but saying the centered div will expand vertically while remaining vertically centered is wrong. Try it. I know when I say the height must be "fixed", that it's not the right word. It is indeed relative, to its parent. Anyway I think Chris Coyer's method makes more sense, see my answer stackoverflow.com/a/21919578/1491212 It's compatible with IE8 AND does work on an element with no specified dimensions.
@ArmelLarcier It's all good. Is not wrong brother. Try it: codepen.io/shshaw/pen/gEiDt - Add paragraphs to the green box ;]. Granted, it uses Modernizr to accomplish the effect, but all in all it's doable. I saw your answer and the CSS-Tricks.com post as well, but that method doesn't make me happy, it uses extra markup and the CSS is too verbose. I think the best solution is either using flexbox or the transform: translate(-50%, -50%); technique. For IE8 I'd just leave it top/center aligned and move on.
@ricardozea Well the codepen you linked to uses the "display: table" method and extra markup so I'm not surprised. Anyways, +1 to your last sentence.
P
Peter Mortensen

The easiest solution is below:

.outer-div{ width: 100%; height: 200px; display: flex; border:1px solid #000; } .inner-div{ margin: auto; text-align: center; border: 1px solid red; }

Hey there!


Indeed the easiest one yet :) Although, I had to set the styles to a outer-div, instead of body.
4
4 revs, 3 users 73% sids

Unfortunately — but not surprisingly — the solution is more complicated than one would wish it to be. Also unfortunately, you'll need to use additional divs around the div you want vertically centered.

For standards-compliant browsers like Mozilla, Opera, Safari, etc. you need to set the outer div to be displayed as a table and the inner div to be displayed as a table-cell — which can then be vertically centered. For Internet Explorer, you need to position the inner div absolutely within the outer div and then specify the top as 50%. The following pages explain this technique well and provide some code samples too:

Vertical Centering in CSS

Vertical Centering in CSS with Unknown Height (Internet Explorer 7 compatible) (Archived article courtesy of the Wayback Machine)

There is also a technique to do the vertical centering using JavaScript. Vertical alignment of content with JavaScript & CSS demonstrates it.


P
Peter Mortensen

If someone cares for Internet Explorer 10 (and later) only, use Flexbox:

.parent { width: 500px; height: 500px; background: yellow; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; } .centered { width: 100px; height: 100px; background: blue; }

Flexbox support: http://caniuse.com/flexbox


Android < 4.4 doesn't support align-items: center; !
Actually, it does support align-items: center; caniuse.com/#search=align-items
@t.mikael.d You might want to take a closer look at that table. For Android < 4.4, it states "Only supports the old flexbox specification and does not support wrapping."
M
Marwelln

A modern way to center an element vertically would be to use flexbox.

You need a parent to decide the height and a child to center.

The example below will center a div to the center within your browser. What's important (in my example) is to set height: 100% to body and html and then min-height: 100% to your container.

body, html { background: #F5F5F5; box-sizing: border-box; height: 100%; margin: 0; } #center_container { align-items: center; display: flex; min-height: 100%; } #center { background: white; margin: 0 auto; padding: 10px; text-align: center; width: 200px; }

I am center.


D
Deepu Reghunath

Using flex property of CSS.

Solution #1

.parent { width: 400px; height:200px; background: blue; display: flex; align-items: center; justify-content:center; } .child { width: 75px; height: 75px; background: yellow; }

or by using display: flex; and margin: auto;

Solution #2

.parent { width: 400px; height:200px; background: blue; display: flex; } .child { width: 75px; height: 75px; background: yellow; margin:auto; }

show text center

Solution #3

.parent { width: 400px; height: 200px; background: yellow; display: flex; align-items: center; justify-content:center; }

Center

Using percentage(%) height and width.

Solution #4

.parent { position: absolute; height:100%; width:100%; background: blue; display: flex; align-items: center; justify-content:center; } .child { width: 75px; height: 75px; background: yellow; }


C
Community

Centering only vertically

If you don't care about Internet Explorer 6 and 7, you can use a technique that involves two containers.

The outer container:

should have display: table;

The inner container:

should have display: table-cell;

should have vertical-align: middle;

The content box:

should have display: inline-block;

You can add any content you want to the content box without caring about its width or height!

Demo:

body { margin: 0; } .outer-container { position: absolute; display: table; width: 100%; /* This could be ANY width */ height: 100%; /* This could be ANY height */ background: #ccc; } .inner-container { display: table-cell; vertical-align: middle; } .centered-content { display: inline-block; background: #fff; padding: 20px; border: 1px solid #000; }

Malcolm in the Middle

See also this Fiddle!

Centering horizontally and vertically

If you want to center both horizontally and vertically, you also need the following.

The inner container:

should have text-align: center;

The content box:

should re-adjust the horizontal text-alignment to for example text-align: left; or text-align: right;, unless you want text to be centered

Demo:

body { margin: 0; } .outer-container { position: absolute; display: table; width: 100%; /* This could be ANY width */ height: 100%; /* This could be ANY height */ background: #ccc; } .inner-container { display: table-cell; vertical-align: middle; text-align: center; } .centered-content { display: inline-block; text-align: left; background: #fff; padding: 20px; border: 1px solid #000; }

Malcolm in the Middle

See also this Fiddle!


a
antelove

.center { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); /* (x, y) => position */ -ms-transform: translate(-50%, -50%); /* IE 9 */ -webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */ } .vertical { position: absolute; top: 50%; //left: 0; transform: translate(0, -50%); /* (x, y) => position */ } .horizontal { position: absolute; //top: 0; left: 50%; transform: translate(-50%, 0); /* (x, y) => position */ } div { padding: 1em; background-color: grey; color: white; }

Vertically left
Horizontal top
Vertically Horizontal

Related: Center a Image


P
Peter Mortensen

This is always where I go when I have to come back to this issue.

For those who don't want to make the jump:

Specify the parent container as position:relative or position:absolute. Specify a fixed height on the child container. Set position:absolute and top:50% on the child container to move the top down to the middle of the parent. Set margin-top:-yy where yy is half the height of the child container to offset the item up.

An example of this in code:

<style type="text/css">
    #myoutercontainer {position:relative}
    #myinnercontainer {position:absolute; top:50%; height:10em; margin-top:-5em}
</style>
...
<div id="myoutercontainer">
    <div id="myinnercontainer">
        <p>Hey look! I'm vertically centered!</p>
        <p>How sweet is this?!</p>
    </div>
</div>

D
Dev

It can be done in two ways

body{
left: 50%; 
top:50%; 
transform: translate(-50%, -50%); 
height: 100%; 
width: 100%; 
}

OR

Using flex

body {
    height:100%
    width:100%
    display: flex;
    justify-content: center;
    align-items: center;
}

align-items:center; makes the content vertically center

justify-content: center;makes the content horizontally center


P
Peter Mortensen

I just wrote this CSS and to know more, please go through: This article with vertical align anything with just 3 lines of CSS.

.element {
    position: relative;
    top: 50%;
    transform: perspective(1px) translateY(-50%);
}

CSS transforms can cause distortions in text and borders (when the math results in fractional pixels).
P
Peter Mortensen

For newcomers, please try:

display: flex;
align-items: center;
justify-content: center;

Please add a Stack Snippet showing how this CSS code vertically aligns a div.
this works too <div style="display:flex"><div style="margin:auto">Inner</div></div>
I came across with this wonderful explanation of align items and justify content. Must Read : stackoverflow.com/questions/42613359/…
P
Peter Mortensen

The three lines of code using transform works practically on modern browsers and Internet Explorer:

.element{
     position: relative;
     top: 50%;
     transform: translateY(-50%);
     -moz-transform: translateY(-50%);
     -webkit-transform: translateY(-50%);
     -ms-transform: translateY(-50%);
}

I am adding this answer since I found some incompleteness in the previous version of this answer (and Stack Overflow won't allow me to simply comment).

'position' relative messes up the styling if the current div is in the body and has no container div. However 'fixed' seems to work, but it obviously fixes the content in the center of the viewport Also I used this styling for centering some overlay divs and found that in Mozilla all elements inside this transformed div had lost their bottom borders. Possibly a rendering issue. But adding just the minimal padding to some of them rendered it correctly. Chrome and Internet Explorer (surprisingly) rendered the boxes without any need for padding


A
Andy Hoffman

CSS Grid

body, html { margin: 0; } body { display: grid; min-height: 100vh; align-items: center; }

Div to be aligned vertically


P
Peter Mortensen

The answer from Billbad only works with a fixed width of the .inner div. This solution works for a dynamic width by adding the attribute text-align: center to the .outer div.

.outer { position: absolute; display: table; width: 100%; height: 100%; text-align: center; } .middle { display: table-cell; vertical-align: middle; } .inner { text-align: center; display: inline-block; width: auto; }

Content


Interesting! I'm using an almost identical technique! -> stackoverflow.com/questions/396145/…
P
Peter Mortensen

Just do it: Add the class at your div:

.modal {
  margin: auto;
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  height: 240px;
}

And read this article for an explanation. Note: Height is necessary.


Woah! Nice one, exactly what I needed and I've not seen it before
B
Brady
.center{
    display: grid;
    place-items: center;
}

adding height: 100%; centers it also vertically.
a
arket

Not answering for browser compatibility but to also mention the new Grid and the not so new Flexbox feature.

Grid

From: Mozilla - Grid Documentation - Align Div Vertically

Browser Support: Grid Browser Support

CSS:

.wrapper {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 10px;
  grid-auto-rows: 200px;
  grid-template-areas: 
    ". a a ."
    ". a a .";
}
.item1 {
  grid-area: a;
  align-self: center;
  justify-self: center;
}

HTML:

<div class="wrapper">
 <div class="item1">Item 1</div>
</div>

Flexbox

Browser Support: Flexbox Browser Support

CSS:

display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
align-items: center;
justify-content: center;

P
Peter Mortensen

I did it with this (change width, height, margin-top and margin-left accordingly):

.wrapper {
    width: 960px;
    height: 590px;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -295px;
    margin-left: -480px;
}
<div class="wrapper"> -- Content -- </div>

Thats only good if you know the width/height of the DIV your trying to center. This isn't what the question is asking
P
Peter Mortensen

I think a solid solution for all browsers without using Flexbox - "align-items: center;" is a combination of display: table and vertical-align: middle;.

CSS

.vertically-center
{
    display: table;

    width: 100%;  /* Optional */
    height: 100%; /* Optional */
}

.vertically-center > div
{
    display: table-cell;
    vertical-align: middle;
}

HTML

<div class="vertically-center">
    <div>
        <div style="border: 1px solid black;">some text</div>
    </div>
</div>

‣Demo: https://jsfiddle.net/6m640rpp/


P
Peter Mortensen

Especially for parent divs with relative (unknown) height, the centering in the unknown solution works great for me. There are some really nice code examples in the article.

It was tested in Chrome, Firefox, Opera, and Internet Explorer.

/* This parent can be any width and height */ .block { text-align: center; } /* The ghost, nudged to maintain perfect centering */ .block:before { content: ''; display: inline-block; height: 100%; vertical-align: middle; margin-right: -0.25em; /* Adjusts for spacing */ } /* The element to be centered, can also be of any width and height */ .centered { display: inline-block; vertical-align: middle; width: 300px; }

Some text

Any other text..."


P
Peter Mortensen

The contents can be easily centered by using Flexbox. The following code shows the CSS for the container inside which the contents needs to be centered:

.absolute-center {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -ms-flex-align: center;
    -webkit-align-items: center;
    -webkit-box-align: center;

    align-items: center;
}