Perfection or Vanity

Project: Terminated

Blog nie jest już dalej prowadzony ani aktualizowany. Mimo tego, wpisy i komentarze są dalej dostępne. Możesz przeczytać pożegnalny wpis albo przejść do archiwum.

Sekcje w szablonach

13 października 2005

Sekcje w szablonach, czyli najczęstsze błędy i nieporozumienia podczas tworzenia układów za pomocą sekcji.
Osoby pragnące zaznajomić się z szablonami stron tworzonymi na divach często napotykają problemy, których wielokrotnie nie rozumieją. Nie potrafiąc ich rozwikłać własnymi siłami (bo czasam wystarczy pogooglać) wracają do tabelek rzucając hasło "divy ssą".

Prawda jest taka, że najczęściej przyczyną złych wyników pracy jest niedouczenie i niedoinformowanie. W erze tabelek nikt nie potrzebował wiedzieć co to jest element blokowy bądź liniowy, jak działa oblewanie i pozycjonowanie. Szablony działające na sekcjach (<div/>) są sterowane CSSem i nie wystarczą tylko empiryczne ćwiczenia.

Problem 1

Najprostszy do rozwikłania. Otóż sekcje to nie tabelki. Żadna nie pokaże Ci się, jeśli niczego w niej nie ma.

  1. <div id="container">
  2. <div id="box"></div>
  3. </div>

Nie ma nic w środku, nie ma ich na stronie (chyba, że mają ustawione rozmiary). Zwykle wystarczy wstawić jakiś <p></p> z Lorem Ipsum dla wypełnienia bądź dla celów testowych parę <br/>.

Problem 2

  1. <p>Lorem ipsum…</p>
  2. <blockquote style="float: right"><p>To jest jakiś tam cytat.</p></blockquote>

Blockquote jest floatowane na prawo. Wszystko wygląda bardzo dziwacznie, a przecież chcieliśmy żeby tekst opływał ten cytat.

Otóż, żeby pływanie bloków wyglądało w tym przypadku ok, blockquote musi się znaleźć przed akapitem w kodzie. Dodatkowo powienineś przypisać mu szerokość.

Zapamiętaj sobie, jeśli nie wynika Ci to z wiedzy o blokach i floatach, że aby coś wyfloatować w poziomie, musisz to umieścić w źródle strony przed elementem, który będzie opływał ten pierwszy. No ale wtedy może się pojawić…

Problem 3

„Mam dwie kolumny, floatuję jedną ale nic się nie dzieje, argh.” Zapomniałeś do drugiej dostawić marginesu o długości równej szerokości pierwszej.

Korzystając z przykładu wcześniejszego możemy określić szerokość (width) elementu <blockquote/> i margines z prawej strony, dla akapitu i być może efekt Cię zadowoli (bo będzie odmienny).

Możesz też floatować ją w drugą stronę, ale wtedy pamiętaj że wystąpi…

Problem 4

Jest sekcja, w niej dwie kolejne.

  1. <div id="main">
  2. <div id="content">Left</div>
  3. <div id="sidebar">Right</div>
  4. </div>

Sekcja główna ma kolor tła, dwie w niej są floatowane na lewo i prawo. Problem jest taki, że tło sekcji main jest wysokie na jeden wiersz. Ilustruje to obrazek:

Skrócenie sekcji głównej

Problem wynika z tego, że nie rozumiesz jak działa pływanie elementów. Wyrywasz je ze strumienia dokumentu. Blok główny nie ma się czego przyczepić, więc zostaje „skrócony”. Rozwiązanie jest proste. Należy rozciągnąć sekcję main. Można to uczynić przez height, ale jest to bardzo nieeleganckie rozwiązanie.

Wystarczy umieścić pod koniec main dowolny element z właściwością clear="both".

  1. <div id="main">
  2. <div id="content">Left</div>
  3. <div id="sidebar">Right</div>
  4. <hr style="clear: both" />
  5. </div>

Właściwość ta spowoduje, że element <hr/> nie będzie mógł opływać kolumn przez co spadnie poniżej najdłuższej z nich. Co automatycznie rozciągnie sekcję main. Prawda, że proste? :)

O wiele lepiej ustawić właściwość overflow (hidden albo auto) dla kontenera, rezygnując z dodatkowego elementu pod kolumnami.

To by było na tyle. Oczywiście problemów związanych z sekcjami i tworzeniem układów za ich pomocą jest o wiele więcej, ja jedynie zaznaczyłem najczęstsze i najbardziej frustrujące, a jednocześnie najłatwiejsze do rozwiązania.

Informacje i hiperłącza

Blog o projektowaniu zgodnych ze standardami stron internetowych.

Praktyczne przykłady, sztuczki CSS, sposoby obchodzenia błędów przeglądarek, lekki i nieinwazyjny JavaScript, użyteczny design, dostępność i skrypty użytkownika.

RSS

Informacje o wpisie

Napisał riddle 13 października 2005 o 14:57

Kategorie: CSS, HTML & Semantyka, Standardy sieciowe

Dodaj do:

Wpisy archiwalne

Archiwum miesięczne

Dzięki!

Dodaj bloga do Technorati Favorites Dodaj bloga do Del.icio.us Blog należy do sieci 10przykazań.com

  1. Ciekawe, ciekawe...

  2. W problemie 4 zamiast hr (niektorzy nie lubia tej kreski) mozna uzyc pustego diva, nic sie nie pojawi, a glowna sekcja zostanie rozciagnieta

  3. Można też dodać position: absolute; (bodajże)

    "Nawet jakbyś ustawił szerokość i wysokość box, kolorek dla container, to nic Ci z tego nie wyniknie. Nie ma nic w środku, nie ma ich na stronie."

    Że niby to:
    <div style="background: #f90;">
    <div style="height: 90px; width: 90px;"></div>
    </div>

    ?

  4. Apropo problemu pierwszego - jesli ustawimy dla diva box szerokosc i wysokosc to pojawi sie on na stronie...

  5. Racja.

  6. Ooo... ciekawe. Problem 4 miałam kiedyś u siebie i wówczas nie doszłam do rozwiązania.

    Wiesz, co, trochę się wycofuję z komentarzy o wyglądzie Twojego jogga. Przyjemnie się tu wraca. I ciekawie piszesz.

  7. Ciekawy artykulik...

    PS. http://www.w3.org/TR/2005/WD-xhtml2-20050527/mod-structural.html#sec_8.8.

    ...tak mi się z sekcjami skojarzyło ;)

  8. Milka: <hr /> jest strukturalnym znacznikiem do odzielania sekcji, a tworzenie nic nie znaczących divów jest jednastką chorobową wydzieloną i opisaną przez Zeldmana jako divits. Lubienie czy nie poziomej kreski - hr {display:none}

  9. > Wystarczy umieścić pod koniec main dowolny element z właściwością clear="both".

    No tu się nie zgodzę. Semantyka poszła w pole. Przykład analogiczny do wstawiania blockquote w celu text-indent. Ja bym skorzystał z opcji nie ingerującej w kod.
    http://www.positioniseverything.net/easyclearing.html
    http://www.mezzoblue.com/archives/2005/03/03/clearance/index.php

    @Fipaj, mi na początku też. :-)

  10. Ad 4: http://patrys.jogger.pl/comment.php?eid=121784

    Nie potrzeba żadnych dodatkowych elementów.

  11. Patrys: piszesz tam o rozciagania w poziomie. Czy ta metoda zadziala rowniez na pion?

  12. Ta metoda sprawia, że parent rozciąga się w każdą stronę do najbardziej wystającego za daną krawędź dziecka.

  13. ckrzysiek 13 02 marca 2007, 18:24

    Tak jak napisałeś, zaczynam z DIVami i CSSem i miałem problem #4

    • Przy zastosowaniu overflow okazało się, że w IE strona mi się sypnęła, jakby zignorowała poprzedni DIV z float: left.
    • W przypadku hr, jeśli dodawałem display:none efekt taki sam jak bez hr, czyli display:none = efekt:none
    • Jak zostawiłem <hr> w Operze i FF wszystko OK, dodatkowa linia nie szpeciła, ale IE rozciągnął mi także tło pod HR, co w moim przypadku psuło stronę
    • Przy pustym DIV idealnie
    • nie próbowałem z

    /* źródło: http://www.positioniseverything.net/easyclearing.html */
    .clearfix:after { content: „.”; display: block; height: 0; clear: both; visibility: hidden;
    }
    .clearfix {display: inline-block;}
    /* Hides from IE-mac \*/

    • html .clearfix {height: 1%;}

    .clearfix {display: block;}
    /* End hide from IE-mac */

    choć wygląda przyzwoicie

  14. Co do odp. 4, to da się coś zrobić, żeby te div rozciągały się do wysokości dłuższego z nich? Czyli, żeby ich wysokości były zawsze równe. Jeśli nadam im position absolute i ustawie wartości bottom, to ten sposób już nie pomaga.

Dodaj komentarz

Do formatowania komentarzy używaj Textile (HTML nie działa). Szczególnie jeśli wklejasz większe fragmenty kodu. W razie niepewności użyj podglądu komentarza.

Wypowiedzi obraźliwe, infantylne oraz nie na temat będą moderowane – pisząc postaraj się zwiększyć wartość dyskusji.

Komentarze nie służą do wysyłania wiadomości albo informowania o błędach, itd. Chcesz coś mi napisać – skontaktuj się.