Jak równomiernie i w pełni rozciągnąć stałą liczbę poziomych elementów nawigacyjnych na określonym kontenerze
Chciałbym rozciągnąć 6 elementów nav równomiernie w kontenerze 900px, z równą ilością białej przestrzeni między nimi. Na przykład...
---| 900px Container |---
---| HOME ABOUT BASIC SERVICES SPECIALTY SERVICES OUR STAFF CONTACT US |---
Obecnie najlepszą metodą, jaką mogę znaleźć, aby to zrobić, jest:
nav ul {
width: 900px;
margin: 0 auto;
}
nav li {
line-height: 87px;
float: left;
text-align: center;
width: 150px;
}
PROBLEM z tym jest dwojaki. Po pierwsze, nie usprawiedliwia to, ale raczej rozprowadza znaczniki li równomiernie po tagu ul.. tworzenie nierównej białej przestrzeni między mniejszymi elementami menu, takimi jak "HOME" lub "ABOUT", a większymi, takimi jak "PODSTAWOWE USŁUGI".
Drugi problem polega na tym, że układ łamie się, jeśli element nav jest większy niż 150px, które usługi specjalne są - nawet jeśli jest więcej niż wystarczająco dużo miejsca dla całej nav.
Czy ktoś może to dla mnie rozwiązać? Przeszukałem sieć w poszukiwaniu rozwiązań i wszystkie wydają się być niewystarczające. CSS / HTML tylko jeśli to możliwe... Dzięki!UPDATE( 7/29/13): użycie komórki tabeli jest najlepszym nowoczesnym sposobem implementacji tego układu. Zobacz odpowiedź Felixa poniżej. Właściwość table cell
działa obecnie na 94% przeglądarek. Będziesz musiał coś zrobić z IE7 i poniżej, ale poza tym powinno być ok.
UPDATE (7/30/13): niestety, istnieje błąd webkit, który wpływa na to, jeśli łączysz ten układ z zapytaniami o Media. Na razie musisz unikać zmiany właściwości 'display'. Zobacz Błąd Webkit.
UPDATE (7/25/14): poniżej znajduje się lepsze rozwiązanie dla text-align: justify. Korzystanie z tego jest prostsze i unikniesz błędu Webkit.
12 answers
Użyj text-align:justify
na kontenerze, w ten sposób będzie działać bez względu na to, ile elementów masz na liście (nie musisz obliczać % szerokości dla każdego elementu listy
#nav {
text-align: justify;
min-width: 500px;
}
#nav:after {
content: '';
display: inline-block;
width: 100%;
}
#nav li {
display: inline-block;
}
<ul id="nav">
<li><a href="#">HOME</a></li>
<li><a href="#">ABOUT</a></li>
<li><a href="#">BASIC SERVICES</a></li>
<li><a href="#">OUR STAFF</a></li>
<li><a href="#">CONTACT US</a></li>
</ul>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-02 20:44:10
To naprawdę działa. Ma również tę zaletę, że można użyć zapytań o media, aby łatwo wyłączyć styl poziomy - na przykład, jeśli chcesz umieścić je w pionie, gdy na telefonie komórkowym.
HTML
<ul id="nav">
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
CSS
#nav {
display: table;
height: 87px;
width: 100%;
}
#nav li {
display: table-cell;
height: 87px;
width: 16.666666667%; /* (100 / numItems)% */
line-height: 87px;
text-align: center;
background: #ddd;
border-right: 1px solid #fff;
white-space: nowrap;
}
@media (max-width: 767px) {
#nav li {
display: block;
width: 100%;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 08:39:51
Jeśli możesz, użyj flexbox:
<ul>
<li>HOME</li>
<li>ABOUT US</li>
<li>SERVICES</li>
<li>PREVIOUS PROJECTS</li>
<li>TESTIMONIALS</li>
<li>NEWS</li>
<li>RESEARCH & DEV</li>
<li>CONTACT</li>
</ul>
ul {
display: flex;
justify-content:space-between;
list-style-type: none;
}
Jsfiddle: http://jsfiddle.net/RAaJ8/
Obsługa przeglądarki jest całkiem dobra (z przedrostkami i innymi paskudnymi rzeczami): http://caniuse.com/flexbox
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 11:34:24
Idealne rozwiązanie będzie:
- automatycznie skaluj do szerokości kontenera nawigacyjnego
- Obsługa dynamicznej liczby pozycji menu.
Używając prostego menu ul
wewnątrz kontenera nav
, możemy zbudować rozwiązanie spełniające powyższe wymagania.
HTML
<nav>
<ul>
<li>Home</li>
<li>About</li>
<li>Basic Services</li>
<li>Specialty Services</li>
<li>Our Staff</li>
<li>Contact Us</li>
</ul>
</nav>
Najpierw musimy wymusić na ul
pełną szerokość jego nav
kontenera. Aby to osiągnąć, użyjemy :after
psuedo-element z width: 100%
.
To osiąga nasz cel doskonale, ale dodaje końcowe białe spacje z elementu psuedo. Możemy usunąć tę białą spację we wszystkich przeglądarkach przez IE8, ustawiając line-height
z ul
na 0 i ustawiając ją z powrotem na 100% na swoich dzieciach li
. Zobacz przykład CodePen i rozwiązanie poniżej:
CSS
nav {
width: 900px;
}
nav ul {
text-align: justify;
line-height: 0;
margin: 0;
padding: 0;
}
nav ul:after {
content: '';
display: inline-block;
width: 100%;
}
nav ul li {
display: inline-block;
line-height: 100%;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-01 02:28:46
[2]} próbowałem wszystkich powyższych i znalazłem ich chcących. Jest to najprostsze, najbardziej elastyczne rozwiązanie, jakie mogłem wymyślić (dzięki wszystkim powyższym za inspirację).
HTML
<div id="container">
<ul>
<li>HOME</li>
<li>ABOUT US</li>
<li>SERVICES</li>
<li>PREVIOUS PROJECTS</li>
<li>TESTIMONIALS</li>
<li>NEWS</li>
<li>RESEARCH & DEV</li>
<li>CONTACT</li>
</ul>
</div>
CSS
div#container{
width:900px;
background-color:#eee;
padding:20px;
}
ul {
display:table;
width: 100%;
margin:0 0;
-webkit-padding-start:0px; /* reset chrome default */
}
ul li {
display:table-cell;
height:30px;
line-height:30px;
font-size:12px;
padding:20px 10px;
text-align: center;
background-color:#999;
border-right:2px solid #fff;
}
ul li:first-child {
border-radius:10px 0 0 10px;
}
ul li:last-child {
border-radius:0 10px 10px 0;
border-right:0 none;
}
Możesz zrzucić pierwsze/Ostatnie zaokrąglone końce, oczywiście, ale myślę, że są prawdziwe (tak jak twój Klient;)
Szerokość kontenera ogranicza poziomą listę, ale możesz to porzucić i po prostu zastosować wartość bezwzględną do UL, jeśli chcesz.
Fiddle with jeśli chcesz..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-15 18:03:57
To powinno zrobić to za Ciebie.
<div id="nav-wrap">
<ul id="nav">
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</div>
#nav-wrap {
float: left;
height: 87px;
width: 900px;
}
#nav {
display: inline;
height: 87px;
width: 100%;
}
.nav-item {
float: left;
height: 87px;
line-height: 87px;
text-align: center;
text-decoration: none;
width: 150px;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-21 01:58:35
Próbowałeś ustawić szerokość li na powiedzmy 16% z marżą 0,5%?
nav li {
line-height: 87px;
float: left;
text-align: center;
width: 16%;
margin-right: 0.5%;
}
Edit: ustawiłbym UL na 100% szerokości:
Nav ul { Szerokość: 100%; margines: 0 auto; }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-20 23:47:45
Jest to coś, co naprawi Model CSS flexbox, ponieważ pozwoli Ci określić, że każda li otrzyma równą część pozostałej szerokości.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-21 00:31:16
Próbowałem tak wielu różnych rzeczy i w końcu okazało się, że to, co działa najlepiej dla mnie, to po prostu dodanie w
padding-right: 28px;
Bawiłem się wyściółką, aby uzyskać odpowiednią ilość, aby równomiernie rozmieścić przedmioty.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 08:25:10
Zamiast definiować szerokość, możesz po prostu umieścić lewy margines na li, aby odstępy były spójne i upewnić się, że margines+li mieści się w granicach 900px.
nav li {
line-height: 87px;
float: left;
text-align: center;
margin-left: 35px;
}
Mam nadzieję, że to pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-20 23:49:00
<!DOCTYPE html>
<html lang="en">
<head>
<style>
#container { width: 100%; border: 1px solid black; display: block; text-align: justify; }
object, span { display: inline-block; }
span { width: 100%; }
</style>
</head>
<div id="container">
<object>
<div>
alpha
</div>
</object>
<object>
<div>
beta
</div>
</object>
<object>
<div>
charlie
</div>
</object>
<object>
<div>
delta
</div>
</object>
<object>
<div>
epsilon
</div>
</object>
<object>
<div>
foxtrot
</div>
</object>
<span></span>
</div>
</html>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-06 23:16:26
Waham się oferować to, ponieważ nadużywa ye olde html. Nie jest to dobre rozwiązanie, ale jest to rozwiązanie: Użyj tabeli.
CSS:
table.navigation {
width: 990px;
}
table.navigation td {
text-align: center;
}
HTML:
<table cellpadding="0" cellspacing="0" border="0" class="navigation">
<tr>
<td>HOME</td>
<td>ABOUT</td>
<td>BASIC SERVICES</td>
<td>SPECIALTY SERVICES</td>
<td>OUR STAFF</td>
<td>CONTACT US</td>
</tr>
</table>
Nie po to zostały stworzone tabele, ale dopóki nie będziemy mogli rzetelnie wykonać tej samej akcji w w lepszy sposób myślę, że chodzi tylko o dopuszczalność.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-05 09:17:06