101

I've got a menu that appears on hover over an absolutely positioned div. All of the menu items have to be relatively positioned because the absolutely div will appear multiple times on a page and will appear in multiple sizes in one instance.

How would I center multiple items with position: relative both vertically and horizontally when I won't know the the size of the parent div?

I know the position: absolute trick with negative margins, but this situation calls for something different.

Here's the code:

.OuterCase { 
  position  : absolute; 
  width     : 100%;  
  height    : 100%; 
  text-align: center;
}

.InnerItem  { 
   width  : 38px;
   height : 38px;
   display: inline-block;
}

I've got it to center the items horizontally; it's getting the vertical that's being a bit elusive.

Paul Roub
  • 36,322
  • 27
  • 84
  • 93
Flippinmonk
  • 1,029
  • 2
  • 8
  • 6

7 Answers7

139

Much simpler:

position: relative; 
left: 50%;
transform: translateX(-50%);

You are now centered in your parent element. You can do that vertically too.

injecteer
  • 20,038
  • 4
  • 45
  • 89
Hexxefir
  • 1,600
  • 1
  • 8
  • 9
28

Alternatively, you may also use the CSS3 Flexible Box Model. It's a great way to create flexible layouts that can also be applied to center content like so:

#parent {
    -webkit-box-align:center;
    -webkit-box-pack:center;
    display:-webkit-box;
}
JGallardo
  • 11,074
  • 10
  • 82
  • 96
DADU
  • 6,482
  • 7
  • 42
  • 64
  • 3
    Mozilla has its own prefix, -moz. There is also a new Flexbox, see http://css-tricks.com/old-flexbox-and-new-flexbox/ – DADU Feb 22 '13 at 23:53
24

If you have a relatively- (or otherwise-) positioned div you can center something inside it with margin:auto

Vertical centering is a bit tricker, but possible.

spraff
  • 32,570
  • 22
  • 121
  • 229
17

You can use calc to position element relative to center. For example if you want to position element 200px right from the center .. you can do this :

#your_element{
    position:absolute;
    left: calc(50% + 200px);
}

Dont forget this

When you use signs + and - you must have one blank space between sign and number, but when you use signs * and / there is no need for blank space.

MujtabaFR
  • 5,956
  • 6
  • 40
  • 66
Matija
  • 171
  • 1
  • 2
  • this was exactly what I needed for my project, thanks – bowlerae Feb 22 '17 at 01:16
  • 1
    Its not accurate, but nice solution. The better result would be if you know element width and height, for instance w: 40, h: 30, then left: calc(50% - 20px), right: calc(50% - 15px). that would center element accurately – Madman Jun 15 '17 at 11:18
1

Another option is to create an extra wrapper to center the element vertically.

#container{
  border:solid 1px #33aaff;
  width:200px;
  height:200px;
}

#helper{
  position:relative;
  height:50px;
  top:50%;
  border:dotted 1px #ff55aa;
}

#centered{
  position:relative;
  height:50px;
  top:-50%;
  border:solid 1px #ff55aa;
}
<div id="container">
  <div id="helper">
    <div id="centered"></div>
  </div>
<div>
Paweł
  • 4,238
  • 4
  • 21
  • 40
1
.parent {
    width: 100%;
    height: 30vh;    
    display: flex;
    justify-content: center;
    align-items: center;
}
.child {
    position: relative;
    height: 20vh;
    display: flex;
    justify-content: center;
    align-items: center;
  }

Just make sure the height of the parent is greater than the height of the child.

0

An other simple solution I did not yet see here:

.parent{
    display: flex;
    flex-direction: column;
    height: 40vh;
    width: 40vw;
}

.child{
    margin:auto;
}
cupcake
  • 41
  • 4