I am trying to center a <ul>
inside a <div>
. I tried the following
text-align: center;
and
left: 50%;
This is not working.
CSS:
.container { clear: both; width: 800px; height: 70px; margin-bottom: 10px; text-align: center; } .container ul { padding: 0 0 0 20px; margin: 0; list-style: none; } .container ul li { margin: 0; padding: 0; }
I want the ul
to be centered inside the container.
Just give the list centered text (e.g. ul. nav { text-align: center; } ) and the list items inline-block (e.g. ul. nav li { display: inline-block; } ). If you want to do it with margin for whatever reason, look into width: fit-content; .
The steps are as follows: Float the wrapper to the left and give it a width of 100% to make it take up the full viewport width. Float both the ul and the li to the left and don't give them any width to make them adjust to their content. Give the ul a position: relative of left: 50% .
Center a ul inside a div using CSS grids In this method, all you need to do is put the <ul> inside a div element and then make it a grid container by applying display: grid; on it.
To horizontally center a block element (like <div>), use margin: auto; Setting the width of the element will prevent it from stretching out to the edges of its container.
Following is a list of solutions to centering things in CSS horizontally. The snippet includes all of them.
html { font: 1.25em/1.5 Georgia, Times, serif; } pre { color: #fff; background-color: #333; padding: 10px; } blockquote { max-width: 400px; background-color: #e0f0d1; } blockquote > p { font-style: italic; } blockquote > p:first-of-type::before { content: open-quote; } blockquote > p:last-of-type::after { content: close-quote; } blockquote > footer::before { content: "\2014"; } .container, blockquote { position: relative; padding: 20px; } .container { background-color: tomato; } .container::after, blockquote::after { position: absolute; right: 0; bottom: 0; padding: 2px 10px; border: 1px dotted #000; background-color: #fff; } .container::after { content: ".container-" attr(data-num); z-index: 1; } blockquote::after { content: ".quote-" attr(data-num); z-index: 2; } .container-4 { margin-bottom: 200px; } /** * Solution 1 */ .quote-1 { max-width: 400px; margin-right: auto; margin-left: auto; } /** * Solution 2 */ .container-2 { text-align: center; } .quote-2 { display: inline-block; text-align: left; } /** * Solution 3 */ .quote-3 { display: table; margin-right: auto; margin-left: auto; } /** * Solution 4 */ .container-4 { position: relative; } .quote-4 { position: absolute; left: 50%; transform: translateX(-50%); } /** * Solution 5 */ .container-5 { display: flex; justify-content: center; }
<main> <h1>CSS: Horizontal Centering</h1> <h2>Uncentered Example</h2> <p>This is the scenario: We have a container with an element inside of it that we want to center. I just added a little padding and background colors so both elements are distinquishable.</p> <div class="container container-0" data-num="0"> <blockquote class="quote-0" data-num="0"> <p>My friend Data. You see things with the wonder of a child. And that makes you more human than any of us.</p> <footer>Tasha Yar about Data</footer> </blockquote> </div> <h2>Solution 1: Using <code>max-width</code> & <code>margin</code> (IE7)</h2> <p>This method is widely used. The upside here is that only the element which one wants to center needs rules.</p> <pre><code>.quote-1 { max-width: 400px; margin-right: auto; margin-left: auto; }</code></pre> <div class="container container-1" data-num="1"> <blockquote class="quote quote-1" data-num="1"> <p>My friend Data. You see things with the wonder of a child. And that makes you more human than any of us.</p> <footer>Tasha Yar about Data</footer> </blockquote> </div> <h2>Solution 2: Using <code>display: inline-block</code> and <code>text-align</code> (IE8)</h2> <p>This method utilizes that <code>inline-block</code> elements are treated as text and as such they are affected by the <code>text-align</code> property. This does not rely on a fixed width which is an upside. This is helpful for when you donβt know the number of elements in a container for example.</p> <pre><code>.container-2 { text-align: center; } .quote-2 { display: inline-block; text-align: left; }</code></pre> <div class="container container-2" data-num="2"> <blockquote class="quote quote-2" data-num="2"> <p>My friend Data. You see things with the wonder of a child. And that makes you more human than any of us.</p> <footer>Tasha Yar about Data</footer> </blockquote> </div> <h2>Solution 3: Using <code>display: table</code> and <code>margin</code> (IE8)</h2> <p>Very similar to the second solution but only requires to apply rules on the element that is to be centered.</p> <pre><code>.quote-3 { display: table; margin-right: auto; margin-left: auto; }</code></pre> <div class="container container-3" data-num="3"> <blockquote class="quote quote-3" data-num="3"> <p>My friend Data. You see things with the wonder of a child. And that makes you more human than any of us.</p> <footer>Tasha Yar about Data</footer> </blockquote> </div> <h2>Solution 4: Using <code>translate()</code> and <code>position</code> (IE9)</h2> <p>Donβt use as a general approach for horizontal centering elements. The downside here is that the centered element will be removed from the document flow. Notice the container shrinking to zero height with only the padding keeping it visible. This is what <i>removing an element from the document flow</i> means.</p> <p>There are however applications for this technique. For example, it works for <b>vertically</b> centering by using <code>top</code> or <code>bottom</code> together with <code>translateY()</code>.</p> <pre><code>.container-4 { position: relative; } .quote-4 { position: absolute; left: 50%; transform: translateX(-50%); }</code></pre> <div class="container container-4" data-num="4"> <blockquote class="quote quote-4" data-num="4"> <p>My friend Data. You see things with the wonder of a child. And that makes you more human than any of us.</p> <footer>Tasha Yar about Data</footer> </blockquote> </div> <h2>Solution 5: Using Flexible Box Layout Module (IE10+ with vendor prefix)</h2> <p></p> <pre><code>.container-5 { display: flex; justify-content: center; }</code></pre> <div class="container container-5" data-num="5"> <blockquote class="quote quote-5" data-num="5"> <p>My friend Data. You see things with the wonder of a child. And that makes you more human than any of us.</p> <footer>Tasha Yar about Data</footer> </blockquote> </div> </main>
display: flex
.container { display: flex; justify-content: center; }
Notes:
max-width
& margin
You can horizontally center a block-level element by assigning a fixed width and setting margin-right
and margin-left
to auto
.
.container ul { /* for IE below version 7 use `width` instead of `max-width` */ max-width: 800px; margin-right: auto; margin-left: auto; }
Notes:
transform: translatex(-50%)
& left: 50%
This is similar to the quirky centering method which uses absolute positioning and negative margins.
.container { position: relative; } .container ul { position: absolute; left: 50%; transform: translatex(-50%); }
Notes:
top
instead of left
and translateY()
instead of translateX()
. The two can even be combined. πtransform2d
display: table
& margin
Just like the first solution, you use auto values for right and left margins, but donβt assign a width. If you donβt need to support IE7 and below, this is better suited, although it feels kind of hacky to use the table
property value for display
.
.container ul { display: table; margin-right: auto; margin-left: auto; }
display: inline-block
& text-align
Centering an element just like you would do with regular text is possible as well. Downside: You need to assign values to both a container and the element itself.
.container { text-align: center; } .container ul { display: inline-block; /* One most likely needs to realign flow content */ text-align: initial; }
Notes:
Make the left and right margins of your UL auto and assign it a width:
#headermenu ul { margin: 0 auto; width: 620px; }
Edit: As kleinfreund has suggested, you can also center align the container and give the ul an inline-block display, but you then also have to give the LIs either a left float or an inline display.
#headermenu { text-align: center; } #headermenu ul { display: inline-block; } #headermenu ul li { float: left; /* or display: inline; */ }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With