正如其他答案已经提到的,这里的问题是 JSFiddle 特有的。我可以通过简单地在 StackOverflow sn-p 中包含有关此问题的相同代码来轻松地向您展示这一点:
iframe {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
}
<iframe src="https://news02ycombinator02com2.mentionusercontent.net/item?id=8357207#up_8360397" width="100%" height="100%"></iframe>
更简单的 HTML 文档
在 JSFiddle 上传递到 iframe 的每个片段 URL 都会出现此问题。因此,我们可以复制这个问题,只需创建一个单独的 JSFiddle 演示并链接到我们的 iframe 中。
我在这里创建了这个新的 JSFiddle 演示:http://fiddle.jshell.net/JamesD/k5vk2u9h/1/show/light/#test。
如你所见,这里的片段是#test。现在可以使用以下标记在新的 JSFiddle 演示中复制此问题:
<iframe src="http://fiddle.jshell.net/JamesD/k5vk2u9h/1/show/light/#test"></iframe>
height 和 width 属性无关紧要,因为没有它们,问题仍然存在。
解决方法
这里的另一个答案建议修复是修改 JSFiddle 自己的 HTML 以便正确地重新呈现页面。这不是一个很好的解决方案,因为在现实世界中(例如,将某人链接到 JSFiddle 演示时),他们可能不具备实现此目的的专业知识。
我们可以通过使用 JavaScript 来解决这个问题。由于我创建的新 HTML 文档位于同一域 (http://jshell.net) 上,我们可以在 iframe 本身内执行 JavaScript。手动设置location.hash 属性也会触发这个问题,所以我们可以做的是将iframe 直接滚动到我们希望关注的元素。
首先,从我们iframe的src属性中的URL中删除片段:
<iframe src="http://fiddle.jshell.net/JamesD/k5vk2u9h/1/show/light/"></iframe>
如上所述,我使用的片段是id 为“test”的元素。这意味着获取我们元素的最简单方法是通过其id 属性选择它:
var frame = frames[0],
elem = frame.document.querySelector('#test'),
这里,frame 是对我们自己文档中的iframe 的引用,elem 是我们的#test 元素。我们可以使用getBoundingClientRect()获取匹配元素的位置:
position = elem.getBoundingClientRect();
这将为我们提供一个如下所示的 ClientRect 对象:
现在我们知道我们的#test 元素位于距离iframe 顶部3034px 处。使用它,我们现在可以使用window.scrollTo() 将页面自己滚动到这个位置(在这种情况下,我们的iframe 的window 保存在我们的frame 变量中):
frame.scrollTo(0, position.top);
请注意,此解决方案仅在 iframe 指向托管在同一域上的 URL 或在 iframe 嵌入的页面上启用了 CORS 时才有效。
最佳选择
在完成所有这些之后,最好的办法是简单地通知 JSFiddle 的开发人员这是一个错误。我在他们的 GitHub 存储库中提出了这个问题:https://github.com/jsfiddle/jsfiddle-issues/issues/547。