Ughck,意外的水平滚动条,对吧?
这可能很痛苦,但你通常可以通过在 DevTools 中四处浏览并选择元素来找到有问题的元素,直到你找到一个元素延伸到右侧太远(向左侧溢出页面通常不会以相同的方式触发滚动条)并调整它。
有时我会使用 DevTools 的“删除节点”功能从页面中删除内容,直到滚动条消失。 然后我知道哪个元素导致了这个问题,并且可以从那里深入研究。 这是一个关于这种故障排除的超级快速视频
在某些情况下,可能存在一个元素实际上比文档本身更宽,这可能会导致水平溢出滚动。 你可以使用一些 JavaScript 来帮助你找到罪魁祸首。
var docWidth = document.documentElement.offsetWidth;
[].forEach.call(
document.querySelectorAll('*'),
function(el) {
if (el.offsetWidth > docWidth) {
console.log(el);
}
}
);
这可能会找到类似的东西

另一个对我来说有时很有帮助的小技巧是,滚动到可以看见溢出区域的地方,然后单击并检查该区域内的元素,看看是否可以定位到有问题的元素。
隐藏的水平溢出
有时水平溢出更难以捉摸。 例如,它不会触发水平滚动条,但你仍然可以通过触摸板滑动或选择并拖动来显示溢出。
我制作了该场景的基本演示,请查看此 GIF

发生的情况是,有一个元素位于屏幕外,并且具有 opacity: 0;
,因此你无法看到它。 通常情况下,这会触发水平溢出和水平滚动条,但我们明确地隐藏了它
body {
overflow-x: hidden;
}
.hidden-thing {
position: absolute;
left: 100%;
width: 50px;
height: 50px;
opacity: 0;
}
在大多数情况下,当一个元素被隐藏在具有隐藏溢出元素的边界之外时,它只是在视觉世界中消失了。 但是对于文档本身,你仍然可以强制滚动到那里。 很奇怪,但事实如此。 它可能是一个错误,因为如果你使用 overflow: hidden;
而不是 overflow-x: hidden;
,它就会阻止它。 只是使用 overflow-x
更加常见和实用。
请注意,这是桌面 Blink 或基于 WebKit 的浏览器中的一个问题。 在 Gecko 或我所见过的任何移动设备中都不是问题。
拥有隐藏的屏幕外元素并不罕见。 我认为随着动画、过渡、3D 效果、材质设计、过渡界面,它变得越来越常见。 我在设计 CodePen 上的搜索表单时遇到了这个问题,该表单在你点击某个东西时会滑出来。 简而言之,它就像这样

在这种情况下,解决方案是隐藏父元素上的溢出,而不是依赖于 body 上的隐藏溢出。
不错,谢谢
打开检查器 -> “新建样式规则”
你总是可以添加:
opacity: 1 !important; visibility: visible !important;
如果你认为你可能有一个隐藏的元素,但通常以上方法对我来说立即有效。就是这样。 快速、简单、有效。
+1 给它。
我来这里就是想说这个。
不知为何,我从未想过要这样做。 非常棒的小技巧!
好吧,如果你在没有正确盒子模型的情况下这样做,你就会在每个元素上增加 2 像素... 这反过来会导致整个页面混乱...
我会选择性地这样做,只在浮动 div 上做...
通常会使用
*{ border:1px solid #red !important}
来找到元素,但 .js 解决方案看起来非常有用使用书签小工具很棒 :)
谢谢
哦! 或者你可以修改它,用红色勾勒出有问题的元素。 两全其美 :)
javascript:void(function () {var docWidth = document.documentElement.offsetWidth;[].forEach.call(document.querySelectorAll(‘*’), function (el) {if (el.offsetWidth%3EdocWidth) el.style.border = “1px solid red”})})();
最棒的 :)
javascript:void(function () {var docWidth = document.documentElement.offsetWidth;[].forEach.call(document.querySelectorAll(‘*’), function (el) {if (el.offsetWidth>docWidth) {el.style.outline = “1px solid red”; console.log(el);}})})();
你真的应该开始使用键盘快捷键。 节点可以通过 Del 键删除。 快得多。
很难截取键盘快捷键的视频。 他们制作了一些小应用程序来展示当你按下它们时你正在按什么键,但这有点烦人。
当然,在截屏视频中它可能更清晰。 但你也应该教导更有效的方法(作为开发人员,我们也会使用键盘来复制/粘贴,或删除文本字符,而不是通过上下文菜单选择并删除)。
此外,你不需要刷新页面来恢复上一个(当深入时),只需通过菜单撤消上一个删除操作(或 Cmd+Z)。
我必须说,在视频中没有这两种方法让观看变得很痛苦。 我希望你能认可这两个提示!
这有点过分了... 只要在 Firefox 中安装 Web 开发工具栏... 单击“轮廓 - 轮廓所有块级元素”,这样你就可以立即知道罪魁祸首在哪里。
Rob
大多数人不希望只为这个安装一个过时的扩展。
我总是以此为借口启动 Firefox 开发工具的 3D 视图。 然后我可以四处看看哪些不可见的元素隐藏在边框中。
使用 TreeWalker 的相同代码: https://gist.github.com/cuth/c1ddf2b1ce2fb07e512a
为什么要使用
TreeWalker
? 你不会从中获得任何好处,反而会失去 IE8 的兼容性。使用书签小工具很棒 :) 谢谢 :)
即使一个元素的宽度小于
document.documentElement.offsetWidth
,它也可能触发水平滚动条。 此时,getBoundClientRect
就派上用场了,因为它提供了元素相对于当前视窗的位置请记住,使用
outline
比border
更好,因为轮廓不会占用 DOM 定位中的空间。我喜欢你使用‘getBoundingClientRect’的想法! 但是我不理解 if 语句。
你不应该使用类似的东西吗?
顺便说一句,tuts+ 是测试此代码的好地方 :)
(附注:你是对的,TreeWalker 是不必要的。)
伙计们,我认为,如果问题不是来自溢出(但它不会在 GECKO 中出现问题)...
我们可以使用 Gecko。 我的意思是,如果你的显卡驱动支持“WEBGL”,你可以在 PC 上使用 Firefox 的默认检查工具的“3d”视图!
当我们使用 3d 视图时,我们可以完美地看到堆栈,并且我们也可以观察到哪些部分在尺寸上超过了特定的盒子。
前几天我在开发一个 WordPress 网站时遇到了完全相同的问题。 由于其他项目的定位方式,修复它实际上非常痛苦。 下次,请提前几天发布这些技巧!
我们的方法一直是在 body 标签内部始终放置一个 div,并应用一个内联样式 overflow:hidden。
我发现这样我就可以让各种东西有意地悬挂在左右边缘,而无需单独调试,这些东西主要是画布外菜单、需要在其他视窗大小下显示隐藏区域的样式化图像以及各种在屏幕上动画显示的元素。
我知道这篇文章试图诊断和解决无意中发生的断裂,因此这是一种略微不同的角度,但希望对某些人有所帮助。
+1 到 js 代码片段和书签!