CSS의 단위 CSS at-rules 레이아웃 선택자와 속성

Description: CSS에서 사용되는 프로그래밍적인 요소 단위, @규칙 레이아웃 선택자와 속성등에 대해 기록해 놓은 글입니다.

현재 노트: KR-010.10 c CSS의 단위 CSS at-rules 레이아웃 선택자와 속성
상위 분류: KR-010.10 HTML,CSS,JavaScript

#CSS

글 작성 이유

중요한 단위 rem과 em같은 단위, @keyframe과 같은 CSS at-rules, flexbox와 같은 레이아웃, 선택자속성등 디자인 요소보다는 CSS의 프로그래밍 요소 중 직접 써서 나중에도 볼만한 것들을 기록해 놓기 위하여 글을 작성합니다.

단위

CSS에서 사용되는 단위에 대해 정리해봅니다. 가장 기본이면서도 알아두면 쓸데가 많아서 해당 개념을 학습하고 사용한 후 정리해봅니다.

단위>폰트

em

my parent element's font-size 로서 폰트사이즈의 상대적인 크기를 의미합니다.
폰트의 경우 모든 요소마다 하드코딩된 px값을 사용한다면 일관성 유지가 매우매우 어렵기 때문에 위와 같은 상대적인 단위를 사용하는 것이 편합니다.

부모 엘레멘트의 폰트 사이즈를 1을 기준으로 표기됩니다.

단위이기때문에 font-size를 기준으로 한다 뿐이지 width, height등에 적용가능

font-size: 0.5em /*부모 요소의 0.5배 사이즈*/

width: 2em /*부모 폰트사이즈의 2배 사이즈 */

rem

The root element's font-size로서 em과 유사한 폰트사이즈의 상대적인 크기를 의미합니다. em과 다른 점은 html태그의 font-size를 기준으로 선정되는 점입니다. 즉 부모 컨테이너에 영향을 받지 않게됩니다.



font-size: 0.5em /*html font-size의 0.5배 사이즈*/

width: 2em /*html font-size의 2배 사이즈 */
emrem 중 무엇을 사용해야하는지?

일반적으로는 rem을 사용하고 국소적으로 특별한 곳에는 em을 사용하는 방식이 관리하기 쉽다고 생각합니다. em의 경우 부모 컨테이너의 영향을 받다보니 깊이가 깊어질수록 그 영향을 짐작하기 힘들고 관리하기 어려워집니다. 하지만 rem의 경우 html의 폰트 사이즈가 고정되니 변경하기가 어렵습니다. 그래서 운영관리를 생각한다면 rem으로 통일된 값을 사용하고 rem사용이 어려운 경우에만 특별히 em을 사용하는 것이 적절해보입니다.


CSS at-rules

@가 붙은 특수한 규칙입니다. 주로 @media, @keyfraems 등


레이아웃

아이템을 배치하기 위한 방법입니다. 주로 1차원인 flexbox와 2차원인 grid를 통해 배치하게 됩니다.

flexbox

자유롭게 열과 행을 지정하는 1차원 방법이며 이름에서와 같이 유연하게 아이템 배치, 간격 자동 조정, 위치잡기등 flexbox는 많은 레이아웃 작업을 훨씬 쉽게 만들어 주는 이유로 널리 사용되고 있는 방법입니다.

display: flex; /* display 속성에 명시하는 방법으로 사용가능 */
flexbox 에서 증요한 것은 main축과 수직인 cross 축 그리고 아이템 배치 방법입니다.

flexbox에서는 진행방향을 main축과 수직인 cross축을 flex-direction을 통해 지정할 수 있습니다. 이를 통해 유연한 배치를 설정할 수 있습니다.
아이템 배치 방법은 justify-contentalign-items를 이용하여 배치합니다.
justify-content 의 경우 main축에 대하여, align-items는 수직 cross축에 대해 아이템배치를 지정하게됩니다.

/* 기본값으로 행방향으로 왼쪽에서 오른쪽으로 진행됩니다 */
flex-direction: row;

/* 행방향의 역방향으로 오른쪽에서 왼쪽으로 진행됩니다 */
flex-direction: row-reverse;

/* 열방향으로 위에서 아래로 진행됩니다 */
flex-direction: column;

/* 열방향 역방향으로 아래에서 위로 진행됩니다. */
flex-direction: column-reverse;

이 외에도 더 많은 옵션이 있지만 주로 사용하는 옵션은 다음과 같습니다.

justify-content: center; /* 항목들을 축의 중심 부분에 정렬합니다. */
justify-content: flex-start; /* 항목들을 축의 시작 부분에 정렬합니다.. */
justify-content: flex-end; /* 항목들을 축의 끝 부분에 정렬합니다. */


/* 분산 정렬 */
/* 첫 항목은 시작 부분에 밀착되어 정렬됩니다. 마지막 항목은 끝 부분에 밀착되어 정렬됩니다. */
justify-content: space-between; 

/* 각 항목들은 양쪽 여백의 절반만큼 나누어 갖습니다. */
justify-content: space-around;

/* 각 항목들은 서로 간에 동일한 여백을 갖습니다. */
justify-content: space-evenly; 

align-itemsjustify-content처럼 아이템을 배치하는 방식이지만 그 방향성이 수직인 cross축입니다. 기본값은 stretch이고 일부 값은 justify-content와 같은 값도 있지만 다른 부분도 있습니다.

코드로 보는 justify-content의 아이템 배치

gap: flexbox grid에 사용
아이템끼리의 간격 조정에 사용.padding이나 margin보다 적합한듯. flex 내에서는

gap: 1em 16%;

gap: 20px 10px;

flex의 item이 컨테이너 밖을 벗어나는 이유는?

flex 아이템이 컨테이너를 벗어나는 주요 원인은 flex-wrap의 기본값이 nowrap이기 때문입니다. 이 설정은 줄바꿈 없이 모든 아이템을 강제로 한 줄에 배치하려고 합니다.
이를 해결하기 위하여 flex-wrap 속성을 wrap으로 변경해주어야 합니다.

tailwindcss > Vanilla CSS

flex-wrap -> flex-wrap: wrap
flex-nowrap -> flex-wrap: nowrap


선택자

Html element를 타입, 현재상태, 자식여부. Attribute, 포지션등으로 특정하게 선택할 떄 사용하는 것이 선택자(Selector)입니다. 선택자는 크게 기본 선택자, 의사 클래스(pseudo-class), pseudo-element 등이 있습니다.

기본 선택 자는 단순하게 특정 태그, 특정 클래스, 특정 ID를 선택하지만 실제환경에서는 좀더 복잡한 조건이 요구됩니다.

&를 활용하여 현재 부모 또는 아래의 child 클래스를 간편하게 선택.
하지만 신규기능에 속한 편이라 2023년 12월이후로 최신 브라우저와 기기에서 가능하지만 오래된 디바이스나 브라우저에서는 불가능할 수도 있음

pseudo-class(가상 클래스)

선택된 요소의 특정 상태를 스타일링 하는데 사용되는 추가 클래스입니다. html element에 특정 상태일 때 CSS를 적용 할 수있습니다.
가상 클래스는 콜론( :) 뒤에 가상 클래스 이름(예: :hover)이 오는 방식으로 구성됩니다.

속성

CSS의 구현을 담당하는 여러 속성들을 실제 사용해보며 기록할만 것들을 적어 놓은 카테고리입니다.

position

위치와 관련된 속성입니다.

position: 'static'(default) 'relative' 'absolute' ...

border

테두리 관련 속성. 대부분의 경우에 사용됨. 기본값이 none이라 최소한의 style 설정없이는 다른 값들을 설정해 놓아도 보이지 않음

border: `thickness` `style` `color`

border-radius

border를 둥글게 만들고 싶을 떄 사용 하는 shorthand 속성. 아래의 네 모서리 값의 축약버전

border-radius: <length or percentage>

cursor

마우스 hover시 모양설정

transition

애니메이션 효과를 스타일링

[property] [duration] [timing-function] [delay]`

text-align

텍스트 표시 조정 속성

text-align: <left, right, start, center etc...>

center의 경우 중앙정렬. leftright, start의 경우 왼쪽 정렬 오른쪽 정렬과 같은 효과
start의 경우 일반적인 왼쪽에서 오른쪽글자의 경우 left와 동일하며 히브리어나 아랍어같은 오른쪽에서 왼쪽이 기본인 경우 방향이 달라짐

min-height

최소 높이. 고정 높이인 height도 있지만 글씨가 들어가서 들쭐날쭉한 초기상태는 확인을 위해 이 값이 좋은듯.

outline

기존 레이아웃에 영향을 주지 않고 윤곽선만 추가하는 속성

윤곽선 표시에서 outline 속성 대신 주로 border를 사용하는 이유는?

결국 outline속성은 모든면에 대해 딱딱하게 수정만 가능하기 border의 bottom이나 top처럼 한쪽 선만 그리는 기능이 안 되기 때문에
그리고 레이아웃의 길이가 예를들어 border까지 포함해서계산하는경우가 많기 때문.
width에 영향을 주기에 평소에는 transparent로 설정을 하다 props를 받아서 색을 표시하는것도 하나의 실용 예제

white-space

줄바꿈과 관련된 속성. 주로 줄바꿈에의해 width의 길이가 바뀌거나 문자의 경우 특정 줄바꿈이 요구되는 경우 고려해봐야할 속성


/* 주로 사용하는 값들*/
white-space: normal
white-space: pre
white-space: pre-wrap

display

화면 표시를 결정하는 주요요소. 보통 엘리먼트가 한줄을 차지하는 block 과 엘리먼트만큼만 차지하고 한줄에 여러 아이템이 위치 가능한 inline방식, 이외에 자주 사용하는 flexgrid 외에도 <li>에 사용 되는 list-item 등이 있다.


display: block
display: inline
display: flex
display: list-item;


질문:li 태그에 찍히는 점의 위치를 바꾸고 싶을 때는?

li 태그의 마커위치를 조정할 수 있는 속성이 있다. (list-style-position)

컨텐츠 위치는 바뀌지 않고 마크의 위치가 컨텐츠 박스 바깥이냐 안쪽이냐를 설정가능. default는 outside

tailwind -> Vanilla CSS
list-inside -> list-style-position: inside;
list-outside -> list-style-position: outside;

질문:li 태그에 에 flex를 넣으니 list-disc즉 리스트 아이템의 볼릿이 안보일 때

HTML의 <li> 요소의 기본 display 속성은 list-item인지 확인한다.

<li>요소는 display속성을 list-item이라는 값이 default인데 이와 다른 값인 flex와 같은 다른 display 설정시 원활하게 동작하지 않습니다.

display: list-item의 중요한 특징:

  1. 블록 레벨 요소처럼 동작합니다 (새 줄에서 시작하고 가로 너비 전체를 차지)
  2. 자동으로 불릿 또는 숫자 마커를 요소 앞에 생성합니다
  3. 이 마커의 스타일과 위치는 list-style-type, list-style-position 등의 속성으로 제어할 수 있습니다

CSS에서 display: flex나 다른 값을 적용하면 이 list-item 값이 덮어씌워지게 되고, 그 결과 불릿이 사라지게 됩니다. 따라서 ListItem 컴포넌트에서 flex를 제거했을 때 불릿이 정상적으로 표시된 것입니다.


질문: hover와 같은 동적 애니메이션을 특정 영역에서 금지 시키려면?

pointer-events 속성을 활용 하여 금지시킵니다.

부모 컨테이너에서 해당 속성은 none으로 바꿔줍니다. 단 부모가 none일지라도 자식 컨테이너에서 auto를 통해 특정 컴포넌트만 활성화가 가능합니다.

tailwindcss -> Vanilla CSS

`pointer-events-auto -> pointer-events: auto;
`pointer-events-none-> pointer-events: none;