I'm trying to get a div that has position:fixed
center aligned on my page.
I've always been able to do it with absolutely positioned divs using this "hack"
left: 50%; width: 400px; margin-left:-200px
...where the value for margin-left is half the width of the div.
This doesn't seem to work for fixed position divs, instead it just places them with their left-most corner at 50% and ignores the margin-left declaration.
Any ideas of how to fix this so I can center align fixed positioned elements?
And I'll throw in a bonus M&M if you can tell me a better way to center align absolutely positioned elements than the way I've outlined above.
This question is related to
html
center
alignment
css-position
If you want to center aligning a fixed position div both vertically and horizontally use this
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
Koen's answer doesn't exactly centers the element.
The proper way is to use CCS3 transform
property. Although it's not supported in some old browsers. And we don't even need to set a fixed or relative width
.
.centered {
position: fixed;
left: 50%;
transform: translate(-50%, 0);
}
Working jsfiddle comparison here.
For the ones having this same problem, but with a responsive design, you can also use:
width: 75%;
position: fixed;
left: 50%;
margin-left: -37.5%;
Doing this will always keep your fixed div
centered on the screen, even with a responsive design.
I used the following with Twitter Bootstrap (v3)
<footer id="colophon" style="position: fixed; bottom: 0px; width: 100%;">
<div class="container">
<p>Stuff - rows - cols etc</p>
</div>
</footer>
I.e make a full width element that is fixed position, and just shove a container in it, the container is centered relative to the full width. Should behave ok responsively too.
It is quite easy using width: 70%; left:15%;
Sets the element width to 70% of the window and leaves 15% on both sides
Center it horizontally:
display: fixed;
top: 0;
left: 0;
transform: translate(calc(50vw - 50%));
Center it horizontally and vertically:
display: fixed;
top: 0;
left: 0;
transform: translate(calc(50vw - 50%), calc(50vh - 50%));
No side effect: It will not limit element's width when using margins in flexbox
If you know the width is 400px this would be the easiest way to do it I guess.
left: calc(50% - 200px);
if you don't want to use the wrapper method. then you can do this:
.fixed_center_div {
position: fixed;
width: 200px;
height: 200px;
left: 50%;
top: 50%;
margin-left: -100px; /* 50% of width */
margin-top: -100px; /* 50% of height */
}
From the post above, I think the best way is
width: 100%
margin-left: auto
and margin-right: auto
, or for table make it align="center"
.Hope this will help.
This works if you want the element to span across the page like another navigation bar.
width: calc (width: 100% - width whatever else is off centering it)
For example if your side navigation bar is 200px:
width: calc(100% - 200px);
Normal divs should use margin-left: auto
and margin-right: auto
, but that doesn't work for fixed divs. The way around this is similar to Andrew's answer, but doesn't use the deprecated <center>
thing. Basically, just give the fixed div a wrapper.
#wrapper {_x000D_
width: 100%;_x000D_
position: fixed;_x000D_
background: gray;_x000D_
}_x000D_
#fixed_div {_x000D_
margin-left: auto;_x000D_
margin-right: auto;_x000D_
position: relative;_x000D_
width: 100px;_x000D_
height: 30px;_x000D_
text-align: center;_x000D_
background: lightgreen;_x000D_
}
_x000D_
<div id="wrapper">_x000D_
<div id="fixed_div"></div>_x000D_
</div
_x000D_
This will center a fixed div within a div while allowing the div to react with the browser. i.e. The div will be centered if there's enough space, but will collide with the edge of the browser if there isn't; similar to how a regular centered div reacts.
A solution using flex box; fully responsive:
parent_div {
position: fixed;
width: 100%;
display: flex;
justify-content: center;
}
child_div {
/* whatever you want */
}
You could use flexbox for this as well.
.wrapper {_x000D_
position: fixed;_x000D_
top: 0;_x000D_
left: 0;_x000D_
height: 100%;_x000D_
width: 100%;_x000D_
_x000D_
/* this is what centers your element in the fixed wrapper*/_x000D_
display: flex;_x000D_
flex-flow: column nowrap;_x000D_
justify-content: center; /* aligns on vertical for column */_x000D_
align-items: center; /* aligns on horizontal for column */_x000D_
_x000D_
/* just for styling to see the limits */_x000D_
border: 2px dashed red;_x000D_
box-sizing: border-box;_x000D_
}_x000D_
_x000D_
.element {_x000D_
width: 200px;_x000D_
height: 80px;_x000D_
_x000D_
/* Just for styling */_x000D_
background-color: lightyellow;_x000D_
border: 2px dashed purple;_x000D_
}
_x000D_
<div class="wrapper"> <!-- Fixed element that spans the viewport -->_x000D_
<div class="element">Your element</div> <!-- your actual centered element -->_x000D_
</div>
_x000D_
<div class="container-div">
<div class="center-div">
</div>
</div>
.container-div {position:fixed; left: 0; bottom: 0; width: 100%; margin: 0;}
.center-div {width: 200px; margin: 0 auto;}
This should do the same.
Source: Stackoverflow.com