如何知道哪个 HTML 元素导致垂直滚动条

我正在学习 鞋带。在“开始”菜单中,几乎没有给出模板。我在玩这个。其中一个例子是关于固定 Footer 的。我从前面的例子中使用导航,并希望用固定的页脚来调整它。但是垂直滚动条即将出现。我正在寻找的元素,这是造成垂直滚动条。

下面是 HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Bootstrap, from Twitter</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">


<!-- Le styles -->
<link href="css/bootstrap.css" rel="stylesheet">


<style type="text/css">


/* Sticky footer styles
-------------------------------------------------- */


html,
body {
height: 100%;
/* The html and body elements cannot have any padding or margin. */
}


/* Wrapper for page content to push down footer */
#wrap {
min-height: 100%;
height: auto !important;
height: 100%;
/* Negative indent footer by it's height */
margin: 0 auto -60px;
}


/* Set the fixed height of the footer here */
#push,
#footer {
height: 60px;
}
#footer {
background-color: #f5f5f5;
}


/* Lastly, apply responsive CSS fixes as necessary */
@media (max-width: 767px) {
#footer {
margin-left: -20px;
margin-right: -20px;
padding-left: 20px;
padding-right: 20px;
}
}






/* Custom page CSS
-------------------------------------------------- */
/* Not required for template or sticky footer method. */


.container {
width: auto;
max-width: 680px;
height: auto;
}
.container .credit {
margin: 20px 0;
}


/* Adjust Nav */
#wrap > .container {
margin-top: 60px;
}


</style>


<link href="css/bootstrap-responsive.css" rel="stylesheet">


<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="html5shiv.js"></script>
<![endif]-->


<!-- Fav and touch icons -->


<link rel="apple-touch-icon-precomposed" sizes="144x144" href="ico/apple-touch-icon-144-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="ico/apple-touch-icon-114-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="ico/apple-touch-icon-72-precomposed.png">
<link rel="apple-touch-icon-precomposed" href="ico/apple-touch-icon-57-precomposed.png">
<link rel="shortcut icon" href="ico/favicon.png">


</head>


<body>
<div id="wrap">
<div class="navbar navbar-inverse navbar-fixed-top" >
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="brand" href="#">Project name</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</div>
</div>


<div class="container">


<h1>Bootstrap starter template</h1>
<p>Use this document as a way to quick start any new project.<br> All you get is this message and a barebones HTML document.</p>


</div> <!-- /container -->
<div id="push"></div>
</div> <!-- End Wrap -->


<div id="footer">
<div class="container">
<p class="muted credit">Example courtesy <a href="http://martinbean.co.uk">Martin Bean</a> and <a href="http://ryanfait.com/sticky-footer/">Ryan Fait</a>.</p>
</div>
</div>




<!-- Le javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="../jquery.js"></script>
<script src="js-ext/bootstrap-transition.js"></script>
<script src="js-ext/bootstrap-alert.js"></script>
<script src="js-ext/bootstrap-modal.js"></script>
<script src="js-ext/bootstrap-dropdown.js"></script>
<script src="js-ext/bootstrap-scrollspy.js"></script>
<script src="js-ext/bootstrap-tab.js"></script>
<script src="js-ext/bootstrap-tooltip.js"></script>
<script src="js-ext/bootstrap-popover.js"></script>
<script src="js-ext/bootstrap-button.js"></script>
<script src="js-ext/bootstrap-collapse.js"></script>
<script src="js-ext/bootstrap-carousel.js"></script>
<script src="js-ext/bootstrap-typeahead.js"></script>


</body>
</html>

在这些情况下,有没有什么诀窍可以知道是哪个元素导致了滚动条?我之前也遇到过类似的问题,我不记得我是否能找到简单的解决方法。

44780 次浏览

Add:

* {
outline: 1px solid red;
}

Then when you scroll down you should see one really tall box. Right click on it and select inspect element. That should give you the information you need.

Use some browser debugging tool. Hit F12 to open it and check the dom elements. You'll be able to find it.

Ok, I got that if I change from margin-top to padding-top for container to adjust for nav then problem is solved. I reached to the solution after deleting elements in Firebug. So, quick fix problem is solved but my questions are still open.

How to know which element is causing scroll bar? Any trick?

Also, why margin-top is not working but padding-top has worked?

To make clear where I made change, I am adding the modified CSS:

   /* Adjust Nav */
#wrap > .container {
padding-top: 60px;


}

I find it's usually an image without a max-width: 100%

There is an excellent article by Chris Coyier which explain everything you need about this problem.

after reading this article, I personally use this code in my console to find out which element cause vertical scroll:

press F12 in your Browser then choose console and paste the below code there and press enter:

var all = document.getElementsByTagName("*"), i = 0, rect, docWidth = document.documentElement.offsetWidth;
for (; i < all.length; i++) {
rect = all[i].getBoundingClientRect();
if (rect.right > docWidth || rect.left < 0){
console.log(all[i]);
all[i].style.border = '1px solid red';
}
}

Update:
if the above code didn't work it might be an element inside an iframe that make the page to vertically scroll. in this case you can check iframes with this code:

var frames = document.getElementsByTagName("iframe");
for(var i=0; i < frames.length; i++){
var frame = frames[i];
frame = (frame.contentWindow || frame.contentDocument);
var all = frame.document.getElementsByTagName("*"),rect,
docWidth = document.documentElement.offsetWidth;
for (var j =0; j < all.length; j++) {
rect = all[j].getBoundingClientRect();
if (rect.right > docWidth || rect.left < 0){
console.log(all[j]);
all[j].style.border = '1px solid red';
}
}
}

I'd say you should use document.scrollingElement.

Paste the below in the console and scroll. It will log the culprit in the console.

function findScroller(element) {
element.onscroll = function() { console.log(element)}


Array.from(element.children).forEach(findScroller);
}


findScroller(document.body);

The below code helps you to find which element is causing vertical or holizon scroll bar.

This will find the element and create border with red:5px at the element of causing the scroll bar.

After run this in the devtool of your browser , check if any element has '_____target' class which is causing the scroll bar.

If you find the element, then comment out this tag from html and refresh and try it again.

/* Parameter should be either horizon OR vertical */
let checktype = 'horizon';






(function(which){
style();


var elements = document.querySelectorAll("body *");
var found = false;


elements.forEach(element => {
if( found ) return;
element.classList.add("_____zerospace");


var scrollbar = detectScrollbar(element);
if(!scrollbar[which])
{
console.log(element);
element.classList.add('_____target');
found = true;
}
})


return;


function detectScrollbar(target)
{
//var div = document.getElementById('container_div_id');
var element = document.scrollingElement;
var hasHorizontalScrollbar = element.scrollWidth > element.clientWidth;
var hasVerticalScrollbar = element.scrollHeight > element.clientHeight;


return {horizon: hasHorizontalScrollbar, vertical: hasVerticalScrollbar};
}


function style()
{
var style = document.createElement('style');
style.innerHTML = '._____zerospace { padding:0 !important; margin:0 !important } ._____target{border: solid 5px red}';


document.head.appendChild(style);


}


})(checktype)

I had tried the other debugging methods and nothing helped. But I found this article, and it's what I'm looking for!

How to find the cause of horizontal scrollbars

Setting the width of the body to 100vw

The viewport width unit (vw) is a useful way to make things a certain percentage of the screen wide.

When you use 100vw however, you make something the full width of the viewport and this includes the width of scrollbars. So the end result is that your page is slightly wider than the available width (which is the full width of the viewport without the scrollbars).

In short: if you use width: 100vw on a page that has a vertical scrollbar you end up with a horizontal overflow.

The easy fix is to use width: 100% instead. Percentages don't include the width of the scrollbar, so will automatically fit.

If you can't do that, or you're setting the width on another element, add overflow-x: hidden or overflow: hidden to the surrounding element to prevent the scrollbar.

After reading this, I checked, and the horizontal overflow was exactly the width of the vertical scrollbar! Searched for 100vw in the code and found the problem.