CSS ile Kutu modeli, sorunları ve çözümleri

CSS’e geçişte en çok düşündüren konu niye CSS geçelim ve CSS’in avantajları nelerdir? CSS’in avantajı bize web sayfasındaki elemanlara daha fazla müdahele etme imkanı vermesidir. Burada bunun en güzel örneklerinden birini göreceğiz.

CSS tüm HTML elementlerini bir dikdörtgen kutu içine konmuş varsayarak ona göre pozisyonları ve boyutlarını konrol eder. Bu elementler her zaman bir padding, margin, border ve içerik alanını içerir. Aşağıdaki şekle bir bakınız:

Margin’ler her zaman transparandır. Border’lar üç şekilde( solid, dashed ve dotted) olabilir. Background sadece border içerisine uygulanabilir, yani padding ve içerik alanı kısmını içerir.

Bir elementin toplam genişliği; sol+sağ marginleri, sol+sağ padding’leri, sol+sağ border’ları ve elementin içeriğini kapsar. Margin’ler, padding’ler ve border’lar opsiyonel elementlerdir fakat başlangıçta bunların değerleri ‘0′ olarak belirlenmiştir. Yükseklik içinde durum aynıdır. üst-alt margin değerleri, üst-alt padding değerleri, üst-alt border değerleri ve içerik alanı yükseliği toplamı yükseklik değerini oluşturur.

Box modeli iki elementi bulunur. Blok-level elementler ve inline-level elementler.

Blok-level elementler : Blok-level elementin görünüş formatı bir kutu gibidir. Blok-level elementler inline elementleri ve diğer blok-level elementleri içerebilir. Tipik özellikleri yeni bir satır başlangıcı yapmalarıdır. Örnek: h6, p, li vd.

Inline-level Elementler : Inline elementler bir içerik gibi görünür, diğer bir inline elelementi veye bir metni içere bilir. Genelde yeni satır veya boşluk oluşturmazlar. Örnek: a, strong, span vd.

Tüm kutu modelleri aşağıdaki bölümleri içerir:

İçerik Alanı: Elementin asıl içeriğini oluşturan kısmıdır. Metin ve nesneler içerir.

Padding : Elementin kenarındaki dolgu alanıdır.

Border : Elementin kenarlıklarıdır.

Margin: Elementin kenar boşluklarıdır.

Box Model Sorunu ve Çözümü

W3C’ye göre genişlik(ve yükseklik) değeri içerik alanı değeridir. padding ve border değerleri buna ek olarak toplam kutu genişliğine eklenir. Eğer toplam kutu değeri eklenecekse içerik alanı ve etrafındaki padding ve border değerleri toplamıdır.

Buraya kadar çok güzel ancak tüm web tarayıcıları bu durumu aynı şekilde yorumlamaz. IE’un IE6/strict’den önceki versiyonları yukarıda anlattığımız standart yorumun dışına çıkar, genişlik veya yükseklik değeri tüm kutu model element değerini ifade eder. Yani tüm padding ve border değerlerini içerir kalan kısmıda içerik alanı değeri olarak belirlenir.

#icerik{
    width:200px;
    padding:10px;
    border:5px solid #000;
}

Standart web tarayıcıları bu durumu şöyle yorumlayacaklardır.

200px + 10px sol kenar iç boşluğu + 5px sol kenar çizgisi + 10px sağ kenar iç boşluğu + 5px sağ kenar çizgisi = 230px toplam genişlik

kutu elemetinin genişliği 230px olacaktır.

Ancak IE‘un IE6/strict’den önceki versiyonlar için kutu elementinin genişlik değeri 200px’dir.

Margin(Kenar dış boşluğu) değeri width değerini direk etkilemese de dolaylı olarak etkiler. Kutular arasındaki genişliği hesaplarken margin değerlerinide dikkate almalıyız. CSS ile sayfa yapıların oluştururken kenar dış boğluklarını(margin) da dikkate elmalıyız.

Bu sorunun çözümü için üretilmiş bir çok yöntem vardır. Ancak bence en sağlamı tantek‘in ürettiği koddur ve burada bundan bahsedeceğim.

#icerik{
    width:230px;
    padding:10px;
    border:5px solid #000; /* Bundan sonraki kısmı ie5win sakla */
    voice-family: "\"}\"";
    voice-family:inherit;
    width:200px;
}

Burdaki ilk genişilk değeri(2. satırdaki) IE’un IE6/strict’den önceki versiyonların yorumlayacağı genişlik değeri, ikinci genişlik değeri(7. satırdaki) ise standart yorumu destekleyen web tarayıcılarının kullanacağı değerdir.

Bu kodlamada son olarak Opera 5 için bir kod ekleyeceğiz.

#icerik{
    width:230px;
    padding:10px;
    border:5px solid #000; /* Bundan sonraki kısmı ie5win sakla */
    voice-family: "\"}\"";
    voice-family:inherit;
    width:200px;
}
html>body #icerik {
	width:200px;
}

Not: Aynı şeyler yükseklik(height) içinde geçerlidir.

Kaynaklar

İlgili Yazılar:

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

50 Yorum (Yorum Ekle)

  • cemil diyor ki:

    tekrar tekrar ayni konu uzerine soru soruyorum kusura bakmayin. okusuklarimdan anladigim kadariyla en saglikli cozum burada anlattiginiz iki sunucu icin ayni class tanimina kod eklemek. yalniz sayfada kullanilan sabit genislikli tum blok elementlerinin class taniminda bu kodu eklememiz gerekiyor sanirim. bu css dosyasinin sismesine sebep olacaktir. buna ragmen pratikte kullanilan yontem bu mudur? her blok elementi icin bu kodlar eklenmeli midir? tesekkur ederim simdiden. saygilarimla…

  • fatih.hayrioglu diyor ki:

    ilk width değeri ie5 içindir.

    ie genişliği = #icerikAlani genişliği + padding + margin + border

    ikinci width değeri yeni esli tarayıcılar dediğimiz ie 6 ve ff içindir

    genişlik = #icerikAlani genişliği

    şeklindedir.

    sondaki genişlikte opera içindir.

    ie 6 daik sorun bir ihtimal DOCTYPE kullanılmadığında çıkar eğer kodun başında bir DOCTYPE tanımyaparsanız düzlir.

  • Yunus diyor ki:

    Bu kodu kullandım ama her iki tarayıcımda 2. girdiğim genişlik değerini baz alıyor.

    Tarayıcılarımdan biri ie 6 diğer firefox. Firefoxda sorun yok ama ie6 da hatalı görüyorum

  • fatih.hayrioglu diyor ki:

    Her web tarayıcısı için farklı css dosyası kullanmak pek önerilen bir şey değil, yaptığınız işi her iki dosyada da yapmak gibi eziyet verici bir yönü var. Tek dosyadan yönetim daha kullanışlı ve avantajlı bence.

    Ayrıca bu konu ile alakalı CSS’i Web Sayfalarına Eklemek ve CSS Kodlama Teknikleri ve CSS Kodlarını Azaltma Yöntemlerimakalelerini okumanızı tavsiye ederim.

  • cemil diyor ki:

    tesekkurler bir sey daha sormak istiyorum. bu gibi sorunlara yukaridaki gibi bir cozum mu getirelim(ayni cssyi butun browserlara uyarlamak gibi) yoksa er browser icin farkli bir css dosyasi mi tasarlayalim. hangisi daha sagliklidir, hangisini onerirsiniz?

  • fatih.hayrioglu diyor ki:

    Web stadartlarına uygun kodlama yaptığınızda şişme olmayacaktır. Aksine kod dahada azalır.

    Web tarayıcılarından kaynaklana sorunlar nedeni ile yapılan fazladan kodlama CSS’inde değil web tarayıcılarının sorunlarından kaynaklanır.

  • cemil diyor ki:

    oncelikle tesekkurler, bulabildigim en guzel turkce css anlatimini hazirladiginiz icin. bu sorunda anlamadigim sey her div tanimi icin bu kodlari ilgili classa yada id ye eklemeli miyiz? bu kodu sisirmiyor mu? saygilarimla…

  • fatih.hayrioglu diyor ki:

    ie 6.0′da DOCTYPE değerleri Transitional veya Strict dışında dediğiniz doğru ancak diğer web tarayıcılarında durum farklıdır. Burdaki amaçta bu dur farklı web tarayıcıları ve yorumlayıcılarda aynı sonucu elde etmek.

  • stormist diyor ki:

    Gerçekten Güzel Bir Anlatim ellerine sağlik ama söylemeden geçemiyecem doctype iedeki doctype larda düzenleme yaparak dabu kutu modelinin her browserda ayni göstermek mumkun diye bir makale okumuştum yanlişsam düzeltin

  • Halil diyor ki:

    Bugün itibari ile table lardan kurtulmak için ne kadar css ila alakalı makale varsa okuyorum:P Bu makalen yeni başlayanlar için kesinlikle okunmalı! Emeğin için teşekkürler

Yorum yaz

Format: Yorum içinde kullanılabilecek HTML kodları: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

?