Cross-Browser Variable Opacity with PNG_經驗交流
Periodically, someone tells me about the magic of PNG, how it's the ideal image format for the web, and that someday we'll all be using it on our sites instead of GIF. People have been saying this for years, and by now most of us have stopped listening. Sadly, flaky browser support has made PNG impractical for almost everything; but now, with a few simple workarounds, we can finally put one of its most compelling features to use.
PNG? What?
The Portable Network Graphics, or PNG (pronounced “ping”), image format has been around since 1995, having cropped up during the now long-forgotten GIF scare, when Compuserve and Unisys announced they would begin charging royalties for the use of the GIF image format.
To provide GIF support in their applications, software makers like Adobe and Macromedia must pay royalty fees – fees which are passed down to the end user in the selling cost of the software.
When PNG appeared on the scene, web designers were ready to make the switch to the free, superior format and shun GIF forever. But over time, browsers continually failed to support PNG, and eventually most people started to forget about it. Today, nearly everyone still uses GIF habitually.
Which is a shame, because PNG makes GIF look pretty pathetic: it supports gamma correction, (sometimes) smaller file sizes, loss-less compression, up to 48-bit color, and, best of all, true alpha transparency.
To get why alpha transparency is a big deal, we must first understand one of the most annoying limitations of GIF.
Binary Transparency: the Scourge of GIF
When it comes to transparency, GIF doesn't cut it. Whereas PNG supports alpha transparency, GIF only supports binary transparency, which is a big limitation and has a couple of important implications.
For one, a GIF image can either use no transparent colors at all or have one color that's completely transparent – there are no degrees of transparency.
And if a complex GIF does contain a transparent color, the background color of the web page must match the transparent color, or else the anti-aliased area around the transparent color will be surrounded by ugly haloing and fringing. If you've spent more than five minutes as a web designer, you know what I'm talking about.
The result is that any anti-aliased transparent GIF is inextricably tied to the background color of the web page on which it lives. If you ever decide to change that color, you must also change the GIF.
Miraculously, PNG doesn't behave that way. A PNG can be transparent in varying degrees – in other words, it can be of variable opacity. And a transparent PNG is background-independent: it can live on any background color or image. Say you want your navigation on monkeys-run-amuck.com to be 65% opaque so you can see through it to your orangutan background image. You can do that. A transparent anti-aliased “Gorillas, Chimps, Gibbons, et al” title that can sit on top of any background color or image? You can do that, too.
So What About Browser Support?
By now, of course, we'd all be up to our ears in PNGs if browsers supported them reliably. But seven years after the format's inception, you still can't slap a PNG onto a web page like you can a GIF or JPG. It's disgraceful, but not as bad as it sounds.
It turns out that most of the latest versions of the major browsers fully support alpha transparency with PNG – namely, Netscape 6, Opera 6, and recently-released Mozilla 1, all on Windows; and, for the Mac, Internet Explorer 5, Netscape 6, Opera 5, Mozilla 1, OmniWeb 3.1, and ICab 1.9. Incredibly, PNG even works on Opera 6 for Linux, on WebTV, and on Sega Dreamcast.
Now, what's missing from that list?
IE5.5+/Win, bless its heart, will, in fact, display a PNG, but it doesn't natively support alpha transparency. In IE5.5+/Win, the transparent area of your PNG will display at 100% opacity – that is, it won't be transparent at all.
Bugger. So what do we do now?
Proprietary Code-o-Rama: the AlphaImageLoader
Filter
IE4+/Win supports a variety of non-standard, largely ridiculous visual filters that you can apply to any image's style. You can, for instance, fade in an image with a gradient wipe, or make it stretch from nothing to full size, or even make it swipe into place circularly, like a scene change in Star Wars.
A non-pointless gem among these is the AlphaImageLoader
filter, which is supported in IE5.5+/Win. When used to display a PNG, it allows for full alpha transparency support. All you have to do is this:
<DIV ID="myDiv" STYLE="position:relative; height:250px; width:250px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader<SPAN class=linewrap>»</SPAN> (src='myimage.png',sizingMethod='scale');"></DIV>
(Line wraps are marked ». –Ed.)
And you're in business. Perfect alpha transparency. This code works great, with only the small drawback that it's not part of any accepted web standard, and no other browser on the planet understands it.
Serving up PNGs with JavaScript
So the trick is to determine the user's browser and serve up the images appropriately: if IE5.5+/Win, then we use AlphaImageLoader
; if a browser with native PNG support, then we display PNGs the normal way; if anything else, then we display alternate GIFs, because we can't be sure that a PNG will display correctly or at all.
Using a slightly tweaked version of Chris Nott's Browser Detect Lite, we set some global variables to this effect that we can use later on.
// if IE5.5+ on Win32, then display PNGs with AlphaImageLoader if ((browser.isIE55 || browser.isIE6up) && browser.isWin32) { var pngAlpha = true; // else, if the browser can display PNGs normally, then do that } else if ((browser.isGecko) |<span class="linewrap">»</span> | (browser.isIE5up && browser.isMac) |<span class="linewrap">»</span> | (browser.isOpera && browser.isWin <span class="linewrap">»</span> && browser.versionMajor >= 6) |<span class="linewrap">»</span> | (browser.isOpera && browser.isUnix <span class="linewrap">»</span> && browser.versionMajor >= 6) |<span class="linewrap">»</span> | (browser.isOpera && browser.isMac <span class="linewrap">»</span> && browser.versionMajor >= 5) |<span class="linewrap">»</span> | (browser.isOmniweb && <span class="linewrap">»</span> browser.versionMinor >= 3.1) |<span class="linewrap">»</span> | (browser.isIcab && <span class="linewrap">»</span> browser.versionMinor >= 1.9) |<span class="linewrap">»</span> | (browser.isWebtv) |<span class="linewrap">»</span> | (browser.isDreamcast)) { var pngNormal = true; }
(Note for the faint of heart: complete source code for all the examples we cover is available at the end of the article.)
Tactic 1: Quick and Dirty with document.writes
The simplest, most reliable way to spit out PNGs is using inline document.writes based on the above detection. So we use a function like this:
function od_displayImage(strId, strPath, intWidth, <span class="linewrap">»</span> intHeight, strClass, strAlt) { if (pngAlpha) { document.write('<div style="height:'+intHeight+'px;<SPAN class=linewrap>»</SPAN> width:'+intWidth+'px;<SPAN class=linewrap>»</SPAN> filter:progid:DXImageTransform.Microsoft.AlphaImageLoader<SPAN class=linewrap>»</SPAN> (src=\''+strPath+'.png\', sizingMethod=\'scale\')" <SPAN class=linewrap>»</SPAN> id="'+strId+'" class="'+strClass+'"></div>'); } else if (pngNormal) { document.write('<img src="'+strPath+'.png" <SPAN class=linewrap>»</SPAN> width="'+intWidth+'"<SPAN class=linewrap>»</SPAN> height="'+intHeight+'" name="'+strId+'" <SPAN class=linewrap>»</SPAN> border="0" class="'+strClass+'" alt="'+strAlt+'" />'); } else { document.write('<img src="'+strPath+'.gif" <SPAN class=linewrap>»</SPAN> width="'+intWidth+'"<SPAN class=linewrap>»</SPAN> height="'+intHeight+'" name="'+strId+'" <SPAN class=linewrap>»</SPAN> border="0" class="'+strClass+'" alt="'+strAlt+'" />'); } }
Now we can call the od_displayImage function from anywhere on the page. Any JavaScript-capable browser will display an image, and, if we want to be really careful, we can accompany each call with a
It's a time-tested method, but what if we want more control over our PNGs?
Tactic 2: the Beauty & Majesty of Objects
When I told the programmer in the office next door that I was writing this article, he took one look at my code, glowered at me, and said, “Fool. Where's the abstraction? You need to use objects.”
So now we have a JavaScript object to display PNGs. Here's how we use it:
<html><head> <script language="javascript" src="browserdetect_lite.js" type="text/javascript"> </script> <script language="javascript" src="opacity.js" type="text/javascript"></script> <script type="text/javascript"> var objMyImg = null; function init() { objMyImg = new OpacityObject('myimg','/images/myimage'); objMyImg.setBackground(); } </script> <style type="text/css"> #myimg { background: url('back.png') repeat; position:absolute; left: 10px; top: 10px; width: 200px; height: 200px; } </style> </head> <body onload="init()" background="back.jpg"> <div id="myimg"></div> </body> </html>
That's it. The cool thing about the OpacityObject is that we just pass it a DIV ID and an image path and we're done. Using the appropriate technique, it applies the image as a background of the DIV, and from there we can do whatever we want with it. Fill it with text, move it across the screen, resize it dynamically, whatever – just like any other DIV.
The object works in any CSS 1-capable browser that can dynamically apply a background image to a DIV with JavaScript. It's completely flexible, and we could even use it in place of the above function.
The trade-off is that it doesn't degrade as nicely. Netscape 4.7/Win/Mac and Opera 5/Mac, for instance, won't display an image at all. And it has another significant problem, which is this:
IE5/Mac only supports alpha transparency when the PNG resides in an <img>
tag, not when it's set as the background property of a DIV. So PNGs displayed with the OpacityObject will appear 100% opaque in IE5/Mac. This problem is especially frustrating because IE5/Mac is the only browser which natively supports PNG and behaves this way. We've notified Microsoft about this apparent bug and hope for it to be fixed in an upcoming release.
But for now, these issues are the trade-off for flexibility. Obviously, choose the right tactic based on the particular needs of your project. Between them both, you can do pretty much anything with PNGs – like, for instance...
Example 1: Translucent Image on a Photo
In this simple example, we see how the same 80% opaque PNG can be displayed on any kind of background: Translucent Image on a Photo.
Example 2: Anti-Aliased Translucent Navigation with Rollovers
What a beautiful thing it would be, I'm sure you've thought from time to time, to create translucent anti-aliased images that work on any background. Well, check it out: Anti-Aliased Translucent Navigation with Rollovers.
Mouse over the images, observe the behavior of the rollovers, and click “change background” to see how the images behave on different backgrounds. Then view the source. There are a few things worth noting here:
- 正しい画像をプリロードするには、「.png」または「.gif」のいずれかを含む
strExt
という変数を作成します。 PNG と代替 GIF がファイル拡張子を除いて同じ名前を使用している限り、ブラウザは実際に使用する画像のみをプリロードします。 -
pngLink
というクラスを作成し、カーソル プロパティを「ポインター」に設定します。関数を呼び出すときにそのクラス名を関数に渡し、関数はそのクラスを PNG に適用します。その結果、IE5.5+/Win では画像リンクは実際には単なる DIV であるにもかかわらず、ユーザーが画像リンクの上にマウスを移動すると、ポインタがカーソルに変わります。 (画像の使用方法に応じて、PNG クラスに"display:block"
または"display:inline"
を追加して、画像を Netscape 6 で正しく表示できるようにすることもできます。 (詳細については、XHTML によるより良い生活を参照してください) 。) - PNG の表示に特化したいくつかのロールオーバー関数も使用します。
AlphaImageLoader
を使用して PNG を動的に交換することは可能ですが、IE5.5+/Win では難しいことがわかりました。とても遅いし、効果的なロールオーバーをするには遅すぎる。より効果的なのは、PNG を含む DIV に背景色を適用することです。色は画像の透明な部分を通して輝きます。これも高速に実行できます。この関数を呼び出すときは、表示する画像の名前と HTML の色を送信します。IE5.5+/Win では色が表示され、その他の場合は画像が表示されます。 - これらの画像にはドロップ シャドウが付いていることに注目してください。 PNG が完全に透明であっても、任意の背景画像や色を背景に貼り付けることができ、見栄えが良くなります。それはクールですか?
例 3: HTML テキストを内部に含む浮動半透明 DIV
最初の 2 つの例では、戦術 1 の即席関数を使用しました。ここで、PNG がページ上の他のコードと対話できるようにするため、今回は OpacityObject を使用して PNG を表示します。
しかし、覚えておいてください – このアプローチには欠点があり (上記を参照)、最も残念なのは、この例が IE5/Mac では完全には動作しないことです。それが苦痛を引き起こす場合は、手っ取り早く汚い機能が常にあります。それ以外の場合は、読み続けてください。
まず、DIV を作成し、それに ID を与え、高さ、幅、フォント ファミリーなど、必要なスタイル プロパティをそれに割り当てます。
次に、OpacityObject をインスタンス化するときに、その DIV の ID を渡します。画像パスも通過し、背景が半透明の DIV ができました。かっこいい!
次に、いくつかの HTML テキストを DIV に配置し、別の無関係なオブジェクト メソッドをそれに適用します (このオブジェクトは OpacityObject とは何の関係もありません。周囲にあるコードであれば何でも構いません)。これで、半透明の DIV を画面上で移動できるようになりました。うーん! 内部に HTML テキストを含むフローティング半透明 DIV.
これで、OpacityObject で何が可能になるかが垣間見えます。筋金入りの CSS/DOM の人たち、大騒ぎしてください。
可変不透明-R-あなた
取り上げたオブジェクト、関数、例のソース コードをダウンロードします。すべてのコードは、同様に含まれている調整されたバージョンの Browser Detect Lite に依存しています。 可変不透明度ソース コード。
1 つの PNG と 1 つの PNG のみ
これはすべて非常にエキサイティングですが、Web 開発者を興奮させる多くの成果と同様に、今日のブラウザーで PNG を動作させることは、それほど難しいことではありません。 Internet Explorer で完全な PNG サポートを提供するよう Microsoft を説得するために、請願 に署名することを検討してみてはいかがでしょうか。運が良ければ、この記事は間もなく廃止されるでしょう。
それまでの間、このコードを改善するためのアイデアがあれば、この記事のディスカッション フォーラムに投稿してください。たとえば、PNG ホーム サイト では、アルファ透明度をサポートしているはずの他のいくつかの不明瞭なブラウザについて説明していますが、まだ検証されていません。これらの主張のいずれかを検証できる場合、またはその他の貴重な意見がある場合は、お知らせください。それに応じてコードを更新します。
リソース
- PNG ホーム サイト
-
AlphaImageLoader
MSDN のフィルター ページ -
WebFX での PNG の動作。IE で PNG を表示する別の方法。 runtimeStyle オブジェクトの使用が含まれます。このアプローチの欠点は、PNG が CSS 背景画像
<img>
ではなく、

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

如何在Windows11上將PNG轉換為JPG在Windows10和11上,您可以使用Microsoft內建的Paint應用程式快速轉換圖片檔案。若要在Windows11上將PNG映像轉換為JPG,請使用下列步驟:開啟檔案總管並導航至要轉換的PNG映像。右鍵單擊圖像並從選單中選擇開啟方式>繪製。您的照片或圖像會在「畫圖」應用程式中開啟。注意螢幕底部的檔案大小。若要將檔案從PNG轉換為JPG,請按一下檔案並從選單中選擇另存為>JPEG圖片。當文件資源

假設您需要將檔案的副檔名從一個副檔名重新命名為另一個副檔名,例如jpg到png。這很簡單,當然!但是,如果您有多個需要更改擴展名的檔案怎麼辦?或者更糟的是,如果這些多個檔案也位於多個資料夾和子資料夾中,在一個資料夾中呢?好吧,對於一個普通人來說,這可能是一場噩夢。但對於一個極客來說,絕對不是。現在的問題是,你是不是極客。好吧,有了 極客專頁的幫助,您絕對是!在本文中,我們透過批次腳本的方法解釋瞭如何輕鬆地重命名資料夾內所有檔案的副檔名,包括您選擇的子資料夾從一個副檔名到另一個副檔名。注意:

我們中的許多人在Python 程式碼中一遍又一遍地看到這個程式碼片段:with open('Hi.text', 'w') as f: f.write("Hello, there") 但是,我們中的有些人不知道with 有什麼用,以及為什麼我們需要在這裡使用它。在此閱讀中,您將找到關於 with 可解決的幾乎所有問題。讓我們開始吧!首先,讓我們考慮一下如果不使用 with 關鍵字我們需要做什麼。在這種情況下,我們需要先開啟檔案並嘗試執行 write。不管成功與否,我們最好在

對於PHP開發者來說,遇到「Undefinedvariable」警告訊息是非常常見的一件事情。這種情況通常出現在嘗試使用未定義的變數時,會導致PHP腳本無法正常執行。這篇文章將介紹如何解決「PHPNotice:Undefinedvariable:的解決方法in」的問題。造成問題的原因:在PHP腳本中,如果變數未被初始化或賦值,就會產生「Un

png是一種採用無損壓縮演算法的點陣圖格式。 PNG格式有8位、24位、32位三種形式,其中8位PNG支援兩種不同的透明形式,24位PNG不支援透明,32位PNG在24位基礎上增加了8位透明通道,因此可展現256級透明程度。

PNG是一種常見的圖像檔案格式,全稱為「可移植網路圖形」(PortableNetworkGraphics)。它是一種無損壓縮格式,旨在取代過去常用的JPEG和GIF格式。 PNG格式在1995年由圖形設計師ThomasBoutell創建,並在隨後的幾年裡逐漸流行起來。 PNG格式的特點是支援高品質的影像壓縮,同時保留了影像的細節和色彩資訊。與JPEG格式相

把圖片弄成png的方法:1、打開ps軟體;2、找到需要處理的圖片比導入到軟體中;3、將圖片的背景接色調整為白色;4、選取「魔術橡皮擦」工具,點選圖片上需要透明化的背景區域;5、依序點擊選單列的“文件”-“儲存為”,在彈窗的保存格式中選擇“png”,導出png格式的圖片即可。

png是一種常見的影像檔案格式,它是一種無損的壓縮格式,也就是說它不會損失影像品質。 PNG代表可移植網路圖形(PortableNetworkGraphics)。 PNG檔案格式最初在1996年由一組開發者共同創建,旨在取代一些有限的和低效的文件格式,如GIF。 PNG檔案格式基於無損壓縮演算法,利用索引、調色板和灰階影像來儲存影像資料。與其他影像格式相比,PN
