Resize external website content to fit iFrame width

在 web 开发中,将其他网站的内容嵌入到当前网页中是一种常见的方式。而 iframe 是实现这种嵌入的一种标准化的方法。但是,在使用 iframe 嵌入外部网站时,经常会遇到一个问题:如果外部网站的宽度大于 iframe 的宽度,那么会导致嵌入的内容出现滚动条,影响用户体验。本文将介绍如何使用 JavaScript 和 CSS 自适应地调整 iframe 中网站的大小,以确保内容恰好适合 iframe 的宽度。

方法概述

解决此问题的方法涉及两个步骤:

  1. 获取外部网站的宽度
  2. 调整 iframe 大小以适应其内部内容的宽度

为了获取外部网站的宽度,我们需要跨域通信。为了简化操作,我们可以利用 postMessage API 实现跨域消息传递。具体来说,我们需要在 iframe 中的脚本中添加以下代码:

-- ---- ----------- -------- ------ -----
-------- ----------------- -
  ----- ------ - --------------------
  -- ------- -- ------------------ -
    ----- ----- - --------------------------
    ------------------------------------ -----
  -
-

-- ------------------------------
------------- - -- -- -
  ------------------
  --------------------------------- -----------------
--

在这个代码中,我们使用 window.frameElement 获取到当前 iframe 元素,然后使用 postMessage 方法将宽度信息发送到父窗口。最后,我们通过监听 resize 事件来更新宽度,以确保它始终反映出实际的宽度。

接下来,我们需要在父窗口中处理这个消息。具体来说,我们需要添加以下 JavaScript 代码:

-- ---------- ------ -----
---------------------------------- ----- -- -
  -- ------------- --- ---------------------- ------- -- --------------
  
  ----- ------ - -------------------------------------
  -- -------- -
    ------------------ - ------------------
  -
---

在这个代码中,我们首先检查消息来源是否是我们信任的网站。如果是,我们就使用 document.getElementById 获取到目标 iframe,然后将其宽度设置为从子窗口传递过来的值。

CSS 样式

除了上述 JavaScript 代码之外,还需要一些 CSS 样式来确保内容能够正确地适应 iframe 的宽度。具体来说,我们需要将 iframe 和 body 中的样式设置为:

-- -- ------ ----------------- --
----- ---- -
  ----------- -------
-

-- ------ ----- ------------ --
------ -
  ------ -----
  ------- -----
-

-- -------------------- --
- -
  ---------- ---- -----------
-

这些样式将确保 iframe 的宽度始终是 100%,并且网站中的所有元素都能够正确地适应其宽度。

示例代码

以下是一个完整的示例代码,可以让您更好地理解上述概念:

--------- -----
------
------
  ----- ----------------
  ------------- -------- ------- ------- -- --- ------ -------------
  -------
    ----- ---- -
      ----------- -------
    -
    
    ------ -
      -----

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------