16:9
동영상처럼 가로 세로 비율이 고정 된 사이트를 모아 놓았습니다 .
나는 그것을 중앙에 놓고 사용 가능한 너비와 사용 가능한 높이를 채우기 위해 확장하고 싶지만 양쪽에서 더 커지지 않도록합니다.
예를 들면 :
- 길고 얇은 페이지에는 비례 높이를 유지하면서 전체 너비로 콘텐츠가 늘어납니다.
- 짧은 폭의 페이지에는 비례하는 너비로 전체 높이로 콘텐츠가 늘어납니다.
내가 살펴본 두 가지 방법이 있습니다.
- 적절한 가로 세로 비율의 이미지를 사용하여 컨테이너를 확장
div
했지만 주요 브라우저에서 동일한 방식으로 작동하도록 만들 수 없습니다. - 비례 하단 패딩을 설정하지만 너비에 대해서만 상대적으로 작동하고 높이를 무시합니다. 너비에 따라 계속 커지고 세로 스크롤 막대가 표시됩니다.
JS로 쉽게 할 수 있다는 것을 알고 있지만 순수한 CSS 솔루션을 원합니다.
어떤 아이디어?
답변
새로운 CSS 뷰포트 단위 vw
및 vh
(뷰포트 너비 / 뷰포트 높이) 사용
수직 및 수평으로 크기를 조정하면 요소가 비율을 깨지 않고 스크롤바없이 항상 최대 뷰포트 크기를 채운다는 것을 알 수 있습니다!
(순수) CSS
div
{
width: 100vw;
height: 56.25vw; /* height:width ratio = 9/16 = .5625 */
background: pink;
max-height: 100vh;
max-width: 177.78vh; /* 16/9 = 1.778 */
margin: auto;
position: absolute;
top:0;bottom:0; /* vertical center */
left:0;right:0; /* horizontal center */
}
뷰포트의 너비와 높이의 최대 90 %를 사용하려는 경우 : FIDDLE
또한 브라우저 지원도 꽤 좋습니다 : IE9 +, FF, Chrome, Safari- caniuse
답변
Danield
추가 사용을 위해 LESS 믹스 인에서의 답변을 재구성 합니다.
// Mixin for ratio dimensions
.viewportRatio(@x, @y) {
width: 100vw;
height: @y * 100vw / @x;
max-width: @x / @y * 100vh;
max-height: 100vh;
}
div {
// Force a ratio of 5:1 for all <div>
.viewportRatio(5, 1);
background-color: blue;
margin: 0;
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
}
답변
CSS 뷰포트 단위 와 함께 CSS 미디어 쿼리를 사용하고 뷰포트 의 종횡비에 맞게 조정합니다. 이렇게하면과 같은 다른 속성도 업데이트 할 수 있습니다.@media
vw
vh
font-size
이 바이올린 은 div의 고정 된 종횡비와 크기가 정확히 일치하는 텍스트를 보여줍니다.
초기 크기는 전체 너비를 기준으로합니다.
div {
width: 100vw;
height: calc(100vw * 9 / 16);
font-size: 10vw;
/* align center */
margin: auto;
position: absolute;
top: 0px; right: 0px; bottom: 0px; left: 0px;
/* visual indicators */
background:
url(data:image/gif;base64,R0lGODlhAgAUAIABAB1ziv///yH5BAEAAAEALAAAAAACABQAAAIHhI+pa+EPCwA7) repeat-y center top,
url(data:image/gif;base64,R0lGODlhFAACAIABAIodZP///yH5BAEAAAEALAAAAAAUAAIAAAIIhI8Zu+nIVgEAOw==) repeat-x left center,
silver;
}
그런 다음 뷰포트가 원하는 종횡비보다 넓 으면 기본 측정 값으로 높이로 전환합니다.
/* 100 * 16/9 = 177.778 */
@media (min-width: 177.778vh) {
div {
height: 100vh;
width: calc(100vh * 16 / 9);
font-size: calc(10vh * 16 / 9);
}
}
이것은 @Danield 의 max-width
and max-height
접근 방식 과 매우 유사하며 더 유연합니다.
답변
이것에 대한 나의 원래 질문은 두 가지 모두 고정 된 측면의 요소를 갖는 방법이지만 지정된 컨테이너 내에 정확히 맞추는 방법이었습니다. 개별 요소가 종횡비를 유지하기 만하면 훨씬 쉽습니다.
내가 만난 가장 좋은 방법은 요소에 높이를 0으로 지정한 다음 백분율 padding-bottom을 사용하여 높이를 지정하는 것입니다. 백분율 패딩은 항상 요소의 너비에 비례하며 위쪽 또는 아래쪽 패딩이더라도 높이가 아닙니다.
따라서이를 활용하여 요소에 컨테이너 내에 배치 할 백분율 너비를 지정한 다음 패딩을 사용하여 가로 세로 비율 또는 다른 용어로 너비와 높이 간의 관계를 지정할 수 있습니다.
.object {
width: 80%; /* whatever width here, can be fixed no of pixels etc. */
height: 0px;
padding-bottom: 56.25%;
}
.object .content {
position: absolute;
top: 0px;
left: 0px;
height: 100%;
width: 100%;
box-sizing: border-box;
-moz-box-sizing: border-box;
padding: 40px;
}
따라서 위의 예에서 개체는 컨테이너 너비의 80 %를 차지하고 높이는 해당 값의 56.25 %입니다. 너비가 160px이면 하단 패딩이므로 높이는 90px (16 : 9 비율)가됩니다.
여기서 문제가되지 않는 사소한 문제는 새 개체 내부에 자연 공간이 없다는 것입니다. 예를 들어 텍스트를 넣어야하고 해당 텍스트가 자체 패딩 값을 가져야하는 경우 내부에 컨테이너를 추가하고 거기에 속성을 지정해야합니다.
또한 vw 및 vh 단위는 일부 구형 브라우저에서 지원되지 않으므로 내 질문에 대한 대답이 가능하지 않을 수 있으며 더 많은 lo-fi를 사용해야 할 수도 있습니다.
답변
CSS
특정 솔루션 을 원한다고 요청하셨습니다 . 종횡비를 유지하려면 높이를 원하는 종횡비로 나누어야합니다. 16 : 9 = 1.777777777778.
컨테이너의 올바른 높이를 얻으려면 현재 너비를 1.777777777778로 나누어야합니다. 당신은 width
단지 CSS
또는 백분율로 나눈 컨테이너의 확인을 할 수 없기 때문에 (내가 아는 한) CSS
이것은 불가능합니다 JavaScript
.
원하는 종횡비를 유지하는 작업 스크립트를 작성했습니다.
HTML
<div id="aspectRatio"></div>
CSS
body { width: 100%; height: 100%; padding: 0; margin: 0; }
#aspectRatio { background: #ff6a00; }
자바 스크립트
window.onload = function () {
//Let's create a function that will scale an element with the desired ratio
//Specify the element id, desired width, and height
function keepAspectRatio(id, width, height) {
var aspectRatioDiv = document.getElementById(id);
aspectRatioDiv.style.width = window.innerWidth;
aspectRatioDiv.style.height = (window.innerWidth / (width / height)) + "px";
}
//run the function when the window loads
keepAspectRatio("aspectRatio", 16, 9);
//run the function every time the window is resized
window.onresize = function (event) {
keepAspectRatio("aspectRatio", 16, 9);
}
}
다음을 사용하여 function
다른 비율로 다른 것을 표시 하려면 다시 사용할 수 있습니다.
keepAspectRatio(id, width, height);
답변
이제이를 해결하기 위해 지정된 새 CSS 속성이 object-fit
있습니다.
http://docs.webplatform.org/wiki/css/properties/object-fit
브라우저 지원은 여전히 다소 부족합니다 ( http://caniuse.com/#feat=object-fit)- 현재 Microsoft를 제외한 대부분의 브라우저에서 어느 정도 작동하지만 시간이 주어지면이 질문에 정확히 필요한 것입니다.
답변
Danield의 대답 은 좋지만 div가 전체 뷰포트를 채울 때만 사용할 수 있습니다. 또는 뷰포트 calc
에있는 다른 콘텐츠의 너비와 높이를 알고있는 경우 약간의를 사용하여 사용할 수 있습니다.
그러나 margin-bottom
전술 한 답변의 방법과 트릭을 결합 하면 다른 콘텐츠의 높이 만 알면 문제를 줄일 수 있습니다. 이것은 고정 높이 헤더가 있지만 예를 들어 사이드 바의 너비를 알 수없는 경우에 유용합니다.
body {
margin: 0;
margin-top: 100px; /* simulating a header */
}
main {
margin: 0 auto;
max-width: calc(200vh - 200px);
}
section {
padding-bottom: 50%;
position: relative;
}
div {
position:absolute;
background-color: red;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
<main>
<section>
<div></div>
</section>
</main>
여기에서는 scss를 사용하는 jsfiddle 에 있으므로 값의 출처가 더 명확 해집니다.