CSS ile Menü Yapmak III – Dikey Açılır Menüler

Bu tip menüleri javascript ile yapabiliriz. HTML ve CSS ile de daha esnek, kolay düzenlenebilir ve bir çok web tarayıcısı tarafında desteklenen(IE6 ve öncesi dahil) açılır menü yapılabilir. Aslında javascript’e ihtiyaç olmamasına karşın IE7′den önceki sürümler için javascript kodu gerekmektedir.

Açılır menü yapmak için daha önceki menü örneklerinde olduğu gibi sıralanmamış listeleri(<ul>) kullanacağız. Buradaki fark alt kategorilerin yani üzerine gelince açılacak menünün bir alt sırlanmış liste olarak eklenmesidir.

<ul id="menu" >
    <li><a href="#">Anasayfa</a></li>
    <li><a href="#">Haberler</a>
    <ul>
        <li><a href="#">şžirket Haberleri </a></li>
        <li><a href="#">Yurt içi Haberleri </a></li>
        <li><a href="#">Yurt dışı Haberleri</a></li>
    </ul>
    </li>
    <li><a href="#">Ürünler</a>
    <ul>
        <li><a href="#">Tencere</a></li>
        <li><a href="#">Tava</a></li>
        <li><a href="#">Ütü</a></li>
        <li><a href="#">Tost Makinesi </a></li>
        <li><a href="#">El Süpürgesi </a></li>
    </ul>
    </li>
</ul>

İlk olarak satır başı boşluklarını ve imgeleri kaldıralım.

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    width: 150px;
}

Sonra ilk linkleri göreceli olarak konumlandırmalıyız. Bu konumlandırma aslında ikinci kademe açılacak menüye mutlak konumlandırma yapılması için kullanılır.

ul li {
	position: relative;
}

Bir sonraki adımda da ikincil açılan menüleri konumlandırmak olacaktır. Her birinci linke karşılık gelen ikincil açılır menüler ilkinin sağına konumlandırılmalıdır. Bunun için soldan 149px değeri verilir. 1 piksel sola kaydırılır ki fare ilk linki üzerinde ikinci linkin üzerine glemeden kaybolmasın. Ayrıca ikincil linklerin ilk sayfa açıldığında görünmemesi için display:none özelliği atanır.

li ul {
    position: absolute;
    left: 149px;
    top: 0;
    display: none;
}

Açılır menü yapısını oluşturmuş olduk şimdi linkleri güzelleştirip menü haline getirmek için önceki menüleri yaparken uyguladığımız kodları uygulayalım. Linklerin kendine has alanlarını tanımlamak için display:block özeliğini kullanalım. Linklerin altındaki çizgiyi kaldırmak için text-decoration:none özelliğini kullanalım. Linkler arasına mesafe vermek için padding verelim. Birde bir zemin rengi tanımı ver kenarlık tanımı yapalım. Üstteki linkin alt kenarlığı ile alttaki linkin üst kenarlığı üst üste bineceğinde alt kenarlık değerini sıfırlayalım.

ul li a {
    display: block;
    text-decoration: none;
    background-color: #E2E2E2;
    padding: 5px;
    border:1px solid #000;
    border-bottom:0;
}

Bu kodu yazdığımızda IE linkler arasına boşluk koyacaktır(IE7 de hala bu sorun devam ediyor) bu durumu düzeltmek için:

/* IE. gizle \*/
* html ul li { float: left; height: 1%; }
* html ul li a { height: 1%; }
/* IE den gizleme sonu */

En alttaki çizgimiz eksik kalmaması için ilk link ul’sinin alt kenarlık tanım yaparız.

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    width: 150px;
    border-bottom: 1px solid #00;
}

Birincil menü görünümü tamamlandı ancak ikincil menüler görünmüyor. İkincil menüleri göstermek için:

li:hover ul {
	display: block;
}

Bu kadar basit bir kod menümüzü tamamlar. Ancak bir sorun var ki o da IE7′den öncesi bu kodu desteklemez.

Internet Explorer 7. versiyonuna kadar :hover pseudo sınıfını sadece linklerde (<a>) uygulanmasını destekler diğer elementlerde bu özelliğin kullanımını desteklemez.

Peki menümüz böyle mi kalacak hayır. IE6 ve altı için bir javascript kodu yazacağız.

startList = function() {
if (document.all&&document.getElementById) {
navRoot = document.getElementById("menu");
for (i=0; i<navRoot.childNodes.length; i++) {
node = navRoot.childNodes[i];
if (node.nodeName=="LI") {
node.onmouseover=function() {
this.className+=" over";
}
node.onmouseout=function() {
this.className=this.className.replace(" over", "");
}
}
}
}
}
window.onload=startList;

Bu çözümü bize kazandıran arkadaşlara teşekkürü bir borç biliriz ve linkini de yazarız.

Ayrıca aşağıdaki kodu da eklemeliyiz.

li:hover ul, li.over ul{ display: block; }

Ayrıca kod daki<ul id="menu" > ve javascriptteki navRoot = document.getElementById("menu"); aynı olmasına dikkat edelim.

Örnek kodları indir

Bazı arkadaşlardan bu menünün sağda olması halin nasıl yaparız diye bir istek geldi bende bunun için bir kod eklemek istiyorum. Bu ekleme 28 Mayıs 2009 da yapılmıştır.

Soldaki örneğe göre iki değişikliğimiz oldu. Birincisi menüyü sağa almak için ul ye float:right ataması yaptık. İkincisi, ikinici açılan menüyü soldan 149 px yerine eksi 149px ile sola almak oldu

Kaynaklar

140 Yorum (Yorum Ekle)

  • efedrin diyor ki:

    sayın kenan temiz
    öncelikle şu adresteki dersleri sırayla çalışmanızı öneririm;
    http://www.fatihhayrioglu.com/?page_id=119

    sorduğunuz soru ise şu adresteki ders ile ilgili;
    http://www.fatihhayrioglu.com/?p=91

    fatih hocam
    12 kasımdaki yorumunuzdaki gibi farklı isimler verdim ama çalıştıramadım malesef

  • kenan temiz diyor ki:

    bilgiler cok güzel sağolun.ama ben menü hazırlamak istiyorum ve buradaki bilgilerden pek bi şey anlamadım. baya acemiyim anlayacağınız. bu css kodları ile menü yaparken kodları nereye yazıyoruz bunun bir programı falan varmı. teşekkürler.

  • fatih.hayrioglu diyor ki:

    sorun ilk katmana

    ismini ver

    tanımlamasını yaparsan sorun çözlüyor. Sorun javascript te ki

    navRoot = document.getElementById("menu");

    menu değerini karşılaşmaması ve onagörei şlem yapmaması

  • fatih.hayrioglu diyor ki:

    Eğer kodları yazarken blokları arasına yazmak gerekiyor.

    Ama yine de bunu düzeltmeye çalışacağım.

  • efedrin diyor ki:

    sayfa kodlarını buraya yazınca bozuluyor :(

  • efedrin diyor ki:

    tabi hocam, şu an sadece boş bir html de deniyorum

    Untitled Document

    startList = function() {
    if (document.all&&document.getElementById) {
    navRoot = document.getElementById("menu");
    for (i=0; i

    #menu {
    position: absolute;
    top: 150px;
    }

    #menu ul {
    margin: 0;
    padding: 0;
    list-style: none;
    width: 150px; border-bottom: 1px solid #000;
    }
    #menu ul li {
    position: relative;
    }
    #menu ul li ul {
    position: absolute;
    left: 149px;
    top: 0;
    display: none;
    }
    #menu ul li a {
    display: block;
    text-decoration: none;
    background-color: #E2E2E2;
    padding: 5px;
    border:1px solid #000;
    border-bottom:0;
    }
    /* IE. gizle \*/
    * html #menu ul li { float: left; height: 1%; }
    * html #menu ul li a { height: 1%; }
    /* IE den gizleme sonu */
    #menu li:hover ul { display: block; }

    Anasayfa
    Haberler
    Sirket Haberleri
    Yurt içi Haberleri
    Yurt disi Haberleri
    Ürünler
    TencereTavaÜtüTost Makinesi El Süpürgesi

  • fatih.hayrioglu diyor ki:

    dışına bir katman ekleyip sonra bunu kod da belirtince sorun çıkmaması lazım. IE çalışmamaısının nedeni javascript eklememek yada yanlış eklemek olabilir.

    Menünün kaybolması fare imlecinin :hover uygulanan elementin üzerinde çıkması olabilir.

    kodları yazarsan daha çok yardım olabilriz.

  • efedrin diyor ki:

    hocam verdiğiniz kodların başına #menu ekledim(sizin verdiğiniz haliyle kullanınca sitedemdeki daha önce tanımlanmış diğer ul özelliklerine göre davranıyordu), daha sonra tüm listeyi div içine aldım;

    Anasayfa

    bu kodlar firefox ve operada sorunsuz çalıştı,
    ancak;
    -ie7 de dikey olan menüde açılır pencerelere tıklamayamadan pencereler kayboluyor (bir sonraki derste verdiğiniz yatay örnekte bu sorun yok_
    -ie6 ve altı sürümlerde ise hiç çalışmadı,
    ben şu şekilde uyarlamıştım, detayları aynen sizin örnekteki gibidir.

    #menua {burda menünün sayfadaki pozisyonunu yazacağım}
    #menua ul
    #menua ul li
    #menua ul li ul
    #menua li > #menua ul
    #menua ul li a
    #menua a:hover
    #menua li:hover ul

    sizce nerde hata yapıyorum
    teşekkürler

  • efedrin diyor ki:

    yabancı sitelerde gördüğümüz örneklerin benzerlerini anlaşılır bir dille sizin sitenizde görmek memnuniyet verici,
    ellerinize sağlık,

  • koblay diyor ki:

    Böyle faydalı bilgiler icin cok cok tesekkür ederim…

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>

?