正如其他答案已经提到的,这里的问题是 JSFiddle 特有的。我可以轻松地向您展示这一点,只需在该问题的 StackOverflow 代码片段中包含相同的代码即可:
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 文档
当每个片段 URL 传递到iframe
在 JSFiddle 上。因此,我们可以复制这个问题,只需创建一个单独的 JSFiddle 演示并链接到我们的iframe
.
我在这里创建了这个新的 JSFiddle 演示:http://fiddle.jshell.net/JamesD/k5vk2u9h/1/show/light/#test 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>
The height
and width
属性无关紧要,因为没有它们问题仍然出现。
JSFiddle 演示 http://jsfiddle.net/JamesD/xzonssqz/.
解决方法
这里的另一个答案表明修复方法是修改 JSFiddle 自己的 HTML,以便正确地重新渲染页面。这不是一个很好的解决方案,因为在现实情况下(即将某人链接到 JSFiddle 演示时),他们可能不具备实现此目标的专业知识。
我们可以使用 JavaScript 来解决这个问题。由于我创建的新 HTML 文档位于同一域(http://jshell.net http://jshell.net)我们可以在iframe
本身。手动设置location.hash
属性也会触发这个问题,所以我们可以做的是滚动iframe
直接转到我们希望关注的元素。
首先,从 URL 中删除片段src
我们的属性iframe
:
<iframe src="http://fiddle.jshell.net/JamesD/k5vk2u9h/1/show/light/"></iframe>
如上所述,我使用的片段是一个元素,其id
是“测试”。这意味着获取元素的最简单方法是通过它的元素来选择它id
属性:
var frame = frames[0],
elem = frame.document.querySelector('#test'),
Here, frame
是对我们的参考iframe
在我们自己的文档中,以及elem
is our #test
元素。我们可以通过使用来获取匹配元素的位置getBoundingClientRect()
:
position = elem.getBoundingClientRect();
这将为我们提供一个 ClientRect 对象,如下所示:
有了这个,我们现在知道我们的#test
元素距离我们的顶部 3034pxiframe
。使用这个,我们现在可以使用以下方法将页面自己滚动到这个位置window.scrollTo()
(其中window
of our iframe
在这种情况下是在我们的frame
多变的):
frame.scrollTo(0, position.top);
JSFiddle 演示 http://jsfiddle.net/JamesD/et1oj1ph/.
请注意,此解决方案仅在以下情况下才有效:iframe
指向同一域上托管的 URL,或者如果页面上启用了 CORSiframe
是嵌入。
最好的选择
完成所有这些操作后,最好的办法就是简单地通知 JSFiddle 的开发人员这是一个错误。我已将其作为问题在 GitHub 存储库中提出:https://github.com/jsfiddle/jsfiddle-issues/issues/547 https://github.com/jsfiddle/jsfiddle-issues/issues/547.