Определить ширину окна и компенсировать полосы прокрутки - Javascript
Как определить ширину окна пользователя с помощью Javascript и учетной записи для их полосы прокрутки? (Мне нужна ширина экрана INSIDE полосы прокрутки). Вот то, что у меня есть... кажется, работает в нескольких браузерах... кроме того, что он не учитывает полосы прокрутки.
function browserWidth() {
var myWidth = 0;
if( typeof( window.innerWidth ) == 'number' ) {
//Non-IE
myWidth = window.innerWidth;
} else if( document.documentElement && document.documentElement.clientWidth ) {
//IE 6+ in 'standards compliant mode'
myWidth = document.documentElement.clientWidth;
} else if( document.body && document.body.clientWidth ) {
//IE 4 compatible
myWidth = document.body.clientWidth;
}
return myWidth;
}
любые идеи? мне нужно, чтобы он работал во всех браузерах;)
Ответы
Ответ 1
Вы найдете большое резюме о том, какие свойства поддерживаются в браузерах на этой странице на quirksmode.org.
Лучше всего, чтобы захватить элемент на странице (используя document.body, где поддерживается, или document.getElementById или что-то еще), пройдите по цепочке offsetParent, чтобы найти самый верхний элемент, затем проверьте этот элемент clientWidth и clientHeight.
Ответ 2
A (заметно неприятный) обходной путь, если вас интересует только ширина, заключается в создании 1px x 100% div и использовании offsetWidth. Работает на IE >= 7, FF, Chrome, Safari и Opera (я не пробовал IE6, так как мы работаем над тем, чтобы вы были счастливы, что-то-работает-все-так-не-жаловаться -Общие-нечеткие политики в эти дни). Я держу div с document.body с атрибутами { position: 'absolute', top: '-1px', left: 0, width: '100%', height: '1px' }
, создавая его в первый раз, когда это необходимо.
Работает, если вы можете его переварить.
Ответ 3
Просто добавьте это до проверки window.innerWidth():
if (typeof(document.body.clientWidth) == 'number') {
// newest gen browsers
width = document.body.clientWidth;
height = document.body.clientHeight;
}
Ответ 4
Это то, что я сделал - всего полгода на изучение JavaScript, так что это может быть плохой проблемой. Во-первых, я создал прозрачное квадратное изображение (10px x 10px)
, но вы также можете создать непрозрачное изображение и добавить его в свой JavaScript как
document.getElementById('getDimensions').style.visibility = "hidden";
HTML:
<img id="getDimensions" src="images/aSmallBox.png" alt="A small transparent image
meant to determine the dimensions of the viewport" width="10px" height="10px"/>
JavaScript:
//Inside function called by window.onload event handler (could go in CSS file, but
//better to keep it with other related code in JS file)
document.getElementById('getDimensions').style.position = "fixed";
document.getElementById('getDimensions').style.bottom = "0px";
document.getElementById('getDimensions').style.right = "0px";
//Everything below inside function called by window.onresize event handler
var baseWidthCalculation = document.getElementById('getDimensions').offsetLeft;
var baseHeightCalculation = document.getElementById('getDimensions').offsetTop;
//Account for the dimensions of the square img element (10x10)
var viewportWidth = baseWidthCalculation + 10;
var viewportHeight = baseHeightCalculation + 10;
Ответ 5
Это более эффективная версия идеи, размещенной здесь Тимом Салаем (хотя вы только начинаете, было блестяще разместить элемент в нижнем правом углу).
var getDimensions = document.createElement("div");
getDimensions.setAttribute("style",
"visibility:hidden;position:fixed;bottom:0px;right:0px;");
document.getElementsByTagName("body")[0].appendChild(getDimensions);
var viewportWidth = getDimensions.offsetLeft;
var viewportHeight = getDimensions.offsetTop;
И вот модульная версия
var PageDimensions = function(){
var Width;
var Height;
function pagedimensionsCtor (){
var getDimensions = document.createElement("div");
getDimensions.setAttribute("style" ,
"visibility:hidden;position:fixed;bottom:0px;right:0px;");
document.getElementsByTagName("body")[0].appendChild(getDimensions);
Width = getDimensions.offsetLeft;
Height = getDimensions.offsetTop;
getDimensions.parentNode.removeChild(getDimensions);
}
pagedimensionsCtor();
function Reset(){
pagedimensionsCtor();
}
function GetPageHeight(){
return Height;
}
function GetPageWidth(){
return Width;
}
return{
Reset: Reset,
GetPageHeight: GetPageHeight,
GetPageWidth: GetPageWidth
};
}
Используйте модульную версию:
var page = new PageDimensions();
console.log("viewportWidth: " + page.GetPageWidth() + " viewportHeight: " + page.GetPageHeight());
Бонусная функция:
page.Reset();//just in case you think your dimensions have changed
Ответ 6
Я бы сравнил "innerWidth" с шириной тела. Если ширина телa > внутренняя ширина, то имеются полосы прокрутки.
if (browserWidth() < document.body.offsetWidth) {
doSomething();
}
Ответ 7
Другим решением, которое вы можете попробовать, является изменение CSS, поэтому прокрутка происходит на вашей странице, а не в окне браузера. В стиле для тела добавьте переполнение: авто. Теперь элемент body включает полосу прокрутки, поэтому, когда вы получаете ширину окна, вы измеряете ширину вне контейнера прокрутки, а не внутри нее.
Это похоже на потенциальный источник причудливости и, возможно, на проблему доступности, поэтому, если вы собираетесь широко использовать, вы можете протестировать его довольно внимательно.