Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CSS][HTML] Zaokrąglone menu na DIV-ach
Forum PHP.pl > Forum > Przedszkole
Walian
Próbuję utworzyć menu, które posiadałoby belkę tytułową pokrytą teksturą gradientową (3 pliki) z zaokrąglonymi rogami. Chciałbym to zrobić na DIV-ach ale męczę to cały dzień i nie potrafię dostosować tego tak by działało w IE 6. Udało mi się to zrobić częściowo stosując jedną tabelę, a w pełni poprawnie dopiero stosując dwie.

Chcę to wszystko zrobić tak by:
  • Szerokość całego menu była zależna od szerokości kontenera, w którym się znajduje.
  • Menu ustala marginesy (chyba wiadomo po co).
  • Teksturowanie belki ma polegać na trzech plikach graficznych:
    • l.png ma rozmiar 7 x 32 i jest lewym narożnikiem belki.
    • m.png ma rozmiar 1 x 32 i jest rozciągane horyzontalnie.
    • r.png ma rozmiar 7 x 32 i jest prawym narożnikiem belki.


Wiem, że mogę użyć jednego pliku graficznego do takiego menu, ale wtedy, gdy będę chciał zmienić rozmiar to będę musiał tworzyć nowy plik graficzny.
Wygląd mojej strony ma wyglądać tak, że po lewej będą takie menusy, po prawej i na środku, z tymże te na środku oczywiście będą większe - w nich będą artykuły, recenzje i takie tam.
Tak więc muszą się one bezproblemowo rozciągać automatycznie w poziomie zależnie od kontenera, w którym je umieszczę.

Oto moje wypociny:
Plik html (menu na divach, na tabeli, i na dwóch tabelach):
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. "http://www.w3.org/TR/html4/strict.dtd">
  3. <title>Test</title>
  4. <meta name="robots" content="noindex, nofollow">
  5. <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  6. <meta http-equiv="Content-Language" content="pl">
  7. <link rel="stylesheet" href="n.css" type="text/css">
  8. </head>
  9. <div class="menu">
  10. <div class="h">
  11. <div class="l"></div><div class="m">Tytuł</div><div class="r"></div>
  12. </div>
  13. <div class="c">
  14. <a href="" title="">Treść</a><br>
  15. <a href="" title="">Treść</a><br>
  16. <a href="" title="">Treść Treść</a>
  17. </div>
  18. </div>
  19.  
  20. <table cellspacing="0" cellpadding="0" class="menu">
  21. <tr>
  22. <td class="l"></td><td class="m">Tytuł</td><td class="r"></td>
  23. <!-- Jeśli tytuł będzie dłuższy, to IE 6 wyświetli to poprawnie... -->
  24. </tr>
  25. <tr>
  26. <td colspan="3" class="c">
  27. <a href="" title="">Treść</a><br>
  28. <a href="" title="">Treść</a><br>
  29. <a href="" title="">Treść Treść</a>
  30. <!-- Jeśli treść będzie krótsza, to IE 6 wyświetli to poprawnie... -->
  31. </td>
  32. </tr>
  33. </table>
  34.  
  35. <table cellspacing="0" cellpadding="0" class="menu">
  36. <tr>
  37. <td>
  38. <table cellspacing="0" cellpadding="0" style="width: 100%">
  39. <tr>
  40. <td class="l"></td><td class="m">Tytuł</td><td class="r"></td>
  41. </tr>
  42. </table>
  43. </td>
  44. </tr>
  45. <tr>
  46. <td class="c">
  47. <a href="" title="">Treść</a><br>
  48. <a href="" title="">Treść</a><br>
  49. <a href="" title="">Treść Treść</a>
  50. </td>
  51. </tr>
  52. </table>
  53. </body>
  54. </html>


Arkusz stylów:
  1. body
  2. {
  3. margin: 0;
  4. background-color: #fff;
  5. font-family: Verdana, Tahoma;
  6. font-size: 11px;
  7. color: #000;
  8. }
  9. a:link, a:active {color: #000; text-decoration: none}
  10. a:visited {color: #194b66; text-decoration: none}
  11. a:hover {color: #1e5c7d; text-decoration: underline}
  12.  
  13. /* DIV-y */
  14. div.menu {width: 100%}
  15. div.menu div.h {width: 100%; height: 32px}
  16. div.menu div.h div.l
  17. {
  18. float: left;
  19. width: 7px;
  20. height: 32px;
  21. background: red url('gfx/l.png') top left no-repeat;
  22. }
  23. div.menu div.h div.m
  24. {
  25. float: left;
  26. height: 32px;
  27. width: 100%;
  28. background: url('gfx/m.png') top left repeat-x;
  29. line-height: 32px;
  30. text-align: left;
  31. color: #fff;
  32. font-weight: bold;
  33. }
  34. div.menu div.h div.r
  35. {
  36. float: left;
  37. width: 7px;
  38. height: 32px;
  39. background: url('gfx/r.png') top left no-repeat;
  40. }
  41. div.menu div.c
  42. {
  43. background-color: #f0f9ff;
  44. }
  45.  
  46. /* Tabele */
  47. table.menu {width: 175px}
  48. table.menu td.l
  49. {
  50. width: 7px;
  51. background: red url('gfx/l.png') top left no-repeat;
  52. }
  53. table.menu td.m
  54. {
  55. height: 32px;
  56. background: url('gfx/m.png') top left repeat-x;
  57. line-height: 32px;
  58. text-align: left;
  59. color: #fff;
  60. font-weight: bold;
  61. }
  62. table.menu td.r
  63. {
  64. width: 7px;
  65. background: url('gfx/r.png') top left no-repeat;
  66. }
  67. table.menu td.c
  68. {
  69. background-color: #f0f9ff;
  70. border: 1px solid #065fa1;
  71. }


Screen jak to wygląda w IE 6 (WinXP SP3):


Wszystkie pliki:
http://www.sendspace.com/file/4hzrs9
ats2008
Witaj,

Zaintrygowałeś mnie tym problemem.

Na początku powiem, że twój kod jest kompletnie nieczytelny. Nie dziw się, jeśli nikt poza mną nie odpowie... Nawet się w niego nie wczytywałem, tylko zacząłem robić od początku po swojemu.

Po pierwsze: poczytaj sobie ten artykuł o elastycznych szablonach: http://www.kurshtml.boo.pl/css/plynny_szablon,szablon.html. Nie wiem, czy jest sens robienia elastycznego menu... tylko dział info jest elastyczny, ale kwestia gustu...

Oto moje rozwiązanie: jest w jednym pliku (umieść go w katalogu, gdzie masz n.html). Nie jest ono idealne, ale jeszcze do tego wrócę.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  4. <title>Untitled Document</title>
  5. <style type="text/css">
  6.  
  7.  
  8. #menu {width:30%; height:auto; margin:0; padding:0;
  9. float:left;}
  10.  
  11. #info {width:68%; height:auto; margin:0; padding:0;
  12. float:right;}
  13.  
  14. /*clasy nagłówka*/
  15. .naglowek {overflow:hidden;
  16. background:url(gfx/m.png);
  17. background-repeat:repeat-x;
  18. width:100%;}
  19. .l {float:left; width:5%;
  20. height:32px;
  21. background-image:url(gfx/l.png);
  22. background-repeat:no-repeat;
  23. background-position:left top; }
  24.  
  25.  
  26.  
  27. .r {float:right;
  28. text-align:center;
  29. width:95%;
  30. height:32px;
  31. background-image:url(gfx/r.png);
  32. background-repeat:no-repeat;
  33. background-position:right top;}
  34.  
  35. .trescmenu {width:100%; clear:both; text-align:center;}
  36.  
  37.  
  38.  
  39. </head>
  40.  
  41.  
  42. <!--=================MENU=================-->
  43. <div id="menu">
  44.  
  45. <div class="naglowek"><div class="l">l</div><div class="r">Nagłówek</div></div>
  46.  
  47. <div class="trescmenu">Treść menu </div>
  48. </div>
  49. <!--=================INFO=================-->
  50. <div id="info">
  51. <div class="naglowek"><div class="l">l</div><div class="r">Nagłówek</div></div>
  52. <div class="trescmenu">Treść Info </div>
  53. </div>
  54.  
  55. </body>
  56. </html>


W tym rozwiązaniu zwróć uwagę na pliki l.png i r.png. One nie powinny mieć przezroczystości, tylko zaokrąglenie w kolorze tła. Po pierwsze dlatego, że IE nie obsługuje przezroczystości .png (dlatego lepiej we wszystkich plikach użyć gifa z przezroczystością), a po drugie, w moim rozwiązaniu tło kontenera div.naglowek jest na całą szerokość, stąd po bokach trzeba umieścić tło nieprzezroczyste.

Szerokość div.r i div.l ustawiłem na 5/95% - ale można jeszcze pokombinować z proporcjami. Jeśli będą za małe, to przy mniejszych rozdzielczościach obetnie ci zaokrątlenie.

Za chwilę napiszę jeszcze jeden post, bo coś lepszego przyszło mi do głowy.

Ogólnie, dzięki za problem, sporo i mnie to nauczyło.

Życzę powodzenia na przyszłość.


Rozwiązanie 2:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  4. <title>Untitled Document</title>
  5. <style type="text/css">
  6.  
  7.  
  8. #menu {width:28%; height:auto; margin:0; padding:0;
  9. float:left;
  10. padding-left:7px;
  11. background: url(gfx/l.png) left top no-repeat;}
  12.  
  13. #info {width:68%; height:auto; margin:0; padding:0;
  14. float:right;
  15. padding-right:7px;
  16. background: url(gfx/r.png) right top no-repeat;}
  17.  
  18. /*clasy nagłówka*/
  19. .around1 {width:100%; padding-left:7px;
  20. background:url(gfx/l.png) top left no-repeat;
  21. }
  22.  
  23. .around2 {width:100%; padding-right:7px;
  24. background:url(gfx/r.png) top right no-repeat;}
  25.  
  26. .naglowek {overflow:hidden;
  27. background:url(gfx/m.png);
  28. background-repeat:repeat-x;
  29. width:100%;}
  30. .r {float:right;
  31. text-align:center;
  32. width:100%;
  33. height:32px;
  34. }
  35.  
  36. .trescmenu {width:100%; clear:both; text-align:center;}
  37.  
  38.  
  39.  
  40. </head>
  41.  
  42.  
  43. <!--=================MENU=================-->
  44. <div id="menu">
  45. <div class="around2">
  46. <div class="naglowek"><div class="r">Menu</div></div>
  47.  
  48. </div>
  49. <div class="trescmenu">Treść menu </div>
  50. </div>
  51. <!--=================INFO=================-->
  52. <div id="info">
  53. <div class="around1">
  54. <div class="naglowek"><div class="r">Info</div></div>
  55. <div class="trescmenu">Treść Info </div>
  56. </div>
  57. </div>
  58.  
  59. </body>
  60. </html>


No, teraz wyszło lepiej, jedyne na co moim zdaniem trzeba zwrócić uwagę, to margines między div#menu i div#info. Tutaj dałem 28/68%, żeby był proporcjonalny.

Pozdrawiam i życzę powodzenia.
Walian
Dzięki za odpowiedź.

Cytat("ats2008")
W tym rozwiązaniu zwróć uwagę na pliki l.png i r.png. One nie powinny mieć przezroczystości, tylko zaokrąglenie w kolorze tła. Po pierwsze dlatego, że IE nie obsługuje przezroczystości .png (dlatego lepiej we wszystkich plikach użyć gifa z przezroczystością) (...)

Tak, zauważyłem to wcześniej i albo użyję gifów, albo png bez kanału alfa, na razie olać to.

Pierwszy sposób:
W IE 6 wyświetla się poprawnie.
W Operze i Firefox-ie nie ma zaokrąglonych rogów (ten środkowy obrazek pokrywa całą belkę) i tekst dziwnie się rozjechał na belce.

Drugi sposób:
Tu już bliżej rozwiązania problemu, aczkolwiek nie można ustalić poprawnie bordera dla treści.
Wszystkie trzy przeglądarki wyświetlają kod bardzo podobnie (Opera i Firefox identycznie).
ats2008
to jest do obejścia, trzeba dodać jeszcze jednego diva, zdjąć padding 7px z div.menu i div.info i wkleić go z backgroudem w odpowiednie miejsce.

Życzę powodzenia.



jak się już uporasz wyświetl gotowca na zamknięcie wątku, ok? Może się komuś jeszcze przyda.

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