Jak określić wysokość poziomego paska przewijania lub szerokość pionowego w JavaScript?
Jak określić wysokość poziomego paska przewijania lub szerokość pionowego w JavaScript?
Odpowiedzi:
Z bloga Alexandre Gomes nie próbowałem tego. Daj mi znać, jeśli to zadziała.
function getScrollBarWidth () {
var inner = document.createElement('p');
inner.style.width = "100%";
inner.style.height = "200px";
var outer = document.createElement('div');
outer.style.position = "absolute";
outer.style.top = "0px";
outer.style.left = "0px";
outer.style.visibility = "hidden";
outer.style.width = "200px";
outer.style.height = "150px";
outer.style.overflow = "hidden";
outer.appendChild (inner);
document.body.appendChild (outer);
var w1 = inner.offsetWidth;
outer.style.overflow = 'scroll';
var w2 = inner.offsetWidth;
if (w1 == w2) w2 = outer.clientWidth;
document.body.removeChild (outer);
return (w1 - w2);
};
Korzystając z jQuery, możesz skrócić odpowiedź Matthew Vinesa do:
function getScrollBarWidth () {
var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
$outer.remove();
return 100 - widthWithScroll;
};
To jest tylko skrypt, który znalazłem, który działa w przeglądarkach webkit ... :)
$.scrollbarWidth = function() {
var parent, child, width;
if(width===undefined) {
parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');
child=parent.children();
width=child.innerWidth()-child.height(99).innerWidth();
parent.remove();
}
return width;
};
Zminimalizowana wersja:
$.scrollbarWidth=function(){var a,b,c;if(c===undefined){a=$('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');b=a.children();c=b.innerWidth()-b.height(99).innerWidth();a.remove()}return c};
I musisz to wywołać, gdy dokument będzie gotowy ... tak
$(function(){ console.log($.scrollbarWidth()); });
Testowane 2012-03-28 na Windows 7 w najnowszych wersjach FF, Chrome, IE i Safari iw 100% sprawne.
źródło: http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth
widthbędzie zawsze === undefined pierwszym razem, gdy funkcja jest wywoływana. Przy kolejnych wywołaniach funkcja widthjest już ustawiona, to sprawdzenie po prostu zapobiega niepotrzebnemu ponownemu wykonywaniu obliczeń.
width, ale za każdym razem ponownie go obliczy. Działa, ale jest strasznie nieefektywny. Zrób światu przysługę i zamiast tego użyj poprawnej wersji wtyczki Almana.
jeśli szukasz prostej operacji, po prostu wymieszaj zwykłe dom js i jquery,
var swidth=(window.innerWidth-$(window).width());
zwraca rozmiar paska przewijania bieżącej strony. (jeśli jest widoczny lub zwróci 0)
window.scrollBarWidth = function() {
document.body.style.overflow = 'hidden';
var width = document.body.clientWidth;
document.body.style.overflow = 'scroll';
width -= document.body.clientWidth;
if(!width) width = document.body.offsetWidth - document.body.clientWidth;
document.body.style.overflow = '';
return width;
}
Dla mnie najbardziej przydatnym sposobem był
(window.innerWidth - document.getElementsByTagName('html')[0].clientWidth)
z waniliowym JavaScriptem.
document.documentElement.clientWidth. documentElementjaśniej i wyraźniej wyraża zamiar uzyskania <html>elementu.
Znalazłem proste rozwiązanie, które działa w przypadku elementów wewnątrz strony, zamiast samej strony:
$('#element')[0].offsetHeight - $('#element')[0].clientHeight
Zwraca wysokość paska przewijania osi X.
// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);
// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
console.info(scrollbarWidth); // Mac: 15
// Delete the DIV
document.body.removeChild(scrollDiv);
.scrollbar-measure {
width: 100px;
height: 100px;
overflow: scroll;
position: absolute;
top: -9999px;
}
Daje mi 17 na mojej stronie internetowej, 14 tutaj na Stackoverflow.
Jeśli masz już element z paskiem przewijania, użyj:
function getScrollbarHeight(el) {
return el.getBoundingClientRect().height - el.scrollHeight;
};
Jeśli nie ma paska przewijania horzints, funkcja powróci do 0
Możesz określić windowpasek przewijania za pomocą documentjak poniżej za pomocą jquery + javascript:
var scrollbarWidth = ($(document).width() - window.innerWidth);
console.info("Window Scroll Bar Width=" + scrollbarWidth );
Sposób Antiscroll.jsw jego kodzie to:
function scrollbarSize () {
var div = $(
'<div class="antiscroll-inner" style="width:50px;height:50px;overflow-y:scroll;'
+ 'position:absolute;top:-200px;left:-200px;"><div style="height:100px;width:100%"/>'
+ '</div>'
);
$('body').append(div);
var w1 = $(div).innerWidth();
var w2 = $('div', div).innerWidth();
$(div).remove();
return w1 - w2;
};
Kod pochodzi stąd: https://github.com/LearnBoost/antiscroll/blob/master/antiscroll.js#L447
detectScrollbarWidthHeight: function() {
var div = document.createElement("div");
div.style.overflow = "scroll";
div.style.visibility = "hidden";
div.style.position = 'absolute';
div.style.width = '100px';
div.style.height = '100px';
document.body.appendChild(div);
return {
width: div.offsetWidth - div.clientWidth,
height: div.offsetHeight - div.clientHeight
};
},
Przetestowano w Chrome, FF, IE8, IE11.
Utwórz pusty divi upewnij się, że jest obecny na wszystkich stronach (np. Umieszczając go w headerszablonie).
Daj mu taką stylizację:
#scrollbar-helper {
// Hide it beyond the borders of the browser
position: absolute;
top: -100%;
// Make sure the scrollbar is always visible
overflow: scroll;
}
Następnie po prostu sprawdź rozmiar za #scrollbar-helperpomocą Javascript:
var scrollbarWidth = document.getElementById('scrollbar-helper').offsetWidth;
var scrollbarHeight = document.getElementById('scrollbar-helper').offsetHeight;
Nie musisz niczego obliczać, ponieważ divzawsze będzie to mieć widthand heightof scrollbar.
Jedynym minusem jest to, że divw twoich szablonach będzie pusty .. Ale z drugiej strony, twoje pliki Javascript będą czystsze, ponieważ zajmuje to tylko 1 lub 2 linie kodu.
function getWindowScrollBarHeight() {
let bodyStyle = window.getComputedStyle(document.body);
let fullHeight = document.body.scrollHeight;
let contentsHeight = document.body.getBoundingClientRect().height;
let marginTop = parseInt(bodyStyle.getPropertyValue('margin-top'), 10);
let marginBottom = parseInt(bodyStyle.getPropertyValue('margin-bottom'), 10);
return fullHeight - contentHeight - marginTop - marginBottom;
}
function getScrollBarWidth() {
return window.innerWidth - document.documentElement.clientWidth;
}
W większości przeglądarek szerokość paska przewijania wynosi 15 pikseli
Z jQuery (testowane tylko w Firefoksie):
function getScrollBarHeight() {
var jTest = $('<div style="display:none;width:50px;overflow: scroll"><div style="width:100px;"><br /><br /></div></div>');
$('body').append(jTest);
var h = jTest.innerHeight();
jTest.css({
overflow: 'auto',
width: '200px'
});
var h2 = jTest.innerHeight();
return h - h2;
}
function getScrollBarWidth() {
var jTest = $('<div style="display:none;height:50px;overflow: scroll"><div style="height:100px;"></div></div>');
$('body').append(jTest);
var w = jTest.innerWidth();
jTest.css({
overflow: 'auto',
height: '200px'
});
var w2 = jTest.innerWidth();
return w - w2;
}
Ale tak naprawdę bardziej podoba mi się odpowiedź @ Steve.
To świetna odpowiedź: https://stackoverflow.com/a/986977/5914609
Jednak w moim przypadku to nie zadziałało. I spędziłem godziny na poszukiwaniu rozwiązania.
Wreszcie wróciłem do powyższego kodu i dodałem! Ważne do każdego stylu. I zadziałało.
Nie mogę dodać komentarzy pod oryginalną odpowiedzią. Oto poprawka:
function getScrollBarWidth () {
var inner = document.createElement('p');
inner.style.width = "100% !important";
inner.style.height = "200px !important";
var outer = document.createElement('div');
outer.style.position = "absolute !important";
outer.style.top = "0px !important";
outer.style.left = "0px !important";
outer.style.visibility = "hidden !important";
outer.style.width = "200px !important";
outer.style.height = "150px !important";
outer.style.overflow = "hidden !important";
outer.appendChild (inner);
document.body.appendChild (outer);
var w1 = inner.offsetWidth;
outer.style.overflow = 'scroll !important';
var w2 = inner.offsetWidth;
if (w1 == w2) w2 = outer.clientWidth;
document.body.removeChild (outer);
return (w1 - w2);
};
Ta życiowa decyzja da ci możliwość znalezienia szerokości scrollY przeglądarki (waniliowy JavaScript). Korzystając z tego przykładu, możesz uzyskać szerokość scrollY dowolnego elementu, w tym elementów, które nie powinny mieć scrollu zgodnie z twoją obecną koncepcją projektową:
getComputedScrollYWidth (el) {
let displayCSSValue ; // CSS value
let overflowYCSSValue; // CSS value
// SAVE current original STYLES values
{
displayCSSValue = el.style.display;
overflowYCSSValue = el.style.overflowY;
}
// SET TEMPORALLY styles values
{
el.style.display = 'block';
el.style.overflowY = 'scroll';
}
// SAVE SCROLL WIDTH of the current browser.
const scrollWidth = el.offsetWidth - el.clientWidth;
// REPLACE temporally STYLES values by original
{
el.style.display = displayCSSValue;
el.style.overflowY = overflowYCSSValue;
}
return scrollWidth;
}
Oto bardziej zwięzłe i łatwiejsze do odczytania rozwiązanie oparte na różnicy szerokości przesunięcia:
function getScrollbarWidth(): number {
// Creating invisible container
const outer = document.createElement('div');
outer.style.visibility = 'hidden';
outer.style.overflow = 'scroll'; // forcing scrollbar to appear
outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps
document.body.appendChild(outer);
// Creating inner element and placing it in the container
const inner = document.createElement('div');
outer.appendChild(inner);
// Calculating difference between container's full width and the child width
const scrollbarWidth = (outer.offsetWidth - inner.offsetWidth);
// Removing temporary elements from the DOM
outer.parentNode.removeChild(outer);
return scrollbarWidth;
}
Zobacz JSFiddle .
Już zakodowane w mojej bibliotece, więc oto jest:
var vScrollWidth = window.screen.width - window.document.documentElement.clientWidth;
Powinienem wspomnieć, że $(window).width()zamiast niego można również użyć jQuery window.document.documentElement.clientWidth.
To nie działa, jeśli otworzysz narzędzia programistyczne w przeglądarce Firefox po prawej stronie, ale pokonuje to, jeśli okno deweloperów zostanie otwarte u dołu!
window.screenjest obsługiwany przez quirksmode.org !
Baw się dobrze!
Wydaje się, że działa, ale może istnieje prostsze rozwiązanie, które działa we wszystkich przeglądarkach?
// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);
// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
console.info(scrollbarWidth); // Mac: 15
// Delete the DIV
document.body.removeChild(scrollDiv);
.scrollbar-measure {
width: 100px;
height: 100px;
overflow: scroll;
position: absolute;
top: -9999px;
}