높이 변경시 이미지 종횡비 유지


114

CSS 플렉스 박스 모델을 사용하여 이미지가 종횡비를 유지하도록 강제 할 수 있습니까?

JS Fiddle : http://jsfiddle.net/xLc2Le0k/2/

컨테이너의 너비를 채우기 위해 이미지가 늘어나거나 줄어 듭니다. 괜찮습니다.하지만 이미지 비율을 유지하기 위해 높이 를 늘리거나 줄일 수도 있습니까?

HTML

<div class="slider">
    <img src="http://www.placebacon.net/400/300" alt="Bacn">
    <img src="http://www.placebacon.net/400/300" alt="Bacn">
    <img src="http://www.placebacon.net/400/300" alt="Bacn">
    <img src="http://www.placebacon.net/400/300" alt="Bacn">
</div>

CSS

.slider {
    display: flex;
}
.slider img {
    margin: 0 5px;
}

1
지금까지 내가 아는 한, 가장 좋은 해결책은을 사용하는 것입니다 <div>CSS를 함께background-image: url(...);background-size:contain; background-repeat:no-repeat
Blazemonger

1
여기에 몇 가지 흥미로운 단서가 있지만 이미지가 이미 같은 비율이 아닌 경우에는 어떨까요? 추가 및 '추가'div는 우리가 걱정해야 할 마지막 사항입니다. 대신 다음과 같은 테스트 케이스를 사용하지 않는 이유 : jsfiddle.net/sheriffderek/999Lg9qv
sheriffderek

답변:


68

img 태그의 경우 한쪽을 정의하면 다른 쪽의 크기가 조정되어 종횡비를 유지하고 기본적으로 이미지가 원래 크기로 확장됩니다.

이 사실을 사용하여 각 img 태그를 div 태그로 래핑하고 너비를 부모 div의 100 %로 설정하면 높이가 원하는 가로 세로 비율에 따라 달라집니다.

http://jsfiddle.net/0o5tpbxg/

* {
    margin: 0;
    padding: 0;
}
.slider {
    display: flex;
}
.slider .slide img {
    width: 100%;
}

2
div 사용을 제안하는 두 가지 답변이 있다는 것을 알고 있지만 이미지 높이가 예상과 다른 이유를 설명하기 때문에이 답변을 올바르게 표시하고 있습니다. 실제로 이것은 정상적이고 올바른 동작이며 버그가 아니기 때문에 "수정"될 가능성이 낮습니다.
coderMe

18
그러나이 답변은 flexbox 컨테이너 내에서 이미지가 다르게 동작하기 때문에 flexbox에 대해 아무것도 언급하지 않습니다. 한쪽을 설정해도 다른 쪽은 비례 적으로 크기가 조정되지 않습니다. 비 플렉스 박스 컨테이너에 래핑하면 도움이되지만 불필요한 마크 업이 의미를 잃습니다.
Robert Koritnik

3
이 작업을 수행하기 위해 래핑 div가 필요하지 않은 것 같습니다. jsfiddle.net/xLc2Le0k/120
Rick Strahl

4
그러나 이것은 어떻습니까? jsfiddle.net/xLc2Le0k/15 이 솔루션은 이미지가 모두 같은 비율이기 때문에 작동하는 우연이라고 생각합니다. 참고 : 특히 반응 형 이미지를 처리 ​​할 때 위치 지정을 위해 div에 이미지를 배치하여 '의미 성'을 잃지 않습니다.
sheriffderek

1
진지하게 가장 깨끗한 솔루션이며 사진과 함께 작동합니다!
shaneonabike

64

플렉스 부모 내부의 어느 축에서나 이미지가 늘어나지 않도록 몇 가지 해결책을 찾았습니다.

예를 들어 이미지에 개체 맞춤을 사용해 볼 수 있습니다.

object-fit: contain;

http://jsfiddle.net/ykw3sfjd/

또는 경우에 따라 더 잘 작동 할 수있는 플렉스 특정 규칙을 추가 할 수 있습니다.

align-self: center;
flex: 0 0 auto;

4
객체 맞는 좋은 솔루션이 될 수는되지 않은 IE 및 Edge에서 지원 누락 심지어 에지 14
다니엘스


나는 그 폴백을 직접 사용하고 있으며 매우 잘 작동합니다.
Matty Balaam

1
@daniels Edge는 이제 개발 단계에서 개체에 적합합니다. developer.microsoft.com/en-us/microsoft-edge/platform/status/…
AMDG

1
object-fit: contain;내가 크롬에서만 문제가 있었을 때 나를 위해 트릭을 썼다.
Benjamin Peter

53

포함하는 div를 추가 할 필요가 없습니다.

css "align-items"속성의 기본값은 "stretch"로 이미지가 원래 높이까지 늘어납니다. css "align-items"속성을 "flex-start"로 설정하면 문제가 해결됩니다.

.slider {
    display: flex;
    align-items: flex-start;  /* ADD THIS! */
}

3
Ahh ... 실제로 지원되는 방식으로 일을 해주셔서 감사합니다. 나는 그 일까지 답변을 읽고 있었다 그리고 우리 모두 가지고 있었다 더러운 해킹을 믿을 수 없었다 ..
펠릭스 Gagnon의-Grenier의

35

본질적인 크기를 가진 대부분의 이미지 , 즉 jpeg이미지 처럼 자연스러운 크기 입니다. 지정된 크기가 너비와 높이 중 하나를 정의하는 경우 고유 비율을 사용하여 누락 된 값이 결정됩니다 ...- MDN 참조 .

그러나 내가 아는 한 현재 Flexible Box Layout Module Level 1을 사용하여 직접 플렉스 항목으로 설정되는 이미지가 예상대로 작동하지 않습니다 .

다음 토론을 참조하고 버그 보고서가 관련 될 수 있습니다.

  • Flexbugs # 14 -Chrome / Flexbox Intrinsic Sizing이 올바르게 구현되지 않았습니다.
  • Firefox 버그 972595 -Flex 컨테이너는 flex 항목의 고유 너비를 계산하기 위해 "width"대신 "flex-basis"를 사용해야합니다.
  • Chromium 문제 249112 -Flexbox에서 고유 종횡비를 허용하여 기본 크기 계산을 알립니다.

해결 방법으로 각각 <img><div>또는로 래핑 할 수 <span>있습니다.

jsFiddle

.slider {
  display: flex;
}

.slider>div {
  min-width: 0; /* why? see below. */
}

.slider>div>img {
  max-width: 100%;
  height: auto;
}
<div class="slider">
  <div><img src="https://picsum.photos/400/300?image=0" /></div>
  <div><img src="https://picsum.photos/400/300?image=1" /></div>
  <div><img src="https://picsum.photos/400/300?image=2" /></div>
  <div><img src="https://picsum.photos/400/300?image=3" /></div>
</div>

4.5 플렉스 아이템의 묵시적 최소 크기

flex 항목에 대해보다 합리적인 기본 최소 크기를 제공하기 위해이 사양에서는 CSS 2.1에 정의 된 min-widthmin-height 속성 의 초기 값으로 새로운 auto 값을 도입합니다 .


또는 CSS table레이아웃을 대신 사용할 수 있습니다. 와 유사한 결과를 얻을 수 있으며 flexboxIE8에서도 더 많은 브라우저에서 작동합니다.

jsFiddle

.slider {
  display: table;
  width: 100%;
  table-layout: fixed;
  border-collapse: collapse;
}

.slider>div {
  display: table-cell;
  vertical-align: top;
}

.slider>div>img {
  max-width: 100%;
  height: auto;
}
<div class="slider">
  <div><img src="https://picsum.photos/400/300?image=0" /></div>
  <div><img src="https://picsum.photos/400/300?image=1" /></div>
  <div><img src="https://picsum.photos/400/300?image=2" /></div>
  <div><img src="https://picsum.photos/400/300?image=3" /></div>
</div>


첫 번째 조각은 필요가 .slider > div{min-width:0}지원하는 새로운 브라우저 min-width: auto.
Oriol

3
flexbox 사양 automin-widthmin-height(이전에는 0) 의 기본값으로 새 값을 도입했습니다 . Chrome은 아직이를 구현하지 않으므로 첫 번째 스 니펫이 작동합니다. 그러나 새로운 브라우저는 플렉스 항목이 이미지의 기본 너비보다 작게 축소되도록하기 위해 필요합니다.
Oriol

2
+1 이것은 근본적인 문제인 flexbox 모델의 이미지에 대해 이야기하기 때문에 받아 들여야 합니다. ...이 경우
로버트 Koritnik을

다양한 중단 점에서 레이아웃이 변경되지 않으면 테이블이 훌륭하지만 요즘에는 그럴 것 같지 않습니다.
sheriffderek

1
이미지가 모두 같은 비율이 아닌 경우는 어떻습니까? jsfiddle.net/sheriffderek/5u7y21we
sheriffderek

6

나는 최근에 flexbox를 가지고 놀았고 실험과 다음 추론을 통해 이에 대한 해결책을 찾았습니다. 그러나 실제로 이것이 정확히 일어나는 일인지 확실하지 않습니다.

실제 너비가 플렉스 시스템의 영향을받는 경우. 따라서 요소의 너비가 부모의 최대 너비에 도달하면 CSS에 설정된 추가 너비가 무시됩니다. 그런 다음 너비를 100 %로 설정하는 것이 안전합니다.

img 태그의 높이는 이미지 자체에서 파생되므로 높이를 0 %로 설정하면 작업을 수행 할 수 있습니다. (이것은 내가 무엇에 대해 명확하지 않은 곳입니다 ...하지만 그것을 고쳐야한다는 것이 이해가되었습니다)

데모

(먼저 여기에서 본 것을 기억하십시오!)

.slider {
    display: flex;
}
.slider img {
    height: 0%;
    width: 100%;
    margin: 0 5px;
}

아직 크롬에서만 작동합니다.


흥미롭지 만 버그 인 것 같습니다. 사양 에 따르면 " 백분율은 생성 된 상자의 컨테이너 블록 높이를 기준으로 계산됩니다. 컨테이너 블록의 높이가 명시 적으로 지정되지 않고 (즉, 콘텐츠 높이에 따라 다름)이 요소가 절대 위치가 아닌 경우 , 값은auto "로 계산됩니다 . 그것이 Firefox에서 일어나는 일입니다.
Oriol

jsfiddle.net/xLc2Le0k/8 은 ff와 크롬의 차이점을 설명합니다. 이것에 대한
무하마드 Umer

너비는 크롬에서 높이가하는 일을하는 것 같습니다.
Muhammad Umer

흥미롭지 만 X- 브라우저 전용 솔루션이 실제로는 솔루션이 아닌 것 같습니다. 댓글이 달린 바이올린, 여기 : jsfiddle.net/xLc2Le0k/8 은 FF에서 절대적으로 매력적 입니다. 이것은 FF가 정말로 100 %라면 이미지 높이를 이미지 높이에 "비례"하게 만드는 것 같습니다. 즉, img는 컨테이너의 디스플레이 인 flex에 대해 "알지"못합니다. 이것은 FF에서 img의 너비를 100 %로 설정하면 너비를 자동으로 설정 한 경우보다 이미지가 더 커지는 이유를 설명합니다.
coderMe

거의 비슷하지만 Chrome에서만 작동합니다. jsfiddle.net/sheriffderek/xLc2Le0k/270
sheriffderek

2

이 동작이 예상됩니다. 플렉스 컨테이너는 기본적으로 모든 자식을 립니다. 이미지에는 예외가 없습니다. (즉, 부모는 align-items: stretch속성 을 갖습니다 )

종횡비를 유지하기 위해 두 가지 솔루션이 있습니다.

  1. 어느 쪽의 기본 교체 align-items: stretch에 속성을 align-items: flex-start하거나 align-self: centerhttp://jsfiddle.net/e394Lqnt/3/

또는

  1. 독점적으로 아이 자체에 설정 정렬 속성 : 같은, align-self: center또는 align-self: flex-starthttp://jsfiddle.net/e394Lqnt/2/

-1

사실 이미지의 비율을 유지하려면 이미지 태그의 컨테이너에 높이가 있어야한다는 것을 알았습니다. 예를 들면>

.container{display:flex; height:100%;} img{width:100%;height:auto;}

그런 다음 html에서 컨테이너가 태그 이미지를 래핑합니다.

<div class="container"><img src="image.jpg" alt="image" /></div>

이것은 IE 및 기타 브라우저에서 작동합니다.


-1

나는 똑같은 문제가 있었다. 플렉스 정렬을 사용하여 요소를 중앙에 배치하십시오. align-items: center대신 을 사용해야 합니다 align-content: center. 이렇게하면 가로 세로 비율이 유지되지만 align-content는 가로 세로 비율을 유지하지 않습니다.

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