chevron-left chevron-right

Piotr Nalepa Blog webmasterski

[CSS] Wyśrodkowanie menu za pomocą CSS

This version
Published
Author
Category
CSS
Feedback
Write to me · Post on X

This post is 16 years old. Browsers and tools may have changed since then, so check the code against current documentation before you use it.

W dzisiejszym tutorialu poruszam problem wyśrodkowywania menu za pomocą CSS. Do tej pory wielu ludzi ma z tym problemy i próbuje robić menu z wykorzystaniem marginesów czy paddingów, a to nie jest dobry sposób jeśli chcemy mieć menu z dynamicznie ustalaną szerokością zależną od długości przycisków czy napisów w linkach w menu.

Na początek stwórzmy sobie przykładową strukturę menu. W moim przypadku wygląda następująco:

Example 1HTML
<div id="menu">
<ul>
<li><a href="#">Przycisk 1</a></li>
<li><a href="#">Przycisk 2</a></li>
<li><a href="#">Przycisk 3</a></li>
<li><a href="#" class="zaznaczony">Przycisk 4</a></li>
</ul>
</div>

Następnie trzeba stworzyć plik CSS, który będzie zawierał poniższy kod:

Example 2CSS
#menu {
   float: left;
   width: 100%;
   background: #fff;
   border-bottom: 4px solid #000;
   overflow: hidden;
   position: relative;
}
#menu ul {
   clear: left;
   float: left;
   list-style: none;
   margin: 0;
   padding: 0;
   position: relative;
   left: 50%;
   text-align: center;
}
#menu ul li {
   display: block;
   float: left;
   list-style: none;
   margin: 0;
   padding: 0;
   position: relative;
   right: 50%;
}
#menu ul li a {
   display: block;
   margin: 0 0 0 1px;
   padding: 3px 10px;
   background: #ddd;
   color: #000;
   text-decoration: none;
   line-height: 20px;
}
#menu ul li a:hover {
   background: #b00;
   color: #fff;
}
#menu ul li a.zaznaczony, #menu ul li a.zaznaczony:hover {
   color: #fff;
   background: #000;
   font-weight: bold;
}

Aby stworzyć efekt wyśrodkowania menu użyłem pozycjonowania relatywnego dla ul w którym jest zawarte menu i ustawiłem jego pozycję na 50% z lewej strony i wzmocniłem ustawiając text-align: center.
Ponadto, dla każdego elementu listy menu dałem pozycjonowanie relatywne ustawiając pozycję na 50% z prawej strony i display: block.

Tworząc tego typu wyśrodkowane menu należy pamiętać o kilku rzeczach:

  • Nie możesz dać żadnych wizualnych styli do elementu ul takich jak: background czy border. Musisz te atrybuty dać dla elementów listy li.
  • Jeśli chcesz stworzyć osobny styl dla którejś pozycji w menu, to dodaj klasę do tego przycisku. Dzięki temu unikniesz dziwnego wysypania się menu.

Budując w ten sposób menu dostajesz menu w pełni zgodne ze standardami, bez żadnych hacków dla innych przeglądarek oraz dodatkowego kodu JavaScript.

Demo z tego artykułu jest dostępne tutaj: wyśrodkowane menu CSS

About the author

Staff Software Engineer

I've been writing this blog since 2009 and building for the web professionally for 14 years. Today I lead the frontend of the Cosmos platform at Bishop Fox, where I've been since day one of the project. Before that I worked at OLX, KUDO, Auto1 and eZ Systems. Here I write about what I've learned in practice: JavaScript, TypeScript, React, CSS and frontend architecture. I've also spoken at conferences across Poland and Europe. Got a question or an idea for a post? Let me know!