Jak wyśrodkować i wyrównać poziome menu <UL>?


148

Muszę wyśrodkować i wyrównać poziome menu.
Próbowałem różnych rozwiązań, w tym mieszanki inline-block/ block/ center-alignitp., Ale nie udało mi się.

Oto mój kod:

<div class="topmenu-design">
    <!-- Top menu content: START -->
    <ul id="topmenu firstlevel">                                                                                       
      <li class="firstli" id="node_id_64"><div><a href="#"><span>Om kampanjen</span></a></div></li>
      <li id="node_id_65"><div><a href="#"><span>Fakta om inneklima</span></a></div></li>
      <li class="lastli" id="node_id_66"><div><a href="#"><span>Statistikk</span></a></div></li>
    </ul>
    <!-- Top menu content: END -->
</div>

AKTUALIZACJA

Wiem, jak wyśrodkować, wyrównać ulwewnątrz div. Można to osiągnąć za pomocą sugestii Sarfraza. Ale elementy listy są nadal pływające, pozostawione w ramach ul.

Czy potrzebuję JavaScript, aby to osiągnąć?


Wyśrodkuj tekst w każdym LI lub wyśrodkuj UL w DIV?
Joop

Odpowiedzi:


130

Z http://pmob.co.uk/pob/centred-float.htm :

Założenie jest proste i po prostu obejmuje bezszeroką obwolutę pływającą, która jest przesuwana w lewo, a następnie przesuwana poza ekran do lewej pozycji szerokości: względna; po lewej: -50%. Następnie zagnieżdżony element wewnętrzny jest odwracany i stosowane jest względne położenie + 50%. Powoduje to umieszczenie martwego elementu w środku. Względne pozycjonowanie utrzymuje przepływ i umożliwia przepływ innej zawartości pod spodem.

Kod

#buttons{
    float:right;
    position:relative;
    left:-50%;
    text-align:left;
}
#buttons ul{
    list-style:none;
    position:relative;
    left:50%;
}

#buttons li{float:left;position:relative;}/* ie needs position:relative here*/

#buttons a{
    text-decoration:none;
    margin:10px;
    background:red;
    float:left;
    border:2px outset blue;
    color:#fff;
    padding:2px 5px;
    text-align:center;
    white-space:nowrap;
}
#buttons a:hover{ border:2px inset blue;color:red;background:#f2f2f2;}
#content{overflow:hidden}/* hide horizontal scrollbar*/
<div id="buttons">
    <ul>
        <li><a href="#">Button 1</a></li>
        <li><a href="#">Button 2's a bit longer</a></li>
        <li><a href="#">Butt 3</a></li>
        <li><a href="#">Button 4</a></li>
    </ul>
</div>


9
Czy możesz dodać kod lub kontekst do tej odpowiedzi, aby zapobiec gniciu linków?
Nightfirecat

Rozwiązanie działa świetnie i przepraszam, że pytam po tak długim czasie, ale co jeśli mam rozwijaną css? Nie mogę użyć przepełnienia: ukryty wtedy w rodzicu. Ale nadal będzie się przepełniać, jak tutaj: homeafrika.com .
Samia Ruponti

W rzeczywistości nie widzisz żadnego przepełnienia w tej witrynie. Nie jestem pewien, czy potrzebujesz przepełnienia: ukryty; trochę tak czy inaczej, chociaż ponieważ jest to przepełnienie w poziomie, zawsze możesz spróbować overflow-x: hidden; zamiast. webchat.freenode.net/?nick=oerflowono&channels=#websites w celu uzyskania pomocy w czasie rzeczywistym.
reisio

1
Rozwiązanie ładnie wyśrodkowuje menu, ale jeśli masz podmenu, które powinny otwierać się w określonej ustalonej pozycji po najechaniu kursorem, jesteś skazany na zagładę, ponieważ position: relativemenu głównego zmienia zachowanie position:absolutepodmenu.
cweiske

1
@reisio Gdzie jest #buttonsidentyfikator w pytaniu OP? Gdzie w twojej odpowiedzi jest zauważenie, że musi go użyć? Jak można to zaakceptować i uzyskać najlepszą odpowiedź, jeśli tak naprawdę nie odpowiadasz na pytanie, a jedynie cytujesz jakieś bla-bla na temat nie na temat z jakiegoś linku?
trejder

90

To działa dla mnie. Jeśli nie zinterpretowałem Twojego pytania źle, możesz spróbować.

    div#centerDiv {
        width: 100%;
        text-align: center;
        border: 1px solid red;
    }
    ul.centerUL {
        margin: 2px auto;
        line-height: 1.4;
        padding-left: 0;
    }
    .centerUL li {
        display: inline;
        text-align: center;
    }
<div id="centerDiv">
    <ul class="centerUL">
        <li><a href="http://www.amazon.com">Amazon 1</a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com">Amazon 2</a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com">Amazon 3</a></li>
    </ul>
</div>


2
zgadzam się z @cweiske. Po prostu użycie wyrównania tekstu: wyśrodkuj na zawierającym div rozwiązało problem
Kim Stacks

Musisz tylko upewnić się, że każdy tekst w środku otrzymatext-align: left;
Juan Mendes,

To jest urocze! Ale ul ma domyślne wypełnienie po lewej stronie, co oznacza, że ​​menu jest przesunięte na prawo od środka. Będziesz musiał usunąć domyślne wypełnienie z ul za pomocą padding-left: 0;
Iterative Gypsy

1
Idealnie lepsza odpowiedź niż przyjęte rozwiązanie, użycie display: inline załatwia sprawę. nie używaj pływaka, jest to zbyt skomplikowane. Dzięki za spostrzeżenia @Robusto
Clain Dsilva,

środek wyrównywania tekstu w li jest niepotrzebny
Aminah Nuraini

75

Z Flexbox CSS3. Prosty.

ul {
  display: flex;
  justify-content: center;
}

ul li {
  padding: 0 8px;
}

6
Zdecydowanie poleciłbym tę metodę
caras

1
Ja również poleciłbym tę metodę zamiast wybranej odpowiedzi.
mickburkejnr

Mam ci piwo!
Suyash Dixit

Muszę powiedzieć, że nigdy wcześniej nie korzystałem z flexu ani z justify-content. Doskonała odpowiedź
Gman

Świetna odpowiedź beero
Ilyas karim

20

To najprostszy sposób, jaki znalazłem. Użyłem twojego html. Dopełnienie służy tylko do resetowania ustawień domyślnych przeglądarki.

ul {
  text-align: center;
  padding: 0;
}
li {
  display: inline-block;
}
<div class="topmenu-design">
  <!-- Top menu content: START -->
  <ul id="topmenu firstlevel">
    <li class="firstli" id="node_id_64">
      <div><a href="#"><span>Om kampanjen</span></a>
      </div>
    </li>
    <li id="node_id_65">
      <div><a href="#"><span>Fakta om inneklima</span></a>
      </div>
    </li>
    <li class="lastli" id="node_id_66">
      <div><a href="#"><span>Statistikk</span></a>
      </div>
    </li>
  </ul>
  <!-- Top menu content: END -->
</div>



2

Spróbuj tego:

div.topmenu-design ul
{
  display:block;
  width:600px; /* or whatever width value */
  margin:0px auto;
}

1
To działa, aby wyśrodkować UL. Ale <LI> nadal jest pływające. Chcę, aby <LI> było wyśrodkowane wewnątrz <UL>. Czy to możliwe?
Steven

2

Zrób to tak:

   <div id="footer">
        <ul>
            <li><a href="/1.html">Link 1</a></li>
            <li><a href="/2.html">Link 2</a></li>
            <li><a href="/3.html">Link 3</a></li>
            <li><a href="/4.html">Link 4</a></li>
            <li><a href="/5.html">Link 5</a></li>
        </ul>
   </div>

Oraz CSS:

#footer {
    background-color:#ccc;
    height:39px;
    line-height:36px;
    margin:0 auto;
    text-align:center;
    width:950px;
}

#footer ul li {
    display:inline;
    font-family:Arial,sans-serif;
    font-size:1em;
    padding:0 2px;
    text-decoration:none;
}

2

Jak wielu z was, od jakiegoś czasu się z tym zmagam. Ostatecznie rozwiązanie dotyczyło elementu div zawierającego UL. Wszystkie sugestie dotyczące zmiany wyściółki, szerokości itp. UL nie przyniosły efektu, ale następujące były.

Chodzi o element margin:0 auto;DIV zawierający. Mam nadzieję, że to pomoże niektórym ludziom i dziękuję wszystkim, którzy już zasugerowali to w połączeniu z innymi rzeczami.

.divNav
{
    width: 99%;
    text-align:center;
    margin:0 auto; 
}

.divNav ul
{ 
    display:inline-block; 
    list-style:none;
    zoom: 1;
}

.divNav ul li 
{
    float:left;
    margin-right: .8em;       
    padding: 0; 
}

.divNav a,  #divNav a:visited
{
    width: 7.5em;
    display: block; 
    border: 1px solid #000;
    border-bottom:none;
    padding: 5px; 
    background-color:#F90;
    text-decoration: none;
    color:#FFF;
    text-align: center;
    font-family:Verdana, Geneva, sans-serif;
    font-size:1em;
}

2

Demo - http://codepen.io/grantex/pen/InLmJ

<div class="navigation">
    <ul>
        <li><a href="">Home</a></li>
        <li><a href="">About</a></li>
        <li><a href="">Contact</a></li>
        <li><a href="">Menu</a></li>
        <li><a href="">Others</a></li>
    </ul>
</div>


.navigation {
    max-width: 700px;
    margin: 0 auto;
}
.navigation ul {
    list-style: none;
    display: table;
    width: 100%;
}
.navigation ul li {
    display: table-cell;
    text-align: center;
}
.navigation ul li a {
    padding: 5px 10px;
    width: 100%;
}

O tak dużo czystszy.


1

Ogólnie rzecz biorąc, sposobem na wyśrodkowanie elementu poziomu czerni (takiego jak a <ul>) jest użyciemargin:auto; właściwości.

Aby wyrównać tekst i elementy poziomu liniowego w elemencie blokowym, użyj text-align:center;. Więc razem coś w rodzaju ...

ul {
    margin:auto;
}
ul li {
    text-align:center;
    list-style-position:inside; /* so that the bullet points are also centered */
}
ul li div {
    display:inline; /* so that the bullet points aren't above the content */
}

... powinno działać.

Przypadkiem marginesowym jest Internet Explorer6 ... lub nawet inne IE, gdy nie używasz <!DOCTYPE>. IE6 nieprawidłowo wyrównuje elementy na poziomie bloków przy użyciu text-align. Więc jeśli chcesz obsługiwać IE6 (lub nie używasz a <!DOCTYPE>), Twoje pełne rozwiązanie to ...

div.topmenu-design {
    text-align:center;
}
div.topmenu-design ul {
    margin:auto;
}
div.topmenu-design ul li {
    text-align:center;
    list-style-position:inside; /* so that the bullet points are also centered */
}
div.topmenu-design ul li div {
    display:inline; /* so that the bullet points aren't above the content */
}

Jako przypis, myślę, że id="topmenu firstlevel"jest nieprawidłowy, ponieważ idatrybut nie może zawierać spacji ...? Rzeczywiście rekomendacja W3C definiuje ten idatrybut jako „Nazwa” typu ...

Tokeny ID i NAZWA muszą zaczynać się od litery ([A-Za-z]) i mogą po nich następować dowolne litery, cyfry ([0-9]), łączniki („-”), podkreślenia („_”) , dwukropki („:”) i kropki („.”).


1

Użyłem właściwości display: inline-block: rozwiązanie polega na zastosowaniu wrappera o stałej szerokości. Wewnątrz blok ul z blokiem inline do wyświetlania. Używając tego, ul po prostu przyjmuje szerokość dla prawdziwej zawartości! i wreszcie margin: 0 auto, aby wyśrodkować ten inline-block =)

/*ul wrapper*/
.gallery_wrapper{
        width:          958px;
        margin:         0 auto;
  }
/*ul list*/
ul.gallery_carrousel{
        display:        inline-block;
        margin:         0 auto;
}
.contenido_secundario li{
        float:          left;
}

0

używam do tego kodu jQuery. (Alternatywne rozwiązanie)

    $(document).ready(function() { 
       var margin = $(".topmenu-design").width()-$("#topmenu").width();
       $("#topmenu").css('margin-left',margin/2);
    });

0
div {
     text-align: center;
}
div ul {
     display: inline-table;
}

ul jako inline-table rozwiązuje problem. Użyłem nadrzędnego elementu DIV, aby wyrównać tekst do środka. w ten sposób wygląda dobrze nawet w innych językach (tłumaczenie, inna szerokość)


0

Rozwiązanie @ Robusto było najprostsze w tym, co próbowałem zrobić, sugeruję, abyś go użył. Próbowałem zrobić to samo z obrazami na nieuporządkowanej liście, aby stworzyć galerię ... Zrobiłem js skrzypce, żeby się z tym wygłupiać. Nie krępuj się wypróbowania tutaj.

[został utworzony przy użyciu przykładowego kodu solido]
HTML:

<div id="centerDiv">
    <ul class="centerUL">
        <li><a href="http://www.amazon.com"><img src="http://placehold.it/200x150>         </a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com"><img src="http://placehold.it/200x150"></a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com"><img src="http://placehold.it/200x150"></a></li>
    </ul>
</div>


CSS:

div#centerDiv {
    width: 700px;
    text-align: center;
    border: 1px solid red;
}
ul.centerUL {
    margin: 2px auto;
    line-height: 1.4;
}
.centerUL li {
    display: inline;
    text-align: center;
}

0
ul{margin-left:33%}

To przyzwoite przybliżenie na dużych ekranach. To nie jest dobre, ale dobre, brudne poprawki.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.