CSS3 ile birlikte gelen yeni özellikleri araştırmaya devam ediyorum. Bunlardan bir tanesi border-image özelliği. border-image, elamanın kenarlarına resim eklemek için kullanabileceğimiz bir özelliktir. Küçük resimlerle dekoratif kenar resimleri, oval şekilli kenarlar ve renk geçişleri uygulayabiliriz. CSS3’ün birçok özelliğinde olduğu gibi border-image özelliğide yeni nesil tarayıcılar tarafından desteklenmektedir, ancak her tarayıcı önek ile desteklemektedir.(ie hiç desteklemiyor)

CSS3 border-image özelliğinin en güzel taraflarından birisi resmi 9 parçaya bölüp istediğimiz gibi esnetmemize olanak sağlamasıdır. Bu sayede küçük resimler ile istediğimiz görüntüleri elde ederiz.

grafik zurb.com sitesinden alınmıştır.

border-image kod yapısı

  • border-image: <resim_kaynagi> <bolum {1,4}> / <genislik {1,4}> <dis_hat> <tekrar{1,2}>;

Firefox, Chrome, Safari ve Opera gibi yeni nesil tarayıcılar destekliyor. Diğer özelliklerde olduğu gibi önek ile destekliyorlar. İnternet Explorer 9 desteklemiyor, şu an geliştirme aşamasında olan 10 da destekleyeceğini düşünüyorum.

Yukarıda yazdığımız tanım bir kısaltmadır. Bu kısaltma

  • border-image-source:
  • border-image-slice:
  • border-image-width:
  • border-image-outset:
  • border-image-repeat;

Özelliklerini tek başına ifade eder. Ayrı yazılan bu özellikleri henüz hiç bir tarayıcı ayrı ayrı desteklememektedir. border-image’i destekleyen tüm tarayıcılar önek ile border-image kısaltmasını desteklemektedir.

**border-image-source **Resmin kaynağı belirtir. Url, renk geçişi veya data URI olabilir. Background-image için tanımladığımız her değeri içerebilir.

border-image-slice border-image-slice değeri 1’den 4’e kadar değer alabilir. Yukarıdaki çizimde gösterdiğimiz gibi border-image resmi dokuz alandan oluşur. 4 köşe, 4 kenar ve 1 adet orta kısım. Köşeler sabit boyutunu korur. Diğer bölümler ise sabit, genişleyebilir veya her ikisi tanımlarına göre çeşitli durumlar alabilir.

.test{
	border-image-slice: 5px 5px 5px 5px;
}

Yukarıdaki örnekte görüldüğü gibi köşelerden belli bir mesafe bırakılarak kalan kısımlar uzatılmıştır. Tanımlama diğer css tanımlarında olduğu gibi saat yönünde üst-sağ-alt ve sol şeklindedir. Yüzde değerleri tanımlanırken (%) işareti konulması zorunludur, ancak piksel tanımlarında px koymak zorunlu değildir. Yukarıdaki tanım aşağıdaki gibi de yapılabilir.

.test{
	border-image-slice: 5 5 5 5;
}

Tüm değerler eşit ise tek tanım ile de ifade edilebilir.

.test{
	border-image-slice: 5;
}

Başta belirttiğimiz gibi 9 bölüme ayrılan resmin kenarları ve orta kısmına border-image ile işlev atayabiliyoruz. Orta kısım kenarların içini kapsayan bölümdür. Eğer orta kısmı renk veya başka bir şey ile doldurmayı düşünüyorsanız resim düzenleme aracınız ile resmin orta kısmını saydam bırakarak istediğinizi yapabilirsiniz.

Standartlarda orta kısım tamamen doldurma seçeneği(fill) var ancak doldurma diye bir seçenek(örn no-fill) yok. Umarız ileri bunuda eklerler.

Bu kısmı daha iyi anlamak için çevrimiçi araçları biraz kurcalayın derim. http://border-image.com ve http://www.norabrowndesign.com/css-experiments/border-image-anim.html sitelerini ziyaret ediniz.

**border-image-width **border-image-width özelliği elemanın kenar genişliğini belirler. border-image-width tanımlı ise CSS2’den aşina olduğumuz border-width tanımını ezer.

.test{
	border-image-width: 5px 5px 5px 5px
}

tüm değerler aynı ise tek tanım ile kısaltma yapılabilir

.test{
	border-image-width: 5px;
}

Genel tanımda ise taksim ile ayrılarak belirtilir.

.test{
	border-image: url(“images/test.gif”) 5 / 5px;
}

Bu kısaltmayı Opera henüz desteklememektedir. Bu nedenle bunun yerine border-width değerini kullanabiliriz.

.test{
	border-image: url(“images/test.gif”) 5 repeat;
}

.test{
	border-width:5px;
}

border-image-outset border-image dış hat çizgisi kutunun dışına taşan kısmı belirtir. Şu an için destekleyen tarayıcılar yoktur. Başlangıç değeri 0’dır.

border-image-repeat border-image-repeat özelliği köşeler hariç diğer alanların(kenarlar ve orta kısım) tekrarlanacağını ve/veya esnetileceğini belirler.  Bir veya iki değer alır iki tanım yapıldı ise ilk değer üst-alt ikinci değer sol-sağ içindir. Tek değer tüm alanlar içindir.

  • stretch:Resim belirlenen kenar alanını esneyerek doldurur.
  • repeat: Resim boyutunu koruyarak tekrarlı olarak karo şeklinde belirlenen kenar alanı doldurur.
  • round : repeat değerine benzer. Resimleri tekrar ettirir ve aynı zamanda genişlik veya yüksekliğine uydurmak içinde esnetir. (element buna uyum sağlamak için tekrar boyutlandırlır) Bir nevi hem repeat hemde strecth uygular.
  • space:border-image alanı doldurmak için tekrar eder, bu tekrarlar eşit aralıkta olur, sağlanan genişlik resmin boyutunu tam katı olmadığı durumlarda aradaki beyaz boşluğu gösterir.

Webkit tabanlı tarayıcılar rounddeğerini desteklemiyor, onun yerine repeatkullanmak daha mantıklı. spaceözelliğini şimdilik hiç bir tarayıcı desteklemiyor.

Bu kısmı daha iyi anlamak için çevirimiçi araçları biraz kurcalayın derim. http://border-image.com ve http://www.norabrowndesign.com/css-experiments/border-image-anim.html sitelerini ziyaret ediniz.

Bu özellikleri tek tek şu an hiç bir tarayıcı desteklememektedir, bundan dolayı şimdilik kaydı ile border-image kısaltması kullanılmalıdır. Yukarıda konu daha iyi anlaşılması için ayrı ayrı gösterilmiştir.

.test{
    width:300px;
    height:300px;
    border-width: 33px;
    -moz-border-image: url(border_image_desen.png) 33 stretch;
    -webkit-border-image: url(border_image_desen.png) 33 stretch;
    -o-border-image: url(border_image_desen.png) 33 stretch;
    border-image: url(border_image_desen.png) 33 stretch;
}

strech

.test{
    width:300px;
    height:300px;
    border-width: 33px;
    -moz-border-image: url(border_image_desen.png) 33 repeat;
    -webkit-border-image: url(border_image_desen.png) 33 repeat;
    -o-border-image: url(border_image_desen.png) 33 repeat;
    border-image: url(border_image_desen.png) 33 repeat;
}

repeat

.test{
    width:300px;
    height:300px;
    border-width: 33px;
    -moz-border-image: url(border_image_desen.png) 33 round;
    -webkit-border-image: url(/border_image_desen.png) 33 round;
    -o-border-image: url(border_image_desen.png) 33 round;
    border-image: url(border_image_desen.png) 33 round;
}

round

iPhone geri butonu standardını border-image ile çok kolay bir şekilde yapabiliriz.

Kullandığımız buton

Resim küçük ve biz köşelerini sabit bırakıp orta kısımları uzatalım.

Esneme sadece üst ve alttan olduğu için sadece sağ ve sol değerlerini tanımladık. Aynı şekilde genişlikleri(border-width) tanımladık. Ortaya esnek bir buton çıktık.

a.backButton{
	-webkit-border-image:url(backButton.png) 0 5 0 14 stretch;
	-moz-border-image:url(backButton.png) 0 5 0 14 stretch;
	-o-border-image:url(backButton.png) 0 5 0 14 stretch;
	border-image:url(backButton.png) 0 5 0 14 stretch;
	border-width:0 5px 0 14px;
}

Yukarıdaki örnekte görüldüğü gibi basit bir kod ile(siz bakmayın öneklerin kalabalığına) ensek bir buton elde etmiş oluyoruz. Kullandığımız resimde boyut olarak küçük.

Tarayıcı Desteği

Chrome explorer Firefox
2.0+ (-webkit) 11+ 3.5+ (-moz)

Mobil Tarayıcılar

Android Mobil Safari Chrome
2.1+ (-webkit) 3.2+ (-webkit) 36+

Sonuç

border-image özelliği gayet kullanışlı bir özellik. Birçok konuda elimiz rahatlatacak bir özellik. Uyguladıkça daha güzel örneklerin çıkacağına inanıyorum. Standartlar tam oturmasa da zamanla daha iyi olacaktır. Bu özellikte bazı şimdilik eksik kalan yerler olsa da mobil uygulamalarda uygulanabilirliği var.

Kaynaklar

Sitem üzerinden birçok mesaj aldım bu konuda. Sonunda yazmaya karar verdim, bir önceki makalemde CSS3’ün background-size özelliğini anlattım, orada da bahsettiğim gibi background-size özelliğini kullanarak bu işi çok kolay bir şekilde yapabiliriz. Buradaki problemimiz bu özelliği desteklemeyen tarayıcılar için nasıl bir çözüm bulmalıyız.

Bu makalede farklı tarayıcılar için sayfamızın zeminini tam kaplayan ardalan resimlerini nasıl tanımlayacağımızı anlatmaya çalışacağım.

CSS3 background-size ile basit şekilde yapalım

Bir önceki makalede de anlattığım gibi background-size özelliği bu iş için biçilmiş kaftandır. Çok basit bir kod ile istediğimize ulaşırız.

html {
	background: url(images/bg.jpg) no-repeat center center fixed;
	-webkit-background-size: cover;
	-moz-background-size: cover;
	-o-background-size: cover;
	background-size: cover;
}

Bir örnek yapalım

html{
    background:url("zemin_resmi.jpg") 0 0 no-repeat fixed;
    background-size:cover;
    -webkit-background-size:cover;
    -moz-background-size:cover;
    -o-background-size:cover;
}

Örneği görmek için tıklayınız.

Ardalan resmini http://interfacelift.com/wallpaper/details/2421/empty_bottles.html aldım.

html elementine vermemizin nedeni body tanımlamalarında bazı tarayıcılarda sorun yaşamamızdır. Kaydırma çubuğunun hareketi ile zemin resmi kaymaması için resmi sabitledik(fixed). cover özelliği ile resmi zemine yaydık. Daha detaylı bilgi için tıklayınız.

Tarayıcı Desteği

Chrome explorer Firefox
1.0+ 9+ 3.6+

Mobil Tarayıcılar

Android Mobil Safari Chrome
2.1+ 3.2+ 36+

İnternet Explorer 9 sürümünden önceki sürümlerinin bu özelliği desteklememesidir. İnternet Explorer için filter ile bir çözüm üretebiliriz.

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.zemin_resmi.jpg', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='zemin_resmi.jpg', sizingMethod='scale')";

Bu kod ile ie içinde çözüm üretilmiş olacaktır. Linklerde ve içerik seçmede bazı orunlar olabiliyor.

Tüm Tarayıcılar İçin Çözüm

<div id="tamEkranArdAlan"><img src="http://fatihhayrioglu.com/images/emptybottles.jpg" width="100%" height="100%" /></div>
<div id="icerik">
...
</div

Sayfamızı içerik ve ardalan resmi olarak ikiye ayırıyoruz.

html, body {height:100%; margin:0; padding:0;}

Sayfanın boşluklarını sıfırlıyoruz.

#tamEkranArdAlan {
	position:fixed;
	top:0;
	left:0;
	width:100%;
	height:100%;
}

Zemine yerleştirilecek resmi sabitleyip üstten ve soldan başlangıç noktasına yerleştiriyoruz ve genişlik ve yükseklik değerini %100 veriyoruz.

#icerik {
	position:relative;
	z-index:1;
	width:650px;
	padding:20px;
	font:14px/1.8em Arial;
	margin:40px auto;
	border-radius:10px;
	color:#333;
	background-color:#fff
}

İçerik alanını postion:relative; z-index:1 değeri atayarak içerikteki seçilme ve linklerde sorun olmasını engelliyoruz. Diğer tanımlar içerik alanının görselliğini ayarlamak içindir.

Bu kodlar ie6 hariç çalışırken ie6’da çalışmıyor ie6’da çalışması için

*html {
	overflow-y:hidden;
}

*html body {
	overflow-y:auto;
}

*html #tamEkranArdAlan {
	position:absolute;
	z-index:-1;
}

*html #icerik{
	position:static;
	padding:20px;
}

ie6 postipon:fixed desteklemediği için postion:absolute değeri tanımlıyoruz. İçerik alanınıda postion:static tanımlıyoruz. Kaydırma çubuğu sorunlarını halletmek için body ve html tanımlarımızı yapıyoruz.

Sonuç olarak tüm tarayıcılarda çalışan sayfa zeminini kapsayan zemin resmi tanımlamış olduk.

Sonuç

Sonuç olarak CSS3 ile birlikte gelen background-size özelliği tam işimizi görsede İnternet Explorer’un desteklememesi projelerimizde uygulamak için bizi düşündürüyor.

Tüm tarayıcıların desteklediği ikinci yöntem sadece CSS ile çözüm ürettiği için tercih edilebilir. Ayrıca javascript ile bazı çözümler olsa da ben css ile çözümü olan bir kodu javascript ile çözme taraftarı değilim. Javascript uygulamaları içinhttp://css-tricks.com/perfect-full-page-background-image/ linkindeki örnekleri incelemenizi öneriyorum.

Baktığım sitelerdeki uygulanabilir bu iki yöntemi sizlerle paylaştım uyguladıkça ve diğer yöntemleri gördükçe buraya ekleme yapabilirim. Birazda ihtiyaca göre yöntem uygulamak gerekiyor bu işte.

Kalın sağlıcakla

Kaynaklar

background-size özelliği background-image ile tanımlanan resmin boyutlarını tanımlamamıza yarar.

Yapısı : background-size: [<bg-size>[, <bg-size> ]
Aldığı Değerler : [ <yuzde_deger> | <uzunluk> | auto ] | contain | cover
Başlangıç değeri: auto
Uygulanabilen elementler: tüm elementler
Kalıtsallık: Yok

İki değer tanımlandığında ilk değer genişlik için ikinci değer yükseklik için uygulanır, tek değer atanmış ise hem genişlik hemde yükseklik için bu değer geçerlidir demektir.

Uzunluk olarak standart değerleri alabilir. Yüzde değerler tanımlandığında kapsayıcı elemana göre konumlanır, ardalan resmine göre değil. Örneğin genişlik ve yükseklik tanımı olarak 100% tanımlandığında ardalan resmi kapsayıcı elemanın zeminini dolduracak şekilde yayılır. Resmi gerçek boyutlarında kullanmak için auto değeri atanır.

Standart değerlerden başka iki farklı değer daha alır:  cover ve container değerleri. Her ikiside tarayıcı boyutuna göre orantılı olarak ardalan resmini boyutlandırır.

cover: Resmin genişlik veya yükseklik değerinden en küçük olanına göre kapsayıcı elemanın ardalanını tamamen kaplar. Ardalan resmi tüm kapsayıcı elemanın zeminini kaplayacak şekilde ayarlanır ve resmin kalan kısmı kesik görünür.

contain: Ardalan resminin genişlik veya yüksekliğinden en büyük olanına göre ardalan alanın içine uydurur. Resmi herhangi bir yerini kesmeden tamamını gösterir, ancak bazı bölgeler ardalan resmi olmadan görünür.

Yukarıdaki grafikte görüldüğü gibi gerçek resmin genişliği büyük, yüksekliği küçüktür. contain tanımlandığında genişlik ve yükseklikten büyük olanı yani burada genişliğin uzunluğu kapsayıcı genişliğine sığıncaya kadar orantılı şekilde küçültülerek atanmış. Kapsayıcı elemanın üst ve at kısmı boş kaldı.  

cover tanımlandığında genişlik ve yükseklikten küçük olanı yani burada yüksekliğin uzunluğu kapsayıcı genişliğine sığıncaya kadar orantılı şekilde büyütülerek atanmış. Ardalan resminin sağ ve soldan taşan kısımları kesik görünecektir.

gif, jpeg ve png gibi resim formatları yeniden boyutlandırıldığında pek hoş görüntüler ortaya çıkmıyor. Vektörel resimler(svg) desteği ile daha güzel görüntüler elde edeceğiz. Negatif değerlere izin vermemektedir. background-size:0 değeri resmin görünmemesini sağlar.

CSS3 diğer özelliklerinde olduğu gibi background-size özelliğini destekleyen farklı tarayıcılar kendi öneklerini kullanmaktadır.

.deneme {
	background-image: url(bg-image.png);
	-moz-background-size: 100% 100%;           /* Firefox 3.6 */
	-o-background-size: 100% 100%;           /* Opera 9.5 */
	-webkit-background-size: 100% 100%;           /* Safari 3.0, Chrome */
	background-size: 100% 100%;           /* w3c, Firefox 4.0, ie9  */
}

Tarayıcı Desteği

Chrome explorer Firefox
1.0+ (-webkit) 9+ 3.6+

Mobil Tarayıcılar

Android Mobil Safari Chrome
2.1+ (-webkit) 3.2+ (-webkit) 36+

Daha detaylı örnekler için http://whereswalden.com/files/mozilla/background-size/more-examples.html sitesine bakınız.

Sonuç

Birçok yerde kullanabileceğimiz bu özellik yardımı ile ardalandaki resimlerimizi daha iyi organize edebileceğiz. Sayfa zeminini tam kaplayan alanlar oluşturmak için, css sprite resimlerini daha iyi kullanabilme imkanı, esnek yapılı sayfa planlarında ardalan resimlerini yayma konularında vd. konularda bizlerin elini sağlamlaştıran güzel bir özellik.  IE9 ve sonrasında desteklediği için şimdi uygulamak zor gibi, ancak mobil araçlar için hazırlanan sayfalarda uygulanabilir.

Sayfa Zeminini Tamamen Kaplayan Resimler Tanımlamak diye bir makale yazmak şart oldu.

Kalın sağlıcakla

Kaynaklar