Запобігайте розширенню смуги прокрутки до Ширини сторінки в Chrome


125

У мене є невелика проблема, що намагається підтримувати мої сторінки .html на однаковій ширині в Chrome. Наприклад, у мене є сторінка (1) з великим вмістом, яка переповнює висоту вікна перегляду (правильне слово?), Тому вертикальна смуга прокрутки на цій сторінці (1). На сторінці (2) у мене однаковий макет (меню, діви, ... тощо), але менше вмісту, тому вертикальних смуг прокрутки там немає.

Проблема полягає в тому, що на сторінці (1) смуги прокрутки, здається, штовхають елементи трохи вліво (додаючи до ширини?), В той час як усе виглядає добре зосередженим на сторінці (2)

Я все ще початківець у HTML / CSS / JS, і я досить впевнений, що це не так складно, але мені не пощастило розібратися у рішенні. Це працює за призначенням на IE10 та FireFox (смуги прокрутки, що не заважають), я стикався з цим лише у Chrome.

Відповіді:


42

Ви можете отримати розмір смуги прокрутки, а потім застосувати поле до контейнера.

Щось на зразок цього:

var checkScrollBars = function(){
    var b = $('body');
    var normalw = 0;
    var scrollw = 0;
    if(b.prop('scrollHeight')>b.height()){
        normalw = window.innerWidth;
        scrollw = normalw - b.width();
        $('#container').css({marginRight:'-'+scrollw+'px'});
    }
}

CSS для видалення h-смуги прокрутки:

body{
    overflow-x:hidden;
}

Спробуйте поглянути на це: http://jsfiddle.net/NQAzt/


1
Розумне рішення, я не розумію умови в "якщо", хоча!
Acemad

3
ScrollHeight - загальна висота елемента. Що ти бачиш і що приховано. Приклад: у вашому вікні приблизно 500 пікс., Корпус має вміст 900 пікселів. Показано 500px, але інші 400px приховані, і на панелі прокрутки з'явиться цей піксель, що перетворюється. Отже, умова подібна "якщо висота всього вмісту більша за висоту точки огляду, додайте поле до тіла". Вибачте за мою погану англійську мову
Lwyrn

Я отримав це зараз, дякую за чітке пояснення, я спробував це рішення і отримав додаткову горизонтальну смугу прокрутки, не знаю чому, хоча.
Acemad

2
Я додав трохи фрагменту css, щоб запобігти це у відповіді :)
Lwyrn

4
Це рішення вимикає прокрутку
лавина1

117

ВІДМОВА ВІД ВІДПОВІДАЛЬНОСТІ : накладення було застарілим .
Ви все ще можете користуватися цим, якщо вам абсолютно доведеться, але намагайтеся цього не робити.

Це працює лише в браузерах WebKit , але мені це дуже подобається. Буде вести себе як autoу інших браузерах.

.yourContent{
   overflow-y: overlay;
}

Це зробить смугу прокрутки лише як накладку , тим самим не впливаючи на ширину вашого елемента!


Це не працює для IE11. Чи є якась робота над значенням накладання для роботи в IE.
Анвеш Редді

не наскільки я знаю, вам доведеться робити інші варіанти, запропоновані в цій темі для IE
simonDos

Багато чого потрібно! Мені знадобилося більше півгодини, щоб просто побачити, що, чорт, зробив не так зі своєю розміткою. Якими стилями я зловживав? Це також повинно бути за замовчуванням.
kushalvm

3
Але це застаріло
Акаш Єллаппа

1
Я оновив рішення, щоб це відобразити. Kinda sad: P
simonDos

57

Все, що вам потрібно зробити, це додати:

html {
    overflow-y: scroll;
}

У вашому файлі css, оскільки це буде мати прокрутку, потрібна вона чи ні, хоча ви просто не зможете прокручувати

Це означає, що вікно перегляду буде мати однакову ширину для обох


4
Отже, я зобов'язаний додати смуги прокрутки до обох? хіба немає способу просто ігнорувати ширину вертикальної смуги прокрутки? Дякую !
Acemad

Немає можливості ігнорувати це, про що я знаю, але те, що я сказав, працює ласощами @ Rockr90
Hive7

@ d3c0y це правда, і я згадував це у відповіді, але це найпростіший спосіб зробити це. Я не знаю, чи змінилося це за останні 3 роки, проте
Hive7

@aks. це змушує браузер думати, що ви можете прокручувати, тому дає змогу прокручувати панель прокрутки та прокручувати y - бічний скроллер
Hive7

1
overflow-y: прокручування; додасть / покаже смугу прокрутки у всі області перегляду, навіть якщо немає прокручуваних елементів.
Абхілаш

35

ймовірно

html {
    width: 100vw;
}

це саме те, що ти хочеш.


1
Це чудово підходило для мого використання: gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847 Я використовую calc()для визначення ширини перегляду основного вмісту, щоб фіксований екран на екрані не міг займати ліву частину екрана на робочому столі, зберігаючи рідну прокрутка на мобільному.
bmcminn

3
Я возився зі своїми прокруткою протягом останніх 36 годин. У мене було кілька різних рішень, які спрацювали, але порушили інші питання. Це перше рішення, яке працює і дозволяє мені використовувати звичайну смугу прокрутки в іншому місці. Дякую.
кошер

Ласкаво просимо! Але возитися з htmlшириною 's vwтрохи нерозумно , тому будьте обережні!
Нейромедіатор

Це спрацювало чудово, чи може хтось пояснити, як це працює?
Зевс

1
Рішення непогане, але воно може додати горизонтальну прокрутку.
FDisk

18

Веб-браузери на зразок Safari та Chrome віднімають ширину смуги прокрутки від видимої ширини сторінки при розрахунку ширини: 100% або 100vw. Детальніше про прокрутку та широту сторінку DM Rutherford .

Спробуйте використовувати overflow-y: overlayзамість цього.


9
Не публікуйте однакових відповідей на кілька запитань. Опублікуйте одну хорошу відповідь, а потім проголосуйте / позначте, щоб закрити інші питання як дублікати. Якщо питання не є дублікатом, підготуйте свої відповіді на питання.
Пол Руб

Це повинно працювати, але накладення ще не є стандартним, воно не підтримується у всіх браузерах.
Zia Ul Rehman Mghal

Швидкий ікот: у Safari це призвело до припинення прокрутки сторінки
joshfindit

13

Я виявив, що можу додати

::-webkit-scrollbar { 
display: none; 
}

безпосередньо до мого css, і це зробить смугу прокрутки невидимою, але все ж дозволить мені прокручувати (принаймні на Chrome). Добре, коли ви не хочете відволікаючої смуги прокрутки на своїй сторінці!


5
Це дещо ризиковано і не крос-браузерне рішення, хоча stackoverflow.com/questions/9251354/…
Alex Pyzhianov

4

Для контейнерів із фіксованою шириною може бути досягнуто чисте перехресне рішення браузера CSS , обернувши контейнер в інший діл та застосувавши однакову ширину до обох div.

#outer {
  overflow-y: auto;
  overflow-x: hidden;
  /*
   * width must be an absolute value otherwise the inner divs width must be set via
   * javascript to the computed width of the parent container
   */
  width: 200px;
}

#inner {
  width: inherit;
}

Клацніть тут, щоб побачити приклад на Codepen


3

Не здається, що моя інша відповідь працює цілком коректно на даний момент (але я продовжую намагатися ввести її в дію).

Але в основному те, що вам потрібно буде зробити, і те, що він намагався зробити динамічно, - це встановити ширину вмісту трохи менше, ніж ширину батьківської панелі, що прокручується.
Так що, коли з’являється смуга прокрутки, це не впливає на вміст.

Цей ПРИКЛАД показує більш хакітний спосіб досягнення цієї мети шляхом жорсткого кодування widths, а не намагання змусити браузер зробити це для нас за допомогою padding.
Якщо це можливо, це найпростіше рішення, якщо ви не хочете постійної смуги прокрутки.


Це хороше рішення, однак я працюю на чуйному веб-сайті за допомогою Bootstrap, і важливо автоматизувати ширину і все, що ви кажете?
Acemad

добре, якщо (з метою імовірності обману) також: хтось з'ясував, як отримати мою іншу відповідь на роботу (з прокладкою або з запасом); ви можете якось використовувати медіа-запити для вибіркового застосування прокладки; або css-вирази реалізовані в сучасних браузерах, щоб вибірково застосовувати прокладки. Я думаю, що дорога лише для постійної смуги прокрутки або використання JS для виявлення смуги прокрутки
Hashbrown

1

EDIT: ця відповідь на даний момент не зовсім правильна, зверніться до моєї іншої відповіді, щоб побачити, що я намагався зробити тут. Я намагаюся це виправити, але якщо ви можете запропонувати допомогу, зробіть це в коментарях, дякую!

Використання padding-rightпом'якшить раптову появу прокрутки

ПРИКЛАД

хромовані девтоли, на яких зображено набивання непорушеним

Як видно з крапок, текст переносить його в ту саму точку сторінки перед загортанням, незалежно від того, присутній смуга прокрутки чи ні.
Це тому, що при введенні смуги прокрутки накладка ховається за нею, тому смуга прокрутки не натискає на текст!


3
Ширина смуги прокрутки може змінюватися залежно від того, яку ОС та браузер ви використовуєте. Він може вимірювати як 20 пікселів, так і 40 пікселів
Lwyrn

2
добре, ви б використали максимум усіх можливих значень
Hashbrown

1
Деякі пристрої / прокрутки ОС браузера не мають навіть ширини.
Сергій Голіней

0
.modal-dialog {
   position: absolute;
   left: calc(50vw - 300px);
}

де 300 пікс - це половина ширини мого діалогового вікна.

Це насправді єдине, що працювало на мене.


0

У мене була така ж проблема в Chrome. Зі мною це сталося лише тоді, коли смугу прокрутки завжди видно. (знайдено в загальних налаштуваннях) У мене є модальний і, коли я відкриваю модальний, я помітив, що ...

body {
    padding-left: 15px;
}

додається в організм. Щоб це не сталося, я додав

body {
    padding-left: 0px !important;
}

0

Я не можу додати коментар до першої відповіді, і це вже давно ... але в цьому демо є проблема:

if(b.prop('scrollHeight')>b.height()){
    normalw = window.innerWidth;
    scrollw = normalw - b.width();
    $('#container').css({marginRight:'-'+scrollw+'px'});
}

b.prop ('scrollHeight') завжди дорівнює b.height (),

Я думаю, що має бути так:

if(b.prop('scrollHeight')>window.innerHeight) ...

Нарешті, я рекомендую метод:

html {
 overflow-y: scroll;
}

:root {
  overflow-y: auto;
  overflow-x: hidden;
}

:root body {
  position: absolute;
}

body {
 width: 100vw;
 overflow: hidden;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.