Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [solved] :hover -> bold i poziome menu
Forum PHP.pl > Forum > Po stronie przeglądarki
sowiq
Witam,
pytanie może wydawać się głupie, zwłaszcza jeśli pochodzi od kogoś zajmującego się tematem od jakiegoś czasu, ale kto pyta, nie błądzi.

Mam proste menu:
  1. <ul class="menu">
  2. <li><a href="#">menu 1</a></li>
  3. <li><a href="#">menu 2</a></li>
  4. <li><a href="#">menu 3</a></li>
  5. <li><a href="#">menu 4</a></li>
  6. </ul>

i CSS:
  1. ul.menu{
  2. list-style-type: none;
  3. padding: 0;
  4. margin: 0;
  5. }
  6. ul.menu li{
  7. display: block;
  8. float: left;
  9. padding: 3px;
  10. }
  11. ul.menu li a{ font-weight: normal; }
  12. ul.menu li a:hover{ font-weight: bold; }

Czyli ni mniej, ni więcej, tylko menu w układzie poziomym.

Moje pytanie brzmi: co muszę zrobić, żeby menu nie rozszerzało się po najechaniu kursorem na jakiś element? Chodzi o to, że jeśli link zostanie pogrubiony, to zmienia swoją szerokość 'rozpychając' na boki swojego rodzica, a ten sąsiednie elementy.

Od razu powiem, że nie mogę nadać elementom stałej/min/max szerokości, bo nie wiem co w nich będzie (różne języki menu definiowane z panelu admina).

Z góry dzięki za wszelkie podpowiedzi smile.gif
piotrooo89
ja bym próbował nadawać paddingi i/lub magriny...
sowiq
No ok, ale paddingi i marginy zostają takie same po najechaniu kursorem. Zmienia się tylko szerokość czcionki i 'rozpycha' element na szerokości. Trzeba by zmniejszyć paddingi poziome po najechaniu, ale o ile, skoro treść linków może mieć różną długość (czyli różne 'wydłużenia')?
piotrooo89
ustaw jednakowy padding dla elementu bez hovera i z hoverem.
sowiq
Nie, to nie pomaga. Tak jak pisałem wyżej. Problem jest w innym miejscu. Zobacz to na poniższym przykładzie:
  1. <ul class="menu">
  2. <li><a href="#">menu 1</a></li>
  3. <li><a href="#">menu 2</a></li>
  4. <li><a href="#">menu 3</a></li>
  5. <li><a href="#">menu 4</a></li>
  6. </ul>

  1. ul.menu{
  2. list-style-type: none;
  3. padding: 0;
  4. margin: 0;
  5. }
  6. ul.menu li{
  7. display: block;
  8. float: left;
  9. padding: 3px;
  10. background-color: #f00;
  11. }
  12. ul.menu li a{
  13. display: block;
  14. font-weight: normal;
  15. padding: 5px;
  16. background-color: #0f0;
  17. }
  18. ul.menu li a:hover{
  19. display: block;
  20. font-weight: bold;
  21. padding: 5px;
  22. }


W przypływie desperacji miałem już zamiar ustawić coś w stylu 'lewego tła', tzn zrobić przezroczystą czcionkę /czcionkę w kolorze tła, wyboldowaną, która ustawi szerokość elementu, a nad nią (odpowiednia wartość position) prawdziwy link. Ale to średnio elegancki sposób...
Crozin
jakimś tam rozwiązaniem jest dodanie w JS do zdarzenia mouseover funkcji, która ustawi elementowi szerokość równą offsetWidth - padding i do zdarzenia mouseout funkcje, która poprostu wywali właściwość width.

Użycie tutaj JS nie stworzy żadnych problemów - w przypadku jego braku co najwyżej "poskacze".
W samym CSS raczej ciężko będzie to uzyskać nie mając możliwości ustawienia stałej szerokości elementu - może jakaś zabawa z wywalaniem tekstu poza documentFlow przy :hover, ale to IMHO przerost formy nad treścią winksmiley.jpg
sowiq
@Crozin,
masz rację, JS to chyba najlepszy sposób. Właśnie miałem wrzucić tutaj rozwiązanie, ale byłeś szybszy smile.gif

Ja to robię trochę inaczej. Za pomocą JS przechodzę przez wszystkie elementy menu, ustawiam im font-weight na bold, zapamiętuję offsetWidth, czcionkę zmieniam na normal, a jako width ustawiam zapamiętaną wartość. Dzięki temu tylko raz wykonuję JS, bez zbędnych obliczeń.

Dzięki za pomoc!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.