Chrome에서 스크롤바가 페이지 너비에 추가되는 것을 방지


125

Chrome에서 .html 페이지를 일관된 너비로 유지하려는 작은 문제가 있습니다. 그 페이지 (1). 페이지 (2)에서 동일한 레이아웃 (메뉴, div 등)을 가지고 있지만 콘텐츠가 적기 때문에 수직 스크롤 막대가 없습니다.

문제는 (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'});
    }
}

h- 스크롤바 제거를위한 CSS :

body{
    overflow-x:hidden;
}

이것을보십시오 : http://jsfiddle.net/NQAzt/


1
영리한 해결책, 나는 'if'의 조건을 이해하지 못합니다!
Acemad 2013-08-31

3
scrollHeight는 요소의 총 높이입니다. 당신이 보는 것과 숨겨진 것. 예 : 창은 높이가 500px이고 본문에는 900px의 콘텐츠가 있습니다. 500px는 표시되지만 다른 400px는 숨겨져 있으며 스크롤 막대가 표시되어이 남은 픽셀을 표시합니다. 따라서 조건은 "모든 콘텐츠의 높이가 시점 높이보다 크면 본문에 여백을 추가합니다"와 같습니다. 죄송합니다 나의 나쁜 영어
Lwyrn

나는 지금 그것을 얻었습니다. 명확한 설명에 감사드립니다.이 솔루션을 시도하고 추가 수평 스크롤 막대를 얻었습니다. 왜 그런지 모르겠습니다.
Acemad 2013 년

2
나는 답장에서 그것을 방지하기 위해 약간의 CSS를 추가했습니다 :)
Lwyrn

4
이 솔루션은 스크롤링을 비활성화합니다
avalanche1

117

DISCLAIMER : 오버레이더 이상 사용되지 않습니다 .
꼭 필요한 경우 여전히 이것을 사용할 수 있지만 사용하지 마십시오.

이것은 WebKit 브라우저에서만 작동 하지만 많이 좋아합니다. auto다른 브라우저 에서처럼 작동 합니다.

.yourContent{
   overflow-y: overlay;
}

이렇게하면 스크롤바가 오버레이 로만 나타나 므로 요소 의 너비 에 영향을주지 않습니다 !


IE11에서는 작동하지 않습니다. IE에서 오버레이 값이 작동하도록 해결 방법이 있습니까?
Anvesh Reddy

내가 아는 한, IE에 대한이 스레드에서 제안 된 다른 옵션을 사용하여 수행해야합니다
simonDos

많이 필요합니다! 내 마크 업에서 내가 뭘 잘못했는지 확인하는 데 30 분 넘게 걸렸다. 어떤 스타일을 남용 했습니까? 이것도 기본값이어야합니다.
kushalvm

3
그러나이되지 않습니다
아카 쉬 Yellappa에게

1
이를 반영하기 위해 솔루션을 업데이트했습니다.
조금

57

다음을 추가하기 만하면됩니다.

html {
    overflow-y: scroll;
}

CSS 파일에서 필요한지 여부에 관계없이 스크롤러가 있지만 스크롤 할 수는 없습니다.

즉, 뷰포트의 너비는


4
그래서 두 가지 모두에 스크롤 막대를 추가해야합니다. 수직 스크롤 막대의 너비를 무시하는 방법이 없습니까? 감사합니다 !
Acemad 2013-08-31

내가 알고있는 것을 무시할 수있는 방법은 없지만 내가 말한 것은 치료법 @ Rockr90
Hive7

@ d3c0y 이것은 사실이며 대답에서 언급했지만 가장 쉬운 방법입니다. 하지만 지난 3 년 동안 변경되었는지는 모르겠습니다
Hive7

@aks. 브라우저가 스크롤 할 수 있다고 생각하게하여 스크롤바 및 스크롤이 가능하도록 y가 사이드 스크롤러입니다
Hive7

1
overflow-y : 스크롤; 스크롤 가능한 요소가 없어도 모든 뷰포트에 스크롤바를 추가 / 표시합니다.
Abhilash 2011

35

아마

html {
    width: 100vw;
}

당신이 원하는 것입니다.


1
이것은 내 유스 케이스에 대한 큰 일 : gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847은 내가 사용하고 calc()기본을 모두 유지하면서, 그래서 탐색 오프 스크린 고정 된 것을 바탕 화면에서 화면의 왼쪽을 차지할 수있는 메인 컨텐츠 뷰의 폭을 결정하기 위해 모바일에서 스크롤하십시오.
bmcminn

3
지난 36 시간 동안 스크롤바를 엉망으로 만들고 있습니다. 몇 가지 다른 솔루션이 작동했지만 다른 문제가 발생했습니다. 이것은 작동하고 다른 곳에서 일반 스크롤바를 사용할 수있는 첫 번째 솔루션입니다. 감사합니다.
kosher

천만에요! 그러나 함께 장난은 html의 폭 vw의 비트입니다 해키는 , 그래서 몇 가지주의 해주세요!
신경 전달 물질

이것은 훌륭하게 작동했습니다. 누군가 이것이 어떻게 작동하는지 설명 할 수 있습니까?
Zeus

1
솔루션은 나쁘지 않지만 가로 스크롤을 추가 할 수 있습니다.
FDisk

18

Safari 및 Chrome과 같은 Webkit 브라우저는 너비 (100 % 또는 100vw)를 계산할 때 보이는 페이지 너비에서 스크롤 막대 너비를 뺍니다. DM Rutherford의 스크롤링 및 페이지 너비에 대해 자세히 알아보십시오 .

overflow-y: overlay대신 사용해보십시오 .


9
여러 질문에 동일한 답변을 게시하지 마십시오. 하나의 좋은 답변을 게시 한 다음 투표 / 플래그하여 다른 질문을 중복으로 종료합니다. 질문이 중복되지 않는 경우 질문에 대한 답변을 조정하십시오.
Paul Roub

이것은 작동하지만 오버레이는 아직 표준이 아니며 모든 브라우저에서 지원되지 않습니다.
Zia Ul Rehman Mughal

빠른 딸꾹질 : Safari에서이 스크롤을 막을 수있는 페이지 발생
joshfindit

13

추가 할 수 있음을 알았습니다.

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

내 CSS에 직접 연결하면 스크롤 막대가 보이지 않지만 여전히 스크롤 할 수 있습니다 (적어도 Chrome에서). 페이지에 산만 한 스크롤바를 원하지 않을 때 유용합니다!


5
그것은 다소 위험하지 크로스 브라우저 솔루션입니다하지만 stackoverflow.com/questions/9251354/...
알렉스 Pyzhianov

4

너비가 고정 된 컨테이너의 경우 컨테이너를 다른 div로 래핑하고 두 div에 동일한 너비를 적용하여 순수한 CSS 크로스 브라우저 솔루션을 구현할 수 있습니다.

#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

내 다른 대답이 현재 제대로 작동하지 않는 것 같습니다 (하지만 계속 작동하도록 노력할 것입니다).

그러나 기본적으로 수행해야 할 작업과 동적으로 수행하려는 작업은 콘텐츠의 너비를 스크롤 가능한 부모 창의 너비보다 약간 작게 설정하는 것입니다.
따라서 스크롤바가 나타날 때 콘텐츠에 영향을주지 않습니다.

예제width브라우저가를 통해 우리를 위해 그것을하도록하는 대신 s를 하드 코딩함으로써 그 목표를 달성하는 더 엉뚱한 방법을 보여줍니다 padding.
이것이 가능하다면 영구적 인 스크롤바를 원하지 않는 가장 간단한 해결책입니다.


그것은 좋은 해결책이지만 부트 스트랩을 사용하여 반응 형 웹 사이트에서 작업하고 있으며 너비와 모든 것을 자동화하는 것이 중요합니다.
Acemad 2013-08-31

(가능성이 떨어지는 순서대로) 누군가가 내 다른 대답을 (패딩 또는 여백으로) 작동시키는 방법을 알아내는 경우가 아니면; 어떻게 든 미디어 쿼리 를 사용 하여 패딩을 선택적으로 적용 할 수 있습니다 . 또는 css 표현식 은 패딩을 선택적으로 적용하기 위해 최신 브라우저에서 구현됩니다. 난 단지 영구 스크롤 또는 스크롤 막대를 감지하는 JS를 사용하여이 갈 수있는 방법이라고 생각
Hashbrown

1

편집 : 이 대답은 현재 옳지 않습니다. 다른 대답을 참조하여 여기에서 무엇을하려고했는지 확인하십시오. 나는 그것을 고치려고 노력하고 있지만 도움을 줄 수 있다면 의견에 그렇게하십시오. 감사합니다!

를 사용 padding-right하면 스크롤바의 갑작스런 모양이 완화됩니다.

패딩이 움직이지 않은 것을 보여주는 크롬 devtools

점에서 볼 수 있듯이 텍스트는 스크롤 막대가 있는지 여부에 관계없이 줄 바꿈 전에 페이지의 동일한 지점으로 이동합니다.
스크롤바가 도입되면 패딩이 그 뒤에 숨겨져 스크롤바가 텍스트를 밀지 않기 때문입니다!


3
스크롤바 너비는 사용중인 OS 및 브라우저에 따라 변경 될 수 있습니다. 20px뿐만 아니라 40px까지 측정 할 수 있습니다
Lwyrn

2
물론 당신은 모든 가능한 값의 최대 사용하십시오
Hashbrown

1
일부 기기 / OS 브라우저의 스크롤에는 너비가 없습니다.
Sergey Goliney

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

여기서 300px는 대화 창 너비의 절반입니다.

이것은 실제로 나를 위해 일한 유일한 것입니다.


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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.