Transparan PNG ve CSS Background

27/10/2008
Merhaba bu makalemizde transparan PNG imajlarınızı tekrar eden CSS backgroundlarda hatasız olarak kullanmayı inceleyeceğiz.


Daha önceki Expression Web – Web User Control isimli makalemin sonunda imajlarınızı transparan PNG olarak kullanabilmenin yolunu anlatmıştım.

Bu makaledeki örneğimizi şu şekilde düşünün. Diyelim ki tasarımın altında bir imaj bulunmakta, imajınızın üstünde ise gelen içeriğe göre boyu değişebilecek dinamik bir alan tasarladınız. Altta bunun için hazırladığım bir örnek bulunmakta. Alttaki imaj zamanında hazırladığım bir foto manipülasyon çalışmasıdır.

Ne güzel yaptınız her şey hazır. O zaman sitemizi oturtalım.

Tasarımın HTML’i

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”><head>
<meta content=”text/html; charset=utf-8″ http-equiv=”Content-Type” />
<title>Transparan PNG ve CSS Background</title>
<link href=”main.css” rel=”stylesheet” type=”text/css” />
</head>

<body>

<table align=”center” border=”0″ cellpadding=”0″ cellspacing=”0″>
<tr>
<td valign=”top”>
<table align=”center” border=”0″ cellpadding=”0″ cellspacing=”0″ style=”width: 438px”>
<tr>
<td><img alt=”” height=”11″ src=”top.png” width=”438″ /></td>
</tr>
<tr>
<td>Lorem ipsum dolor sit amet, consectetuer
adipiscing elit. Duis sit amet turpis. Sed in orci. Vivamus
pulvinar, lacus quis fermentum blandit, mauris ante adipiscing
ligula, quis sollicitudin arcu nibh iaculis metus. Aenean eu
justo et libero eleifend aliquet. Vestibulum at sem.
Pellentesque commodo ligula eget velit. Duis a leo ut lacus
ultrices sodales. Suspendisse elementum. In lectus. Aenean sed
eros sit amet arcu sagittis euismod. Sed varius sapien eu leo.
Fusce consectetuer, lectus quis luctus faucibus, quam orci
consectetuer mi, ut volutpat neque pede nec sem. Maecenas
placerat pharetra erat. Aenean dolor velit, vehicula vel,
pharetra non, viverra ut, diam. Integer quis pede a erat
accumsan dictum. Maecenas magna massa, fringilla quis, ultricies
at, sollicitudin a, turpis. Sed pulvinar lectus ac quam. Sed
aliquet, eros ac convallis tempus, orci nunc bibendum erat, non
laoreet pede purus vel quam. Vestibulum nulla diam, cursus et,
tincidunt a, luctus id, diam. Aliquam malesuada nulla at mi. Nam
varius odio vitae quam. Ut venenatis. Sed elit. Ut magna est,
fermentum in, aliquam non, iaculis quis, mauris. Cras id neque
eget libero pulvinar semper. In hac habitasse platea dictumst.
In hac habitasse platea dictumst. Praesent tincidunt neque sit
amet magna. Nam hendrerit ultrices pede. Etiam sollicitudin.
Donec pretium pellentesque ligula. Cum sociis natoque penatibus
et magnis dis parturient montes, nascetur ridiculus mus.
Pellentesque ante. Suspendisse potenti. Sed ultrices, elit sit
amet fermentum viverra, ipsum justo fringilla lacus, at
vestibulum tortor leo in enim. Integer elit. Etiam egestas eros
et enim. Mauris justo. Mauris id nisl ut diam faucibus porttitor.
Maecenas eu augue vel tortor fringilla lacinia. Aliquam tempor
vestibulum erat. Fusce pharetra dapibus massa. Fusce bibendum
dapibus ipsum. Mauris sed tellus sit amet felis fermentum
bibendum. Integer massa. Donec venenatis ante ut tellus. Nunc
vitae massa. Fusce sed leo. Morbi elementum. Pellentesque turpis
elit, porttitor ut, porttitor a, commodo eget, nisl. Vestibulum
tellus elit, vulputate ac, rhoncus porta, facilisis euismod, mi.
Phasellus posuere, justo in blandit convallis, orci odio luctus
est, tempus scelerisque massa dolor eget turpis. In hac
habitasse platea dictumst. Nullam iaculis augue at pede.
Pellentesque vel nisl et nulla accumsan elementum. Morbi eget
libero vitae ipsum tincidunt tincidunt. Aliquam malesuada justo.
Cras blandit iaculis nunc. Curabitur in nunc. Morbi quam.
Vestibulum rhoncus nisi et urna. Integer id libero. Cras vitae
arcu et erat sagittis tempus. Donec pretium. Nam et purus non
risus eleifend malesuada. Etiam felis nulla, eleifend quis,
dignissim eget, scelerisque non, est. Class aptent taciti
sociosqu ad litora torquent per conubia nostra, per inceptos
himenaeos. Pellentesque in ipsum. Fusce rutrum felis sit amet
mauris. Pellentesque vitae turpis</td>
</tr>
<tr>
<td><img alt=”” height=”12″ src=”bottom.png” width=”438″ /></td>
</tr>
</table>
</td>
</tr>
</table>

</body>

</html>

Tasarımın CSS’i

body{
background-color:black;
margin:0px;
font-family:Trebuchet MS, Arial, Verdana, sans-serif;
color:black;
font-size:11px;
}
.mainTable{
width:1000px;
background-image:url(‘back.jpg’);
background-repeat:no-repeat;
height:750px;}
.contentTable{
width:438px;
margin-top:50px;
}
.contentBack{
background-image:url(‘content_back.png’);
background-repeat:repeat-y;
padding:10px 20px 10px 20px;
}

VE ÇIKAN SONUÇLAR;

Alttaki imaj Internet Explorer 7.0, Firefox 2.0 ve Opera 9.0 içindir.

Peki Internet Explorer 6.0 nasıl bir görüntü verir. IE 6.0’ın sonucu altta. Gördüğünüz gibi IE 6.0 transparan PNG konusunda tamamen başarısız. Eğer bir tasarım hazırlıyorsanız IE 6.0’ı yok sayamazsınız. Hala bir çok insan bu versiyonu kullanmaktadır.

Transparan imajları düzeltmek için tasarıma javascript kodumuzu ekliyoruz.

function correctPNG()
{
for(var i=0; i<document.images.length; i++)
{
var img = document.images[i]
var imgName = img.src.toUpperCase()
if (imgName.substring(imgName.length-3, imgName.length) == “PNG”)
{
var imgID = (img.id) ? “id='” + img.id + “‘ ” : “”
var imgClass = (img.className) ? “class='” + img.className + “‘ ” : “”
var imgTitle = (img.title) ? “title='” + img.title + “‘ ” : “title='” + img.alt + “‘ ”
var imgStyle = “display:inline-block;” + img.style.cssText
if (img.align == “left”) imgStyle = “float:left;” + imgStyle
if (img.align == “right”) imgStyle = “float:right;” + imgStyle
if (img.parentElement.href) imgStyle = “cursor:hand;” + imgStyle
var strNewHTML = “<span ” + imgID + imgClass + imgTitle
+ ” style=\”” + “width:” + img.width + “px; height:” + img.height + “px;” + imgStyle + “;”
+ “filter:progid:DXImageTransform.Microsoft.AlphaImageLoader”
+ “(src=\'” + img.src + “\’, sizingMethod=’scale’);\”></span>”
img.outerHTML = strNewHTML
i = i-1
}
}
}
window.attachEvent(“onload”, correctPNG);

HTML’imizide javascript referans kodumuzu ekliyoruz.

<!–[if lt IE 7]>
<script defer type=”text/javascript” src=”pngfix.js”></script>
<![endif]–>

Böylece üst ve alt transparan PNG imajları IE 6.0’da düzeltmiş olduk.

Ama fark ettiğiniz gibi CSS’den gelen ve tekrar eden background PNG’sinde hala sorun var. Şimdi onu da düzeltilim. O alanı düzenleyen CSS alttaki gibiydi.

.contentBack{
background-image:url(‘content_back.png’);
background-repeat:repeat-y;
padding:10px 20px 10px 20px;
}

Aynı CSS’e şu eklemeyi yapıyoruz.

.contentBack{
background-image:url(‘content_back.png’);
background-repeat:repeat-y;
padding:10px 20px 10px 20px;
behavior: url(iepngfix.htc);
}

Alttaki kodu olduğu kopyalayıp iepngfix.htc olarak CSS’siniz ile aynı klasöre kopyalarsanız artık IE 6.0’da da tasarımınız düzgün çalışacaktır.

<public:component>
<public:attach event=”onpropertychange” onevent=”iePNGFix(0)” /><script type=”text/javascript”>

if (typeof blankImg == ‘undefined’) var blankImg = ‘blank.gif’;

function filt(s, b)
{
var f = ‘DXImageTransform.Microsoft.AlphaImageLoader’;
var sM = (currentStyle.backgroundRepeat == ‘no-repeat’) ? ‘crop’ : ‘scale’;
s = (s || ”).replace(/\(/g, ‘%28’).replace(/\)/g, ‘%29’);

if (s && !(/IMG|INPUT/.test(nodeName) && !b) &&
currentStyle.width == ‘auto’ && currentStyle.height == ‘auto’)
{
style.width = offsetWidth + ‘px’;
style.height = clientHeight + ‘px’;
if (currentStyle.display == ‘inline’) style.display = ‘inline-block’;
}

if (filters[f])
{
filters[f].enabled = s ? true : false;
if (s) with (filters[f]) { src = s }
}
else if (s) style.filter = ‘progid:’+f+'(src=”‘+s+'”,sizingMethod=”‘ + sM + ‘”)’;
}

function iePNGFix(init)
{
if (!/MSIE (5\.5|6)/.test(navigator.userAgent) || typeof filters == ‘unknown’) return;
var evt = init ? { propertyName: ‘src,background’ } : event;
var isSrc = /src/.test(evt.propertyName);
var isBg = /background/.test(evt.propertyName);
var isClass = !init &&
((this.className != this._png_class) && (this.className || this._png_class));
if (!(isSrc || isBg || isClass)) return;
this._png_class = this.className;
var blank = blankImg.match(/([^\/]+)$/)[1];

// Required for Whatever:hover support – erase any set BG if className changes.
if (isClass && ((style.backgroundImage.indexOf(‘url(‘) == -1) ||
(style.backgroundImage.indexOf(blank) > -1)))
{
setTimeout(function() { this.style.backgroundImage = ” }, 0);
return;
}

if (isSrc && this.src && /IMG|INPUT/.test(nodeName))
{
if ((/\.png/i).test(src))
{
filt(src, 1);
src = blankImg;
}
else if (src.indexOf(blank) == -1) filt();
}

var bgSrc = currentStyle.backgroundImage || style.backgroundImage;
if ((bgSrc + this.src).indexOf(blank) == -1)
{
var bgPNG = bgSrc.match(/^url[(“‘]+(.*\.png[^\)”‘]*)[\)”‘]+[^\)]*$/i);

if (bgPNG)
{
style.backgroundImage = ‘url(“‘ + blankImg + ‘”)’;
filt(bgPNG[1], 0);
// Unclickable elements inside PNG backgrounds.
var tags = [‘a’, ‘input’, ‘select’, ‘textarea’, ‘iframe’, ‘object’],
t = tags.length, tFix = [];
while (t–)
{
var elms = all.tags(tags[t]), e = elms.length;
while (e–) tFix.push(elms[e]);
}
var t = tFix.length;
if (t && (/relative|absolute/i).test(currentStyle.position))
alert(‘IEPNGFix: Children of positioned element are unclickable:\n\n<‘ +
nodeName + (id && ‘ id=’ + id) + ‘>’);
while (t–)
if (!(/relative|absolute/i).test(tFix[t].currentStyle.position))
tFix[t].style.position = ‘relative’;
}
else filt();
}
}

iePNGFix(1);

</script>
</public:component>

Veee IE 6.0 için yeni görüntü.

Not: Javascript’i ve HTC’yi hazırlayan arkadaşlara teşekkür ederim.

Bu makalede web tasarımcısının baş belası olabilecek transparan PNG’yi CSS ile kullanmanın yolunu inceledik.

İyi çalışmalar

Teşekkürler.

2 Yorum

  • […] 2010 SharePoint Designer 2010 Not: Daha önceleri bir makalemde transparan PNG’nin gücünü anlatmıştım. İşte o güce dayanarak 7 farklı tema üretilmiş bir portal […]

  • […] Araçlar: PS CS5, Expression Web 4, SharePoint Designer 2010 Not: Transparan PNG’nin gücü (bu konuda bir yazı yazmıştım) ile hazırladığım tasarımda “n” tane background ile “n” tane farklı […]

Yorum Yaz

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

fifteen + thirteen =