Як центрувати горизонтальне меню <UL>?


148

Мені потрібно по центру вирівняти горизонтальне меню.
Я спробував різні рішення, включаючи суміш inline-block// block/ center-alignтощо, але не досяг успіху.

Ось мій код:

<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>

ОНОВЛЕННЯ

Я знаю, як центрувати вирівнювання в ulмежах div. Це можна досягти, використовуючи пропозицію Сарфраз. Але елементи списку все ще пропускаються зліва в межах ul.

Чи потрібен Javascript для цього?


Центруйте текст у кожному LI або по центру UL в DIV?
Joop

Відповіді:


130

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

Приміщення просте і в основному включає в себе обгортку поплавця без ширини, яка пливе ліворуч і потім зміщується з екрана в положення лівої ширини: відносна; зліва: -50%. Далі вкладений внутрішній елемент перевертається і застосовується відносне положення + 50%. Це спричиняє розміщення елемента мертвим у центрі. Відносне позиціонування підтримує потік і дозволяє іншому вмісту текти під ним.

Код

#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
Чи можете ви додайте до цієї відповіді якийсь код або контекст, щоб запобігти гниттю посилання?
Nightfirecat

Рішення чудово працює, і мені шкода запитати про це через такий тривалий час, але що робити, якщо у мене спадений файл css? Я не можу використовувати переповнення: приховано у батьківській програмі. Але воно все одно переповниться, як тут: homeafrika.com .
Самія Рупонті

Насправді не бачите жодного переповнення на цьому сайті. Я не впевнений, що вам потрібен перелив: приховано; біт так чи інакше, хоча оскільки це для горизонтального переповнення, ви завжди можете спробувати overflow-x: hidden; замість цього. webchat.freenode.net/?nick=oerflowono&channels=#weites для надання допомоги в режимі реального часу.
reisio

1
Рішення добре центрирує меню, але якщо у вас є підменю, яке повинно відкриватися в певному фіксованому положенні на наведення курсора, ви приречені, оскільки position: relativeголовне меню змінює поведінку position:absoluteпідменю.
cweiske

1
@reisio Де є #buttonsпитання у запитанні ОП? Де у Вашій відповіді помічено, що він повинен ним користуватися? Як це можна прийняти і відповісти на голоси, якщо ви насправді не відповідаєте на питання, а цитуєте лише якийсь поза темою бла-бла з якогось посилання?
trejder

90

Це працює для мене. Якщо я неправильно пояснив ваше запитання, ви можете спробувати.

    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
згоден з @cweiske. Просто за допомогою вирівнювання тексту: центр на вміщеному діві вирішив проблему для мене
Кім Стек

Вам просто потрібно буде переконатися, що будь-який текст всередині отримуєtext-align: left;
Хуан Мендес

Це прекрасно! Але ul має типову підкладку зліва, що означає, що меню натиснуто праворуч від центру. Вам потрібно буде видалити типовий прокладку з ul із padding-left: 0;
Ітеративна циганка

1
Ідеально краща відповідь, ніж прийняте рішення, використання дисплея: inline робить фокус. не використовуйте float, його надмірно складний. Дякуємо за розуміння @Robusto
Clain Dsilva

Центр вирівнювання тексту в лі є непотрібним
Aminah Nuraini

75

З флексбоком CSS3. Простий.

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

ul li {
  padding: 0 8px;
}

6
Я б точно рекомендував цей метод
caras

1
Я також рекомендував би цей спосіб над обраною відповіддю.
mickburkejnr

Я володію тобою пивом!
Suyash Dixit

Мені б сказати, що я ніколи не використовував флекс раніше, ніж виправдовував зміст. Відмінна відповідь
Gman

Great Answer beero
Ilyas karim

20

Це найпростіший спосіб, який я знайшов. Я використовував ваш html. Прокладка призначена лише для скидання налаштувань браузера.

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>


9

Ось хороша стаття про те, як це зробити досить непомітно, без жодних злому та повної крос-браузерної підтримки. Для мене працює:

-> http://matthewjamestaylor.com/blog/beautiful-css-centered-menus-no-hacks-full-cross-browser-support


1
Чи можете ви опублікувати резюме цього випадку на випадок, якщо посилання знизиться?
алекс

2

Спробуйте це:

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

1
Це працює в центрі UL. Але <LI> все ще пливе ліворуч. Я хочу, щоб <LI> був зосереджений всередині <UL>. Це можливо?
Стівен

2

Зробіть так:

   <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>

І 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

Як і багато хто з вас, я деякий час боровся з цим. Рішення в кінцевому рахунку було пов'язане з дівом, що містить UL. Усі пропозиції щодо зміни прокладки, ширини та ін. UL не мали ефекту, але наступне зробило.

Вся справа в margin:0 auto;тому, що міститься на діві. Я сподіваюся, що це допомагає деяким людям, і дякую всім, хто вже запропонував це у поєднанні з іншими речами.

.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

Демо - 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%;
}

Омг стільки чистішого.


1

Взагалі кажучи, шлях до центру чорного елемента рівня (наприклад, а <ul>) використовує margin:auto;властивість.

Для вирівнювання елементів тексту та рядка в межах елемента блоку використовуйте text-align:center;. Тож усі разом щось на кшталт ...

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 */
}

... повинен працювати.

Бахромою є Internet Explorer6 ... або навіть інші IE, коли не використовується a <!DOCTYPE>. IE6 неправильно вирівнює елементи рівня блоку за допомогою text-align. Отже, якщо ви хочете підтримати IE6 (або не використовуєте a <!DOCTYPE>), ваше повне рішення - це ...

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 */
}

Як виноска, я думаю id="topmenu firstlevel", що недійсний, оскільки idатрибут не може містити пробілів ...? Дійсно рекомендація w3c визначає на idатрибут як тип «ім'я» ...

Токени ID та NAME повинні починатися з літери ([A-Za-z]) і може супроводжуватися будь-якою кількістю букв, цифр ([0-9]), дефісів ("-"), підкреслення ("_") , двокрапки (":") та періоди (".").


1

Я використовував властивість display: inline-block: рішення полягає у використанні обгортки з фіксованою шириною. Всередині ul-блок із вбудованим блоком для відображення. Використовуючи це, ul просто взяти ширину для реального змісту! і, нарешті, маржа: 0 авто, щоб центрировать цей вбудований блок =)

/*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

Я використовую для цього код jquery. (Альтернативне рішення)

    $(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 як вбудована таблиця виправляє проблему. Я використовував батьківський div для вирівнювання тексту по центру. таким чином це добре виглядає навіть в інших мовах (переклад, різної ширини)


0

@ Рішення Robusto було найпростішим для того, що я намагався зробити, я пропоную вам скористатися цим. Я намагався зробити те ж саме для зображень із невпорядкованого списку, щоб зробити галерею ... Я створив js-скрипку, щоб обдурити це. Сміливо спробуйте тут.

[він був створений за допомогою зразкового коду robusto]
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%}

Це гідне наближення на великих екранах. Це не добре, але добре брудне виправлення.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.