이 영역을 누르면 첫 페이지로 이동
Nuhends 의 Tech Life 블로그의 첫 페이지로 이동

Nuhends 의 Tech Life

페이지 맨 위로 올라가기

Nuhends 의 Tech Life

IT / Tech / 재테크 관련 뉴스를 최대한 알기 쉽게 전달하는 Tech 블로그 입니다.

[CSS] 이미지 적용 및 crop 방법 A to Z

  • 2020.12.09 15:35
  • 프로그래밍/HTML&CSS 사전
반응형

[CSS] 이미지 적용 및 crop 방법 A to Z

css 이미지 적용 및 crop 방법 a to z

 


 

이번 포스팅에서는 CSS 로 이미지를 적용하는 방법과 Crop하는 방법에 대해 알아보겠습니다.

 


1. background-image 방식

 

CSS의 background 속성을 사용하여 DOM의 배경으로 이미지를 적용하는 방식

background-image 적용

1.1 기본 성질

컨테이너 DOM 사이즈와 이미지 사이즈의 관계

background-image 방식의 기본 성질

case 1 : 컨테이너 DOM 사이즈 === 이미지의 사이즈
- 기본적으로 컨테이너의 좌측 상단(0, 0)을 기준으로 정렬
- 다른 설정이 없다면 원본 이미지 사이즈로 적용

case 2 : 컨테이너 DOM 사이즈 > 이미지의 사이즈
- 이미지가 반복되면서 컨테이너 DOM의 빈 공간을 가득 채움 ⇒ background-repeat / background-size 속성으로 제어 가능
- background-size: 100% || contain || cover을 줄 경우,
   이미지가 컨테이너의 사이즈에 맞게 확대됨 ⇒ 이미지가 bitmap 형식일 경우 픽셀이 깨져보임

case 3 : 컨테이너 DOM 사이즈 < 이미지의 사이즈
- 좌측 상단(0, 0)을 기준으로 컨테이너 DOM 영역을 초과한 부분이 잘림
- <img> 태그와 달리 이미지가 컨테이너를 벗어나지 않음 (마치 overflow: hidden 속성을 적용할 것처럼)
- background-size: 100% || contain || cover을 줄 경우,
   이미지가 컨테이너의 사이즈에 맞게 축소됨 ⇒ 레티나 디스플레이 대응 원리

See the Pen Background-image : 컨테이너와 이미지 사이즈 CASE by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

 

 

 

 

 

 

 

1.2 background 속성 정리

background는 요소(Element)의 배경 속성을 설정하기 위한 속성

속성명 설명 초기값 CSS 버전
background-color 엘리먼트의 배경 색상을 지정 transparent CSS 1
background-image 엘리먼트의 배경 이미지를 지정 none CSS 1
background-repeat 배경 이미지를 어떻게 반복시킬 것인지 지정 repeat CSS 1
background-attachment 배경 이미지를 어떻게 고정시킬 것인지 지정 scroll CSS 1
background-position 배경 이미지를 엘리먼트 안에서 어디에 위치 시킬건지 offset을 지정 0% 0% CSS 1
background-size 배경 이미지의 크기를 지정 auto CSS 3
주의 : css3 속성은 IE 하위 버전 브라우저(6~8)에서 지원하지 않습니다.

 

1.2.1 지원 브라우저

속성명 Chrome IE Firefox Safari Opera
background-color 1.0 4.0 1.0 1.0 3.5
background-image 1.0 4.0 1.0 1.0 3.5
background-repeat 1.0 4.0 1.0 1.0 3.5
background-attachment 1.0 4.0 1.0 1.0 3.5
background-position 1.0 4.0 1.0 1.0 3.5
background-size 4.0 9.0 4.0 3.0 10.5

 

1.2.2 속성 축약

background 관련 속성은 한 줄로 축약하여 사용할 수 있다.

아래 명시한 순서와 다르거나, 값이 누락되어도 무방하지만, 누락된 속성 값에는 기본값 이 적용
background: [background-color || background-image || background-repeat || background-attachment || background-position] | inherit]

 

background 속성 축약 전/후

 

관련 이슈

background-size 속성이 적용되지 않는 IE8 브라우저에서는 background 속성 전체가 적용되지 않게 됨

 

해결 방법

IE8 브라우저 대응까지 고려한다면, clip, origin, size 속성은 축약형이 아니라 분리하여 선언

 

background 크로스 브라우징

1.3 적용 방법

방법 1 : background-size: cover

이미지 크기 비율을 유지한 상태에서, 컨테이너 영역의 가로 혹은 세로를 맞춤 (초과하는 부분은 crop)

- 장점 : 이미지/컨테이너 비율에 관계없이 모든 경우에 사용 가능
- 단점 : IE8 이하 브라우저 지원 불가

 

background-size: cover
컨테이너/이미지 비율별 cover 적용 케이스

 

방법 2 : background-size: contain

이미지 크기 비율을 유지한 상태에서 컨테이너 영역에 이미지 전체가 들어가도록 이미지 크기를 조정 (비율에 따라 여백이 생길 수 있음)

- 장점 : 이미지/컨테이너 비율에 관계없이 모든 경우에 사용 가능
- 단점 : IE8 이하 브라우저 지원 불가

 

background-size: contain
컨테이너/이미지 비율별 contain 적용 케이스

 

방법 3 : background-size: 100% auto

이미지의 크기를 100% auto 혹은 auto 100%를 주어 비율을 유지하면서 부모 요소에 맞추는 방법

 

속성 값
    - 100% 100%: 이미지의 크기가 컨테이너의 width, height로 설정
       (컨테이너와 이미지의 비율이 다를 경우, 컨테이너의 비율에 맞추어 보이게 됨)

    - auto: 컨테이너 크기와 관계없이 이미지 고유 width, height로 설정
    - 값을 하나만 넣을 경우: 나머지 값은 auto로 설정 (이미지 비율 유지)

 

단점
    - 컨테이너/img의 비율에 따라 100%/auto 순서가 바뀌어 분기 처리 필요 → cover/contain에 비해 번거로움
    - IE8 이하 브라우저 지원 불가

 

1.4 적용 예시

1.4.1 background-size: cover

See the Pen background-size: cover by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

 

1.4.2 background-size: contain

See the Pen background-size: contain by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

 

 

1.4.3 background-size: 100% auto

See the Pen background-image : 컨테이너&이미지 다른 비율 [방법 1] by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

 


2. <img> 태그 방식

HTML의 <img> 태그를 사용하여 이미지를 표현하는 방식

 

2.1 기본 성질

<img> 태그 사이즈와 이미지 사이즈 관계

<img> 태그에 width, height 사이즈가 선언되어 있지 않다면, <img> 태그는 이미지 원본 사이즈로 설정

<img> 태그와 이미지 사이즈 케이스

 

See the Pen <img>태그 : 컨테이너와 이미지 사이즈 CASE by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

반응형

 

2.2 적용 방법

방법 1 : position 과 transform을 이용한 방법

 

position 과 transform을 이용한 방법

- 장점: transform: translate() 속성을 사용할 경우, GPU를 통한 하드웨어 가속으로 성능 향상에 도움됨 (모웹 작업 시 적합)
- 단점: IE8 이하 브라우저 지원 불가

 

방법 2 : position과 margin을 이용한 방법

- 장점 : IE8 이상 모든 브라우저에서 지원 가능
- 단점 : 가로형/세로형 이미지에 따라 분기 적용 필요

 

방법 3 : object-fit을 이용한 방법

object-fit을 이용한 방법

- 장점 : ​​비율에 따른 별도의 분기 없이 하나로 대응 가능 (background-size: cover와 같은 효과)
- 단점 : IE 모든 브라우저에서 지원 불가

 

2.3 적용 예시

2.3.1 position과 transform

See the Pen position: absolute / transform: translate(-50%, -50%) by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

 

 

2.3.2 position과 margin

See the Pen position: absolute / offset: -100% / margin: auto by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

 

 

2.3.3 object-fit

See the Pen object-fit: cover by 이상진 (@sangziii) on CodePen.

 

 

 

 

 

 

 


3. IE 하위 브라우저(~8) 대응법

background-size 속성은 IE9 브라우저부터 지원하기 때문에 서비스 스펙에 따라 하위 브라우저 대응이 필요할 수 있음

 

방법 1 : background-image 방식을 <img> 태그 방식으로 교체

background-image 방식을 하위 브라우저에서는 <img> 태그로 교체하는 방식

참고

- http://wit.nts-corp.com/2015/01/28/3032
- https://css-tricks.com/perfect-full-page-background-image

 

방법 2 : filter 속성 사용

background-size를 사용하는 부분에 filter 속성을 추가해주는 방법

background-size를  사용하는 부분에 filter 속성을 추가해주는 방법

단점
- 이미지의 비율이 컨테이너의 영역에 맞게 크기가 조절됨(이미지의 비율이 변경될 수 있음)
- inline-style로 background-image를 제어하는 경우, html을 수정해야 돼서 번거로움
- 성능에 악영향을 끼칠 수 있음

 

방법 3 : htc 파일 이용

MS에서 제공하는 HTML Component 파일로, 하위 브라우저에서 지원하지 않는 속성이 있을 경우 해당 파일을 불러와서 적용

htc 파일 이용

단점
- 한 페이지에서 여러 번 불러올 경우, 한 번만 작동하는 문제
- 타 모듈과의 충돌 이슈
- 로딩 속도가 매우 느림 ⇒ 성능에 악영향

4. svg 파일 이용

4.1 background-image 방식

background-image 방식과 동일한 crop 방식 ⇒ background-size: cover 로 crop

 

svg background-image 방식

이슈 : IE 브라우저(9~)에서 background-size: cover 적용이 안됨

svg 사용시 cover 이슈

해결 방법 1

svg코드에 preserveAspectRadtio="xMidYmid slice" 속성 값 적용

해결 방법 2

svg코드에 width/height 값 설정

 

4.2 <img> 태그 방식

앞서 살펴본 속성이 적용된 svg파일의 경우 다른 css 추가 없이 자동으로 적용

 


5. 결론

최근 실무에서는 IE8 브라우저는 스펙 아웃되면서 background-image의 cover 속성, 레티나 대응을 위한 svg 포맷을 이용한 방법으로 이미지를 처리하고 있습니다.

하지만 세부적으로는 background 방식은 img태그 방식과 달리 자동으로 SEO 최적화, 접근성 대응이 되지 않아
추가 처리가 필요하기도 해 일부에서는 안티 패턴이라는 주장 (
해당 아티클 https://velog.io/@chris/the-css-background-image-property-as-an-anti-pattern) 도 있습니다. 서비스 스펙에 이슈가 없다면 해당 아티클에서 주장처럼 picture > source 구조로 작업해봐도 좋을 듯합니다.

 

 

글이 도움이 되셨다면 공감&댓글 부탁드립니다.
글 작성에 큰 힘이 됩니다. 🙂

반응형
저작자표시 비영리 변경금지 (새창열림)

'프로그래밍 > HTML&CSS 사전' 카테고리의 다른 글

[CSS] 제일 쉬운 overflow 설명  (2) 2020.12.11
[CSS] word-wrap, word-break 정확하게 알아보기  (0) 2020.12.09
[CSS] cursor 속성 빠르게 알아보기  (0) 2020.12.09
[html/css] HTML 공백 줄바꿈 그리고 white-space  (1) 2020.12.09
[CSS] 말줄임(ellipsis)에 관한 모든 것  (0) 2020.12.09

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [CSS] word-wrap, word-break 정확하게 알아보기

    [CSS] word-wrap, word-break 정확하게 알아보기

    2020.12.09
  • [CSS] cursor 속성 빠르게 알아보기

    [CSS] cursor 속성 빠르게 알아보기

    2020.12.09
  • [html/css] HTML 공백 줄바꿈 그리고 white-space

    [html/css] HTML 공백 줄바꿈 그리고 white-space

    2020.12.09
  • [CSS] 말줄임(ellipsis)에 관한 모든 것

    [CSS] 말줄임(ellipsis)에 관한 모든 것

    2020.12.09
다른 글 더 둘러보기

정보

Nuhends 의 Tech Life 블로그의 첫 페이지로 이동

Nuhends 의 Tech Life

  • Nuhends 의 Tech Life의 첫 페이지로 이동
반응형

검색

메뉴

  • 홈
  • 웹 개발
  • 경제 데이터
  • 경제 공부
  • 방명록

카테고리

  • 분류 전체보기 (127)
    • 프로그래밍 (69)
      • React (3)
      • HTML&CSS 사전 (13)
      • JAVASCRIPT 사전 (11)
      • Algorithm (23)
      • 이슈 정리 (2)
      • 개발 환경 (4)
      • NodeJS (1)
      • Typescript (4)
      • NextJS (5)
      • React-Query (2)
      • ai (1)
    • 경제 데이터 (22)
      • 주식 순위 (20)
      • 경제지표 (2)
    • 경제 공부 (25)
      • 경제 신문 읽기 (3)
      • 세금 재테크 (7)
      • 인사이트 (4)
      • 경제용어정리 (9)
      • 정부 지원 제도 관련 (2)
    • 팁 모음 (11)
      • 인터넷 (5)
      • 생활 (3)
      • SNS 맛집 (3)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 코테
  • 자바스크립트
  • 코테 풀이
  • 프로그래머스
  • softeer
  • 알고리즘
  • javascript
  • 코딩테스트

나의 외부 링크

정보

nuhends의 Nuhends 의 Tech Life

Nuhends 의 Tech Life

nuhends

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © nuhends. Designed by Fraccino.

티스토리툴바