Как с помощью скрипта высчитать ширину полосы прокрутки?
Добрый день!
У меня есть вот такая разметка. С помощью стиля высчитывается ширина полосы прокрутки (за основу берется 16px как у большинства браузерах). Но как мы знаем, в редких и мобильных браузерах ширина полосы прокрутки может колебаться от 14px до 18px, а кое-где быть даже равна нулю. Скажите, пожалуйста, а как можно с помощью скрипта высчитывать полосу прокрутки и этим же скриптом уже корректировать стиль (margin и width) для блока .wrp? Спасибо! <style> * { box-sizing: border-box; } body { margin: 0; padding: 0; } .wrapper { background-color: burlywood; text-align: justify; margin: 0 auto; width: 200px; padding: 0 100px 0 0; } .wrp { background-color: chocolate; height: 100%; min-height: 100vh; padding: 0; margin: 0 calc(8px - 50vw) 0 calc(108px - 50vw); width: calc(100vw - 16px); } </style> <div class="wrapper"> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста <div class="wrp">Этот блок нужно растянуть по ширине экрана, за пределы его родителя</div> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста </div> |
Win 7, Chrome lts:
var scroll_bar_width=$('body').css('overflow','hidden').width()-$('body').css('overflow','auto').width(); alert(scroll_bar_width);//17 Ps. Почему не разместить .wrp вне .wrapper? |
|
Цитата:
это уже готовая разметка, я не могу ее трогать. рони, да, я видел уже это решение. Но, как я понимаю, это не совсем то, что нужно. Как же мне им вывести margin и width для блока .wrp? |
Может так?
https://jsfiddle.net/3m91ubrg/ |
LADYX,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> * { box-sizing: border-box; } body { margin: 0; padding: 0; } .wrapper { background-color: burlywood; text-align: justify; margin: 0 auto; width: 200px; padding: 0 100px 0 0; } .wrp { background-color: chocolate; height: 100%; min-height: 100vh; padding: 0; margin: 0 calc(8px - 50vw) 0 calc(108px - 50vw); width: calc(100vw - 16px); } </style> </head> <body> <div class="wrapper"> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста <div class="wrp">Этот блок нужно растянуть по ширине экрана, за пределы его родителя</div> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста </div> <script> // создадим элемент с прокруткой var div = document.createElement('div'); div.style.overflowY = 'scroll'; div.style.width = '50px'; div.style.height = '50px'; // при display:none размеры нельзя узнать // нужно, чтобы элемент был видим, // visibility:hidden - можно, т.к. сохраняет геометрию div.style.visibility = 'hidden'; document.body.appendChild(div); var scrollWidth = div.offsetWidth - div.clientWidth; document.body.removeChild(div); var x = ".wrp{ width: calc(100vw - "+scrollWidth+"px); margin: 0 calc("+(scrollWidth/2)+"px - 50vw) 0 calc(108px - 50vw);}"; var style = document.createElement('style'); style.textContent = x; document.head.appendChild(style); </script> </body> </html> |
рони,
в этом случае появляется полоса прокрутки внизу. И мы ведь снова в скрипте берем за основу ширину полосы в 16px. А как же в других браузерах тогда? Скажите, пожалуйста, в скрипте 50px - не могу понять, это что за число, откуда оно берется? Цитата:
да, это вариант работает. Странно, скажите, пожалуйста, а зачем тогда использовать такой объемный вариант, как этот Цитата:
Цитата:
|
LADYX, мой вариант годится, если соблюдены определенные условия:
1. JQ подключена; 2. .wrp является потомком .wrapper. Вариант рони не имеет таких зависимостей. |
Цитата:
|
Цитата:
|
Nexus,
Цитата:
рони, Цитата:
calc(108px - 50vw);} Так а почему же появляется нижняя полоса прокрутки? Обратите внимание, слева небольшое расстояние, так понимаю, из-за него же она и появляется. Откуда она берется? |
Цитата:
|
|
Цитата:
Ps. 108px - это .wrp width (100px) + scrollbar width (16px) *.5 |
:write:
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> * { box-sizing: border-box; } body { margin: 0; padding: 0; } .wrapper { background-color: burlywood; text-align: justify; margin: 0 auto; width: 200px; padding: 0 100px 0 0; } .wrp { background-color: chocolate; height: 100%; min-height: 100vh; padding: 0; } </style> </head> <body> <div class="wrapper"> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста <div class="wrp">Этот блок нужно растянуть по ширине экрана, за пределы его родителя</div> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста </div> <script> window.addEventListener('DOMContentLoaded', function() { var scrollWidth = window.innerWidth - document.documentElement.clientWidth ; var x = ".wrp{ width: calc(100vw - "+scrollWidth+"px); margin: 0 calc("+(scrollWidth/2)+"px - 50vw) 0 calc(100% + "+(scrollWidth/2)+"px - 50vw);}"; var style = document.createElement('style'); style.textContent = x; document.querySelector("head").appendChild(style); }); </script> </body> </html> |
Цитата:
Цитата:
$('.wrp') а $('#wrp') Это моя невнимательность, простите. Всё работает, как нужно. Nexus, рони, Огромное спасибо! |
рони,
Цитата:
calc(100% + "+(scrollWidth/2)+"px - 50vw); |
рони,
последний ваш пост - тоже очень интересный вариант, обязательно заберу себе его в блокнот. рони, Nexus, ОГРОМНЕЙШЕЕ ВАМ СПАСИБО!!! |
Nexus,
заменил |
Немного изменил генерируемый css.
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style> * { box-sizing: border-box; } body { margin: 0; padding: 0; } .wrapper { background-color: burlywood; text-align: justify; margin: 0 auto; width: 200px; padding: 0 100px 0 0; } .wrp { background-color: chocolate; height: 100%; min-height: 100vh; padding: 0; } </style> </head> <body> <div class="wrapper"> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста <div class="wrp">Этот блок нужно растянуть по ширине экрана, за пределы его родителя</div> много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста много текста </div> <script> window.addEventListener('DOMContentLoaded', function() { var scrollWidth = window.innerWidth - document.documentElement.clientWidth ; var x = '.wrp{' +'width: calc(100vw - '+scrollWidth+'px);' +'margin-left:calc(-.5 * (100vw - '+scrollWidth+'px) + 100%);' +'}'; var style = document.createElement('style'); style.textContent = x; document.querySelector("head").appendChild(style); }); </script> </body> </html>Тут можно ширину окна изменить рил тайм: https://jsfiddle.net/j2e6pL1t/ PS. Если изменить ширину .wrapper, то работает неправильно. |
Nexus,
прошу меня простить за вновь поднятую тему. При добавлении этого скрипта var body_width=$('body').width(), $wrp=$('.wrp'); $wrp.css({ width:body_width, 'margin-left':-$wrp.offset().left }); происходит конфликт скриптов. А именно все скрипты, которые находятся ниже его, перестают работать. Если я этот скрипт располагаю самым последним, то тогда все скрипты работают корректно. Если я заключаю его в ~function () { }(); то это не помогает избежать конфликта. Скажите, пожалуйста, что можно сделать? |
LADYX,
консоль что пишет? |
Цитата:
показывает на ошибку в строке номер такой-то, на этой строке выходит: 'margin-left':-$wrp.offset().left да, и подчеркивает в этой строке волной ).left |
LADYX,
скорее всего элемента $('.wrp'); ещё нет сделайте так $(function() { var body_width=$('body').width(), $wrp=$('.wrp'); $wrp.css({ width:body_width, 'margin-left':-$wrp.offset().left }); }); |
рони,
я уже так тоже пробовал, не помогает |
LADYX,
делайте макет с проблемой или ждите телепата. что будет в консоли, код ниже $(function() { var body_width=$('body').width(), $wrp=$('.wrp'); console.log($wrp.length) $wrp.css({ width:body_width, 'margin-left':-$wrp.offset().left }); }); |
LADYX,
Цитата:
|
Nexus,
нет, не в этом дело. Сейчас скрипт у меня вот такой: $(function() { function update() { var body_width=$('body').width(), $uf=$('#pp-uf_range'); $uf.css({ width:body_width, 'margin-left':-$uf.offset().left }); console.log($uf.length) } $(window).resize(update); update(); }); рони, в консоли вот что: Uncaught TypeError: Cannot read property 'left' of undefined at update (scripts.js:113) at HTMLDocument.<anonymous> (scripts.js:119) at i (jquery.js?v=22:2) at Object.fireWith [as resolveWith] (jquery.js?v=22:2) at Function.ready (jquery.js?v=22:2) at HTMLDocument.J (jquery.js?v=22:2) scripts.js:113 это: 'margin-left':-$uf.offset().left подчеркивает ).left scripts.js:119 это: update(); Цитата:
я правильно дал информацию? Или не то что нужно? Тогда ткните меня, пожалуйста, носом) |
LADYX, попробуйте так и смотрите консоль:
$(function(){ $(window).resize(function(){ var body_width=$('body').width(), $uf=$('#pp-uf_range'); if(!$uf.length) throw new Error('Element «#pp-uf_range» not found'); $uf.css({ width:body_width, 'margin-left':-$uf.offset().left }); }).resize(); }); У вас элемента нет на странице. |
Nexus,
конфликт решается заменой строки $uf.css({ на $uf.length && $uf.css({ но тогда появляется другая проблема. Есть у меня другой скрипт $(function() { $(window).scroll(function() { var windowScroll = $(window).scrollTop(); var element = $('.pp-sections'); var distanceTop = element.offset().top - ($(window).height() / 2); var distanceHeight = element.offset().top - ($(window).height() / 2 - element.height()); if (windowScroll > distanceTop && windowScroll < distanceHeight) $('#panel-pp').animate({ 'left': '0px' }, 500); else $('#panel-pp').stop(true).animate({ 'left': '-146px' }, 200); }); }); И на страницах, где нет блока .pp-sections, в консоли появляется ошибка в строке var distanceTop = element.offset().top - ($(window).height() / 2); Если обернуть этот скрипт в ~function () { }(); то это не помогает. Что можно сделать? Простите меня за миллион вопросов, я сам уже запарился, ни одно, так другое :( |
Цитата:
Цитата:
Проверить есть элемент на странице или нет можно так: var element = $('.pp-sections'); if(element.length) alert('Элемент есть'); else alert('Элемента нет'); |
Цитата:
Nexus, видите, что получается, есть у меня одна категория, в которой ряд страниц. И на одной из них есть блок div .pp-sections. Так вот на этой странице естественно никаких ошибок не возникает. А на всех остальных страницах появляется ошибка, в связи с чем и не работают все остальные скрипты, которые расположены ниже этого скрипта. Но я не имею такой возможности отдельно именно для этой страницы подключать отдельный файл с этим скриптом, поэтому этот скрипт находится в общем файле со всеми скриптами. Так вот скажите, пожалуйста, возможно ли что-то сделать с этим скриптом, чтобы он срабатывал только тогда, когда на странице есть такой блок, а если на странице такого блока нет, то чтобы этот скрипт полностью игнорировался? Реально ли такое сделать? |
Цитата:
Цитата:
|
рони,
делаю так $(function() { $(window).scroll(function() { var windowScroll = $(window).scrollTop(); var element = $('.pp-sections'); if(element.length) { var distanceTop = element.offset().top - ($(window).height() / 2); var distanceHeight = element.offset().top - ($(window).height() / 2 - element.height()); if (windowScroll > distanceTop && windowScroll < distanceHeight) $('#panel-pp').animate({ 'left': '0px' }, 500); else $('#panel-pp').stop(true).animate({ 'left': '-146px' }, 200); } }); }); и консоль ругается, указывает на ошибку закрывающих скобок в скриптах, которые расположены ниже этого. Скажите, пожалуйста, где у меня ошибка? |
LADYX, в этом участке кода синтаксических ошибок нет.
|
Nexus,
Цитата:
Nexus, рони, огромнейшее вам спасибо за помощь и терпение! Удачи! |
Часовой пояс GMT +3, время: 10:51. |