프론트 작업을 할때, 컨테이너(박스)의 크기는 고정되어 있지만 이미지의 크기는 다양한 경우가 많다. 이미지를 확대/축소하거나 종횡비를 유지하면서 특정 크기에 맞추려년 CSS 속성을 적절히 활용해야 한다
background-size 속성
배경이미지로 불러와 이미지 사이즈와 비율을 조절하고 싶으면, 간단하게 background-size 속성을 통해 조정이 가능하다
.image {
background-image: url("./images/hello.jpg");
background-size: cover;
}
| background-size 속성 | 설명 |
|---|---|
| contain | 이미지 가로/세로 비율을 유지하면서, 이미지가 잘리지 않을 때까지만 채운다 |
| cover | 이미지의 가로/세로 비율을 유지하면서, 이미지가 잘리더라도 주어진 크기를 꽉 채운다 |
| 사이즈 직접 입력 | 비율에 무관하게 입력한 값에 맞춰 사이즈를 조절 |

직관적이고 간단하지만 배경으로 들어갔을때만 사용할 수 있기에 HTML 이미지 태그에는 사용할 수 없다. 즉, background-image로 삽입된 이미지에만 적용할수 있는 속성이라 보면 된다
그래서 만일 서버에서 동적으로 이미지 주소를 전달하는 경우, 아래처럼 인라인 스타일로 background-image를 넣어줘야 한다
<div style="background-image: url('./images/hello.gif')"></div>
이렇게 되면 이미지 태그를 쓸 수 없으니 SEO나 사용자 경험 측면에서 손해 볼수도 있긴하다
background-position 속성
배경 이미지 위치를 x y 좌표를 정의하여 요소 상자의 가장자리를 기준으로 항목을 배치한다. 일반적으로 좌상단부터 이미지를 출력한다
background-position: top;
background-position: bottom;
background-position: center;
background-position: left;
background-position: right;
/* width height 위치가 값에 따라 이동되서 나타나게 된다 */
background-position: 25% 75%;
background-position: 10px 20px;


object-fit 속성
<img> <video> <object> <svg> 과 같은 미디어 요소의 지정된 너비와 높이를 지정하는 CSS 속성이다. 썸네일 목록에서 작은 이미지가 늘어나 흐려지는 걸 방지하기 좋다
img {
width: 300px;
height: 150px;
object-fit: cover;
}
| object-fit 속성 | 설명 |
|---|---|
| fill | 박스 크기에 맞춰 이미지 크기를 조절하며 박스를 가득 채움(기본값) → 종횡비가 일치하지 않으면 이미지가 늘어나거나 줄어들음 |
| contain | 가로/세로 비율을 유지한 채로 사이즈가 조절→ 이미지와 컨테이너 간의 비율이 맞지 않은 경우엔 빈공간이 생김 |
| cover | 이미지의 종횡비를 유지하면서 박스를 가득 채움→ 종횡비가 일치하지 않으면 컨테이너 박스를 넘어간 이미지 객체는 잘림 |
| none | 이미지 크기를 조절하지 않음 |
| scale-down | none과 contain 중 이미지의 크기가 더 작아지는 값에 따름 |



object-position 속성
object-fit 속성은 기본적으로 요소의 가운데로 이미지를 이동시킨다. 이 위치를 원하는 값으로 변경하는 것이 object-position 속성이다
숫자형 px, em, % 등이 사용되며, 키워드 top, left, right, bottom이 사용될 수 있다

img.one{
object-position: center center;
}
img.two{
object-position: right bottom;
}
img.three{
object-position: 50% 50%;
}
img.four{
object-position: 100px 50px;
}

<img>를 컨테이너 안에서 절대 위치로 띄우고, 컨테이너에는 overflow: hidden을 줘서 잘리는 부분을 숨기는 방법이다
이미지를 가운데 정렬하기 위해 top, left, transform 속성이 추가로 필요하다
.container{
width: 200px;
height: 150px;
overflow: hidden; /*넘치는 이미지를 가린다*/
}
.container > img {
position: absolute;
width: 100%;
/*이미지 위치*/
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
<img> + object-fit추가 팁
- object-fit은 IE에서 지원하지 않으므로 레거시 대응 시 3번 방식 사용
- 반응형 이미지를 위해 width: 100% height: auto 조합과 함께 사용 가능
- aspect-ratio 속성을 활용하면 최신 브라우저에서 비율 유지가 더 간단해짐
100px로 지정하고, aspect-ratio: 3/1을 하면 높이는 33.333px가 된다aspect-ratio: 3/1;
aspect-ratio: 4;
aspect-ratio: auto;
aspect-ratio: auto 1/1;
인터넷 익스플로러를 제외한 브라우저에서 지원하는 속성이다

width / height 지정
/ 를 이용하여 width / height 비율을 지정할 수 있다aspect-ratio: 3/1;
<h1>종횡비: 3/1</h1>
<div class="box"></div>
<style>
.box {
width: 100px;
aspect-ratio: 3/1; /* 100, 33.333 */
background: red;
}
</style>

aspect-ratio: 5;
위 코드는 너비는 5, 높이는 1의 비율을 가진다는 뜻이 된다
<h1>종횡비: 5/1</h1>
<div class="box"></div>
<style>
.box {
width: 100px;
aspect-ratio: 5; /* 100, 20 */
background: red;
}
</style>

두개의 값 지정
auto와 /를 동시에 사용할 수 있다
aspect-ratio: auto 1/1;
이 경우에는 요소가 고유한 종횡비를 가지는 경우 해당 종횡비를 따르지만, 만약 그렇지 않은 경우 지정한 비율을 따른다
<div>
<h1>(A) 종횡비 1/1 적용</h1>
<div class="box-1"></div>
</div>
<div>
<h1>(B) 이미지, 종횡비 auto 적용</h1>
<img class="box-2" src="https://w.namu.la/s/09b11b4ec0c0043aeec719b6bb19377412b278aec57ca31771db76e2e413af50d00b3d57c0494fb7fe7a7cde8efdbed322dc1610e0a601c65f2b34114e61d644e0e300767efc5e34a9cb4091aa110a37d941b921f9ed65c88314def82545208d"/>
</div>
<div>
<h1>(C)이미지, 종횡비 1/1 적용</h1>
<img class="box-3" src="https://w.namu.la/s/09b11b4ec0c0043aeec719b6bb19377412b278aec57ca31771db76e2e413af50d00b3d57c0494fb7fe7a7cde8efdbed322dc1610e0a601c65f2b34114e61d644e0e300767efc5e34a9cb4091aa110a37d941b921f9ed65c88314def82545208d"/>
</div>
<style>
body {
display: flex;
gap: 20px;
}
.box-1 {
width: 100px;
aspect-ratio: auto 1/1;
background: orange;
}
.box-2{
width: 100px;
aspect-ratio: auto 1/1;
}
.box-3{
width: 100px;
aspect-ratio: 1/1;
}
</style>

img 비율 지키면서 쓰는 법
이미지에 aspect-ratio를 지정하면 이미지가 깨지던데 이 경우에는 어떻게 할까?
object-fit: cover를 하면 이미지가 깨지지 않으면서 원하는 종횡비로 지정할 수 있다<div class="parent">
<img class="img" src="https://w.namu.la/s/09b11b4ec0c0043aeec719b6bb19377412b278aec57ca31771db76e2e413af50d00b3d57c0494fb7fe7a7cde8efdbed322dc1610e0a601c65f2b34114e61d644e0e300767efc5e34a9cb4091aa110a37d941b921f9ed65c88314def82545208d"/>
</div>
<style>
.parent{
width: 300px;
aspect-ratio: 3/1;
border: 4px solid red;
}
.img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
</style>

aspect-ratio 예외 상황
aspect-ratio를 사용하다보면, 해당 속성이 적용되지 않은 순간이 있을 것이다. 어떤 경우에 예외 상황이 발생하는지 알아보자
요소의 너비와 높이가 지정된 경우, aspect-ratio는 반영되지 않는다
<h4>종횡비: 5/1</h4>
<div class="box"></div>
<style>
.box{
width: 150px;
height: 100px;
aspect-ratio: 5;
background: red;
}
</style>

<h4>종횡비: 3/1</h4>
<div class="box"></div>
<style>
.box{
width: 100px;
min-height: 50px;
aspect-ratio: 3/1;
background: red;
}
</style>

아래 예시는 종횡비 3/1, 너비는 100px로 지정하여 너비 100px, 높이 33.33px이 되는 게 목적이었다. 하지만 높이에 대해 min-height를 지정했기 때문에, min-height 기준으로 계산되어 너비 150px, 높이 50px이 된다
min-height: 0 을 지정해야 한다<div class="box-1">
<h4>수정 전</h4>
<p>ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ</p>
</div>
<div class="box-2">
<h4>수정 후</h4>
<p>ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ</p>
</div>
<style>
.box-1{
width: 200px;
aspect-ratio: 3/1;
background: red;
margin-bottom: 40px;
}
.box-2{
width: 200px;
min-height: 0;
aspect-ratio: 3/1;
background: red;
}
</style>

출처 : https://mong-blog.tistory.com/entry/css-Aspect-Ratio-요소를-비율대로-조정하기
출처 : https://inpa.tistory.com/entry/CSS-📚-이미지-사이즈-비율-맞추는-3가지-방법-object-fit-background-size-position