Javascript için arşiv
jquery ipuçları – 4
Ekim 26th, 2010 • 7 yorum Javascript, jquery
Etiketler: closest(), console.log, delay(), has(), next(), parent(), parents(), prev()
Jquery ipuçları – 1
Jquery ipuçları – 2
Jquery ipuçları – 3
1 – Mümkünse Class yerine Id kullanmayı tercih edin
jQuery ile kod yazarken bize çok büyük kolaylıklar kazandırır. Bunlardan bir tanesi elemana atanmış sınıfı yardımı ile kolayca seçebilme özelliğidir, ancak burada şöyle bir durum söz konusudur; jquery id ile atanmış elemanları normal javascriptteki gibi getElementById ile yakaladığı için daha hızlı çalışırken normal olarak sınıf ile yakalamalarda daha yavaş çalışacaktır.
Bu nedenle mümkün olduğunca seçicilerde id kullanmaya dikkat edilmelidir. Tabi bazı durumlarda sınıf kullanmak zorunda kalabiliriz o başka.
kaynak: net.tutsplus.com
2 – next() ve prev() kullanımı
Bu özelliklerin kullanımı bazen can kurtarıyor ancak kullanırken dikkat etmek lazım, bazende sorunlara yol açabiliyor. Sonradan eklediğiniz bir eleman sizin next ve prev kabullerinizi mahvedebiliyor
next() : next fonksiyonu bir sonraki elemanı yakalar. Sadece sonraki elemanı yakalar alt elemanlarını yakalamaz.
next fonksiyonu filtreleme özelliği vardır, yani next(‘li.secili’) tanımı ile en yakın bir sonraki secili sınıfı tanımlı li elemanını yakalayabiliriz.
Bir örnek verelim.
<ul>
<li>Adana</li>
<li>Ankara</li>
<li class="secili">İstanbul</li>
<li>İzmir</li>
<li>Trabzon</li>
</ul>
Şeklindeki bir html kodundan
$('li.secili').next().css('border-bottom', '1px solid #999');
next() fonksiyonu yardımı ile bir sonraki elemanı yakalayabiliriz.
prev() : prev fonksiyonu bir önceki elemanı yakalar. Sadece önceki elemanı yakalar alt elemanlarını yakalamaz.
prev fonksiyonu filtreleme özelliği vardır, yani prev(‘li.secili’) tanımı ile en yakın bir onceki secili sınıfı tanımlı li elemanını yakalayabiliriz.
Bir örnek verelim.
<ul>
<li>Adana</li>
<li>Ankara</li>
<li class="secili">İstanbul</li>
<li>İzmir</li>
<li>Trabzon</li>
</ul>
Şeklindeki bir html kodundan
$('li.secili').prev().css('border-bottom', '1px solid #999');
prev() fonksiyonu yardımı ile bir önceki elemanı yakalayabiliriz.
3 – Üst Eleman Bulma – parent(), parents() ve closest()
parent()
Bir üst elemanı bulma. Geriye bir adet üst eleman döndürür.
$('td.secili').parent().css('border-bottom', '#999');
$('div').parent('.large').css('font-size', '14px');
İlk kod üst elemanı yakalarken, ikinci satırda ise seçme işlemini biraz daha daraltarak .large sınıfı tanımlı olan üst elmanı yakala diyoruz.
parents()
Belirlenen elemanın tüm üst elemanlarını bulmaya yarar.
$('li').parents().css('background-color', 'red');
$('li').parents("ul").css('background-color', 'red');
İlk satır li’nin tüm üst elemanlarını yakalarken, ikinci satır li’nin tüm ul etiketli üst elemanlarını yakalar.
closest()
En yakın üst elemanı bulmak içindir.
$(document).ready(function()
{
$('li.urunler').closest('ul').css('background-color', 'red');
});
HTML
<ul>
<li>Üst Menü
<ul>
<li class="urunler">Ürün 1</li>
<li class="urunler">Ürün 2</li>
</ul>
</li>
</ul>
İçiçe girmiş birçok listede yukarıdaki tanım ‘urunler’ sınıfı tanımlanmış öğenin ilk üst ul elemanını yakalamamıza yardım eder.
4 – Firebug ve console.log ile kodumuzu izlemek
Firebug’ın çalışma hayatımızdaki yerini biliyoruz. jquery ile hata yakalama amacı ile console.log kullanıyoruz. Daha önceleri javascript ile kod yazarken alert fonksiyonun çok kullanırdım. Şimdi aynı işi console.log yapıyor ancak popup çıkarıp bizi rahatsız etmiyor.
var count = 0;
while(count < 1000) {
count++;
console.log(count);
setTimeout("takistHesapla";, 1000);
}
yazın ve Firebug’ın console sekmesine bakın. Bu kod Chrome’da da çalışıyor.
Örneği görmek için tıklayınız. Tabi takistHesapla diye bieşy bulamadım diye size bin tane hata verecek oda gayet normal.
Bir uyarı işinizi yayına atarken bu satırı silin yoksa ie’de hata verir.
5 – Animasyon ve Efektleri Geciktirme (delay)
jQuery 1.4 ile birlikte gelen yeni bir özellik olan delay() animasyonlarımıza belli bir süre ara vermemizi sağlat, daha önceleri bu işi yapmak için setTimeout metodunu kullanıyorduk.
$("div").fadeIn().delay(4000).fadeOut();
Örneği görmek için tıklayınız.
seçtiğimiz katmana fadeIn efekti ver ve sonra 4000 milisaniye bekle ve sonra fadeOut efekti ver diyoruz.
6 – has() Metodu
jQuery 1.4 ile birlikte gelen bir başka yeni özellik has() metodudur. Daha önceki sürümlerde :has seçicisi vardı, şimdi has() metodu ile daha kolay yakalama işi yapabileceğiz.
<ul>
<li>list item 1</li>
<li>list item 2
<ul>
<li>list item 2-a</li>
<li>list item 2-b</li>
</ul>
</li>
<li>list item 3</li>
<li>list item 4</li>
</ul>
Yukarıdaki kodda alt menüsü olan li elemanını yakalamak için bu metodu kullanabiliriz.
$('li').has('ul').css('background-color', 'red');
Örneği görmek için tıklayınız.
Şeklinde altında ul etiketi olan li’leri ki burada bir tane var oda list item 2 içeriğine sahip olandır.
Kaynaklar
- http://www.tripwiremagazine.com/2009/10/jquery-and-general-javascript-tips-to-improve-your-code.html
- http://www.tvidesign.co.uk/blog/improve-your-jquery-25-excellent-tips.aspx
- http://webdevmania.com/archive/top_10_jquery_snippets_including_jquery_1.4/
- http://addyosmani.com/blog/31-jquery-snippets/
- http://www.smashingmagazine.com/2010/08/04/commonly-confused-bits-of-jquery/
Önden Resimleri(Preloading images) Yükleme Yöntemleri
Ağustos 27th, 2010 • 10 yorum CSS, Javascript, XHTML
Etiketler: önyükleme, performans, resim, web site hızlandırma
Web sitelerimizi hızlandırmak için çeşitli yöntemler ve metotlar deneriz. Amacımız kullanıcıya daha hızlı cevap vermektir. Bunlardan bir tanesi önden resimleri kullanıcı bilgisayarına yükletip sonra açılacak sayfaların hızlı açılmasını sağlamak gibi bir amacımız olduğu durumlardır. Rollover resimleri, araç ipucu(tooltip), background resimleri vb. resimleri önceden yükletmek bize hem sayfa ilk açıldığında kötü görüntüyü engellememizi sağlar hemde kullanıcıya daha sonraki tercihlerinde daha hızlı cevap vermemizi sağlar.
Ben genelde daha önce kullanmadığım metotları kullanmadan önce bir araştırma yaparım ve sonuçta bana göre iyi olan yöntemi uygularım. Web ajanslarında çalışırken bu araştırmayı kısa tutmam gerekirken tek bir proje geliştirirken bu iş için daha uzun zamanımız oluyor.
Bu işi çin CSS, javascript ve ajax ile çözümler mevcut.
Ben bu yöntemlerden javascript yöntemi ile yapmayı tercih ettim. Diğer yöntemler hakkında genel bir bilgi verip geçeceğim.
CSS Yöntemleri
CSS Sprite yöntemide bu kategoriye girer.
CSS yöntemleri genelde sayfa içine konulan resimlerin tarayıcı görüntüsünden kaçırılması ile yapılan yöntemlerdir ki işin bu kısmı benim hoşuma gitmiyor.
CSS ile bu işi yapan bir örnek verelim.
div#preloaded-images {
position: absolute;
overflow: hidden;
left: -9999px;
top: -9999px;
height: 1px;
width: 1px;
}
HTML kodu
<div id="preloaded-images"> <img src="http://deneme.com/image-01.png" width="1" height="1" alt="Image 01" /> <img src="http://deneme.com/image-02.png" width="1" height="1" alt="Image 02" /> <img src="http://deneme.com/image-03.png" width="1" height="1" alt="Image 03" /> </div>
Yukarıda görüldüğü gibi html içine eklenen resimler CSS yardımı ile kullanıcının göremeyeceği bölgelere itilmiştir. Bu şekilde bir çözüm üretilmiştir.
Javascript Yöntemleri
Javascript ile yapılan yöntemlerin genel yapısı bir sıraya sokulan resimler dinamik olarak doküman içine eklenir.
Javascript ile bu işlemi yapan çeşitli kodlar var. Benim uyguladığım ise aşağıdaki koddur. Bu kodun diğerlerine göre avantajı yükleme yaptığımız sayfanın yüklenmesi bittikten sonra bizim önden yükleme yaptığımız resimleri yüklemesidir.
function preloader() {
if (document.images) {
var img1 = new Image();
var img2 = new Image();
var img3 = new Image();
img1.src = "http://domain.tld/path/to/image-001.gif";
img2.src = "http://domain.tld/path/to/image-002.gif";
img3.src = "http://domain.tld/path/to/image-003.gif";
}
}
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
addLoadEvent(preloader);
Yukarıdaki javascript kodu işimizi görecektir.
jQuery ile daha kısa ve basit bir kod ile bu işi yapabiliriz.
// resim onyükleme fonksiyonu
jQuery.preloadImages = function()
{
for(var i = 0; i<arguments.length; i++)
{
jQuery("<img>").attr("src", arguments[i]);
}
};
// yükleme yap
$.preloadImages("images/dexter.jpg", "images/saydam_ardalan1.gif", "images/ornek_sayfa.jpg");
Yukarıdaki kodu yazınca yükleme yaptığımız sayfadaki öğeler yüklenirken yükleme yaptığımız resimlerde yüklenir. Bu benim istediğim bir durum değildir. Bence yükleme yapılacak sayfanın öğeleri yüklendikten sonra yüklenecek resimler yüklenmelidir. Kullanıcı ilk önce mevcut sayfayı tam görmelidir, sonra kullanıcıya göstermeden diğer sayfa resimlerini yüklemeliyiz.
Bunun için kodumuzu aşağıdaki değiştirmeliyiz.
$(document).ready(function() {
$(window).bind('load', function()
{
// resim onyükleme fonksiyonu
jQuery.preloadImages = function()
{
for(var i = 0; i<arguments.length; i++)
{
jQuery("<img>").attr("src", arguments[i]);
}
};
// yükleme yap
$.preloadImages("images/dexter.jpg", "images/saydam_ardalan1.gif", "images/ornek_sayfa.jpg");
});
});
Eklediğimiz sadece $(window).bind(‘load’ function()) kısmıdır. Burada sayfa yüklendikten sonra bu işlemi yap diyoruz.
Örneği görmek için tıklayınız.
Örneklerde dikkatiniz bir yere çekmek istiyorum. Firebug Net sekmesini açtım çünkü sayfa yüklenmesi anını görmenizi istedim. İlk resimde sayfa yüklenirken sonradan görüntüleyeceğimiz resimleride içeren bir durum söz konusu idi. Dikkat ederseniz ilk reismde dikey kırmızı çizgi en sondadır. İkinci resimde ise kırmızı dikey çizgi sayfa öğelerini sonuncusu olan resimden sonra çizilmiştir, daha sonra yükleme yapılan resimler yüklenmiştir.
Sonuç
Ben küçük bir araştırma sonucunda bu kodu kullanmayı uygun buldum. Bulduğum bu kodun kendimce gerekçelerini yukarıda açıklamaya çalıştım, eğer sizlerin daha iyi çözümleri ve önerileri varsa yorum kısmında bizlerle paylaşırsanız sevinirim.
Kalın sağlıacakla
Kaynaklar
- http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/
- http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript
- http://elouai.com/javascript-preload-images.php
- http://www.javascriptkit.com/script/script2/preloadimage.shtml
- http://stackoverflow.com/questions/761263/what-is-the-best-way-to-preload-multiple-images-in-javascript/761332
- http://www.filamentgroup.com/lab/update_automatically_preload_images_from_css_with_jquery/
- http://snipplr.com/view.php?codeview&id=9612
jQuery ipuçları – 3
Temmuz 1st, 2010 • 9 yorum Javascript, jquery
Etiketler: ipuçları, jquery, live(), resize, select, size()
Jquery ipuçları – 1
Jquery ipuçları – 2
jQuery ipuçlarını yayınlamaya devam ediyorum.
1- Dinamik oluşturulan elementlere live() ile olay atama
Sayfaya dinamik olarak eklenen içeriklerde veya ajax ile doldurduğumuz içeriklerdeki elemanlara bir olay atadığımızda(click, mouseover vd.) çalışmayacaktır. jQuery geliştiricileri bunun için live() fonksiyonunu geliştirmiş.
$('a.acilSusam').live('mouseover', function() {
// yapilacak islemler
});
2 – Tarayıcı Penceresinin Boyutlarını Değişmesini Yakalamak
Belki ara sıra lazım olacak bir kod ama bazen gerekiyor işte. Pencere boyutu her değiştiğine bazı işlemleri yapmak sistemimizi yorabilir diye setTimeout yardımı ile belli aralıklarla bunu yaptırıyoruz.
function pencereBoyutuDegisti() {
alert("Değişti");
};
var resizeTimer = null;
$(window).bind('resize', function() {
if (resizeTimer) clearTimeout(resizeTimer);
resizeTimer = setTimeout(pencereBoyutuDegisti, 100);
});
3 – Element miktarını bulmak
Bir dokümanda seçilen elemandan kaç adet olduğu bulmak için;
$('element').size();
4 – Bir elemanın index değerini bulmak
index değerini bulmanın farklı bir yolu
$("ul > li").click(function () {
var index = $(this).prevAll().length;
});
5- Bir elemanın görünür olup olmadığını yakalamak
if($(".eleman").is(":visible")) {
alert('Burda');
}
6- Kaç tane alt elemanı(çocuk elemanı) var
<div id="foo">
<div id="bar"></div>
<div id="baz">
<div id="biz">
</div>
<span><span>
</div>
//kac tane alt elemanı oldugunu bulmak icin
$("#foo > div").length
7- jQuery Kopya Kağıdı(Cheat Sheet)
jQuery’nini bir çok özelliği var ve bunları aklımızda tutma imkanımız yok. Bir kopya kağıdı işimize yaraya bilir.
http://www.futurecolors.ru/jquery/
Burada son sürümün kopya kağıdı mevcut. Bende css3 özelliklerini kullanarak biraz renklendirdim. Benim renklendirdiğim(CSS3 içerir, herisi göremez)
8 – Select Elemanı ipuçları
// secili olan ögenin metnini almak
$("#myselect option:selected").text();
// secili olan ögenin degerini almak icin
$("#myselect option:selected").val();
// secili ogenin index degeri
$("#myselect option").index($("#myselect option:selected"));
// indeksi 2 olan ögeyi seçili hale getirmek
$("#myselect option:eq(2)").attr("selected", "selected");
Kaynaklar
- http://blog.kenmoredesign.com/2009/02/02/useful-jquery-snippets/
- http://tympanus.net/codrops/2010/01/07/some-useful-javascript-jquery-snippets-part-2/
- http://www.catswhocode.com/blog/10-jquery-snippets-for-efficient-developers
- http://tympanus.net/codrops/2010/01/08/some-useful-javascript-jquery-snippets-part-3/
- http://www.opensourcehunter.com/2010/02/27/26-cool-and-usefull-jquery-tips-tricks-solutions/
FireBug Net Sekmesi ve Kullanımı
Mayıs 26th, 2010 • 3 yorum CSS, Javascript, XHTML
Etiketler: Ajax, firebug, Firefox, http, net sekmesi, page speed, YSlow
FireBug hakkında elle tutulur bir bilgi olmadığı için bu makaleyi yazmaya karar verdim. Bu yazımda FireBug Net paneli hakkında olacaktır. FireBug geliştirme ile alakalı bir makale değildir. Özellikleri hakkında genel bir bilgi içerecektir.
Web sayfalarının kodlarken bir çok yönünü düşünerek kodlarız. Erişebilirliği, esneklik, farklı tarayıcılara uyumlu olması, performans bunlardan ilk aklımıza gelenler. En önemlilerinden biri performansının iyi olmasıdır. Web sitesi sahipleri sitelerinin tarayıcılar tarafından hızlı gezilmesi için en kısa zamanda açılmasını sağlamak için uğraşır. Performans değerlendirmesi için kullanabileceğimiz araçlardan birisi Firebug’ın Net panelidir. Burada Firebug’ın Net sekmesini inceleyeceğiz. Aşağıda benim anasayfamın net panelindeki görüntüsünü görüyorsunuz. Okumaya devam edin »
Flash dosyalarını(swf) HTML’e eklemek
Mart 25th, 2010 • 18 yorum Javascript, XHTML
Etiketler: flash-eklemek, swf-dosyası, swfobject, wmode
Flash dosyalarını html sayfalarımıza eklemek baştan beri tam oturmamış bir konudur. Farklı tarayıcılar için farklı kod blokları yazılması, flash olmaması durumu için hazırlanan resimler veya yazılar vs. Ancak bu sorunlar yetmiyormuş gibi birde İnternet Explorer’ın ActiveX güncellemesi sonrası yeni sorunlar çıktı.
O zamanı(Mart-Nisan 2006) hatırlıyorum Turkline’da çalışıyordum ve Microsoft’un Eolas ile lisans sorunları nedeni ile bir gün için tüm flash içeren siteleri kontrol etmemiz gerekmişti. Çözümünü bulup tüm dosyaları değiştirmemiz gerekmişti. Hey gidi günler.
Bu sorundan önce genelde Dreamweaver ki o zamanlar Macromedia Dreamweaver idi, Dreamweaver ile açıp swf ekle diyorduk ve o kendi kodunu ekliyordu.
Tabi internet explorer sorunu sonrası bu işi javascript ile yapmaya başladık. Bir çok yöntem çıktı bu işi javascript ile yapan.
Eskileri bırakıp şimdiki zamana gelelim. Ben html sayfalarına flash(swf) dosyaları eklemek için SwfObject kullanıyorum. Bir çok alternatifine göre avantajlı.
Avantajlarını sıralarsak;
- Diğer flash kodlarına göre daha optimize ve esnek
- Herkes için tek çözüm sunuyor. HTML, javascript ve flashçılar için
- Web standartlarına uygun kod üretiyor ve sorun çıktığında alternatif çözüm sunuyor.
- Çok basit bir javascript kodu var
- Kullanımı kolay
- Boyutu 10kb’dan daha az.(Gzip hali 3.9kb)
SwfObject’in 2.2 sürümü çıktı son olarak. İşi iyice standart haline getirmişler ve scriptsiz çalışan bir metot daha eklemişler. Statik ve Dinamik kod diye iki kısma ayırmışlar kodu.
Kaynak kodları Google Code‘dan indireceğiz. İndirdiğimiz dosyada expressInstall.swf, swfobject.js, index.html, index_dynamic.html, test.swf dosyaları yer alır. Ayrııca src klasörüde yer alır.
Statik Kod ile Flash Dosyalarını Eklemek
SWFObject’in önceki sürümlerinde olmayan bu metot yeni sürüm ile birlikte gelmiştir. Bu kod eski(ie eolas lisans sorunu öncesi) statik metoda benzer bir yapıya sahiptir. Bu kod sayesinde javascript desteği olmaya durumlar için kod üretmiş oluyoruz.
Bu metodun avantajı object ile eklenen kodların daha performanslı sonuç verecektir. Dezavantajı ise eski tarayıcısı olan kullanıcıların gri kenarlık sorunu ve tıklama sorunu yaşamalarıdır. Microsoft daha sonra bu hatayı düzeltti ise de hala bu güncellemeyi yapmayan kullanıcılar vardır.
Indirdigimiz dosya içerisinden çikan index.html sayfasi statik bir flash eklemeye örnektir. Kodlarini incelersek
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject 2 static publishing example page</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.registerObject("myId", "9.0.0", "expressInstall.swf");
</script>
</head>
<body>
<div>
<object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="120">
<param name="movie" value="test.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="test.swf" width="300" height="120">
<!--<![endif]-->
<div>
<h1>Alternatif içerik</h1>
<p>Kullanıcının bilgisayarında flash yüklü değilse burayı gösterecek<a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
</div>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</body>
</html>
Kodu iki kısıma ayıralım. İlk head içerisindeki javascript kısmı ve body içerisindeki html kısmı
head içerisindeki javascript kısmı
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.registerObject("myId", "9.0.0", "expressInstall.swf");
</script>
registerObject fonksiyonuna html içindeki elemanın id’sini(myId), flash sürümünü ve flash olmayanlar için yüklemeye yönlendiren dosyanın adı(expressInstall.swf)
Kodun ikinci kismina gelirsek body içerisine yazılan html kodumuz var
Bu kodumuz iç içe object elemanlarından oluşur. Ayrıca ie sürümlerinin yorumlanması için ie yorum kodları yer alır.
- id(id="myId") swfobject ile yakalamamız için gereklidir.
- width – swf dosyasının genişlik değeri
- height – swf dosyasının yükseklik değeri
Diğer atamalar sabittir. Ayrıca ek özellikler eklemek istediğimizde(örn: flashvars, transparent vd.) <param> etiketi ile bunları eklemeliyiz. Ayrıntılı bilgi için tıklayınız
Dinamik Kod ile Flash Dosyaları Eklemek
Dinamik yöntem ile kod ekleme yöntemi swfobject’in eski sürümleri ile aynıdır. Bu yöntem daha basit uygulanabilirliği vardır. Ayrica dinamik olarak eklendiği için javacscript ve ajax ile müdahale imkanı daha kolaydır.
Bu yöntem kullanıldığında internet explorer’daki tıklama ve gri kenar sorunu olmayacaktır.
İndirdiğimiz dosya içerisindeki index_dynamic.html bu kodlama örneğini içerir.
Bu kodumuzda head içindeki ve body içindeki kısımları ile ikiye ayrılır.
body içerisindeki kısmı
<div id="myContent"> <h1>Alternatif içerik</h1> <p>Kullanıcının bilgisayarında flash yüklü değilse burayı gösterecek <a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p> </div>
Dinamik kodlama ile flash(swf) dosyalarının eklenme mantığı şöyledir; bir eleman oluşturulur ve bu elemana dinamik olarak özellikleri atanır ve sayfa içerisindeki id tanımlı alan ile bu içerik yer değiştirilir. Bu şöyle bir avantaj sağlıyor bize eğer flash yok ise bu eleman içerisine yazdığımız içeriği kullanıcı görüyor, flash var ise de flash görünüyor.
head içindeki kısımları
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("test.swf", "myContent", "300", "120", "9.0.0", "expressInstall.swf");
</script>
swfobject.js dosyasını ekliyoruz. Sonrada html içerisine ekleyeceğimiz swf dosyasının bilgilerini giriyoruz. Sırası ile incelersek
- test.swf – Eklenecek swf dosyasının yolu ve adı, burada aynı klasörde olduğu için sadece adı yazılmıştır.
- "myContent" – body içerisindeki içine eklenecek elemanın id’si
- "300" – swf dosyasının genişliği
- "120" – swf dosyasının yüksekliği
- "9.0.0"- flash sürümü
- expressInstall.swf- flash olmayanlar için yüklemeye yönlendiren dosyanın adı
Dinamik yöntemin avantajlarını sayarken kolay kullanımı olduğunu söylemiştik. Mesela yeni parametre eklerken kodumuzu söyle değiştirmemiz yeterli olacaktır
var flashvars = {};
flashvars.xmlPath = "xml/data.xml";
var params = {};
params.menu = "false";
params.wmode = "opaque";
var attributes = {};
attributes.id = "myDynamicContent";
attributes.name = "myDynamicContent";
swfobject.embedSWF("test.swf", "myAlternativeContent", "300", "120", "9.0.0", false, flashvars, params, attributes);
İlk başta değişkenleri tanımlayıp sonra embed kodu içine ekliyoruz. Bir başka şekli ile
<script type="text/javascript">
swfobject.embedSWF("test.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", {xmlPath:"xml/data.xml"}, {menu:"false", wmode:"opaque"}, {id:"myDynamicContent",name:"myDynamicContent"});
</script>
şeklinde de yazabiliyoruz. Parametre olarak ben genelde ya flashvars ile xml yolunu yazıyorum, yada wmode özelliğini yazıyorum. Diğerlerini pek kullanmıyorum. Bana eski sürümdeki parametre ekleme şekli daha kolay geliyordu açıkçası.
wmode özelliği
Yeri gelmişken wmode özelliğinede değinelim. window , opaque ve transparent özelliklerini alıyor. Ben genelde bu özelliği diğer elemanlar flash altında kalınca kullanıyorum. window hiç kullanmadım, eskiden transparent kullanıyordum ancak transparent kullanınca flash çok yavaşlatıyor sayfayı bu nedenle opaque kullanıyorum. Tabi eğer flash zemini saydam olmayacak ise ki genelde olmuyor.
Sonuç
SwfObject 2.2′in yanında google code içerisinde "SWFObject 2 HTML and JavaScript generator v1.2" yukarıdaki kodu üretmek için bir sayfa hazırlanmış işi daha kolay hale getiren bir araç.
Genel hatları ile bir web sayfasına swf dosyasını bu yöntem ile ekleyebiliriz. Bunun dışında da javascript ile yapılmış bir çok yöntem var, jquery eklentisi var. Ancak ben swfobject’i kullanıyorum. Sizlerede kullanmanızı öneriyorum. Kendinize iyi bakın. Görüşmek dileğiyle. Hoşçakalın.
Kaynaklar
- http://code.google.com/p/swfobject/wiki/documentation
- http://www.adobe.com/devnet/flashplayer/articles/swfobject.html
- http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
- http://blog.deconcept.com/swfobject/ (swfobject ayrintili)
- http://www.tizag.com/flashTutorial/flashhtmlcode.php
- http://www.ispringsolutions.com/articles/how_to_insert_flash_into_html.html
- http://groups.google.com/group/swfobject/browse_thread/thread/eeb1c721a0c10a90?pli=1 (swfobject)
- http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml (eski yöntem)
- http://www.alistapart.com/articles/flashembedcagematch/
- http://www.webogrencisi.com/swfobject-1-5-flash-obje-ekleme-betigi
- http://www.reelseo.com/swfobject-video-seo/
- http://www.gotoandlearn.com/play?id=77
Çok kolonlu yapılar ve çok kolonlu menüler
Mart 17th, 2010 • 23 yorum CSS, Javascript, jquery, Web Standartları, XHTML
Etiketler: css3, çok kolonlu, çok kolonlu menüler, Javascript, jquery
Son zamanlarda bir çok yerde gözüme çarpan bir menü tipi var; iki kolonlu, üç kolonlu vb. menü tipleri. CSS ile en optimum şekilde bu menüyü nasıl yapabilirim diye araştırdım ve sizlerle paylaşmaya karar verdim. Konuyu inceledikçe çok kolonlu yapıların sadece menülerde değil site içeriklerinde de kullanabileceğimizi gördüm. İlk olarak yapının nasıl olduğunu göstereceğim, sonrada menüde nasıl kullanıldığını.
Web mecrası geliştikçe ihtiyaçlarımızda gelişiyor ve ihtiyaçlarımızı karşılayacak metotlar arıyoruz. Çok kolonlu yapılarda böyle bir metot aslında. Sitemizi kullanan insanlar genelde menü vb. erişim ve gezinti araçlarını kullanarak sitemizi dolaşırlar. Menü gibi gezinti araçları site yapısı düşünüldüğünde sayfamızın en önemli alanlarıdır. Bu alanları en iyi şekilde tasarlanması ve düşünülmesi sitemizi daha kullanışlı ve etkin hale getirecektir.
Bu düşünceler ile bir çok web site geliştiricisi çeşitli yöntemler denedi ve denemeye devam ediyor. Kullanılabilirliği en üst düzeye çıkarmak için çeşitli metotlar üretilmektedir. Bence bunlardan en güzellerinden biridir çok kolonlu menüler.
Yatay ve dikey örneklerimiz olmasına karşın genelde yatay ve üst menüdeki örnekler daha kullanışlıdır. Kullanıcıya uzun menü alanlarına erişebilmek için kaydırma çubuğunu kullanırlar buda bizim için bir dezavantajdır. Çok kolonlu menüler bu gibi durumlardan bizi kurtarır. Sitemizi daha derli toplu gösterir.
Çok kolonlu menü örneklerini incelediğimizde belli başlı 2-3 yöntem ile oluşturulduğunu görürüz. Bunları aşağıda inceleyeceğiz. Projelerimizde çoklu menü kullanmaya karar verdiğimizde hangisi projemize uygun ise onu kullanacağız.
Ayrıca javascript yardımı ile ve css3 yardımı ile de çoklu menü oluşturabiliriz bunlarıda göreceğiz.
Burada anlatacağımız metotlar sadece menülerde kullanılmaz, site içeriğindeki benzer yapılar içinde aynı metotlar kullanılabilir.
1. Yol: float uygulanmış liste ögeleri
Bu yöntemde ul elemanına sabit bir genişlik verip, her bir li elemanına float ve sabit genişlik tanımı yaparak yan yana dizeriz. Çok kolonlu yapılarını oluşturmak için en basit metottur.
Dezavantajı listelemek istediğimiz ögeleri yan yana dizer. Normalde istenen birinci kolonu bitirdikten sonra ikinci kolona geçmesidir.
<ul>
<li>Birinci Oge</li>
<li>İkinci Oge</li>
<li>Üçüncü Öge</li>
<li>Dördüncü Öge</li>
<li>Beşinci Öge</li>
<li>Altıncı Öge</li>
<li>Yedinci Öge</li>
<li>Sekizinci Öge</li>
<li>Dokuzuncu Öge</li>
<li>Onuncu Öge</li>
</ul>
CSS kodumuz
ul {
width: 700px;
list-style-type:none;
}
li {
width:180px;
margin:15px 0 0 0;
padding:0 10px 0 0;
line-height:15px;
float:left;
}
Örneği görmek için tıklayınız.
700px tüm genişlik içindir her ögenin genişliğini 180px verip bide sağdan 10px padding değeri ile yan yana dizeriz.
Örneği biraz daha geliştirip açılır menü haline getirelim.
HTML Kodu;
<ul id="menu">
<li><a href="">Tencere</a>
<ul class="kapsul">
<li><a href="">Birinci Oge</a></li>
<li><a href="">İkinci Oge</a></li>
....
<li><a href="">Onuncu Öge</a></li>
</ul>
</li>
<li><a href="">Tava</a></li>
<li><a href="">Çaydanlık</a></li>
<li><a href="">Leğen</a>
<ul class="kapsulSolda">
<li><a href="">Birinci Oge</a></li>
<li><a href="">İkinci Oge</a></li>
.....
<li><a href="">Onuncu Öge</a></li>
</ul>
</li>
</ul>
CSS kodu;(kodun uzun olduğuna bakmayın çoğu kod menü elemanlarını daha güzel görünmesini sağlamak için eklenmiştir.) Bunu menüye uygulayalım
ul{margin:0; padding:0; list-style:none}
ul li{float:left; width:180px; border-top:3px solid #fff; position:relative}
ul li:hover, ul li.over{border-top:3px solid #C30; background-color:#eee; width:180px;}
ul li a{ font:12px "Trebuchet MS", Arial, Helvetica, sans-serif; text-decoration:none; display:block; padding:5px 5px 5px 10px; color:#0657ad; font-weight:bold}
İlk menü öğelerini oluşturduk.
ul li:hover ul, ul li.over ul{display:block;}
Burada virgülün ilk kısmı ie6 hariç olan kısmı için ie6 için ise aşağıdaki javascript kodunu yazacağız.
Tabi başımızın belası ie6 için menüyü açmak için javascript yardımı almamız gerekiyor. Çünkü ie6 linklerin haricinde :hover işleyişini uygulamıyor
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;
Açılan menü kısmının tam kapsanması için kapsayamama kodu ekleyeceğiz.
ul li ul:after {content: "."; display: block; height: 0; clear: both; visibility: hidden;}
ul li ul {display: inline-block;}
/*IE-mac de bu bolumu sakla \ */
* html ul li ul {height: 1%;}
ul li ul {display: block;}
/* IE-mac bu bolumu saklam artik */
Açılacak menü ul sinin tanımlarını yapıyoruz.
ul li ul {width: 580px; list-style-type:none; display:none; border-bottom:3px solid #C30; background-color:#eee; padding:5px 0 10px 10px; position:absolute;}
ul li li {width:180px; margin:5px 0 0 0; padding:0 10px 0 0; line-height:15px; float:left; border:0;}
ul li li:hover{border:0}
ul li li a{color:#0657ad; text-decoration:underline; padding:0; font-weight:normal}
ul li li a:hover{color:#C30; text-decoration:none}
ul li ul.kapsulSolda{right:0}
Kolonlama için yukarıdaki yöntemi uyguluyoruz.
Örneği görmek için tıklayınız.
2. metot: Margin yönlendirmeleri ile
Çok kolonlu yapıları oluşturmak için diğer bir yöntemde ikinci ve üçüncü kolonlara sağdan ve üstten margin değerleri vererek yapmaktır. Bu metodun avantajı kolon dizilişinin istediğimiz gibi olmasıdır. Bu metotta çoğaltacağımız kolonlara ek sınıflar eklemeliyiz.
<ul>
<li class="kolon1"><a href="#">Öğe 1</a></li>
<li class="kolon1"><a href="#">Öğe 2</a></li>
<li class="kolon1"><a href="#">Öğe 3</a></li>
<li class="kolon1"><a href="#">Öğe 4</a></li>
<li class="kolon1"><a href="#">Öğe 5</a></li>
<li class="kolon2 sifirla"><a href="#">Öğe 6</a></li>
<li class="kolon2"><a href="#">Öğe 7</a></li>
<li class="kolon2"><a href="#">Öğe 8</a></li>
<li class="kolon2"><a href="#">Öğe 9</a></li>
<li class="kolon2"><a href="#">Öğe 10</a></li>
<li class="kolon3 sifirla"><a href="#">Öğe 11</a></li>
<li class="kolon3"><a href="#">Öğe 12</a></li>
<li class="kolon3"><a href="#">Öğe 13</a></li>
<li class="kolon3"><a href="#">Öğe 14</a></li>
<li class="kolon3"><a href="#">Öğe 15</a></li>
<li class="kolon3"><a href="#">Öğe 16</a></li>
</ul>
CSS kodumuzu yazalım
ul { margin: 0 0 1em 2em; padding: 0; }
ul li { line-height: 1.2em; margin: 0; padding: 0; }
* html ul li { position: relative; }
ul li.kolon1 { margin-left: 0em; }
ul li.kolon2 { margin-left: 10em; }
ul li.kolon3 { margin-left: 20em; }
li.sifirla { margin-top: -6em; }
ul li a { display: block; width: 7em; text-decoration: none; }
ul li a:hover { text-decoration:underline}
Örnek kodu görmek için tıklayınız.
Yukarıdaki kodda ilk li tanımımız bir önceki metot ile neredeyse aynıdır. Tek farklı olan kısım position:relative tanımıdır, bu tanım ie’deki sorunları gidermek için eklenmiştir. Her kolonun soldan mesafesi margin-left değerleri tanımlanarak sağlanmıştır. İkinci ve üçüncü kolonları yukarı çekmek içinde menü yüksekliği kadar eksi margin değeri verilerek yukarı çekilmiştir.
Margin yönlendirmeleri ile menü oluşturmak pek mantıklı değildir. Esnek olmayan bu yöntem menü ekleme ve çıkarmalarında osurn çıkarır.
3. Metot: Kapsayıcı katman ile bölmek
Bu metotta çoklu kolonlara ayrılacak listeler kapsayıcı katmanlar ile ayrılarak her bir kolon oluşturulur. Bu metotta yükseklik ile ilgi bir şey yapmaya gerek yoktur ve esnek bir yapıya sahiptir.
<div class="licol">
<ol>
<li>Let me not to the marriage of true minds</li>
<li>Admit impediments; love is not love</li>
<li>Which alters when it alteration finds</li>
<li>Or bends with the remover to remove</li>
</ol>
</div>
<div class="licol">
<ol start="5">
<li>Oh, no, it is an ever fixed mark</li>
<li>That looks on tempests and is never shaken;</li>
<li>It is the star to every wand'ring bark</li>
<li>Whose worth's unknown, although his height be taken</li>
</ol>
</div>
<div class="licol">
<ol start="9">
<li>Love's not Time's fool, though rosy lips and cheeks</li>
<li>Within his bending sickle's compass come;</li>
<li>Love alters not with his brief hours and weeks</li>
<li>But bears it out even to the edge of Doom</li>
</ol>
</div>
CSS kodumuzda kısadır.
li {
margin:15px 0 0 0;
padding:0 10px 0 0;
line-height:15px;
}
.licol {
float: left;
width: 200px;
}
Örnek kodu görmek için tıklayınız.
Diğer metotlara göre avantajlı görünen bu metodun da kendince sorunları vardır. Menü yaparken kapsayıcı bir katman(div) atayıp bu katman içinde ul’leri float ve genişlik vererek yan yana koyarız.
<ul id="menu">
<li>
<a href="">Tencere</a>
<div class="ucluKolon">
<ul>
<li><a href="">Let me not to the marriage of true minds</a></li>
...
</ul>
<ul>
<li><a href="">Oh, no, it is an ever fixed mark</a></li>
...
</ul>
<ul>
<li><a href="">Love's not Time's fool, though rosy lips and cheeks</a></li>
...
</ul>
</div>
</li>
....
</ul>
İlk menü kısmını ilk yaptığımız ile aynı kodlara sahip olacaktır.
ul{margin:0; padding:0; list-style:none}
ul li{float:left; width:180px; border-top:3px solid #fff; position:relative}
ul li:hover, ul li.over{border-top:3px solid #C30; background-color:#eee; width:180px;}
ul li a{ font:12px "Trebuchet MS", Arial, Helvetica, sans-serif; text-decoration:none; display:block; padding:5px 5px 5px 10px; color:#0657ad; font-weight:bold}
Daha sonra kapsayıcı katman tanımlarını yapıyoruz. Tabi öncesine kapsayamama sorunu kodunu ekleyerek. Kapsayamama sorunu kodlarını başa ekliyoruz çünkü bu kısmı sayfa normal gösteriminde gizlememiz gerekiyor.
div.ucluKolon:after {content: "."; display: block; height: 0; clear: both; visibility: hidden;}
div.ucluKolon {display: inline-block;}
/*IE-mac de bu bolumu sakla \ */
* html div.ucluKolon {height: 1%;}
div.ucluKolon{display: block;}
/* IE-mac bu bolumu saklam artik */
div.ucluKolon{width:600px; display:none; border-bottom:3px solid #C30; background-color:#eee; padding:5px 0 10px 10px; position:absolute}
Üst menüde en sağdaki menü elemanının altında açılan menü sağ doğru değilde sola doğru açılacak, bunun için
.sagda{right:0}
Üç kolonlu yapıyı oluşturmak için katman içindeki ul’lere genişlik ve float tanımı yapıyoruz.
div.ucluKolon ul{float:left; width:200px}
üst menülerin üzerine gelince açılması için
ul li:hover div.ucluKolon, ul li.over div.ucluKolon{display:block}
ie6 için javascript kodumuzu yazıyoruz. Yukarıdaki kodun aynısı.
Örnek kodu görmek için tıklayınız.
4. CSS 3 column-count özelliği ile
CSS3 ile birlikte gelen yeni bir özellik sayesinde işler çok kolaylaştırıyor.
<ul id="menu">
<li>Birinci Oge</li>
<li>İkinci Oge</li>
<li>Üçüncü Öge</li>
<li>Dördüncü Öge</li>
<li>Beşinci Öge</li>
<li>Altıncı Öge</li>
<li>Yedinci Öge</li>
<li>Sekizinci Öge</li>
<li>Dokuzuncu Öge</li>
<li>Onuncu Öge</li>
</ul>
CSS kodumuz ise iki satır
ul#menu{
width:700px;
column-count: 3;
-moz-column-count: 3;
-webkit-column-count: 3;
}
Örnek kodu görmek için tıklayınız.
Farklı tarayıcılar için yazılan bu kod maalesef ie ve opera’nın desteği olmadığı için uygulaması şimdilik yok.
5. Metot: Javascript yardımı ile
Aslında bu yöntem bir önceki metodun tamamlayıcı bir metodudur.
Bu metotta css3 column-count özelliği ile yine css ile kodu yazacağız, javascript ile de desteklemeyen tarayıcılara uyumlu hale getireceğiz.
Bu javascript kodunu csscripting.com sitende yayınlanmış, ancak bu site yayında değil cvwdesign.com sitesinde kodu buldum. Açıkça söylemek gerekirse bunun dışında çalışan javascript kodu bulamadım.
Bu kodu kullanırken css kodunuzu harici kullanmalıyız aksi halde kod çalışmıyor.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Çoklu kolon</title>
<link href="kolon.css" rel="stylesheet" />
<!--[if IE]><script type="text/javascript" src="css3-multi-column.js"></script><![endif]-->
</head>
<body>
<ul class="column">
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
</ul>
</body>
</html>
Bu javascript dosyasını ekleyince css3 aşağıdaki özelliklere karşılık gelen özellikleri
- column-count
- column-width
- column-gap
- column-rule
destekliyor. Mevcut açık kodun boyutu fazla gelince çevrimiçi yui kompresor ile javascript dosyasını sıkıştırdım. Gayet güzel bir oran ile dosya boyutunu 37 kb’dan 19 kb’a kadar düşürdüm.
Örnek kodu görmek için tıklayınız.
jQuery yardımı ile çeşitli çözümler mevcuttur. kaynaklar bölümünde yazdım linklerini.
Kaynaklar
- http://www.useit.com/alertbox/mega-dropdown-menus.html (genel bilgi)
- http://articles.techrepublic.com.com/5100-10878_11-5810687.html
- http://www.communitymx.com/content/article.cfm?page=1&cid=27F87
- http://www.alistapart.com/articles/multicolumnlists/
- http://archivist.incutio.com/viewlist/css-discuss/88422
- http://www.cssplay.co.uk/menus/drop_lists.html (örnek)
- http://www.cssplay.co.uk/menu/column.html (farklı bir bakış)
- http://blog.pengoworks.com/index.cfm/2008/4/3/Preview-jQuery-Multicolumn-Dropdown-Plugin
- http://green-beast.com/experiments/css_double_lists.php
- http://css-discuss.incutio.com/?page=MultipleColumnLists
- http://welcome.hp.com/country/tr/tr/welcome.html
- http://css.flepstudio.org/en/css3/multi-column.html (css3 multi column)
- http://www.smashingmagazine.com/2009/03/24/designing-drop-down-menus-examples-and-best-practices/
- http://www.cvwdesign.com/txp/article/360/multi-column-layout-with-css3-and-some-javascript
- http://www.sohtanaka.com/web-design/mega-drop-downs-w-css-jquery/ (jquery yardımı işle güzel)
- http://codeasily.com/jquery/multi-column-list-with-jquery (jquery multi kolon eklentisi)
- http://welcome.totheinter.net/columnizer-jquery-plugin/ (jquery multi kolon eklentisi)
- http://www.zenelements.co.uk/blog/css3-multiple-columns/ (css3 multi-kolon ve destekleme listesi)
- http://www.americanstandard-us.com/ (örnek)
- http://www.gatesfoundation.org/Pages/home.aspx (örnek)
- http://www.cssplay.co.uk/menus/multi-column.html (örnek)
- http://www.whitehouse.gov/ (Örnek)
- http://www.wittysparks.com/2009/09/21/build-multi-level-multi-column-multi-menus-with-pure-css/
- http://www.smileycat.com/design_elements/mega_dropdown_menus/#001915


