CSS의 객체 맞춤 및 배경 크기에 대한 심층 분석

게시 됨: 2022-03-10
빠른 요약 ↬ 이 기사에서는 실제 사용 사례 및 권장 사항과 함께 object-fitbackground-size 작동하는 방식, 사용할 수 있는 시기 및 이유를 살펴보겠습니다. 뛰어들어봅시다.

HTML 요소에 대해 항상 다른 크기의 이미지를 로드할 수 있는 것은 아닙니다. 이미지의 종횡비에 비례하지 않는 너비와 높이를 사용하면 이미지가 압축되거나 늘어날 수 있습니다. 그것은 좋지 않으며 img 요소에 대한 object-fit 또는 background-size 를 사용하여 해결할 수 있습니다.

먼저 문제를 정의합시다. 다음 그림을 고려하십시오.

잘생긴 사진과 압축된 사진 비교
카드컴포넌트에 사용하면 쭈글쭈글해지는 예쁜 사진. (큰 미리보기)

왜 이런 일이 발생합니까?

이미지는 종횡비를 가지며 브라우저는 포함 상자를 해당 이미지로 채웁니다. 이미지의 종횡비가 이미지에 대해 지정된 너비 및 높이와 다른 경우 결과는 압축되거나 늘어난 이미지가 됩니다.

다음 그림에서 이를 확인할 수 있습니다.

잘생긴 사진과 늘린 사진의 비교
이미지의 종횡비가 포함된 상자와 다르고 이미지가 늘어납니다. (큰 미리보기)

해결책

이미지의 가로 세로 비율이 포함하는 요소의 너비 및 높이와 일치하지 않을 때 항상 다른 크기의 이미지를 추가할 필요는 없습니다. CSS 솔루션에 대해 알아보기 전에 사진 편집 앱에서 이 작업을 수행하는 방법을 보여 드리고자 합니다.

마스크에서 위쪽 및 아래쪽 가장자리가 잘린 이미지의 예
먼저 이미지를 세로로 가운데에 둔 다음 마스크를 클리핑합니다. 이렇게 하면 이미지의 종횡비가 유지되고 압축되지 않습니다. (큰 미리보기)

이제 작동 방식을 이해했으므로 브라우저에서 작동하는 방식에 대해 알아보겠습니다. ( 스포일러 주의: 더 쉽습니다! )

CSS object-fit

object-fit 속성은 img 또는 video 와 같이 대체된 요소의 콘텐츠가 컨테이너에 맞게 크기를 조정해야 하는 방법을 정의합니다. object-fit 의 기본값은 fill 이며, 이로 인해 이미지가 압축되거나 늘어날 수 있습니다.

가능한 값을 살펴보겠습니다.

점프 후 더! 아래에서 계속 읽기 ↓

object-fit 대한 가능한 값

object-fit: contain

이 경우 이미지는 컨테이너의 종횡비에 맞게 크기가 조정됩니다. 이미지의 종횡비가 컨테이너와 일치하지 않으면 레터박스로 표시됩니다.

개체 맞춤: 포함
object-fit: contain 을 사용하면 이미지가 레터박스로 표시되거나 그에 따라 크기가 조정됩니다. (큰 미리보기)

object-fit: cover

여기에서 이미지도 컨테이너의 가로 세로 비율에 맞게 크기가 조정되며 이미지의 가로 세로 비율이 컨테이너의 가로 세로 비율과 일치하지 않으면 맞게 잘립니다.

개체 맞춤: 덮개
object-fit: cover 를 사용할 때 이미지는 그에 맞게 잘리거나 크기가 조정됩니다. (큰 미리보기)

object-fit: fill

이렇게 하면 이미지가 컨테이너의 가로 세로 비율에 맞게 크기가 조정되고 이미지의 가로 세로 비율이 컨테이너와 일치하지 않으면 축소되거나 늘어납니다. 우리는 그것을 원하지 않습니다.

개체 맞춤: 채우기
object-fit: fill 을 사용하면 그에 따라 이미지가 압축되거나 늘어나거나 크기가 조정됩니다. (큰 미리보기)

object-fit: none

이 경우 이미지의 크기가 전혀 조정되지 않으며 늘어나거나 축소되지 않습니다. cover 값처럼 작동하지만 컨테이너의 종횡비를 존중하지 않습니다.

개체 맞춤: 없음
object-fit: none 을 사용할 때 크기가 같지 않으면 이미지의 크기가 조정되지 않습니다. (큰 미리보기)

object-fit 외에도 컨테이너 내에서 이미지를 배치하는 역할을 하는 object-position 속성도 있습니다.

object-position 대한 가능한 값

object-position 속성은 CSS의 background-position 속성과 유사하게 작동합니다.

개체 위치 중심, 왼쪽, 오른쪽
대부분의 경우 기본값이 사용됩니다(예: `center` 또는 `50% 50%`). (큰 미리보기)

topbottom 키워드는 포함하는 상자의 가로 세로 비율이 세로로 더 큰 경우에도 작동합니다.

개체 위치 위쪽 및 아래쪽
object-position: top (왼쪽)과 object-position: bottom (오른쪽) 비교. (큰 미리보기)

CSS background-size

background-size 의 첫 번째 차이점은 HTML( img ) 요소가 아니라 배경을 처리한다는 것입니다.

background-size 에 가능한 값

background-size 에 가능한 값은 auto , containcover 입니다.

background-size: auto

auto 를 사용하면 이미지가 기본 크기로 유지됩니다.

배경 크기: 자동
기본 크기로 인해 때때로 이미지가 흐릿해질 수 있습니다(너무 작은 경우). (큰 미리보기)

background-size: cover

여기서 이미지는 컨테이너에 맞게 크기가 조정됩니다. 종횡비가 동일하지 않으면 이미지가 맞게 마스크됩니다.

배경 크기: 표지
background-size: cover 를 사용할 때 이미지의 종횡비를 고려해야 합니다. (큰 미리보기)

background-size: contain

이 경우 이미지는 컨테이너에 맞게 크기가 조정됩니다. 종횡비가 꺼져 있으면 다음 예와 같이 이미지가 레터박스 처리됩니다.

배경 크기: 포함
background-size: contain 은 컨테이너에 맞게 이미지 크기를 조정합니다. (큰 미리보기)

background-positionobject-position 작동 방식과 유사합니다. 유일한 차이점은 object-position 의 기본 위치가 background-position 의 기본 위치와 다르다는 것입니다.

object-fit 또는 background-size 를 사용하지 않는 경우

요소 또는 이미지에 고정된 높이가 지정되고 background-size: cover 또는 object-fit: cover 가 적용된 경우 이미지가 너무 넓어져 어떻게 영향을 미칠 수 있는 중요한 세부 사항이 손실될 수 있습니다. 사용자는 이미지를 인식합니다.

이미지에 고정 높이가 지정된 다음 예를 고려하십시오.

 .card__thumb { height: 220px; }
고정된 높이로 이미지가 너무 넓고 카드의 컨테이너가 너무 넓은 예
오른쪽에 보이는 이미지는 높이가 고정되어 있고 카드의 컨테이너가 너무 넓기 때문에 너무 넓습니다. (큰 미리보기)

카드의 컨테이너가 너무 넓으면 오른쪽에 보이는 것과 같은 결과가 나타납니다(이미지가 너무 넓음). 종횡비를 지정하지 않기 때문입니다.

이에 대한 두 가지 수정 사항 중 하나만 있습니다. 첫 번째는 패딩 핵을 사용하여 고유 비율을 만드는 것입니다.

 .card__thumb { position: relative; padding-bottom: 75%; height: 0; } .card__thumb img { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

두 번째 수정은 새로운 aspect-ratio CSS 속성을 사용하는 것입니다. 이를 사용하여 다음을 수행할 수 있습니다.

 .card__thumb img { aspect-ratio: 4 / 3; }

참고 : 나는 이미 당신이 그것에 대해 배우고 싶은 경우를 대비하여 aspect-ratio 속성에 대해 자세히 썼습니다: "Let's Learn About Aspect Ratio In CSS".

사용 사례 및 예

사용자 아바타

object-fit: cover 는 사용자 아바타입니다. 아바타에 허용되는 가로 세로 비율은 종종 정사각형입니다. 정사각형 컨테이너에 이미지를 넣으면 이미지가 왜곡될 수 있습니다.

object-fit이 없고 object-fit: 커버가 있는 사용자 아바타
object-fit 없는 사용자 아바타와 object-fit: cover 가 있는 사용자 아바타의 비교. (큰 미리보기)
 .c-avatar { object-fit: cover; }

로고 목록

비즈니스의 고객을 나열하는 것은 중요합니다. 우리는 종종 이 목적을 위해 로고를 사용할 것입니다. 로고의 크기가 다르기 때문에 왜곡 없이 크기를 조정할 수 있는 방법이 필요합니다.

고맙게도 object-fit: contain 은 이에 대한 좋은 솔루션입니다.

 .logo__img { width: 150px; height: 80px; object-fit: contain; }
로고 목록: 에어비앤비, 도미노피자, 애플페이, 아마존
object-fit: contain 을 사용하면 고객 로고를 왜곡하지 않고 크기를 조정할 수 있습니다. (큰 미리보기)

기사 썸네일

이것은 매우 일반적인 사용 사례입니다. 기사 축소판의 컨테이너에 항상 동일한 종횡비의 이미지가 있는 것은 아닙니다. 이 문제는 먼저 콘텐츠 관리 시스템(CMS)에서 해결해야 하지만 항상 그런 것은 아닙니다.

 .article__thumb { object-fit: cover; }
기사 미리보기 이미지
object-fit: cover 의 도움을 받아 기사 축소판을 조정합니다. (큰 미리보기)

영웅 배경

이 사용 사례에서 img 요소를 사용할지 CSS 배경을 사용할지 여부는 다음에 따라 결정됩니다.

  • 이미지가 중요한가요? 어떤 이유로 CSS가 비활성화된 경우 사용자에게 이미지가 표시되기를 원합니까?
  • 아니면 이미지의 목적이 단지 장식적인 것입니까?

답변에 따라 사용할 기능을 결정할 수 있습니다. 이미지가 중요한 경우:

영웅 배경이 있는 사용 사례
음식과 관련된 웹사이트이기 때문에 이미지가 중요하다고 가정해 봅시다. (큰 미리보기)
 <section class="hero"> <img class="hero__thumb" src="thumb.jpg" alt="" /> </section>
 .hero { position: relative; } .hero__thumb { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

이미지가 장식적인 경우 background-image 를 사용할 수 있습니다.

 .hero { position: relative; background-image: linear-gradient(to top, #a34242, rgba(0,0,0,0), url("thumb.jpg"); background-repeat: no-repeat; background-size: cover; }

이 경우 CSS는 더 짧습니다. 이미지 위에 배치된 모든 텍스트를 읽을 수 있고 액세스할 수 있는지 확인합니다.

object-fit: contain

img 에 배경색을 추가할 수 있다는 것을 알고 계셨습니까? object-fit: contain 을 사용할 때도 이점을 얻을 수 있습니다.

아래 예에는 이미지 격자가 있습니다. 이미지와 컨테이너의 종횡비가 다른 경우 배경색이 나타납니다.

 img { object-fit: contain; background-color: #def4fd; }
object-fit: 포함을 사용하여 이미지에 배경색 추가하기
object-fit: contain 을 사용하여 이미지에 배경색을 추가할 수 있습니다. (큰 미리보기)

비디오 요소

배경으로 video 가 필요했던 적이 있습니까? 그렇다면 아마도 부모의 전체 너비와 높이를 차지하기를 원했을 것입니다.

 .hero { position: relative; background-color: #def4fd; } .hero__video { position: aboslute; left: 0; top: 0; width: 100%; height: 100%; }
영상이 주인공의 배경을 가리지 않는 모습
video 요소의 기본 object-fit 값은 contain 입니다. 여기에서 볼 수 있듯이 비디오에 position: absolute , width: 100%height: 100% 가 있더라도 영웅 배경을 다루지 않습니다. (큰 미리보기)

부모의 너비와 높이를 완전히 덮도록 하려면 기본 object-fit 값을 재정의해야 합니다.

 .hero__video { /* other styles */ object-fit: cover; }
비디오가 부모의 전체 너비와 높이를 덮는 그림입니다.
이제 비디오는 부모의 전체 너비와 높이를 다룹니다. (큰 미리보기)

결론

앞에서 본 것처럼 object-fitbackground-size 는 서로 다른 이미지 종횡비를 처리하는 데 매우 유용합니다. 우리는 항상 각 이미지의 완벽한 치수를 제어할 수 있는 것은 아니며, 바로 이 두 CSS 기능이 빛을 발하는 부분입니다.

img 요소와 CSS 배경 중에서 선택하는 것이 접근성에 미치는 영향에 대한 친절한 알림: 이미지가 순전히 장식용이라면 CSS 배경으로 이동하십시오. 그렇지 않으면 img 가 더 적합합니다.

이 기사가 유용했기를 바랍니다. 읽어 주셔서 감사합니다.