Dinamik HTML
26 Kasım 2007
CSS Stil KullanımıAşağıdaki örnek programın nasıl çalıştığını görmek için Örnek-2 programını tıklayın. Burada yapılan, iki tane soysal işlev yaratılmış olmasıdır. Birincisinde sağa ve sola istenilen kadar gidilmesi, diğerinde ise yukarı ve aşağıya aynı biçimde hareket edilmesi öngörülmüştür. Kısacası bu işlevleri çalıştırmak istediğinizde hareket edecek katmanın kimliğini (ID) vermek yeterli olacaktır. Bu HTML içinde işlevler çağrılırken yapılır. Kod o kadar karmaşık değildir. Daha kullanışlı kodlarla kısaltmak olanağı vardır.
Yukarıdaki soysal işlevlerden daha kısası, değişik tarayıcılarla CSS özelliklerine erişim, aşağıdaki işlevde gerçekleştirilebilir.
Bir katmanın CSS özelliklerine erişmek için:
accessCSS("myLayer1")
yazılır. Örneğin:
accessCSS("myLayer1").top ve
accessCSS("myLayer1").zIndex
Kısaltılmış Kodlama
Kısaltılmış işlev daha önceki örneğe uygulanınca:
else edilir. Buradaki kodlama hem daha kısa hem daha anlaşılır biçimdedir. Aslında her ikisinin de çalışma biçimi aynıdır. Görünülüğü (Visibility) Değiştirme
Görünürlük özelliği bir katmanı göstermenizi ya da saklamanızı sağlar. Burada bir katmanın görünürlüğünü değiştiren işlev yazılmıştır.
<div id="myLayer1" style="position:absolute;
left:100;top:100;
visibility:visible">
This is our Layer
</div>
Görünülürlük konusuna başlamadan öce bu işin tarayıcılar arasında oldukça farklı yorumlandığını söylemekte yarar vardır. NN 4'de niteliklerde "show" ve "hide" sözcüklerini kullanmak gerekir. Diğer tarayıcılar, W3C'nin önerdiği gibi "visible" ve "hidden" sözcüklerini kullanırlar. Eğer:
style="visibility:hidden"
tanımlıysa NN 4 katmanı doğru biçimde saklar ama bu değer "hide" olarak yorumlanır. Bu nedenle sorulduğunda değişkendeki değer "hidden" değil "hide" biçiminde ele alınmalıdır. Burada ilk belirlenen görünürlüğün "hidden" ya da "hide" olduğudur. Eğer görünürlük "show" ya da "visible" ise onu saklanacak duruma çevirmek gerekir.
<script>
function toggleVis(layerID){
if(accessCSS(layerID).visibility=="hidden" ||
accessCSS(layerID).visibility=="hide"){
accessCSS(layerID).visibility= "visible";
}else{
accessCSS(layerID).visibility= "hidden";
}
}
</script>
Bilinmesi gereken önemli bir konu daha var. Katmanın görünürlüğüne değer girilmezse onun değeri her zaman "görünür" varsayılmaktadır. Bir başka Tarayıcı Uyumsuzluğu
Bir pencerenin içten içe eni (innerWidth) tarayıcıya bağımlıdır (bu alanda html gövdesi görüntülenir). Zaten DHTML konusundaki pekçok şey de taracıyı bağımlıdır.
NN 4 ve NS 6'da :
window.innerWidth ve window.innerHeightkullanılır. Ama IE'de: document.body.clientWidth ve document.body.clientHeightkullanılır. Bu değerleri IW adlı değişkene aşağıdaki gibi taşırız: "document.body" kullanırken <body> en azından yarım da olsa yüklenmiş olmalıdır. Bu nedenle koda erişim ya "body" etiketi içinden olmalı ya da gövde yüklendikten sonra, onLoad ya da setTimeout() işlevleriyle kullanılmalıdır. Evet, IW değişkenine "innerWidth" değeri atanmış oldu ama bu çok uzun süren bir kodlamadır. Daha kısa yolu koşul?doğru_komut:yalnış_komut biçiminde yazılan kodlamadır:
var IW=window.innerWidth ? window.innerWidth :
document.body.clientWidth;
Bu işlem basit if-else komutlarını kısaltmak için çok kullanışlıdır.
Kaydırma koduna dönüldüğünde kodlamadaki interV evrensel bir değişken olarak IW değişkeniyle birlikte kullanıldığı anlaşılır (setTimeout() değerini saklar).
Yukarıdaki kodlama, katmanın CSS özelliklerine erişmek için kullanılır.
Bu işlev katmanın o anki (x-koordinatı) yerini gösterir. Daha sonra sağdan taşmıyorsa (yani innerWidth değerini geçmezse) o değere üç ekler. Bu işlev kendisini 10 saniye sonra yeniden çalıştırarak döngü kurar.
Fare hareketini fark edebilmek ekranda bir şeylerin hareket etmesinden çok önemlidir. Bu özellik tarayıcı bağımlıdır...
Netscape için e.pageX ya da e.pageY kullanılır. Burada "e" olay değişkenidir.
IE için window.event.x ve window.event.y kullanılır. Aşağıdaki işlev bu değerleri tanımlar:
Katman KoordinatlarıBir katmanın köşesinin yerini saptamak kullanışlı olabilir:
parseInt(accessCSS(layerID).top) ve
parseInt(accessCSS(layerID).left)
Bu değerler bir katmanın üst ve sol kenarının değerini belirtir. Buraya kadar kolaydır. Asıl sorun sağ ve alt kenarın nasıl belirleneceğidir. CSS özellikleri arasında alt ve sağ kenarla ilgili bir tanımlama yoktur. Ama bir katmanın yüksekliğini ve enini alabiliriz. Bunları kullanarak sağ ve alt kenarı hesaplama olanağı doğar.![]() Sol kenarla katmanın enini toplayıp sağ kenarı, aynı biçimde üst kenarla yüksekliği toplayıp alt kenarı bulunabilir. Ama hemen sevinilmemelidir. parseInt(accessCSS(layerID).width)ancak CSS içinde katman için açıkça en tanımı varsa, değerini verir. Tanım yapılmamışsa değer elde edemeyiz. Burada tarayıcıya bağlı kalmadan ve CSS ile en tanımı yapmadan değer nasıl bulunur incelenmiştir. NN 4'de tarayıcının enini bulmak için: document.layers[layerID].clip.width ve document.layers[layerID].clip.heightkullanılır. IE 4'de tarayıcının eni:
document.all[layerID].offsetWidth ve
document.all[layerID].offsetHeight
kullanılılarak bulunur.
Burada "style" sözcüğünün olmamasına dikkat edin. Çünkü offsetWidth ve offsetHeight CSS stilleri değildir.
IE 4'deki gibi IE 5 ve NS 6 de offsetWidth ve offsetHeight kullanır (burada katmanlara daha değişik yaklaşılır). IE 5 ve NS 6'da document.getElementById(layerID).offsetWidth ve document.getElementById(layerID).offsetHeight.tanımları kullanılır. Tarayıcı uyumsuzluklarından soysal bir işlev tanımlamak ilerideki kullanımlar için daha yararlı olabilir: Burada bilinmesi gereken diğer bir konu da farenin o anda hangi katmanın üzerinde olduğunun anlaşılmasıdır. IE 4 ve IE 5'de bu oldukça kolaydır: "event.srcElement" kullanmak yeterlidir. NS 6'da (W3C önerilerindeki gibi) "event.target" kullanılır. NN 4 böyle bir özellik desteklemez. Bu nedenle dolaylı bir yol izlememiz gerekir. Eğer farenin koordinatları bilinirse, katmanların sol ve üst kenarlarından arama yaparak hangi katmanda farenin olduğunu bulunabilir. NS 6 kodu W3C DOM belgelerinde anlatıldığı için burada ayrıntılara girilmemiştir. NN 4 kodunda yapılanlar şöyle özetlenebilir: Önce farenin yeri belirlenir. Tüm katmanalar aranarak farenin, bulunan katmanın tam ortasında olup olmadığına bakılır (daha önceki işlevleri kullanmadan katmanın eni ve boyunu kullanmış olmamız bu değerlerin doğrudan girilmiş olduğunu gösterir). Aslında tarayıcı NN 4 olduğuna göre yukarıdaki işlevler de kullanılabilirdi. Şimdi örneğimize gelebiliriz. Kodun uzun olması ve hemen anlaşılması sorun olur diye önce örneğe bakmakta yarar vardır: Örnek 5 Açılma/Koyulaşma (Fade out/Fade in)Şimdi bir resmi ele alalım, bu resim yavaş yavaş kaybolurken bir başka resimle değişir ve yeni resim de yavaş yavaş koyulaşır. Burada IE özelliklerini kullandığımızdan Netscape kullanıcılarını kodun içinde dolanmalarını kaldırmak gerek. Bunu doğal olarak "document.all" ile yaparız. Hem IE 4 hem de IE 5 bu kodu kullanabilmektedir. Geçirgenliğe ErişimCSS filitre (filter) niteliğine erişmek için IE 4'de:document.all[layerID].style.filterIE 5'de: document.getElementById(layerID).style.filterBurada iki değişik kod kullanmak yerine document.allCSS'nin "alpha" özelliğine erişmek için: document.all[layerID].style.filter.alphakullanılır. 'alpha'nın "opacity" geçirgenlik özelliğine erişmek için: document.all[layerID].style.filter.alpha.opacitykullanılır. Bir resmi açıp, koyulaştırmak için kullanılacak kod şöyle olabilir: Netscape 6 aynısını yapabilirNetscape, IE ile uyumlu olabilmek için kendi geçirgenlik özelliğini (opacity) yarattı. Değer "-moz-opacity" biçiminde tanımlanır ve 0-1 arasında değer alabilir. Aynı IE 4+ geçirgenliği gibi çalışır. <IMG src="img1.gif" id="img1" style="-moz-opacity:0.5"> Sayı kullanmanın yanında yüzde oranı da kullanılabilir. Çünkü 0.3 zaten 30% anlamına gelmektedir.
<IMG src="img1.gif" id="img1" style="-moz-opacity:50%">
Bir Katmanı ortalamak
Bir katmanı ortalamak için ekranın boyunu (innerWidth) ve katmanın enini bilmeliyiz.
Daha sonra toplam sayfa eninden katmanın enini çıkarıp kalanı ikiye bölünce sol
kenarın yerini buluruz. Bu değer de zaten sağ kenar kadardır.
Bu işlemin koduBurada herşey çok açık olduğundan ayrıntılı bir açıklama yoktur. Önemli olan bir katmanı ortalarken onun eninin tanımlanması gerektiğidir. ![]() |
|