publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
6 skomentuj »

TAGI: css , arkusz stylów , webmaster , programowanie

2008-08-05 11:33  |  Piotr Ostalecki

Najczęstsze problemy z arkuszami stylów CSS

Najczęstsze problemy z arkuszami stylów CSS

Wraz z rozwojem arkuszy CSS wzrasta liczba możliwości rozwiązania konkretnego problemu. Niekiedy interpretacja pewnych właściwości jest różna w konkurencyjnych przeglądarkach, co może prowadzić do problemów spędzających początkującym webmasterom sen z powiek. W artykule zajmiemy się kilkudziesięcioma takimi problemami, jednocześnie prezentując sprawdzone sposoby ich rozwiązania. Przy okazji pokażemy również kilka sztuczek CSS, które poprawiają wygląd strony WWW.

1. Błąd podwójnego marginesu

To błąd występujący wyłącznie w Internet Explorerze. Gdy elementowi nadamy atrybuty margin oraz float w tę samą stronę, wartość marginesu zostaje podwojona. Najprostszym rozwiązaniem tego problemu jest dodanie do pliku CSS następującego wiersza: display: inline. Twój kod powinien więc wyglądać tak:

#content {
    float: left;
    width: 500px;
    padding: 10px 15px;
    margin-left: 30px;
    display: inline;
}

2. Minimalna wysokość ignorowana w IE

Atrybut min-height działa w Mozilla Firefoksie, w przeglądarce Microsoftu jest natomiast ignorowany. Rozwiązaniem jest nadanie atrybutu height, który jest odpowiednikiem min-height w IE. Problem został rozwiązany w IE7.

/* zwykłe przeglądarki */
.warstwa {
min-height:8em;
height:auto;
}
/* dla IE */
/*\*/
* html .warstwa {
height: 8em;
}
/**/

3. Wyśrodkowanie środkowego bloku na trzy sposoby

Witryny WWW najczęściej mają szerokość mniejszą niż ekran monitora, a ich zawartość jest wyśrodkowana. Niestety, nie da się tego zrobić intuicyjnym poleceniem text-align:center, trzeba więc stosować inne sposoby.

I. Sposób najwygodniejszy: <div> zostaje wyśrodkowany, gdy jego parametry left-margin i right-margin są ustawione na auto. Dzieje się tak, ponieważ – zgodnie z modelem CSS2 – jeśli oba marginesy są ustawione na auto, ich wartość jest równa. (Działa to w IE od wersji szóstej, tylko gdy przeglądarka jest w trybie standard compliant). Przykład wykorzystania:

body {
  /*text-align działa w tym przypadku w IE*?
  text-align: center;
  /*ustawiamy minimalną szerokość strony dla przeglądarek innych niż IE, zapobiega to „chowaniu” się fragmentów DIV-a poza okno przeglądarki*/
  min-width: 500px;
}
#kontener {
  text-align: left;
  /*ustawia szerokość DIVa*/
  width: 500px;
  /*wyśrodkowanie elementu, dla przeglądarek, w których text-align nie działa w odniesieniu do głównych DIV-ów*/
  margin-left: auto;
  margin-right: auto;
}

II. Wyśrodkowanie wykorzystujące wartości procentowe – sposób najprostszy. Przykładowo: gdy środkowy <div> ma mieć 60% szerokości strony, to oba marginesy zajmują 40% – więc margines lewy to połowa, czyli 20% strony. Analogicznie można wyśrodkować elementy w pionie.

.kontener {
  position: absolute;
  width: 60%;
  left: 20%;
}

III. Wyśrodkowanie przy użyciu wartości absolutnych. Musimy znać szerokość elementu, który chcemy wyśrodkować. Załóżmy, że będzie to 500 px. Przesuwamy go więc o 50% w prawo, tak aby jego lewa krawędź była w środku strony. Cały trik polega na takim ustawieniu lewego marginesu, aby wydawało się, że <div> jest wyśrodkowany. Ustawiamy left-margin na -250 px, czyli –(500 px/2). Oczywiście, ten sam sposób da się także zastosować do wyśrodkowania elementu w pionie.

.kontener {
  position: absolute;
  width: 500px;
  height: 600px;
  left: 50%;
  top: 50%;
  margin-left: -250px;
  margin-top: -300px;
}

4. Wyśrodkowanie elementu w pionie

Zastosowanie zwykłego vertical-align:middle może dać niespodziewane rezultaty, gdy tekst ma wiele linii. Oczywiście, da się temu zapobiec, jeśli się skorzysta z elementu <div>. W tym celu tworzymy trzy zagnieżdżone znaczniki <div>, a następnie wewnątrz ostatniego umieszczamy znacznik <p> z tekstem.

<style type="text/css">
<!--
p {
 margin:0;
 padding:0;
}
#kontener {
 width:550px;
 border:1px solid #666;
 padding:10px;
 height:300px;
}
#tekst {
 width:300px;
 height:100%;
 position:relative;
}
#tekst div {
 position:absolute;
 /*tutaj umieszczamy odległość tekstu od dołu, w procentach lub innych jednostkach*/
 bottom:50%;
 left:0;
}
-->
</style>

<div id="kontener">
 <div id="tekst"><div>
  <p>Wyśrodkowany tekt, który ładnie się zawija na końcu linii</p>
 </div></div>
</div>

5. Problemy z kolumnami

To bardzo wygodny i elegancki sposób prezentowania treści, ale często powoduje problemy. Weźmy pod uwagę taki kod:

<style type="text/css">
.columns{
  width:500px;
  background:yellow; 
}
.main{
  float:left;
  width:400px;
  background:green;  
}
.sidebar{
  float:right;
  width:100px;
  background:blue;  
}

</style>

<div class="columns">
  <div class="main">
    <img src="banner.gif" style="width:410px; height:10px" />
  </div>
  <div class="sidebar">
    <p>Sidebar>
  </div>
</div>

W założeniu chcemy osiągnąć stronę podobną do tej na górnym schemacie i w większości przeglądarek ta strona będzie tak właśnie wyglądała. Jednak w IE sidebar ucieka do dołu, poniżej kolumny main. Problemem okazuje się obrazek banner.gif, którego szerokość jest większa niż szerokość kolumny. Równie dobrze to samo może się stać, gdy do lewej kolumny wpisany zostanie zbyt długi tekst, którego nie można przełamać (np. adres URL – należy o tym pamiętać, akceptując treści wpisywane przez użytkowników witryny).

Ten problem jest powodowany przez pogwałcenie przez IE domyślnych ustawień atrybutu overflow, którego domyślną wartością jest visible. Dzięki temu wszystko, co nie mieści się w kolumnie o określonej wielkości, może poza nią wystawać – i tak odbywa się to w Mozilla Firefoksie. Internet Explorer, niestety, próbuje rozszerzyć lewą kolumnę, przez co brakuje dla niej miejsca i zostaje ona przesunięta w dół.

Dla tego problemu istnieją dwa rozwiązania: pierwsze to ustawienie dla lewej kolumny overflow na hidden – wtedy wszystko to, co wystaje poza kolumnę, zostaje przycięte; drugie rozwiązanie polega na wpisaniu dwóch następujących definicji: word-wrap: break-word; – spowoduje to, że tekst zostanie odpowiednio złamany na fragmenty mieszczące się w zadanym polu. Drugie rozwiązanie działa również dla odnośników, nie jest natomiast obsługiwane przez Firefoksa 3.

6. Pozycjonowanie elementów

Młodzi adepci stylów CSS mają często problem z wyborem typu pozycjonowania danego elementu. Po pierwsze, należy zrozumieć, czym jest pozycjonowanie bezwzględne. Chodzi tutaj o to, że wybrany element jest zabierany ze swojego miejsca i przenoszony dokładnie tam, gdzie tego chce webmaster. Dobrze zobrazuje to poniższy przykład: tworzymy znacznik <div> w kształcie czerwonego kwadratu i umieszczamy go bezpośrednio w <body>. Do arkusza stylów dodamy następujące linie:

#kwadrat {
position: absolute;
bottom: 40px;
right: 40px;
width:40px;
height:40px;
background:red;
}

Efekt będzie taki, że kwadrat zostanie umieszczony 40 pikseli od dołu strony i 40 pikseli od prawej krawędzi ekranu, cokolwiek by się tam znajdowało.

Użycie pozycjonowania względnego spowoduje, że kwadrat zostanie przeniesiony w górną część ekranu. Dzieje się tak dlatego, że elementy zostaje przesunięty o 40 px w lewo (od prawej krawędzi) oraz 40 px w górę (od dołu) w stosunku do nadrzędnego elementu pozycjowanego względnie lub do krawędzi monitora (gdy takiego brak). Przykład:

#kwadrat {
position: relative;
bottom: 40px;
right: 40px;
width:40px;
height:40px;
background:red;
}

7. Wszystko, co musisz wiedzieć o elementach pływających (float)

To prawdopodobnie najmniej intuicyjny element w całym CSS, który jest powodem najczęstszych narzekań webmasterów. Niemniej problemem nie jest sama teoria elementów pływających, a sposób, w jaki są one interpretowane przez przeglądarki. Oto najważniejsze fakty, o których należy pamiętać, budując stronę na bazie warstw pływających:

  • Pływający fragment umieszczamy wewnątrz standardowej treści, a następnie przesuwamy jak najdalej w prawo lub w lewo, a treść strony może opływać ten element. Kiedy jednak element zostanie „wyjęty” z treści (np. przez nadanie mu bezwzględnej pozycji), jest on ignorowany, a reszta treści może zająć jego miejsce (pod lub nad nim).
  • Nie należy definiować elementu pływającego bez zadeklarowania jego szerokości (wyjątkiem są zdjęcia), gdyż efekty tego mogą być nieprzewidywalne.
  • Należy pamiętać, że element pływający może zostać dociągnięty tylko do jednej krawędzi i nie da się go umieścić na środku strony.
  • Gdy brakuje miejsca na element pływający, zostaje on przesunięty w dół, dopóki będzie on mógł być osadzony bez przeszkód.
  • Element pływający nigdy nie wystaje ponad linię, w której został utworzony.
  • Minusem korzystania z elementów pływających jest to, że gdy są one wielokrotnie zagnieżdżone, w praktyce każda przeglądarka może to inaczej zinterpretować.
  • Jeśli umieścimy po definicji elementu pływającego blok tekstu, to będzie go on opływał. Gdy chcemy, by tak się działo, należy nadać mu atrybut clear. Dzięki atrybutowi clear:left tekst nie będzie opływał elementów pływających przyciągniętych do lewej krawędzi. Analogiczny efekt osiągniemy dzięki clear:right, dzięki clear:both tekst nie będzie natomiast opływał żadnego elementu pływającego.
  • Domyślnie element, w którym umieszczony jest float (zwany dalej kontenerem), nie rozszerzy się tak, aby go objąć.

Istnieją dwie możliwości, by zawrzeć cały float wewnątrz kontenera. Prostsza z nich to umieszczenie po każdym elemencie pływającym pustego znacznika <div> z definicją clear:both.

Druga metoda jest o wiele bardziej profesjonalna i nie wymaga wpisywania jakichkolwiek dodatkowych znaczników <div>. Wystarczy do arkusza CSS dołączyć następujący fragment definicji:

.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
 .clearfix {
display: inline-block;
}
* html .clearfix {height: 1%;}

Teraz do znacznika <div>, który służy jako kontener, wystarczy przypisać klasę clearfix. Trik ten działa we wszystkich przeglądarkach zgodnych ze standardami, a dzięki ostatniej linii arkusza nawet w Internet Explorerze.

«poprzednia 1 2 następna »

publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
6 skomentuj »

Polecamy

Reklama

Komentarze

  • nrafal

    #1 nrafal 2008-08-06 17:12:11 0

    Bardzo brzydkie są te hacki na IE - po co psuć sobie arkusz stylów, jeśli można dodać dedykowane dla IE (i to konkretnych wersji!) specjalne arkusze, bazując na microsoftowych komentarzach warunkowych?

    None

  • czytelnik7

    #2 czytelnik7 2008-08-07 18:17:09 0

    Najgorsze co można zrobić użytkownikowi to usunąć to co już zdążył wpisać, czyli w punkcie E:

    Tutaj wpisz swój komentarz

    Trzeba dodać warunek:

    if (this.value=="Tutaj wpisz swój komentarz") { this.value='' }

    None

  • Basstardamus

    #3 Basstardamus 2008-08-09 12:37:55 0

    Pamiętajcie o trybach quirks i strict przeglądrek. Definicja doctype jest niezbędna w dokumencie. Więcej informacji znajdziecie na http://www.quirksmode.org/css/quirksmode.html

    None

  • Marr

    #4 Marr 2008-08-12 23:50:40 0

    a przyjemnym ulepszeniem będzie też powrotne dodanie tekstu do pola przy wprowadzenia warunku przy zdarzeniu onblur :).

    Jeśli oczywiście pole było puste ;)

    None

  • Roberto

    #5 Roberto 2008-08-15 23:10:23 0

    2. brzydkie takie hacki (i niepewne...)

    3. text-align:center "intuicyjny" przy centrowaniu bloków? to żart?

    7. ta "bardziej profesjonalna metoda" to amatorka jednak...

    dla kontenera trzeba dać overflow:hidden i (to dla IE jednak w dobrych przeglądarkach nic nie psuje pod warunkiem, że się nie siedzi w quirks mode) height:100% albo overflow:auto i height:auto - i to jest już na pewno bardziej 'profesjonalna' metoda niż bawienie się w :after

    None

  • gosc123

    #6 gosc123 2009-02-17 10:22:31 0

    {min-height: 100px;

    height: auto !important;

    height: 100px;}

    i nie wolno na tej warstwie użyć overflow: hidden, ale działa dla wszytskich przeglądarek

    IP: 83.29.251.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20

Uwaga! Możesz zarejestrować się w serwisie i w ten sposób zarezerwować swój nick oraz ominąć konieczność ciągłego odczytywania wyrazów.

Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka (słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.

Polecane książki

Czytaj Webhosting

Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.

Zarejestruj domenę

Sprawdź dostępność swojej domeny:

.pl: 0 zł   .com: 19.90 zł
.com.pl: 0 zł   .eu: 19.90 zł