最近,我驚喜地發現了一個CSS媒體特性——scripting
,它能夠在所有現代瀏覽器中使用。這意味著,我們可以根據用戶瀏覽器是否支持JavaScript來提供不同的CSS規則,從而減少未樣式化內容的閃爍或不受歡迎的布局偏移。
使用方法
使用這個特性,我們可以按以下方式漸進式增強樣式:
@media (scripting: enabled) {.my-element {/* 如果JS可用,增強樣式 */} }
或者,我們可以優雅地回退到一些備選樣式:
@media (scripting: none) {.my-element {/* 如果JS不支持,使用備選樣式 */} }
還有一個initial-only
值,適用于在頁面加載期間啟用腳本但在之后不啟用的情況。CSS媒體查詢第5級W3C工作草案中提到了一些它可能有用的場景。
例如,打印頁面,或者在服務器上渲染頁面并發送給用戶的預渲染網絡代理。
我個人不太能想象自己會經常使用initial-only
,盡管我很想找到更多實際應用中的具體例子。
特性出現之前
在這項特性出現之前,檢測JavaScript支持的一種方法是通過在html
標簽上設置一個自定義選擇器——常見的做法是添加一個no-js
類名。如果JavaScript得到支持并啟用,它會在渲染頁面內容之前移除該選擇器。當JavaScript被禁用時,我們可以提供適應體驗的備選樣式。
<html class="no-js"><!-- 頁面內容 --> </html>.no-js .my-element {/* 當JS被禁用時的樣式 */ }
組合查詢
下面是一個示例,注意到媒體查詢被結合起來檢查腳本和減少運動的條件。
@media (scripting: enabled) and (prefers-reduced-motion: no-preference) {/* JS可用且運動OK */ }@media (scripting: none), (prefers-reduced-motion) {/* JS已禁用或減少運動已啟用 */ }
每個條件當然可以有獨家樣式,如果預期的結果需要的話,但在規則集有重疊的地方,將它們結合起來也很好。
問題
更新于2024年4月21日?- 在發布這篇文章后,一些反饋浮現出來,解釋了這個媒體特性在哪些方面意外地失敗了。
- 當使用像NoScript或uBlock Origin這樣的瀏覽器擴展來禁用頁面腳本時,它的表現并不像預期的那樣。即使擴展將JavaScript關閉了,
scripting: enabled
仍然匹配。 - 如果腳本被阻止或無法加載,需要通過JavaScript來處理回退。在上面的演示中,回退需要接入演示的
scripting: none
媒體查詢規則集。
小心那些陷阱
盡管scripting
媒體特性非常有用,但上述問題提醒我們,在依賴它時需要謹慎。例如,如果一個腳本由于某種原因沒有加載,你可能需要一個備用計劃來確保內容的可訪問性和頁面的可用性。
現實世界的應用
在現實世界的網頁設計中,這意味著我們需要為那些可能由于技術或個人偏好而禁用JavaScript的用戶考慮。通過使用scripting
媒體查詢,我們可以確保所有用戶都能獲得清晰、優雅的體驗,無論他們是否選擇使用JavaScript。
結語
總的來說,scripting
媒體查詢是一個強大的工具,可以幫助我們為支持JavaScript和不支持JavaScript的環境提供適當的樣式。它讓我們能夠更好地控制頁面加載時的樣式應用,減少布局偏移,并且提供更加平滑和可預測的用戶體驗。
作為開發者,我們需要保持好奇心和學習熱情,不斷探索新的技術,只有這樣,我們才能在這個快速發展的時代中立于不敗之地。介紹一款程序員都應該知道的軟件JNPF快速開發平臺,很多人都嘗試用過它,它是功能的集大成者,任何信息化系統都可以基于它開發出來。
JNPF可以實現應用從創建、配置、開發、測試到發布、運維、升級等完整生命周期的管理。減少了傳統應用程序的代碼編寫量,通過圖形化、可視化的界面,以拖放組件的方式,即可快速生成應用程序的產品,大幅降低了開發企業管理類軟件的難度。
當然,我更建議大家成為一個全棧,不要把自己的定位局限于前端。