做者:Alvaro Montoro翻譯:瘋狂的技術宅css
原文:https://css-tricks.com/playin...html
未經容許嚴禁轉載前端
CSS 是樣式、佈局和表示的領域。它充斥着顏色、大小和動畫。可是你知道嗎,它還能夠在網頁上控制播放聲音。程序員
本文介紹了一些技巧。實際上它並非真正的 hack,而是針對 HTML 和 CSS 的嚴格實現。不過說實話,這仍然是一種 hack。我不建議在生產中使用它,由於音頻可能還會被 <audio>
元素或 JavaScript 進行控制。web
用 CSS 播放聲音有好幾種方法,可是其基本思想是相同的:將音頻文件做爲網頁中的隱藏對象或文檔插入,並在有操做發生時顯示它。像這樣:面試
<style> embed { display: none; } button:active + embed { display: block; } </style> <button>Play Sound</button> <embed src="path-to-audio-file.mp3" />
查看演示segmentfault
這段代碼使用了 <embed>
標籤,也可使用 <object>
獲得相似的結果:api
<object data="path-to-audio-file.mp3"></object>
關於這個演示和相關技術的快速說明。大約一年前,我用這種技術開發了一種僅使用 HTML 和 CSS 的 CodePen 小型鋼琴。效果很好,可是從那之後,狀況發生了變化,該演示在 CodePen 上再也不起做用。跨域
最大的變化與安全性有關。因爲它用的是 embed
或 object
而不是 audio
,因此導入的文件將會受到更嚴格的安全檢查。跨域訪問控制策略(CORS)強制音頻文件與導入文件的頁面位於相同的協議和域上。即便將聲音放到 base64 中也將再也不起做用。 此外,你(和用戶)可能須要在其瀏覽器設置上激活自動播放功能,此技巧才能起做用。瀏覽器
另外一個變化是,瀏覽器如今只播放一次聲音。我會發誓過去的瀏覽器每次都會播放聲音。但如今彷佛再也不行得通了,這大大限制了技巧的範圍(而且使這個鋼琴演示幾乎毫無用處)。
若是你能夠控制服務器和文件,則能夠解決 CORS 問題,可是禁用的自動播放是每一個用戶都沒法控制的事情。
能夠在 embed
標籤的定義中發現這種行爲背後的理論:
每當 非潛在活動的embed
元素變爲潛在活動狀態,而且每個仍處於處於潛在活動狀態,且其src
屬性或type
屬性被設置、更改或刪的設置,用戶代理必須使用 embed 任務源將 任務排隊來運行embed
元素設置步驟。
object
標記的定義也是如此:
每當出現如下狀況之一:
[...]
- 元素從正在渲染變爲未渲染,反之亦然,
[...] user agent 必須將任務排隊才能運行如下步驟,來(從新)肯定
object
t元素表明什麼。 [而且最終處理並運行它]
儘管咱們對 object
(文件已處理並在渲染上運行)的處理機制更清楚,但對於 embed
,具備「潛在活動」的概念,這彷佛有些複雜。儘管還有一些其餘的條件,但它會在初始渲染上運行,這與處理 object
的方式相似。
如你所見,從技術上講,這根本不是一個把戲,可是並不是全部瀏覽器的行爲方式都是如此。
與許多相似的 hack 技巧同樣,這個功能的支持也不是很好,而且隨瀏覽器的不一樣而有很大差別。
在 Opera 和 Chrome 瀏覽器上,它可以工做。可是,對於其餘基於 Chromium 的瀏覽器,該支持不多。例如,Mac 上的 Edge 能夠正確播放音頻,而 Brave 瀏覽器則不會正確播放音頻,除非你有最新版本。
在 Safari 中沒法使用,對於 Windows 上的 Internet Explorer 或 Edge 來講也是如此。在這些瀏覽器中都沒法使用。
Firefox 會在頁面加載時當即播放全部聲音,可是在隱藏並再次顯示後,將再也不播放。當聲音試圖「無用戶交互」地播放時,它會在控制檯中觸發安全警告,除非用戶首先批准該站點,不然它們將被阻止。
?總的來講,這是有趣的 CSS 技巧,不過倒是一種「不要用在發佈的產品中」的事情…… ?