Strona główna > web > Archipelagi pełne <div>-ów. Czyli o html i semantyce słów kilka.

Archipelagi pełne <div>-ów. Czyli o html i semantyce słów kilka.

W związku z tym, że obecnie siłą rzeczy mam dużo styczności z HTML zainteresowałem się z nie rozerwalnie z nim związaną semantyką.

Temat daleki od Java, ale zawsze to coś technicznego, a i myślę, że jest warte poruszenia. Z tego co zauważyłem dla większości webmajstrów w naszym kraju tworzenie nowocześnie, tworzenie wg standardów W3C to głównie totalna anihilacja większości mających semantycznego znaczenie dozwolonych znaczników na rzecz chyba obdarzanego jakimś kultem <div>,a dla przykładu <table> to samo zło. Poza tym mało kto posiada aktualną wiedzę na temat HTML, no bo po co się go uczyć skoro jest taki prosty. Oprócz tego i sam walidator nie jest w stanie sprawdzić strony pod kątem semantyczności, a więc sama wlepka na stronie potwierdzająca zgodność to w dużej części przypadków pic na wodę fotomontaż, bo standardy to nie tylko valid w3c.

W polskim internecie ciągle mało jest stron poprawnych semantycznie, nie wspominając już o zgodności z takim standardem jak WAI, których praktycznie u nas nie ma

Pomysł na ten post wziął się całkiem przypadkiem. Otóż przeglądałem sobie pewną stronę i podglądnąłem sobie kod źródłowy takiego o to kawałka tejże strony:
4 ostatnie fotki

Kiedy zobaczyłem jakie spaghetti kryje z taką pierdołą, jak wyświetlenie 4 obrazków…

<div class="last_rows"><div class="thumb">
          <div class="outer">
              <div class="middle">
                <div class="inner">
                  <div class="avatar_photo">
<a href="">
<img alt="miniaturka zdjęcia" class="thumb" src=""></a>
                 </div>
                </div>
              </div>
            </div><div class="desc"><div class="author">
<a href="/profile/31521844">XXXXX YYYYYY</a><br>dzisiaj 20:31</div></div>
</div>
<div class="thumb">
            <div class="outer">
              <div class="middle">
                <div class="inner">
                  <div class="avatar_photo"><a href="/profile/22620947/gallery/39">
<img alt="miniaturka zdjęcia" class="thumb" src="http://photos.nasza-klasa.pl/22164904/39/thumb/44d11daf6a.jpeg"></a>
                  </div>
                </div>
              </div>
            </div><div class="desc"><div class="author">
<a href="/profile/22620947">LLLLLLLL ### ~~~ CCCCCCCC ~~~</a><br>dzisiaj 20:31</div></div>
</div>
<div class="thumb">
            <div class="outer">
              <div class="middle">
                <div class="inner">
                  <div class="avatar_photo"><a href="/profile/19763376/gallery/145">
<img alt="miniaturka zdjęcia" class="thumb" src="http://photos.nasza-klasa.pl/19984140/145/thumb/3719f89981.jpeg"></a>
                  </div>
                </div>
              </div>
            </div><div class="desc"><div class="author"><a href="/profile/19763376">***SLODKA  BLONDI***</a><br>dzisiaj 20:31</div></div>
</div>
<div id="last_photo_td"><div class="thumb">
           <div class="outer">
              <div class="middle">
                <div class="inner">
                  <div class="avatar_photo"><a href="">
<img alt="miniaturka zdjęcia" class="thumb" src=""></a>
                  </div>
                </div>
              </div>
            </div><div class="desc"><div class="author">
<a href="">XXXXXX KKKKKK (95 SUPPORT)</a><br>dzisiaj 20:31</div></div>
            </div>
</div> 41 linii
<div class="clear"></div></div></div>

…to wiedziałem, że poruszę w końcu ten temat.
Całą tę stronę trafią skazy o których wspomina Jeffrey Zeldman w swojej książce Designing With Web Standards, a mianowice classitis i divitis w jednym. A chyba jedna z najpopularniejszych stron w polskim internecie powinna trzymać poziom, zwłaszcza jeśli chodzi o tę część na którą twórcy mają największy wpływ, bo sama zawartość to inna kwestia. Tymczasem semantyka leży, ułatwienie dostępu też praktycznie tam nie istnieją, ale to już temat na osobny post.
Zresztą nie tylko o semantykę tu chodzi, taka nadmiarowość znaczników to zapchane łącze itd, co w przypadku tejże strony ma ogromne znaczenie. Prawdopodobnie spokojnie dałoby się zmniejszyć liczbę znaczników całej strony o połowę.

Czas na refaktoryzację

Dokładnie, skoro można zrobić to z kodem źródłowym stricte programowym to czemu nie z html?
Ekspertem w tej dziedzinie to ja na pewno jestem, ale postanowiłem posprzątać ten syf i sprawdzić czy mi się to uda dla własnej satysfakcji, a jak:). Całą strukturę obrazków postanowiłem oprzeć na liście definicji <dl>, wg fachowców od semantyki (m.in. Dan Cederholm w książce Kuloodporne strony internetowe str. 101), może być ona wykorzystywana do tworzenia galerii, zresztą od początku wiedziałem, że ją wykorzystam, chociaż nawet i zwykłe, tak znienawidzone <table> byłoby wydajniejsze niż ten makaron co tam jest…

Struktura

        <div>
            <dl>
                <dt><a href="#"><img src="img/nk1.jpeg" alt="miniaturka-zdjęcia" /></a></dt>
                <dd>
                    <a href="#">Xxxxx Yyyyyyyyyyy</a><br />Dzisiaj 17:44
                </dd>
            </dl>
            <dl>
                <dt><a href="#"><img src="img/nk2.jpeg" alt="miniaturka-zdjęcia" /></a></dt>
                <dd>
                	<a href="#">Uuuuuu Nnnnn (Jjjjjj)</a> <br />Dzisiaj 17:44
                </dd>
            </dl>
            <dl>
                <dt><a href=""><img src="img/nk3.jpeg" alt="miniaturka-zdjęcia" /></a></dt>
                <dd>
                	<a href="#">Aaaa Kkkkkkkkkk</a> <br />Dzisiaj 17:44
                </dd>
            </dl>
            <dl>
                <dt><a href=""><img src="img/nk4.jpeg" alt="miniaturka-zdjęcia" /></a></dt>
                <dd>
               		<a href="">Uuuuu Ppppppp</a> <br />Dzisiaj 17:44
               </dd>
            </dl>
        </div>

Co nam daje:

galeria bez styli

Pierwsze szlify CSS

* {
	padding: 0;
	margin: 0;
}
body {
	font-size: small;
	font-family: Tahoma, Geneva, sans-serif;
	padding: 50px;
	text-align:center;
}
div, dd, dl, dt {
	float: left;
}
div {
	border: 1px solid #ccf;
}
dd {
	clear: left;
	font-size: 75%;
}
dl {
	padding: 7px 14px;
}
a {
	text-decoration: none;
	font-size: 110%;
	font-weight: bold;
	color: #369;
	border: none;
}
img {
	padding: 5px;
	border: 1px solid #ccf;
}

Co tu się dzieje, znającym style nie muszę wyjaśniać. Najważniejszą częścią jest ustawienia elementy <dd>, w którym znajduje się podpis pod zdjęciem, aby znajdował się poniżej elementu <dt>, który to przechowuje nam zdjęcie. Aby uzyskać poziomy kierunek obrazków użycie <dl> z deklaracją float: left załatwia sprawę.

Efekt pierwszych zabiegów CSS

rezultat pierwszych szlifów css

Następnie dodaje deklarację z wziętym wymiarem bezpośrednio z nk:

dt {
	height: 112px;
}

Ustawienie wysokości znacznika przechowującego obrazek, powoduje, że podpisy pod obrazkami znajdują w jednej linii:
wyrównanie podpisów pod zdjęciem

Ostateczny arkusz

* {
	padding: 0;
	margin: 0;
}
body {
	font-size: small;
	font-family: Tahoma, Geneva, sans-serif;
	padding: 50px;
	text-align:center;
}
div, dd, dl, dt {
	float: left;
}
div {
	border: 1px solid #ccf;
	height: 160px;
}
dl {
padding: 7px 14px;
}
dd {
	clear: left;
	font-size: 75%;
	width: 120px;
}
dt {
	width: 120px;
	height: 112px;
	display: table;
}
a {
	text-decoration: none;
	font-size: 110%;
	font-weight: bold;
	color: #369;
}
dt a {
	border: none;
	display: table-cell;
	vertical-align: middle;
}
img {
	padding: 5px;
	background: #fff;
	border: 1px solid #ccf;
	-moz-box-shadow: 1px 1px 0 #ccf;
	-webkit-box-shadow: 1px 1px 0 #ccf;
     box-shadow: 1px 1px 0 #ccf;
}

Musimy wycentrować obrazek w pionie, o tym zabiegu można przeczytać np. tutaj
Aby po tym zabiegu uzyskać wyśrodkowanie tekstu względem obrazka, trzeba dodać właściwośćwidth
dla <dt> i <dd>.

No i pozostaje kwestia cienia pod obrazkiem. Znam dwa rozwiązania:

  • Dodać <div> za obrazkiem (nadrzędny do obrazka) i ustawić obrazek relatywnie względem niego
  • Użyć dobrodziejstw CSS 3

Pierwsze rozwiązanie burzy układ obrazków, ponieważ wyśrodkowanie obrazka w poziomie wtedy idzie w łeb, a z tej racji, że nie ma określonej długości dla pojemnika otaczającego, a co za tym idzie ustawienia marginesów dla niego nic nam nie dadzą. Użycie JavaScript-u, obliczanie szerokości obrazka i dodawanie go do stylu pojemnika pomogło by rozwiązać ten problem.

Ja użyłem właściwości box-shadow efekt jest bardzo fajny, obecny wszędzie poza IE
Brak tego efektu z IE i tak pewnie nie byłby zauważony przez większość użytkowników tak prześladowanej przeze mnie strony…

Mimo sprawy cienia pod obrazkiem, uważam, że takie rozwiązanie jest warte świeczki, ale pozostanie pewnie tylko na tej stronie, a kod tamtej strony będzie dalej cuchnął i zapychał łącza…

A i zapomniałbym;), efekt końcowy:

Kategorie:web Tagi: ,
  1. lll
    Marzec 31, 2010 o 10:48 am | #1

    fajne, wiecej takich wpisow aby tych co =bawia= sie htmlem, zaczeli wkoncu w nim =pracowac=

  2. Wojtek
    Marzec 31, 2010 o 11:29 am | #2

    Wszystko fajnie i słusznie. Ale…

    1. Czasem bywa, że brak czasu i pieniędzy nakazuje zostawić status quo (przynajmniej na jakiś czas).

    2. Do budowy takich stron wykorzystuje się frameworki (duże i ciężkie fragmenty kodu). Ich modyfikacja jest ryzykowna, dlatego stosuje się zasadę: “działa! nie ruszaj!”

    Oczywiście fajnie by było, gdyby strony były super optymalne, ale wątpię aby na stronach typu N-K optymalizacja miała kluczowe znaczenie. Jeśli N-K poświęci środki i czas na poprawki kosmetyczne to nikt tego nie zauważy i nie doceni, co innego jeśli te same środki przeznaczą na nowy moduł na stronie. Co ma większe szanse na przyniesienie dochodu z reklam/opłat/etc. Przy okazji zerknij na kod Facebooka, tam też masz bardzo wiele ów.

    Reasumując, jeśli można refaktoryzujmy, ale pamiętajmy także, że nie zawsze optymalizacja ma kluczowe znaczenie. Często szybkość tworzenia (np. nowych modułów) i elastyczność rozwiązań jest ważniejsza. Wszystko zależy od przeznaczenia kodu.

    • java_adept
      Marzec 31, 2010 o 1:42 pm | #3

      Ad 1.

      Oczywiście doskonale zdaje sobie z tego sprawę, ale już dużo czasu ktoś tam miał na to żeby się tym zająć, a jednak to pozostaje nie ruszone. Nawet w przypadku prowizorki wybrano na nią rozwiązanie najgorsze z możliwych, wg mnie lepszym i łatwiejszym w utrzymaniu byłoby w sadzenie tego w tabelę, listę punktowaną, ten kod wygląda jak wytworzony przez robota.

      Ad 2. Tutaj nie mogę się zgodzić, chyba, że zastosowano jakiś bardzo nie trafiony fw. Samo narzucenie podziału przez większość dobrych szkieletów na warstwy aż prosi o porządki w widokach projektu. A co tam u nich siedzi w kwestii backend-u to już mogę tylko przepuszczać, podejrzewam, że jakiegoś pozytywnego szału z tym też nie mają.

      Poza tym na dłuższą metą taki bałagan utrudnia wprowadzanie jakikolwiek zmian, nawet jeśli siedzi za tym wszystkim świetny silnik, to ogromnie dużo traci produkując tak żałosny kod. Eh, pokarało mnie, że się tego czepiłem i się strona rozlazła, będę musiał znaleźć czas to poukładać, bo jak tu krytykować kogoś jak moje wieże się posypały:D

      Podrawiam

  3. jacek
    Kwiecień 22, 2010 o 9:32 am | #4

    hej,
    mam podobny sentyment do tabelek :-)
    jednak jeśli serwer obsługuje content-encoding gzip, to nawet duża ilość śmieci nie ma większego znaczenia, bo się świetnie kompresują. Specjaliści znający standardy WAI pewnie są drożsi od takich zwykłych projektantów, więc po co przepłacać. Poza tym, na blogu można pisać “to co że XYZ nie ma w IE”, ale dział QA czy specyfikacja wymagań na ogół nie traktuje tego tematu tak lekko :-)

    btw. trafiłem tu z polish podcastu :-)
    http://podcast.java.pl/index.php/2010/04/22/java-pl-podcast-2-newscast/

  1. No trackbacks yet.

Dodaj komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Zmień )

Twitter picture

You are commenting using your Twitter account. Log Out / Zmień )

Facebook photo

You are commenting using your Facebook account. Log Out / Zmień )

Connecting to %s

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.