
認識 <iframe> 標籤的結構與常見屬性
在深入各種應用情境之前,我們先來了解 <iframe> 是什麼以及它有哪些重要的屬性。<iframe>(inline frame)是一種內聯框架元素,允許您在當前網頁中嵌入另一個 HTML 網頁或內容。例如,您可以用 <iframe> 把一段 YouTube 影片、一個地圖,甚至一則社群貼文嵌入到自己的網頁版面中。
<iframe> 的基本語法結構如下:
<iframe src="內容的網址" width="寬度" height="高度" frameborder="0" allowfullscreen></iframe>
上述是一個常見的範例,其中:
- src: 定義要嵌入的外部內容網址。這是唯一必要的屬性,例如地圖的網址、影片的分享連結、貼文的嵌入網址等。
- width 與 height: 設定 <iframe> 框架的寬度與高度。可以使用像素值(例如 width="600")或百分比(例如 width="100%" 代表相對父容器100%的寬度)。若未指定,瀏覽器預設會給一個大約300×150像素的大小,通常不足以呈現大部分內容,因此建議明確設定尺寸或使用響應式技巧(稍後會介紹)。
- allowfullscreen: 布林值屬性,允許嵌入的內容全螢幕顯示。常用於影片等需要全螢幕播放的情境。只要在 <iframe> 標籤中包含這個屬性(不需要設定值),就表示允許使用者點擊內容中的全螢幕按鈕。
- frameborder: 決定是否顯示邊框。frameborder="0" 通常用來移除預設的框線,使嵌入內容更融入頁面。HTML5 已將此屬性標記為過時,但許多嵌入代碼仍沿用它;您也可以改用 CSS style="border: none;" 達到相同效果。
- allow: 用於設定允許的功能或權限。例如:allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"。這個屬性對應權限策略(Permissions Policy),可以控制嵌入內容能使用的裝置功能或行為。以 YouTube 影片為例,上述 allow 設定允許影片可自動播放、使用剪貼簿寫入、啟用設備重力感應等功能,以及使用畫中畫模式播放影片。若您需要嵌入的內容使用麥克風、攝影機等,也需要在此屬性中明確允許。
- sandbox: 這是一項強大的安全性屬性,能對 <iframe> 內的內容進行沙箱化限制。啟用 sandbox 後,嵌入內容會被瀏覽器視為與主頁面隔離的環境,許多動作將被禁止,如執行腳本、彈出視窗、表單提交等。您可以透過給 sandbox 屬性加入特定值來"解封"某些功能。
例如:
sandbox="allow-scripts" 允許嵌入內容執行 JavaScript 腳本。
sandbox="allow-same-origin" 允許 <iframe> 中的內容被視為與主頁面同源(否則預設為不同源,無法存取彼此的 Cookie 或 DOM)。
您可以同時指定多個允許值,如:sandbox="allow-scripts allow-same-origin allow-popups" 等。如果不寫任何值(或直接寫 sandbox 而不指定參數),則表示套用所有限制。沙箱屬性的作用及相關安全議題,我們會在後面安全性章節詳述。
- name: (可選)替這個 <iframe> 命名。這個名稱可用於目標連結,例如使用 <a target="iframe名稱"> 將連結的開啟目標指定為該 iframe。一般嵌入第三方內容時較少用到。
- referrerpolicy: (可選)控制當前頁面在抓取 <iframe> 資源時送出的 Referer 資訊。常用值如 no-referrer(不傳送引用資訊)或 no-referrer-when-downgrade 等。在嵌入一些需要 API Key 驗證的服務(如 Google 地圖)時,可能需要設定適當的 referrerpolicy 以符合其允許的來源。
- loading: (可選)設定 <iframe> 的載入策略。loading="lazy" 可以延遲加載 iframe,直到使用者滾動接近該框架位置時再載入內容,這對提升頁面初始載入性能很有幫助;預設值是 eager(立即載入)。
???? 小提醒: 為了無障礙考量,建議為 <iframe> 加上 title 屬性,簡要描述嵌入內容的用途。例如:<iframe ... title="課程介紹影片"></iframe> 可讓使用螢幕閱讀器的使用者了解這個 iframe 的內容是什麼。這對於提升網站易用性非常重要。
以上是 <iframe> 的常見屬性和結構說明。了解了這些之後,接下來我們將進入各種應用場景的實作教學,包括如何實際嵌入 Google 地圖、YouTube 影片和社群媒體貼文。在每個章節中,我們都會提供對應的平台範例程式碼,方便您直接複製使用。
使用 <iframe> 嵌入 Google 地圖
想像您正在撰寫一份課程教材,希望在頁面中直接展示地圖(例如顯示某個活動地點或教學案例中的地理位置)。利用 <iframe>,我們可以很輕鬆地將 Google 地圖嵌入網頁,讓讀者可以直接在您的頁面中縮放、拖動和瀏覽地圖,而無需另開瀏覽器視窗。
嵌入 Google 地圖有兩種主要方式:
- 使用 Google Maps 提供的嵌入碼: 這是最簡單的方法。打開 Google 地圖網站,搜尋您想呈現的位置,點擊該地點資訊卡上的「分享」,再選擇「嵌入地圖」標籤。Google 會提供一段 <iframe> HTML 程式碼,您只需複製貼上到自己的網頁程式碼中即可。這段程式碼通常已包含設定好的寬、高以及地圖的特殊網址參數,非常方便。
- 手動組合 Google 地圖的 <iframe> URL: Google Maps 的 Embed 服務允許透過特定的 URL 參數來呈現不同的地圖內容。例如您可以指定查詢地址、座標、縮放層級等。以下我們提供一個範例:
<iframe
width="600"
height="450"
frameborder="0" style="border:0"
src="https://maps.google.com/maps?width=600&height=450&hl=zh-TW&coord=25.033611,121.565000&q=台北101&zoom=15&output=embed"
allowfullscreen>
</iframe>
上述範例做了以下設定:
src 中的 maps.google.com/maps?...&q=台北101...&output=embed 是Google地圖的嵌入查詢網址。我們在參數中使用 q=台北101 來指定查詢的地點(台北101),也可以用英文或座標表示;coord=25.033611,121.565000 指定地圖中心的經緯度座標(這裡剛好是台北101的位置);zoom=15 設定初始縮放等級(數值範圍通常是1到21,數字越大地圖放越近);hl=zh-TW 設定介面語言為繁體中文;output=embed 是必要參數,表示要輸出適合 <iframe> 的嵌入地圖。
width 和 height 設為600x450像素,您可以依需要調整這兩個值,或改用百分比讓地圖寬度自適應版型(例如 width="100%")。
frameborder="0" style="border:0" 移除了地圖周圍的邊框。
allowfullscreen 允許使用者將地圖切換為全螢幕顯示。當地圖中有全螢幕按鈕(例如使用街景服務時),這個屬性確保該按鈕可以正常運作。
將上述程式碼插入網頁後,讀者將能直接看到一個互動式的 Google 地圖。如果想嵌入路線規劃或其他地圖模式,Google 也提供對應的參數。不過需要注意的是,某些進階用法(例如顯示即時路況、特定地圖樣式等)可能需要使用 Google Maps Platform 的 Embed API 和 API 金鑰。對一般展示地點資訊而言,不用 API 金鑰的免費嵌入已足夠。此外,Google 地圖要求嵌入框架的最小尺寸為 200×200 像素以上,太小的框架地圖將無法正常載入,因此務必留意尺寸設定。
快速貼士: 如果地圖嵌入後沒有顯示,請確認您的 src URL 是否正確無誤,而且網頁必須使用 HTTPS 協議(大部分主流瀏覽器會阻擋從 HTTPS 網站中載入 HTTP 資源的行為)。Google 地圖的嵌入網址本身就是 https 的,確保您的頁面也是透過 https 服務,就能避免地圖被瀏覽器攔截。
使用 <iframe> 嵌入 YouTube 影片
當您希望在教學內容中直接展示影片(例如講解影片或示範操作),YouTube 提供了方便的影片嵌入功能。透過 <iframe>,讀者可以直接在您的頁面上播放 YouTube 影片,而不需另開 YouTube 網站。
要嵌入 YouTube 影片,步驟如下:前往 YouTube 網站找到您想嵌入的影片,點擊「分享」按鈕,然後選擇「嵌入」。這會彈出一段 <iframe> 程式碼,裡面包含該影片的特殊嵌入網址以及一些建議的屬性設定。您可以直接複製這段程式碼,貼進您的網頁 HTML 中。
以下是一個 YouTube 影片的 <iframe> 嵌入範例:
<iframe width="560" height="315"
src="https://www.youtube.com/embed/VIDEO_ID"
title="YouTube 影片播放器" frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen>
</iframe>
請將上述 VIDEO_ID 替換為實際的 YouTube 影片ID(例如 dQw4w9WgXcQ 等)。範例中值得注意的部分包括:
- src="https://www.youtube.com/embed/VIDEO_ID":這是 YouTube 專用的影片嵌入網址格式,其中包含影片的ID。與一般觀看頁面的 URL 不同,嵌入網址必須使用 https://www.youtube.com/embed/... 路徑。千萬不要直接嵌入一般 YouTube 頁面的網址,否則 <iframe> 只會顯示一個錯誤訊息或空白。
- width 與 height:在這裡設定為 560×315,是16:9寬高比的常見尺寸。您可以調整這兩個值,或改為以百分比寬度配合CSS維持比例(稍後的響應式設計章節會詳細說明)。
- title:我們在這裡加入了 title="YouTube 影片播放器",讓這個 iframe 對於使用輔助技術(如螢幕閱讀器)的使用者來說,有一個描述。這是良好的習慣。
- frameborder="0":移除預設邊框,使影片看起來更乾淨。
- allow:這裡包含一系列由分號分隔的特許權限,允許影片使用一些瀏覽器特性:
- accelerometer:允許使用裝置加速器資訊(某些360°影片可能用得到)。
- autoplay:允許影片自動播放(不過瀏覽器政策通常要求影片靜音才能自動播放,否則會被阻擋)。
- clipboard-write:允許複製內容到剪貼簿(YouTube 影片可能用於分享按鈕的複製連結功能)。
- encrypted-media:允許播放加密的媒體(需要DRM授權的內容)。
- gyroscope:允許使用裝置陀螺儀(某些影片或YouTube功能可能會用到裝置方向)。
- picture-in-picture:允許影片畫中畫播放。使用者可以將影片縮成小窗懸浮於螢幕一角繼續播放。
- web-share:允許使用 Web Share API(讓使用者透過瀏覽器內建分享功能來分享影片)。
- allowfullscreen:允許影片播放器進入全螢幕模式,這對於大部分影片來說是必要的。使用者可以點擊播放器右下的全螢幕按鈕,看全畫面影片。
當您把這段 <iframe> 嵌入碼加入網頁,儲存並在瀏覽器中開啟,就會看到 YouTube 的影片播放器直接出現在您的頁面上,供讀者播放、暫停或調整音量等。
進階提示: 您可以在 YouTube 嵌入網址後加上一些查詢參數來控制影片行為。例如:
?autoplay=1&mute=1 可以讓影片在載入後自動播放並靜音(由於瀏覽器限制,自動播放通常必須靜音才生效)。
?controls=0 可以隱藏影片播放器的控制列(播放/暫停按鈕等)。
?start=30&end=90 可以設定從影片的第30秒開始播放,在第90秒停止。
這些參數可以組合使用,例如:src="https://www.youtube.com/embed/VIDEO_ID?autoplay=1&mute=1&controls=0". 不過請謹慎使用自動播放等功能,避免影響使用者體驗。
使用 <iframe> 嵌入 Facebook 帖文
Facebook 上有許多適合教學引用的內容,例如知名專頁發佈的貼文、影片或討論串等。透過 Facebook 提供的社群外掛(Social Plugins),您可以將公開的 Facebook 帖文嵌入到自己的網頁中,讓讀者直接閱讀貼文內容、觀看貼文內的影片,甚至可以按讚或分享(依照 Facebook 外掛的提供功能)。
嵌入 Facebook 帖文的方式:
- 使用 Facebook 官方嵌入工具: 前往您想嵌入的公開貼文(例如某Facebook專頁的貼文)。在貼文的右上角通常有一個選單按鈕(「...」),點擊後如果該貼文允許嵌入,會有「Embed 帖文」或「嵌入」的選項。點選它會出現一段程式碼供您複製。Facebook 官方提供的嵌入程式碼通常包含一個 <iframe> 或一段 <div> 和 SDK 的引用。如果是採用 <div> + SDK 的方式,您需要同時載入 Facebook 的 SDK 腳本才能運作;相對地,直接使用 <iframe> 則無需額外載入 SDK,更為簡單。
- 使用 <iframe> 插入 Facebook 貼文插件: Facebook 其實有一個專門的插件頁面,可以直接透過 <iframe> 來載入貼文。這個插件的 URL 格式如下:
https://www.facebook.com/plugins/post.php?href=貼文網址&show_text=true&width=設定寬度
為了說明,我們提供一個範例(請注意,由於貼文網址很長,以下用斷行呈現,實際使用時應該是一行):
<iframe
src="https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2FFacebookPage%2Fposts%2F1234567890&show_text=true&width=500"
width="500" height="680"
style="border:none;overflow:hidden;"
scrolling="no" frameborder="0"
allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"
allowfullscreen>
</iframe>
在這段範例中:
src 是指向 Facebook 的貼文插件,其中包含了一個貼文的網址參數(以 href= 開頭)。為了安全,網址通常需要進行URL編碼處理(如範例中的 %3A%2F%2F 等,它們是 :// 的編碼形式)。您可以將 href= 後的值替換成您欲嵌入的公開貼文的網址。
show_text=true 表示在嵌入時顯示貼文的文字內容(如果不需要文字,只想嵌入比如純照片,可設為 false,但大多數情況下我們會保留文字)。
width=500 設定插件的寬度為500像素。這裡我們同時在外層的 <iframe> 標籤也寫了 width="500",兩者應該對應以確保顯示正確。您也可以將寬度改為百分比,像 width="100%" 並將 URL 裡的 width=auto,如此可自適應容器寬度(稍後響應式部分會提到)。
height=680 是根據貼文內容估算的一個高度值。不同貼文高度會不同,您可能需要視情況調整,否則內容若超出此高度就會被截掉(因為我們將 overflow:hidden)。
style="border:none;overflow:hidden;" 去除了邊框,並隱藏溢出內容的滾動條。Facebook 貼文插件在高度不足時,內容超出的部分預設會顯示滾動條,我們這裡用CSS隱藏它以保持版面美觀。如果您希望讓使用者能夠滾動閱讀完整內容,可以將 overflow:hidden 改成 overflow:auto 並保留 scrolling="yes"。
scrolling="no" 搭配 overflow:hidden 使用,以確保在大多數瀏覽器下都不顯示滾動條。
allow 屬性列出 Facebook 貼文可能用到的權限,例如影片自動播放(autoplay)、剪貼簿寫入、加密媒體(播放Facebook影片所需),以及畫中畫、web-share 等。
allowfullscreen 允許嵌入內容全螢幕。對於 Facebook 貼文來說,如果貼文中包含影片,使用者點擊影片的全螢幕按鈕就需要此權限。
將以上程式碼加入網頁後,應該就能看到該Facebook貼文完整地出現在您的頁面裡,包括文字、圖片、按讚和留言數,以及一個Facebook的頂部橫幅(顯示 Facebook logo 及提供查看更多的連結)。
注意事項:
被嵌入的Facebook內容必須是公開的。如果貼文的隱私權限不是公開(例如僅好友可見),那即使嵌入了別人也看不到內容。
Facebook 的嵌入插件會自動套用 Facebook 的樣式風格,但寬度通常會依您設定而定,高度則可能需要您手動調整以容納內容(尤其在行動裝置上,貼文的文字可能因為換行而佔用更多高度)。
您可以嵌入的不只是單一貼文。Facebook 還提供其他類型的插件,例如「影片播放器插件(video.php)」用於嵌入公開影片、「專頁插件(page.php)」用於嵌入整個專頁資訊等。如果您的應用需要,原理都類似,都是透過 <iframe src="https://www.facebook.com/plugins/..."> 的方式載入。
使用 <iframe> 嵌入 Instagram 帖文
Instagram 的內容(例如照片牆貼文、Reels 短片等)在教學平台上有時也具有價值,尤其是展示視覺案例或社群反饋時。不同於前面介紹的 Google 地圖與 YouTube,Instagram 官方的嵌入方式稍有不同:它採用的是一段 <blockquote> 加上一個腳本的形式,而非單純一個 <iframe> URL。不過您依然可以很方便地將 Instagram 帖文呈現在頁面上,下面我們來看看怎麼做。
要嵌入 Instagram 貼文,步驟如下:
前往您想嵌入的 Instagram 帖文(必須是公開帳號的貼文,私人帳號的內容無法對未授權的用戶顯示)。
在該貼文的右上角點擊選單(⋯),選擇「Embed」(嵌入)。如果您在桌面瀏覽器上,此選項會提供一段代碼讓您複製。
將該段代碼貼到您的網頁 HTML 中適當的位置。
Instagram 提供的嵌入代碼看起來大致如下:
<blockquote class="instagram-media" data-instgrm-version="14" style="width: 100%; max-width: 540px; margin: 0 auto;"
data-instgrm-permalink="https://www.instagram.com/p/POST_ID/"
data-instgrm-captioned>
</blockquote>
<script async src="//www.instagram.com/embed.js"></script>
解釋這段代碼:
<blockquote class="instagram-media" ...> 這個區塊是一個容器,Instagram 的嵌入程式碼利用這個容器來載入貼文。裡面通常還會包含一個 <a> 標籤連結到該貼文,但現在 Instagram 要求使用它們提供的腳本來渲染內容,因此我們不需要自行填入任何文字。在這個 blockquote 上,有幾個 data- 開頭的屬性:
- data-instgrm-permalink:指定要嵌入的貼文鏈接(永久鏈接)。把 POST_ID 換成實際的Instagram貼文ID或代碼即可。注意鏈接末尾的 / 不能省略。Instagram 官方提供的代碼中,這個鏈接通常還帶有一些參數如 utm_source=ig_embed 等,不過那些對功能沒有影響,可以保留或略去。
- data-instgrm-version="14":這是Instagram嵌入代碼的版本標記。目前最新版通常是14,可能會更新。保持這個不變即可。
- data-instgrm-captioned:此屬性若存在,表示在嵌入時包含貼文的標題(caption)文字。如果您不想顯示說明文字,可以移除這個屬性。
- style="width: 100%; max-width: 540px; margin: 0 auto;":這段 inline 樣式通常也是官方代碼帶的,用來使Instagram貼文在頁面上置中,並限制最大寬度為540px(Instagram 貼文在桌面上的最大寬度)。您可以視需要調整或覆蓋這些樣式。例如,如果在手機上希望貼文寬度自適應,保持 width:100% 即可,max-width 可以改大或取消。
- <script async src="//www.instagram.com/embed.js"></script>:這行腳本非常重要。它是Instagram提供的嵌入腳本,會自動搜尋頁面上的 instagram-media 類別 blockquote,並將其替換成真正的Instagram內容(通常是一個iframe,內含貼文的HTML)。async 屬性表示非同步加載腳本,不阻塞頁面渲染。src 使用 // 開頭是協議相對的URL(在HTTPS頁面中它會自動用HTTPS抓取腳本)。確保不要遺漏這行,否則前面的 blockquote 內容不會轉換,讀者將只看到一個空的方框。
當上述代碼正確放置後,打開您的頁面,Instagram 帖文就會出現在那個位置。它會包括:
帳戶名稱和頭像(可點擊進入Instagram查看該帳戶)。
該則貼文的照片或影片內容。如果是影片,會有播放按鈕,可以直接播放。
帖子的說明文字(caption),前提是我們在 blockquote 加了 data-instgrm-captioned 或官方代碼自帶時未移除。
Instagram 標誌及「View on Instagram」的連結(讓用戶可以點擊在Instagram上查看原帖)。
貼文的按讚和留言數,但僅作為純文字顯示(Instagram嵌入不允許直接在您的網站上進行按讚或留言互動)。
注意: 與 Facebook 類似,Instagram 嵌入也只能用於公開帳號的貼文。如果嘗試嵌入私人帳號內容,非授權用戶將無法看到。另外,Instagram 的嵌入腳本會將所有樣式和功能一併載入,您不需要也無法自行修改嵌入內容的外觀(例如字體顏色等),因為那是在Instagram提供的iframe內部。但您可以透過 CSS 調整 <blockquote> 外圍容器的布局。
安全性考量:X-Frame-Options、Clickjacking 與 sandbox 機制
在使用 <iframe> 嵌入第三方內容時,安全性是一個不可忽視的議題。以下我們探討幾個重要的安全相關主題,包括為什麼有些網站無法被嵌入、什麼是點擊劫持(Clickjacking)攻擊、以及如何善用 sandbox 屬性保護使用者。
為什麼有些網站無法被 <iframe> 嵌入?
您可能曾經嘗試用 <iframe> 加載某個網站的頁面,卻發現它顯示空白或出現錯誤訊息,這通常不是您的程式碼問題,而是對方網站有意阻止被別人嵌入。網站可以透過一個回應標頭 (HTTP header) 來控制這件事,最常見的就是 X-Frame-Options。
X-Frame-Options 是伺服器在回應HTTP請求時發送的參數,用來告訴瀏覽器「本頁是否允許被嵌入及被誰嵌入」。它有幾個值:
DENY:完全不允許此頁面被嵌入在任何 <iframe> 或 <frame> 中,即使嵌入者與自身同網域也不行。
SAMEORIGIN:只允許同網域的頁面嵌入。例如 A 網站的頁面若設定了 SAMEORIGIN,那只有來自 A 網站自己(網域相同)的 <iframe> 才能載入它。其他網域的站點試圖嵌入時會被阻擋。
ALLOW-FROM <來源網址>:允許特定網域或網址的頁面嵌入(這是舊規範,已被大多數瀏覽器棄用,取而代之的是 Content Security Policy 內的 frame-ancestors 設定,但概念類似)。
如果網站設置了上述限制,當您嘗試用 <iframe> 載入它時,瀏覽器會根據指示拒絕顯示內容。比如常見的大型網站(銀行網站、某些新聞媒體)通常會設置 X-Frame-Options: DENY 來避免被他人嵌入。遇到這種情況,作為嵌入方您幾乎沒有辦法繞過限制(也不建議試圖繞過),這是人家站點出於安全考量的設計。解法通常只能是尋找該站是否提供官方的嵌入工具或 API。比如前述的 Facebook、Instagram 都不能直接 iframe 他們整個網站,但提供了專用的嵌入插件 URL 或腳本來實現安全的嵌入。
點擊劫持(Clickjacking)是什麼?
點擊劫持是一種網絡攻擊手法,攻擊者會將目標網站以隱藏的 <iframe> 嵌入在他自己的惡意頁面中,再引誘使用者去點擊某些東西。由於目標網站被透明地覆蓋在攻擊者頁面上方,用戶實際點擊的可能是目標網站裡的按鈕,但他以為自己點的是眼前看到的內容。透過這種欺騙,攻擊者可能讓用戶無意中執行一些敏感操作,比如在銀行網站上點擊「轉帳」按鈕等。
想像一個情境:您正在看一個看似無害的網頁,上面有個大大的「點此領取優惠」按鈕。其實這個網頁背後偷偷用 <iframe> 載入了您銀行網站的轉帳頁面,並把按鈕的位置與銀行網站中的「確認轉帳」按鈕對齊、將 iframe 設為透明。當您點下去時,表面上是點了優惠按鈕,但實際上點擊穿透到了隱形的銀行頁面 iframe,觸發了轉帳操作!如果您先前在銀行網站已登入,這可能導致資金被轉走——這就是一次 clickjacking 攻擊。
為了防禦點擊劫持,網站才會實施前述的 X-Frame-Options 或 CSP (Content Security Policy) 中的 frame-ancestors 限制,乾脆阻止任何外部來源的嵌入。對於我們作為嵌入第三方內容的一方來說,需要尊重這些限制。若某內容無法嵌入,我們只能放棄或尋找替代方案(例如提供連結讓用戶點擊後在新視窗開啟)。
善用 sandbox 保護用戶
除了仰賴網站本身的安全策略,我們作為嵌入方,也可以主動運用 <iframe> 的 sandbox 屬性來增強安全性。當我們從第三方來源嵌入內容時,如果不確定對方內容的可靠性,sandbox 可以給該內容加上一層「緊箍咒」。
將 <iframe sandbox> 啟用時,瀏覽器會對其中的內容施加一系列嚴格限制,例如:
禁止執行任何腳本。
禁止讀寫 cookie、LocalStorage 等瀏覽器存儲(因為被視為不同來源)。
禁止發起彈窗(如 window.open 會被攔截)。
禁止表單提交等。
這些限制預設全部打開,但我們可以透過 sandbox="允許項目" 來細緻控制。前面我們已簡述了一些可允許的項目,例如 allow-scripts、allow-same-origin 等。再舉幾個可能用到的例子:
如果您嵌入的內容需要能夠開啟新視窗(比如某些廣告會嘗試跳出自己的著陸頁),您可加入 allow-popups。
如果嵌入內容需要使用麥克風或攝像頭(例如嵌入一個線上會議小工具),則加入 allow-modals(允許使用 alert/confirm 等對話框)和透過 allow="camera; microphone" 等在權限策略中一併開放麥克風/攝影機存取權。
預設情況下 sandbox 會讓 <iframe> 內容被視為與主頁不同源,這雖然增強了隔離,但有時您希望嵌入自己網站的另一個頁面且需要與主頁共享上下文(如 cookie),那就可以加上 allow-same-origin 解除同源限制。不過要注意千萬別同時給了 allow-scripts 和 allow-same-origin 給一個您不信任的第三方內容,否則對方的腳本將能讀寫您的網頁內容,產生嚴重安全風險。
總之,sandbox 就像一組開關,讓您決定嵌入內容的自由度。默認是全部關閉的(完全關進沙盒),您可以按需開啟部分開關。如果是不信任的來源,可以索性一個都不開,確保它什麼也做不了;如果是信任的內容且需要特定功能,才開放那些必要的權限。良好運用 sandbox,可以在保護使用者的同時,享受 <iframe> 帶來的便利。
響應式設計:讓 <iframe> 隨螢幕大小自動調整
在各種裝置(桌機、平板、手機)上呈現嵌入內容時,我們希望 <iframe> 可以根據螢幕大小自適應,而不需要固定寬高造成小螢幕瀏覽困難或空白。接下來我們介紹幾種實現響應式 <iframe> 的技巧。
使用百分比寬度與相對高度
最簡單的方式是把 <iframe> 的寬度設為百分比,比如 width="100%",讓它填滿父容器的寬度。高度則可以根據內容的長寬比例來動態調整。如果內容有固定比例(例如影片通常是16:9),我們可以透過 CSS 來維持這個比例。
方法一:使用容器 + padding 百分比技巧
外面包一個父容器 <div>,寬度100%,然後給這個容器一個 padding-top 值來充當高度。這個值的計算基於所需的比例。例如16:9的比例,高度/寬度=9/16=56.25%,所以 padding-top: 56.25%。這個 padding-top 會根據容器寬度自動計算高度(因為padding百分比是相對於元素寬度)。
再將 <iframe> 設為絕對定位充滿這個容器。
範例:
<div class="video-container">
<iframe src="https://www.youtube.com/embed/VIDEO_ID" frameborder="0" allowfullscreen></iframe>
</div>
對應的 CSS:
.video-container {
position: relative;
width: 100%;
padding-top: 56.25%; /* 16:9比例 */
/* 若嵌入內容不是16:9,可調整此比例,例如4:3可用75%, 1:1用100% */
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
這樣,.video-container 在不同螢幕寬度下高度會自動保持16:9比例,而裡面的 <iframe> 則撐滿整個容器,達到響應式縮放的效果。這種做法廣泛適用於影片、地圖等具有固定比例的內容。
方法二:使用 CSS aspect-ratio 屬性(新)
現代瀏覽器已支持 aspect-ratio CSS 屬性。我們可以直接對 <iframe> 設定,例如:
iframe.responsive-map {
width: 100%;
aspect-ratio: 16 / 9; /* 寬高比例16:9 */
border: none;
}
然後在 HTML:
<iframe class="responsive-map" src="地圖的嵌入網址" allowfullscreen></iframe>
aspect-ratio: 16/9 告訴瀏覽器維持元素的寬高比例16:9。搭配 width:100%,高度將自動按比例計算。這種方式比起傳統padding hack更簡潔,不需要多一層容器。不過要注意相容性,aspect-ratio 在較舊的瀏覽器上可能不被支援,但在2025年主流瀏覽器中應已普遍適用。如果需要照顧老舊瀏覽器,用方法一較穩妥。
使Facebook/Instagram嵌入響應版面
對於我們之前討論的 Facebook 插件及 Instagram 貼文,也有一些響應式處理的技巧:
Facebook 貼文插件:可以在插件的 URL 將 width 設為 auto 並使用 CSS 強制 iframe 寬度100%。例如前述範例調整為:src="...&width=auto" 且 <iframe style="width:100%;">。Facebook 插件會自動根據容器寬度縮放內容。不過高度仍然需要手動設定或透過腳本調整。常見做法是給個大致的最大高度,或在不同螢幕使用不同的高度。也有人用 JavaScript 監聽視窗大小改變時動態更新 iframe 的高度,使其比例近似維持。
Instagram 貼文:官方腳本會根據容器寬度自適應顯示,一般來說我們只要確保 .instagram-media 容器寬度是100%或設定好 max-width 即可(官方建議540px為上限)。高度方面Instagram腳本也會自動調整貼文高度,所以通常不用額外處理。如果發現某些狀況下高度沒有跟著變(內容被截斷),可能是腳本載入時就決定高度了;解法可以嘗試在載入腳本前先給容器一個合理的高度,或在貼文完全載入後再行調整。但大多數情況下Instagram嵌入是「寬度適應、高度自調」的,開發者不需要干預。
防止小螢幕下內容溢出
當 <iframe> 所嵌內容寬度固定(例如某些第三方小工具沒有響應式版本)時,小螢幕可能會出現水平捲軸或被裁切。我們可以在外層容器上加上 overflow-x: auto; 允許橫向滾動,或以 CSS transform: scale() 做縮放(進階技巧,但縮放會影響清晰度和操作,因此不推薦,僅當不得已時使用)。
總之,響應式的重點在於:寬度盡量百分比,維持比例,必要時允許滾動。透過以上方法,您的嵌入內容在手機上也能有良好的顯示效果,不會大到超出螢幕或小到看不清。
進階應用:結合 JavaScript 或 CSS 的技巧
在基本的嵌入之外,您可能還想實現更動態或進階的功能。以下我們簡要提及幾種可以結合 JavaScript/CSS 的應用情境,供您發想:
- 動態載入/切換 <iframe> 內容: 您可以使用 JavaScript 來改變 <iframe> 的 src 屬性,從而實現同一個框架區域切換不同內容。例如,點擊不同按鈕,對應載入不同地圖位置或影片。只需取得 iframe 元素,修改其 src 即可。
- 與嵌入內容通信: 如果您嵌入的是同源的頁面(例如同一網站的不同頁),可以透過 JavaScript 存取 iframe 的 contentWindow 或內容的 DOM 進行雙向通信。但大部分第三方內容不是同源,無法直接存取。這種情況下,若需要通信,可以利用 HTML5 的 postMessage 機制——嵌入頁面和主頁可以互相發送消息,前提是嵌入頁有對應的代碼接收並處理消息。比如某些嵌入的小工具提供 postMessage API 讓父頁控制其行為。
- 自動調整 iframe 高度: 針對某些無法預知高度的嵌入內容(尤其是同源的),我們可以寫一段腳本讓 <iframe> 自動根據內容文件的高度來調整。實現方式是嵌入的內容頁面監聽自身高度變化(或在載入完成後取得全文高度),然後透過 postMessage 傳給父頁,父頁接收到高度資訊後再修改 iframe 的 height 值。這需要您對兩邊的代碼都有控制權,像嵌入自家網站的頁面就很適合用這招。
- 覆蓋樣式或加註解: 您無法直接改變 <iframe> 內部的樣式,但可以在外圍加CSS遮罩或提示。例如在 iframe 上方用一個半透明的 div 蓋住,顯示「點擊下方地圖以互動」之類的提示,當使用者滑鼠移上時再隱藏提示層以允許操作地圖。這在有些教學情境下可以引導用戶操作,不至於一下子就對嵌入內容手足無措。
- 使用API控制嵌入內容: 某些第三方內容提供專門的 JavaScript API。例如 YouTube 有提供 Iframe Player API,允許您透過 JS 控制影片播放、暫停、跳轉進度等。這需要加載他們的 API 腳本並使用特殊初始化,但可能用在需要高度自訂化體驗的場合。
- Lazy Loading進一步優化: 前面提到可以使用 loading="lazy" 屬性,或您也可以用 Intersection Observer API 來實現更細緻的懶載入控制。當使用者滾到接近iframe的位置時,再動態設置 src 或移除占位符來載入內容,這樣可以減少未露出的嵌入內容對頁面速度的影響。
需要強調的是,進階技巧往往意味著更多的瀏覽器相容性考量和更高的實作成本。在運用之前,評估一下這些額外的複雜性是否必要。大多數情況下,直接使用 <iframe> 靜態嵌入已經能滿足需求;只有在您需要與嵌入內容有更強的互動或控制時,再考慮投入進階方案。
以上我們涵蓋了 <iframe> 嵌入地圖、影片與社群貼文的方方面面,包括基礎知識、安全性和響應式技巧等。接下來,我們透過一個問與答單元,來快速回顧並解答幾個常見的相關問題。
常見問與答 (Q&A)
問: 為什麼我用 <iframe> 嵌入某些網站會顯示空白或出錯?
答: 這通常是因為對方網站透過 X-Frame-Options 或 Content Security Policy 禁止被嵌入。瀏覽器偵測到這種設定就不會載入內容。例如很多銀行、支付網站都設定了 X-Frame-Options: DENY,以防被惡意網站框架後進行「點擊劫持」攻擊。如果遇到這種情況,您只能放棄嵌入,或者看看該服務是否提供專門的嵌入 widget/API。簡言之,尊重網站自身的安全設定是必要的,沒有安全又合法的方式強行嵌入被禁止的內容。
問: 我想讓嵌入的 <iframe> 高度自動適應內容,有可能嗎?
答: 直接的自適應只有在嵌入的內容和您的頁面同源時比較容易實現(可透過 JavaScript 讀取內容高度)。對於跨網域的第三方內容,出於安全,瀏覽器不允許直接獲取iframe裡面的高度。不過一些網站提供解法,例如Twitter提供了自動調整高度的嵌入腳本。一般來說,如果高度不是太離譜,您可以估計一個大致值或允許滾動條。而如果您自己能控制嵌入頁,那可以在其中用腳本取得內容高度,並用 window.parent.postMessage() 通知父頁設定對應的iframe高度。父頁需用 window.addEventListener("message", ...) 接收處理。這是比較程式化的解決方案,需要您對兩端內容都具備開發權限。
問: 為什麼我的 <iframe> 影片無法自動播放?
答: 現代瀏覽器對自動播放做了限制:通常只有在影片靜音(mute)時才能在未經使用者互動的情況下自動播放。另外您需要在 iframe 的 allow 屬性中包含 autoplay。若還是無效,檢查一下是否有調用正確的參數(如 ?autoplay=1&mute=1)。還有,如果使用者在瀏覽器中整體關閉了自動播放功能,那您的影片也可能不會自動播放,這是使用者層面的控制。
問: <iframe> 中的內容可以和我的主頁共享 CSS 或腳本嗎?我想讓嵌入內容看起來風格一致。
答: 基本上不行。iframe 裡的內容與外部頁面是獨立的 DOM 和渲染上下文,主頁的 CSS 無法影響其中元素(除非兩者同源且您透過 JS 手動將 CSS 塞入iframe,這種情況較少)。如果您希望嵌入內容的風格與主站統一,通常需要在內容源那邊做相應的樣式調整。舉例來說,嵌入自家網站的頁面時,可以共用一套CSS。但對第三方的內容,只能接受它原本的樣貌。您可以做的是調整 iframe 本身的邊框、外圍留白等,讓它在版面上和周圍風格協調。
問: 使用 <iframe> 有沒有什麼負面影響?例如SEO或效能?
答: 有幾點值得注意:
SEO: 搜尋引擎通常不會將 iframe 裡的第三方內容算作您頁面的一部分進行索引。所以嵌入再多有意義的內容,也不會直接提升您頁面的關鍵字權重。此外,如果整個頁面大部分都是一個 iframe,對SEO是不利的,因為對搜索引擎而言您的頁面幾乎沒有自己的內容。
效能: <iframe> 會載入外部資源,可能包含大量HTML、JS、CSS。如果嵌入很多iframe,頁面載入時間和內存消耗都會上升。建議謹慎選擇嵌入內容的數量,並使用 loading="lazy" 讓非首屏的 iframe 延後載入。另外,不要在iframe中載入那種會不斷輪詢或大量計算的內容,否則即便被嵌在角落,也會拖慢整體速度。
響應式: 前面有討論過,需要特別處理。沒有適配行動裝置的內容嵌入在小螢幕上體驗會不佳。
安全: 雖然我們可以透過 sandbox 等提高安全係數,但引入第三方內容終究多一分風險。例如第三方內容若有惡意代碼、或日後被攻陷,可能成為攻擊您網站使用者的跳板。因此嵌入來源最好選擇可信任的知名服務,或者有良好安全聲譽的對象。
問: 如果我要允許別人嵌入我的網頁內容,我需要做什麼嗎?
答: 假如您希望自己的網頁可以被其他網站以 <iframe> 方式嵌入(例如提供小工具給別人用),請確保您沒有設置阻擋(例如不要發送 X-Frame-Options: DENY)。另外,您可以考慮在HTTP回應頭使用 Content-Security-Policy: frame-ancestors 來列出允許嵌入您內容的網域清單,限制只有特定合作夥伴的站點能嵌入,避免未知的站點亂用。當然,如果您希望任何人都能自由嵌入,就不要設置 frame-ancestors 限制。總之,預設情況下,只要不特別阻止,您的網站是能被嵌入的。但也想想有無安全顧慮,需要才加以限制。
希望這份指南讓您對 <iframe> 的運用有了全盤的認識。從基本結構到各平台實例、安全與響應式技巧,我們已一一介紹。對一個具備基礎 HTML/CSS 知識的中級使用者而言,掌握 <iframe> 意味著您可以輕鬆地將豐富的外部資源融入自己的教學平台,增強內容的互動性與多樣性。在實作過程中,別忘了保持對使用者體驗和安全性的關注。祝您在項目中順利應用這些技巧,打造出更引人入勝的教學內容!