[ css ] 반응형 웹을 위한 em, rem 디자인 > html&css

본문 바로가기
사이트 내 전체검색

html&css

[ css ] 반응형 웹을 위한 em, rem 디자인

페이지 정보

작성자 웹지기 댓글 0건 조회 7,240회 작성일 18-10-23 10:32

본문

 em과 rem은 무엇인가?

w3c의 css3 스펙 중 distance unit을 살펴봤다. css의 거리 단위는 크게 상대적 길이와 절대적 길이가 있다. 상대적 길이는 em, ex, ch, rem, vw, vh, vmin, vmax가 있고 절대적 길이는 cm, mm, q, in, pt, pc, px가 있다. 대개 크로스 브라우징이나 쉬운 계산 때문에 강제적으로 길이를 px로 많이 사용한다. 여러 디바이스를 모두 대응해야 하는 문제 때문에 em을 사용하기도 했는데, css3에는 rem이라는 새로운 거리 단위를 지원하게 되었다.

기준에 따른 상대적 길이
단위 설명 기준점
*em 엘리먼트의 폰트 사이즈 글자 크기
ex 엘리먼트의 폰트의 x(소문자) 높이 값
ch 엘리먼트 폰트의 0(숫자)glyphs의 가로값
*rem 루트 엘리먼트의 폰트 사이즈
vw 뷰포트 너비의 1% 화면 크기
vh 뷰포트 높이의 1%
vmin 뷰포트의 중 작은 크기의 1%
vmax 뷰포트의 중 큰 크기의 1%

스펙과 다른 글들을 통해 내가 이해한 내용이다. 다른 상대적 길이 단위를 이용하면 좀 더 가변적인 디자인이 가능 할 것 같다. 하지만 영어 해석이 좀 어려워서 일단은 em과 rem에 집중하기로 했다.

 

em과 rem은 왜 쓰는가?

상대적 길이 단위를 쓰는 이유는 물론 가변적 디자인을 하기 위해서이다. 유연한 디자인과 유지보수의 편리함. 또 어느 디바이스 어떤 상황에서도 사용자에게 같은 컨텐츠를 제공할 수 있다. 반응형 웹이나 웹 표준, 웹 접근성 모두 같은 맥락이라고 볼 수 있다. 자세한 내용은 인터넷의 많은 글에서 찾아 볼 수 있다.

 

em과 rem의 차이점

em과 rem의 가장 큰 차이점은 기준이 무엇이냐는 것이다. em은 상위 엘리먼트의 폰트 사이즈가 기준이고, rem은 루트 엘리먼트(html)의 폰트 사이즈가 기준이 된다. 아래 예를 들었다.

이런 html이 있다고 가정할 때

      <div><p>안녕하세요. 인디브도트입니다.</p></div>
      
em을 썼을때
            html{font-size:10px;}div{font-size:2em;}p{font-size:1em;}
            
em을 썼을때
rem을 썼을때
            html{font-size:10px;}div{font-size:2em;}p{font-size:1rem;}
            
rem을 썼을때

둘의 차이는 p 엘리먼트에 em, rem 단위 밖에 없지만 결과적으로는 10px과 20px의 차이가 있다. em 단위를 쓴 p의 폰트 사이즈는 html의 10px을 div에서 2em으로 10px * 2 = 20px이 되었고 이것을 기준으로 20px * 1 = 20px이 되었다. rem 단위를 쓴 p의 폰트 사이즈는 html의 10px을 div에서 2em으로 10px * 2 = 20px이 되었지만 루트 엘리먼트가 기준이므로 10px * 1 = 10px이 되었다.

 

인디브도트 블로그에 적용하기

em을 사용해서 글자 크기를 지정하는 방법

em을 사용해서 글자 크기를 지정하는 방법이라는 글을 보면, 퍼센트를 이용해서 body의 기본 글자 크기를 고치는 방법을 설명한다.  body { font-size : 62.5% } 로 16px이던 폰트 사이즈를 계산하기 쉬운 10px로 변환하여 사용한다. 하지만 rem은 루트 엘리먼트 기준이기 때문에  html { font-size : 62.5% } 로 루트 엘리먼트의 폰트 사이즈를 10px로 바꿔 사용하였다.

하지만 이렇게 사용하다가 문제가 생겼다. 모바일에서는 1.4rem으로 폰트 사이즈를 14px로 하고, 데스크탑에서는 폰트사이즈를 16px로 사용하려고 하였는데, body의 1.4rem을 유지하면서 html안의 폰트 사이즈를 %로 계산하기가 너무 힘들었다. 그래서 그냥 모바일에서는 html  {font-size : 10px}  데스크탑에서는 html  {font-size : 12px} 로 바꾸어 사용하였다. 그럼 P의 폰트사이즈는 모바일에서 14px, 데스크탑에서는 16.8px이 되어 뷰포트에 맞는 유동적 디자인을 하였다.

그리고 평소에 사용하던 px대신에 margin, padding에 rem 단위를 썼다.

미디어쿼리에 rem 적용?

rem을 미디어쿼리에도 적용해 보고싶었다. 브레이크 포인트 중 하나를 980px로 잡았기 때문에  @media(min-width:98rem){...} 로 작성하였다. 하지만 내가 의도한대로 동작되지 않았다. 뷰포트 980px이 아니라 뷰포트가 1568px이 되었을때 동작하였다. 이유가 무엇인지 미디어쿼리 스펙에서 찾아볼 수 있었다.

Media queries are (almost) always independent of the contents of the document, its styling, or any other internal aspect; they’re only dependent on “external” information unless another feature explicitly specifies that it affects the resolution of Media Queries, such as the @viewport rule.

미디어 쿼리는 문서의 스타일 또는 내부의 기타 형태의 콘텐츠와는 무관하다는 내용이 있다. 나는  html {font-size:62.5%} 로 1em을 10px로 바꾸어 주었지만, html의 글꼴 크기 스타일과 상관없이 1em은 여전히 16px이기 때문에 980px이 아니라 16px * 98 = 1568px에 미디어쿼리가 동작된 것이다.

 

결론

rem으로 디자인하기를 목표로 삼고 제작하면서 많은 혼란이 있었다. 요즘엔 브라우저에서 확대 축소 기능이 다 제공되기 때문에 em, rem을 쓰는 것이 효율성이 있는것인지.. 비율로 생각하기 보다는 px로 생각하는 버릇이 많이 남아 있어서 그런것 같기도 하고.. 아니면 내가 아직 상대적 길이 단위에 대한 이해가 부족한 것 같다. 어떤 단위를 이용하고 설계하는 것이 최적의 디자인을 할 수 있는지에 대한 고민은 끝이 없는 것 같다.

추천0 비추천0

댓글목록

등록된 댓글이 없습니다.

Total 42건 1 페이지
  • 42 [ css ] css를 이용하여 글자 강조 깜빡거리게 하기
  • css를 이용하여 글자 강조 깜빡거리게 하기 keyframes 를 이용하여 활용이 가능하다. 아래의 코드를 css에 적용시켜 주면 된다. @keyframes blink-effect { 50%{ opacity:0; } } .blink { animation: blink-effect 1s step-end infinite; /* 다른 기능을 원한 다면 이부분의 주석을 해제. animation-name: blink-effect; animation-durat...
  • 웹지기 11-17 3209 0 0 댓글 0
  • 35 [ css ] border style 종류
  • border style 종류 - solid, dotted, dashed, double, groove, ridge, inset, outset
  • 웹지기 01-12 2985 0 0 댓글 0
  • 34 [ css ] box-sizing - 요소의 크기를 화면에 표시하는 방식
  • 박스사이징(box-sizing) - 요소의 크기를 화면에 표시하는 방식 - 컨텐츠 기준으로 바뀜 div{ margin:10px;width:150px;} #small{border:10px solid #000;} #large{border:30px solid #000;} &lt;div id="small"&gt;small&lt;/div&gt; &lt;div id="large"&gt;large&lt...
  • 웹지기 01-11 3205 0 0 댓글 0
  • 33 [ css ] 마진 상쇄 현상
  • 마진 상쇄 현상 마진과 마진이 만났을 때 큰 마진이 작은 마진을 먹어버리는 현상 .a{margin:100px;} .b{margin:50px;} 일때 .b 클래스의 margin-top:50px은 .a의 margin-bottom:100px에 의해 상쇄된다.
  • 웹지기 01-11 3074 0 0 댓글 0
  • 32 [ css ] 공간분할 태그
  • 공간분할 태그 - 경계를 분할하거나 영역을 나눌 때 사용하는 태그 블록형식 태그 인라인형식 태그 태그종류 div, h1~h6, p, ul, ol, li, tr, th, td span, a, input, b, i, small, sub, sup, ins, del ...
  • 웹지기 01-11 3103 0 0 댓글 0
  • 31 [ css ] css 명시도 계산법
  • CSS는 명시도 계산법에 따라 점수를 계산해서 마지막에 실행 !import 인라인 방식 내부 외부 임포트 최우선 1000 ...
  • 웹지기 01-11 3122 0 0 댓글 0
  • 30 [ css ] 반응 선택자
  • 반응 선택자 - 사용자의 반응으로 생성되는 특정한 상태를 선택 선택자형태 설 명 :active 마우스로 클릭할 때 선택 :hover 마우스를 올린 태그를 선택
  • 웹지기 01-11 2472 0 0 댓글 0
  • 29 [ css ] css 의 크기 단위
  • 크기단위 - 요소 또는 텍스트의 크기를 지정하는 단위 px - 화소 하나의 크기에 대응되는 단위(고정값) em - 부모요소 크기에 따른 배수단위 rem - html 태그의 요소 크기의 몇배인지 지정하는 단위
  • 웹지기 01-11 2555 0 0 댓글 0
  • 28 [ css ] CSS : Cascading Style Sheets
  • Cascading Style Sheets(CSS)는 HTML이나 XML(SVG, XHTML 같은 XML 방언(dialect) 포함)로 작성된 문서의 표현을 기술하기 위해 쓰이는 스타일시트 언어입니다. CSS는 요소가 화면, 종이, 음성이나 다른 매체 상에 어떻게 렌더링되어야 하는지 기술합니다. CSS는 오픈 웹의 핵심 언어 중 하나이며 W3C 명세에 따라 브라우저끼리 표준을 맞춥니다. 레벨 단위로 개발한 CSS1은 더 이상 사용하지 않고, 다음 레벨인 CSS2.1은 권고안이며, 레벨보...
  • 웹지기 01-11 2504 0 0 댓글 0
게시물 검색

회원로그인

접속자집계

오늘
402
어제
6,641
최대
33,828
전체
8,321,823

그누보드5
Copyright © funyphp.com. All rights reserved.