Programowanie
Szablon
Paul O'Brien: 3-kolumny... Objaśnienie | Paul O'Brien: 3-kolumny... Objaśnienie |
|
|
| Redaktor: Stefan Wajda | |
| 01.08.2006. | |
|
W kolejnym odcinku zaadoptujemy do potrzeb Joomla! projekt płynnego 3-kolumnowego układu, z nagłówkiem i stopką oraz wyrównanymi do najdłuższej kolumnami zaprezentowany w opracowaniu Paula O’Briena Three Column Layout with Equalizing Header and Footer - objaśnienie technik projektowania 3-kolumnowych układów z nagłówkiem i stopką. Poniżej zamieszczamy roboczą wersję tłumaczenia artykułu Paula O’Briena (gwoli lepszej czytelności dodaliśmy śródtytuły). WprowadzenieTo wstyd, że wiele osób, które chcą zastąpić rozmieszczanie elementów na stronach WWW w tabelach układem opartym na kaskadowych arkuszach stylów, najczęściej chce tworzyć kopię tabeli. Ja uniknąłem tego zupełnie. Używałem szablonów opartych na CSS, ponieważ stwarzają większe możliwości, niż dawniejsze oparte na tabelach. Tak często jednak byłem pytany o 3-kolumnowe rozmieszczenie, że zdecydowałem się zebrać to, co wiem, i zastosować w praktyce, by przygotować satysfakcjonującą imitację układu 3-kolumnowego. Chociaż takie rozwiązanie ma kilka ograniczeń, to jednak dobrze się prezentuje w większości przeglądarek. Najpierw krótkie wprowadzenie objaśniające, co i w jaki sposób zostanie osiągnięte. Streszczenie założeńNajpierw krótkie streszczenie, co chcemy osiągnąć. Zaprojektujemy 3-kolumnowy układ z wyrównywanymi kolumnami, w którym stopka znajduje się poniżej zawartości, gdy zawartość jest niewielka, albo na dole dokumentu, jeżeli zawartość jest większa niż wysokość ekranu. Każda kolumna może być dowolnie długa. Kolumny mają krawędzie, a kolory wypełniają zawsze całe kolumny. Można by osiągnąć ten efekt, korzystając z procentowych określeń wysokości. Zastosowalibyśmy wówczas rozwiązanie: 10% dla nagłówka, 80% dla części głównej i 10% dla stopki. Zwykle jednak nie tego chcemy. Najczęściej chcemy niezmiennych wysokości nagłówka i stopki i zawartości automatycznie rozciągającej między nimi. W CSS nie można zastosować wartości 90%+200px i określić wyniku jako 100%. Takie rozwiązanie nie zadziała. Trzeba więc ustawić pojemność strony na wysokość 100% i upewnić się, że cała zawartość mieści się w granicach tego pojemnika (poza stopką, o czym poniżej). Dlaczego tworzymy kontener tylko dla kolumny centralnej, skoro chcemy trzech kolumn? Cierpliwości, już wyjaśniam. Stworzymy kontener z marginesami po lewej i prawej stronie. W tych marginesach umiejscowimy kolumny. Aby jednak uzyskać efekt w postaci 100% wysokości, elementy pływające umieścimy na zewnątrz środkowej kolumny, używając ujemnych marginesów. Zastosujemy Neat Trick - sztuczkę często używaną w innych okolicznościach. Tajemnica tkwi w tym, że umieszczając elementy pływające na zewnątrz kolumny centralnej, uzyskamy 100% wysokość dzięki temu, że będą one wydłużać środkową kolumnę, gdy ich zawartość będzie większa niż jej wysokość. W tym momencie wiele osób porzuciłoby ten zamysł i próbowałoby nieco innego rozwiązania. Jeśli jednak nie poddasz się i wytrwasz, to zobaczysz, że elementy pływające - zachodząc tylko 1 pikselem na kolumnę środkową - będą wpływać na jej zachowanie, wymuszając jej wydłużenie tak, jak tego oczekujemy. Wspaniale! Równocześnie, to, czego chcieliśmy, rozwiąże nam inny kłopot. Problemów z zachodzeniem itd. można uniknąć przez zastosowanie position:relative, przemieszczając kolumny dokładnie do zamierzonej pozycji, to nie trudne. Pozycjonowanie względne przemieszcza element wizualnie, a nie fizycznie, tak że uzyskamy zamierzony efekt nakładania się warstw. Ta technika nie tylko pozwala osiągnąć zakładany efekt, ale dodatkowo umożliwia ustawienie kontenerowi krawędzi na prawo i lewo od kolumny centralnej, co będzie dzielić stronę na trzy kolumny (nie będzie więc żadnej potrzeby umieszczania w elemencie pływającym stylu dla obramowania - Widoczne są tam miejsca wstawienia Kolor lewej i prawej kolumny jest faktycznie tym samym, co kolor tła całej strony(elementu Dotychczas, mamy 3-kolumnowy układ z nagłówkiem, rozciągający się na dowolną szerokość okna przeglądarki. "Kiedy będzie znów o stopce?" - już słyszę ponownie to pytanie. Strona ma 100% wysokości i jeśli dodamy normalną stopkę poniżej, zobaczymy wypełniony ekran. Sposób polega na tym, że dodajemy kontenerowi ujemny margines dolny, podciągający go od dołu w górę i pozwalamy stopce wskoczyć do okna przeglądarki. Margines musi być wystarczająco duży, kompensować wysokość stopki. Te 2 wymiary muszą ze sobą współgrać. W moim przykładzie nie są one dokładnie takie same, ponieważ uwzględniłem wchłonięcie niektórych marginesów elementu. Moglibyśmy już zakończyć naszą pracę, ale obawiam się, że przeglądarki mają dla nas inną niespodziankę w zapasie. Mimo że ustawiliśmy ujemny margines dolny dla kontenera, przeglądarki wciąż traktują kontener, jak by miał pełną wysokość i zawartość oraz powodują, że kontener znika pod stopką. Dlaczego? To rzeczywiście cios, ale nie poddamy się. Wszystko czego potrzebujemy, to zastosowanie podobnej techniki, którą wykorzystaliśmy wcześniej z nagłówkiem. Umieszczamy pusty element czyszczący Technika umieszczenia stopki wymaga objaśnienia, przedstawionego poniżej: Obszar dla stopki był problemem i zastosowanie Kontener zewnętrzny - Eksperymentowałem z marginesami i dopełnieniami, ale to tylko komplikowało i tak niełatwe zadanie. Najbardziej skuteczne i najprostsze okazało się zastosowanie pustego obszaru wielkości około 40px powyżej stopki. Zasadniczo stopka wyraźnie siedzi poniżej. 40px to wystarczająca wartość, aby zatrzymać zawartość prawej krawędzi stopki (domyślny margines elementów div dodaje resztę miejsca). Żeby lepiej zrozumieć problem, skorzystaj z poniższego przykładowego kodu i wprowadź dostatecznie duży tekst wywołujący powiększone okno… Zobaczysz, że tekst wejdzie pod stopkę, a następnie będzie kontynuowany, do końca. To jest ten sam efekt, jaki uzyskuje się z pozycjonowaniem względnym, kiedy przeglądarka wciąż przyjmuje, że element jest w swym oryginalnym miejscu.
<style type="text/css">
.outer {width:100%;height:200px;background:red;margin-bottom:-50px}
.footer {width:100%;height:50px;background:yellow}
</style>
</head>
<body>
<div class="outer">Wprowadź tutaj jak najdłuższy tekst:</div>
<div class="footer">Stopka</div>
</body>
</html>Po eksperymentach z powyższym kodem, rozumiesz dokładnie, na czym polega problem i jak go pokonaliśmy. Dlatego poruszamy tę kwestię odrębnie, poza głównym wątkiem. Teraz, gdy znasz podstawę, możemy przeanalizować i objaśnić kod, w którym zastosowano powyższe rozwiązanie. Style głównych elementówZaczynamy od stylów dla strony ( html, body {height:100%; /* bądźmy mili dla Opery */ padding:0; margin:0; } body { background:pink url(leftcolbg.jpg) repeat-y left top; color: #000000; } #outer{ height:100%; min-height:100%; margin-left:130px; margin-right:130px; background:#F8E7EC; border-left:1px solid #000; border-right:1px solid #000; margin-bottom:-52px; color: #000000; } html > body #outer{height:auto;} /* dla Mozilli, w IE zawsze height = min-height */ Style dla elementy <body>Chcemy mieć stronę o wysokości 100%, wypełniającą ekran w 100%. Uzyskamy to przez ustawienie wartości Skoro ustaliliśmy 100% wysokości dla strony, to inne elementy mogą wykorzystywać tę wysokość jako podstawę dla obliczeń. Dlatego teraz tworzymy blok nazywany Wystarczyłoby to dla IE, ponieważ IE interpretuje wysokość ( Zastosowaliśmy w tym celu parametr html > body #outer{height:auto;} Ustawiamy w ten sposób wysokość na automatyczną (zwiększaną, gdy zwiększa się zawartość), a że wcześniej ustawiliśmy Ustawiamy również dopełnienie ( Dodajemy również do elementu body kolor tła, który będzie również kolorem tła kolumn. Inne kolory dla kolumn możemy uzyskać powtarzającym się obrazem tła (pamiętaj, aby zawsze pod obrazem tła ustawiać odpowiedni kolor - to dobra praktyka programowania). padding : 0; margin : 0; background : pink url(leftcolbg.jpg) repeat-y left top; color: #000000; Style głównego konteneraTeraz zajmijmy się głównym kontenerem - Ten kontener ma ustawione 100% ze 100% elementu margin-left:130px; margin-right:130px; border-left:1px solid #000; border-right:1px solid #000; W ten sposób tworzymy przestrzeń dla kolumn i ustalamy wygląd ich krawędzi. Oczywiście rozmiar może być zmieniony odpowiednio do Twoich potrzeb.Następnie tworzymy przestrzeń dla stopki, używając techniki ujemnego marginesu, wyjaśnialiśmy to już wcześniej:
margin-bottom:-52px;Kolor tła ustawiony dla Pozostałe elementySkoro mamy już główne elementy zdefiniowane, to przystępujemy do pozostałej części strony. NagłówekNajpierw przedstawmy kod nagłówka - bloku #header{ background:#FF0000; border-top:1px solid #000; border-bottom:1px solid #000; color: #000; text-align:center; position:relative; margin:0 -131px; padding-top:56px; } /* Ukryj przed Mac/IE \*/ * html #header{height:56px;height:10px} /* height wymusza układ w IE */ /* Koniec ukrywania dla Mac/IE */ Nagłówek Lewa i prawa kolumnaNastępne: inteligentne rozwiązania - lewa i prawa kolumna: #left { position:relative; /* dla IE, która nie zawsze pokazuje element pływający */ width:130px; /* taka sama jak lewy margines w #outer*/ float:left; margin-left:-129px; /* musi być o 1px mniej niż szer., by zepchnąć stopkę */ padding-top:72px; /* tworzy miejsce na nagłówek */ left:-2px; /* ustawia kolumnę w je pozycję */ } #left p {padding-left:2px;padding-right:2px} #right p {padding-left:2px;padding-right:2px} #right { position:relative; /* dla IE, która nie zawsze pokazuje element pływający */ width:130px;/* taka sama jak prawy margines w #outer*/ float:right; margin-right:-129px; /* musi być o 1px mniej niż szer., aby zepchnąć stopkę */ padding-top:72px; /* tworzy miejsce na nagłówek */ left:2px; /* ustawia kolumnę w je pozycję */ } Lewa kolumna jest pozycjonowanym względnie elementem pływającym ( Dodajemy Element pływający ma szerokość 130px, tę samą, którą ustaliliśmy w Prawy element pływający jest ustawiony dokładnie tak samo z wyjątkiem parametru Zwróć uwagę na dwa inne użyte tutaj style ( Zmieniając rozmiar kolumn, musisz pamiętać o trzech rzeczach:
To wszystko, co jest niezbędne - nie można tego zrobić prościej jak przypuszczam Stopka - |
|
| Zmieniony ( 27.05.2009. ) |
| « poprzedni artykuł |
|---|






