본문 바로가기

프론트엔드

반응형 웹사이트에 유용한 미디어 쿼리, CSS Function 정리!

1. 반응형 웹사이트

  • 하나의 웹사이트로 접속하는 기기의 화면의 크기에 맞춰 자동으로 레이아웃 및 콘텐츠를 구성하는 개발방법
  • 스마트폰의 대중화로 인해 중요성 인식
  • 인터넷에 접속되는 기기가 다양해지면서 더 다양한 스크린에 대응해야 하는 이슈 (스마트폰, 랩탑, PC, 워치, 티비, 냉장고, 자동차, ...)

2. 미디어 쿼리와 반응형 웹사이트의 범위

📚 미디어 쿼리 기본

@media all and (조건) and (조건) {}
  • all: 미디어 설정, default: all, screen | print를 주로 사용
  • only: 특정 미디어에만 적용하는 경우, screen | print를 지정하는 경우
  • and: 미디어 쿼리의 조건은 모두 and 키워드로 연결
  • 조건
    • 반드시 괄호()안에 조건을 입력
    • min: 최소값이 일치할 때, 입력한 사이즈 이상부터 적용
    • max: 최대값이 일치할 때, 입력한 사이즈 이하부터 적용
@media only screen and (min-width: 320px) {}
  • 스크린 형태에만 적용
  • 0 ~319px 적용 안함
  • 320px부터 적용

🤓 유용한 미디어 쿼리 모음 (접근성에 대한 고려)

훨씬 더 많지만 추린것으로, 반응형 웹사이트의 범위는 넓고 방대하다..

화면크기 (뷰포트)

@media screen and (min-width:576px) {}
@media screen and (min-width:768px) {}
@media screen and (min-width:992px) {}
@media screen and (min-width:1200px) {}

화면방향

// 브라우저에서도 화면비가 가로가 더 넓냐 아니냐에 따라 가로 세로가 나눠짐
@media only screen and (orientation:portrait) {}
@media only screen and (orientation:landscape) {}

픽셀밀도

// 고해상도 기기에서 좀 더 선명하게 보이게하는
@media only screen and (device-pixel-ratio:2) {} 
//요즘엔 2가 거의 기본, 하지만 이걸 넘어가는 경우도 많다. 4넘어가는 것도 있음..
@media only screen and (resolution:144dpi) {} 
// 화면의 dpi가 얼마가 되냐에따라 철회할 수 있음

화면비율

// 화면비율에 따라 어떻게 보여줄지
// 티비나 자동차처럼 와이드 디스플레이가 나오면서 각광받음
@media only screen and (aspect-ratio:2/3) {}
@media only screen and (aspect-ratio:9/16) {}
@media only screen and (aspect-ratio:9/19.5) {}

마우스 포인터

// hover가 터치하는 순간에 잠깐 먹는 순간이 있는데 그걸 없애고 싶을 때 (클릭햇다고 인식..)
@media only screen and (pointer: coarse) and (any-pointer: fine) {}
@media only screen and (pointer: fine) and (any-pointer: coarse) {}
@media only screen and (hover: none) and (any-pointer: hover) {}

프린트

@media only screen { background:rgb(230, 230, 230) }
@media only print {
	background: #fff;
    @page {
    	margin: 20em
    }
}

컬러 & 컬러모드

@media all and (color) {} //컬러화면일때
@media all and (monochrome) {} //흑백화면일때 (시각장애인)
@media only screen and (prefers-color-scheme: dark) {} //기기가 다크모드일때
@media only screen and (prefers-color-scheme: light) {}

주변광도

// 기기에따라 노트북에서는 조도를 감지함
// ex) 다크모드인데 주변환경이 너무 밝을때 화면을 어떻게 보여줄지
@media only screen and (light-level: normal) {}
@media only screen and (light-level: dim) {}
@media only screen and (light-level: washed) {}

고대비모드

// 장애인 차별 금지법 등에 의해서 시각장애인 배려
// 컬러를 구분하지못하는 사람들을 위함
@media all and (prefers-contrast: more) {}
@media all and (prefers-contrast: less) {}

애니메이션 & 투명도

// 기기에서 애니메이션을 사용자가 줄여놓으면 의도한 바와 다르게 보여줄수 있기 때문에 여기에서 삭제하도록 수정하거나 함
@media only screen (prefers-reduced-motion: reduce) {}
@media only screen (prefers-reduced-transparency: reduce) {}

 

반응형 사이즈 관련 참고할만한 유용한 사이트들

https://mediaqueriestest.com/: 현재 화면의 미디어쿼리에서의 값들을 알려줌

https://browserleaks.com/: 위사이트에서 종류 더 다양

https://giona.net/tools/css3-mediaquery-generator/: 미디어쿼리를 만들어주는 사이트

📐 미디어쿼리 - 기종별 화면사이즈 분기

📱 모바일 퍼스트

@media (min-width: 768px) {
	/* 태블릿 */
}
@media (min-width: 1024px) {
	/* 랩탑, 데스크탑 */
}

🖥️ 데스크탑 퍼스트

@media (max-width: 1023px) {
	/* 태블릿 */
}
@media (max-width: 639px) {
	/* 모바일 (가로로 돌렸을 때도 모바일사이즈로 나와야하면 기준사이즈가 달라져야하기 때문에 상황에 따라 다름)*/
}
  • 크롬 개발자도구에서 크기를 반응형으로 지정하면, 사이즈를 나눠주는데 이걸 기준으로 하면 보편적임
  • 모든 케이스를 맞출 수 없기 때문에 구글에서 제안하는 사이즈를 기준으로 맞추는 것이 일반적
  • 인터넷상에서 템플릿을 찾아봐도, 이 사이즈를 기준으로 많이 나옴

📱 태블릿 구간 설정

@media (min-width: 768px){}
@media (min-width: 768px) and (max-width: 1024px){
	/* 아이패드 가로 & 세로 */
}
  • 일반적으로 768px부터 적용(아이패드 세로 사이즈 기준)
  • 0 ~767px까지는 모바일, 768px부터는 태블릿
  • 768px과 스마트폰 가로 사이즈 중복 구간 발생
  • 정확히 태블릿에만 적용하기 위해서는 다른 조건을 추가해야함

💡 미디어쿼리 활용

@media screen and (-webkit-max-device-pixel-ratio: 1) {
	/* 고해상도 디스플레이가 아닌 경우 (구형 디바이스) */
}
@media screen and (orientation:portrait) {
	/* 기기가 세로인 경우 */
}
@media screen and (orientation:landscape) {
	/* 기기가 가로인 경우 */
}
@media screen and (any-hover:none) {
	/* 입력 방법이 hover를 지원하지 않는 경우, 오직 터치스크린 */
}

🐭 마우스관련 기기별 적용사항

https://codepen.io/marshall-ku/pen/jOGOdWa

 

🍯 기기별 사이즈 참고 사이트

https://screensiz.es/

https://blisk.io/devices/

https://www.mydevice.io/: use agent도 알려줌

https://yesviz.com/viewport/: 얘가 제일 최신

3. 반응형에 유용한 css Function

var(): css 변수의 값을 삽입

:root {
  --main-bg-color: coral;
}

#div1 {
  background-color: var(--main-bg-color);
}

calc(): 속성값으로 사용될 계산을 수행

width: calc(100% - 100px);

min(), max(): 쉼표로 구분된 값 목록에서 가장 작은 값, 가장 큰 값을 속성값으로 사용

width: min(50%, 300px);

clamp(min, prefered, max): 최소값과 최대값 사이의 범위 내에서 중간값을 고정

width: clamp(min(10vw, 20rem), 300px, max(90vw, 55rem));

env():

  • 노치있는 스마트폰의 노치를 어떻게 처리할 것인지 설정