제목에서 언급했듯이 vw
CSS에서만 스크롤바없이 계산할 수 있습니까?
예를 들어, 내 화면의 너비는 1920px
. vw
반환 1920px
, 좋은. 하지만 제 실제 몸통은 1903px
.
1903px
CSS로만 값 을 검색 할 수있는 방법이 있습니까 (의 직계 자식뿐만 아니라 body
), 아니면 JavaScript가 절대적으로 필요합니까?
제목에서 언급했듯이 vw
CSS에서만 스크롤바없이 계산할 수 있습니까?
예를 들어, 내 화면의 너비는 1920px
. vw
반환 1920px
, 좋은. 하지만 제 실제 몸통은 1903px
.
1903px
CSS로만 값 을 검색 할 수있는 방법이 있습니까 (의 직계 자식뿐만 아니라 body
), 아니면 JavaScript가 절대적으로 필요합니까?
width: calc(100vw - scrollbarWidth)
여기서 'scrollbarWidth'는 15px와 같은 고정 값입니다
답변:
이를 수행하는 한 가지 방법은 calc를 사용하는 것입니다. 내가 아는 한 100 %는 스크롤바를 포함한 너비입니다. 따라서 다음과 같이하면됩니다.
body {
width: calc(100vw - (100vw - 100%));
}
스크롤바의 너비를 뺀 100vw를 얻습니다.
예를 들어 뷰포트의 50 % (스콜 바 너비의 50 % 빼기) 인 정사각형을 원하는 경우 높이로도이 작업을 수행 할 수 있습니다.
.box {
width: calc(50vw - ((100vw - 100%)/2))
height: 0
padding-bottom: calc(50vw - ((100vw - 100%)/2))
}
body
이거나 너비가 같은 요소 인 경우에만 작동합니다 body
(그렇지 않으면 100%
잘못된 요소의 너비를 참조합니다). 어떤 경우에는 단순히 백분율을 사용할 수 있습니다. 내가 뭔가 빠뜨리지 않는 한?
100vw - (100vw - 100%) = 100vw - 100vw + 100% = 100%
내가 뭔가 놓친 게 있나요?
문서가로드되면 CSS 변수를 정의하는 자바 스크립트 줄을 추가하여이를 수행합니다.
document.documentElement.style.setProperty('--scrollbar-width', (window.innerWidth - document.documentElement.clientWidth) + "px");
그런 다음 CSS var(--scrollbar-width)
에서 다른 너비의 스크롤바가 있거나없는 다른 브라우저에 필요한 조정을 수행 할 수 있습니다 . 당신은 대체, 필요한 경우 수평 스크롤 비슷한 일을 할 수있는 innerWidth
과 innerHeight
와 clientWidth
함께 clientHeight
.
specs 에 따르면 뷰포트 상대 길이 단위는 스크롤바를 고려하지 않습니다 (실제로 존재하지 않는다고 가정).
따라서 의도 한 동작이 무엇이든 이러한 단위를 사용할 때 스크롤바를 고려할 수 없습니다.
vw
사양에 따라 스크롤바의 존재를 인식하지 못합니다. 그래서 당신은 그것들을 고려할 수 없습니다.
overflow-y: scroll
vs로 overflow-y: auto
설정해도 vw 단위의 계산 된 값이 변경되지 않는 것 같습니다. 특히 내 사이트에 3.82vw로 설정된 것이 있고 컴퓨터 너비는 1920px입니다. 오버플로 자동을 사용하면 3.82vw = 73.344px, 그런 다음 73.344px를 출력하는 오버플로 스크롤을 사용해 보았습니다. 올바른 경우 실제로 72.6946px를 출력해야 할 때
Webkit 브라우저는 스크롤바를 제외하고 다른 브라우저는 반환 된 너비에 포함합니다. 물론 이것은 문제로 이어질 수 있습니다. 예를 들어 높이를 동적으로 추가하는 ajax로 콘텐츠를 동적으로 생성 한 경우 Safari는 페이지 시각화 중에 레이아웃에서 다른 레이아웃으로 전환 할 수 있습니다. 좋아, 자주 발생하지는 않지만 알고 있습니다. 모바일에서는 문제가 적고 스크롤바가 일반적으로 표시되지 않습니다.
즉, 문제가 모든 브라우저에서 스크롤바없이 뷰포트 너비를 정확히 계산하는 것이라면 내가 아는 한 좋은 방법은 다음과 같습니다.
width = $('body').innerWidth();
이전에 설정 :
body {
margin:0;
}
vw
단위는 고려하지 않는 overflow-y
경우 계정에 스크롤 막대를 overflow-y
설정한다 auto
.
로 변경 overflow-y: scroll;
하면 vw
단위는 스크롤바가없는 뷰포트가됩니다.
고려해야 할 단점 만 있습니다. 콘텐츠가 화면에 맞으면 스크롤바가 표시됩니다. 가능한 해결책은 javascript 에서로 변경하는 auto
것 scroll
입니다.
overflow-x
?
overflow-y: scroll;
"calc"로 코드를 엉망으로 만들지 않고 작동하는 유일한 방법은 컨테이너 요소 크기를 100vw로 만드는 것입니다. overflow-x에 대한 컨테이너 주위에 래퍼 추가; 이렇게하면 스크롤바가 콘텐츠 위에있는 것처럼 컨테이너가 전체 너비가됩니다.
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html{ overflow-y: scroll; }
html, body{ padding:0; margin: 0;}
#wrapper{ overflow-x: hidden; }
.row{ width: 100vw; }
.row:after{ clear: both; content: ''; display: block; overflow: hidden; }
.row-left{ background: blue; float: left; height: 40vh; width: 50vw; }
.row-right{ background: red; float: right; height: 40vh; width: 50vw; }
</style>
</head>
<body>
<div id="wrapper">
<div class="row">
<div class="row-left"></div>
<div class="row-right"></div>
</div>
</div>
</body>
</html>
케이스가 슬라이더와 비슷한 경우 : 많은 답변에 게시 된대로 너비 100 %는 스크롤 막대를 고려하지 않는 반면 100vw는 고려합니다. 창의 너비를 가져야하는 요소가 많고 이미 창 너비가 100 % 인 컨테이너 내부에 중첩 된 (또는 자연 블록 너비가 이와 같은) 요소가 많은 경우 다음을 사용할 수 있습니다.
내 솔루션은 아니지만 전체 범위가 아닌 상대 요소에서 절대로 드롭 다운 전체 너비 메뉴를 만드는 데 도움이됩니다.
: root의 css var에서 스크롤을 얻어서 사용해야합니다.
:root{
--scrollbar-width: calc(100vw - 100%);
}
div { margin-right: var(--scrollbar-width); }