能用 CSS 能播放聲音嗎?

做者: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 上再也不起做用。跨域

最大的變化與安全性有關。因爲它用的是 embedobject 而不是 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 技巧,不過倒是一種「不要用在發佈的產品中」的事情…… ?


本文首發微信公衆號:前端先鋒

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章


歡迎繼續閱讀本專欄其它高贊文章:


相關文章
相關標籤/搜索