| 方案 | 優點 | 缺點 | 適用性 |
|---|---|---|---|
| 圖片預處理 | 兼容性完美、零運行時開銷 | 工作量大、切換困難、動態圖片無法處理 | 靜態站點、特殊紀念日 |
| IE CSS Filter | 代碼極簡 filter: gray; | 僅 IE 支持、性能差、已棄用 | 純 IE 內網環境 |
| JavaScript Canvas | 現代瀏覽器全支持、可控制範圍 | 需遍歷 DOM、大圖/多圖性能壓力大、跨域圖片受限 | 現代項目、臨時灰度需求 |
基於 Canvas 實現,自動處理圖片、背景圖、Canvas 等元素,支持 IE 6+ 及所有現代瀏覽器。
grayscale.js(GitHub: karlhorky/grayscale)<script src="grayscale.js"></script>window.onload = function() {
grayscale(document.body);
};
避免對整個 body 處理導致性能問題,精確指定容器:
// 僅對內容區灰度,保留導航、側邊欄正常
grayscale(document.getElementById('content-area'));
// 或針對特定圖片
grayscale(document.querySelectorAll('.post img'));
background-image 會導致 Canvas 重繪失敗,解決:僅處理 <img> 標籤Access-Control-Allow-Origin: * 並給 <img> 加 crossorigin="anonymous"grayscale()requestAnimationFrame 分批處理,避免主線程阻塞現代瀏覽器(Chrome 18+、Firefox 35+、Edge 12+、Safari 6+)原生支持:
.grayscale {
filter: grayscale(100%);
-webkit-filter: grayscale(100%); /* Safari 6-8 */
}
配合 @supports 實現優雅降級:
.grayscale {
filter: grayscale(100%);
}
@supports not (filter: grayscale(100%)) {
.grayscale {
/* 老瀏覽器回退:JS 方案或無效果 */
}
}
grayscale.jsdocument.body 全量處理,指定具體容器// 完整啟用邏輯
if (CSS.supports('filter', 'grayscale(100%)')) {
document.documentElement.classList.add('grayscale-supported');
} else {
// 動態載入 polyfill
const script = document.createElement('script');
script.src = 'grayscale.js';
script.onload = () => grayscale(document.getElementById('main-content'));
document.head.appendChild(script);
}