Header

πŸ˜‰ ν—·κ°ˆλ Έλ˜ & λͺ°λžλ˜ λΆ€λΆ„λ“€λ§Œ μ •λ¦¬ν•˜λŠ” λ‚˜λ§Œμ˜ TIL
😯 λͺ¨λ“  κ°•μ˜ λ‚΄μš©μ€ 적지 μ•Šμ•„μš”!

였늘의 μ†Œκ°μ€?
λ„ˆλ¬΄λ‚˜λ„ 배우고 μ‹Άμ—ˆλ˜ CSS 기술 Transform!
그리고 핡심인 @mediaκΉŒμ§€..
였늘 CSS 끝μž₯을 λ΄€λ„€μš”. (λ¬Όλ‘  곡뢀할 λ‚΄μš©μ€ μ‚°λ”λ―Έμ§€λ§Œ)

λ…Έμ…˜.. λͺ¨λ°”일도 짜..볼까?




[1] Transform 3D

μš”μ†Œλ₯Ό νšŒμ „μ‹œν‚¬ 수 μžˆλŠ” CSS κΈ°μˆ μž…λ‹ˆλ‹€.

νšŒμ „μ‹œν‚¬ μš”μ†Œμ˜ μ†μ„±μœΌλ‘œ transform: rotate(45deg); λ₯Ό μ§€μ •ν•˜λ©΄ 45λ„λ§ŒνΌ νšŒμ „ν•©λ‹ˆλ‹€.


κΈ°λ³Έμ μœΌλ‘œλŠ” μš”μ†Œμ˜ 정쀑앙을 κΈ°μ€€μœΌλ‘œ μ‚Όμ§€λ§Œ transform-origin으둜 기쀀을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

.container .item {
  width: 150px;
  height: 150px;
  background-color: tomato;
  transition-duration: 1s;
  transform-origin: 100% 50%; /* xμΆ• κΈ°μ€€ yμΆ• κΈ°μ€€ */
}

.container .item:hover {
  transform: rotate(45deg); /* 2차원 λ³€ν™˜ ν•¨μˆ˜ */
}

참고둜 rotateλŠ” 2차원 λ³€ν™˜ ν•¨μˆ˜μž…λ‹ˆλ‹€.


[1-1] 3차원 λ³€ν™˜

[1] perspective

perspective둜 원근 효과λ₯Ό 쀄 수 μžˆμ§€λ§Œ, 3차원 λ³€ν™˜ ν•¨μˆ˜μ—μ„œλ§Œ μ μš©ν•©λ‹ˆλ‹€.

Untitled

λ”°λΌμ„œ μ΄λŸ¬ν•œ 효과λ₯Ό μ£ΌκΈ° μœ„ν•΄μ„œλŠ” rotate λŒ€μ‹  rotateYλ‚˜ rotateX등을 μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

.container .item {
  width: 150px;
  height: 150px;
  background-color: tomato;
  transition-duration: 5s;
  /*   transform-origin: 100% 50%; */
}

.container .item:hover {
  transform: perspective(300px) rotateY(45deg); /* perspectiveλ₯Ό ν•¨μˆ˜ ν˜•νƒœλ‘œ μž‘μ„± */
}


ν•˜μ§€λ§Œ perspectiveλŠ” 보톡 λΆ€λͺ¨ μš”μ†Œμ— μž‘μ„±ν•˜λŠ” 것이 관리가 μ‰½μŠ΅λ‹ˆλ‹€.

.container {
  width: 150px;
  height: 150px;
  border: 4px solid;
  margin: 100px;
  perspective: 300px; /* 이곳에 속성 ν˜•νƒœλ‘œ μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.  */
}


transform-originκ³Ό λΉ„μŠ·ν•˜κ²Œ perspective-origin을 ν†΅ν•΄μ„œ 기쀀을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ κΈ°μ€€μ΄λž€, μ–΄λ””μ„œ μ§€μΌœλ³΄λŠ”κ°€μ— λŒ€ν•œ κΈ°μ€€μž…λ‹ˆλ‹€.

perspective: 300px;
perspective-origin: 0 500px; /* xμΆ• yμΆ• */

Untitled 1

μ›κ·Όλ²•μ˜ 기쀀이 λ‹¬λΌμ§€λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.


[2] transform-style

보톡 3차원 νšŒμ „μ΄ λ°œμƒν•œ μš”μ†Œμ˜ μžμ‹ μš”μ†Œμ— 또 νšŒμ „μ„ λ°œμƒμ‹œμΌœλ„ 적용이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ transform-style을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

.container .item {
  width: 150px;
  height: 150px;
  background-color: tomato;
  transform: rotateY(45deg);
  transform-style: preserve-3d; /* ν•΄λ‹Ή μ˜΅μ…˜μ„ μ§€μ •ν•˜λ©΄ μžμ‹ μš”μ†Œμ—λ„ 3차원 λ³€ν™”κ°€ μΌμ–΄λ‚©λ‹ˆλ‹€. */
}

.container .item .box {
  width: 100px;
  height: 100px;
  background-color: royalblue;
  transform: rotateX(45deg);
}

Untitled 2

μžμ‹ μš”μ†Œ 뢀뢄인 boxμ—μ„œλ„ 3차원 λ³€ν™˜μ΄ μΌμ–΄λ‚˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

β€Ό λ‹€λ§Œ μžμ‹ μš”μ†Œμ—λ§Œ 적용되며, 후손 μš”μ†Œμ—λŠ” λ³€ν™˜μ΄ μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


[3] backface-visibility

뒷면이 보이지 μ•Šκ²Œ ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.

ν•΄λ‹Ή κΈ°λŠ₯을 μ‘μš©ν•΄ ν™”λ©΄μ˜ μ•žλ©΄κ³Ό 뒷면을 λ”°λ‘œ μ§€μ •ν•˜μ—¬ λ Œλ”λ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Untitled 3

Untitled 4

.container {
  width: 150px;
  height: 150px;
  border: 4px solid;
  perspective: 300px;
}

.container .item {
  width: 150px;
  height: 150px;
  font-size: 60px;
  transition-duration: 1s;
  backface-visibility: hidden; /* 뒷면을 보여주지 μ•ŠμŠ΅λ‹ˆλ‹€. (default: visible) */
}
.container .item.front {
  background-color: tomato;
  position: absolute;
}
.container .item.back {
  background-color: royalblue;
  transform: rotateY(-180deg);
}
.container:hover .item.front {
  transform: rotateY(180deg);
}
.container:hover .item.back {
  transform: rotateY(0);
}

마치 μΉ΄λ“œμ˜ μ•ž, 뒷면을 보여주듯 μ• λ‹ˆλ©”μ΄μ…˜ 효과λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.




[2] Columns

β€˜λ‹€λ‹¨β€™μ˜ κ°œλ…μ„ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.


[2-1] 닀단

[1] column-count

column-countλŠ” λ‹¨μ˜ 갯수λ₯Ό μ§€μ •ν•˜λ©° 기본값은 1μž…λ‹ˆλ‹€. (multy-count)

column-count의 수λ₯Ό 늘리면, λ‹¨μ˜ κ°―μˆ˜λ„ λŠ˜μ–΄λ‚©λ‹ˆλ‹€.

Untitled 5


[2] column-width

column-countκ°€ 2 이상이면, column-widthλ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

column-width의 기본값은 autoμž…λ‹ˆλ‹€.

columns 속성을 μ‚¬μš©ν•˜μ—¬ column-count, column-widthλ₯Ό λ‹¨μΆ•ν•˜μ—¬ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
columns: 300px 3;


[3] column-rule

단과 단 μ‚¬μ΄μ˜ ꡬ뢄선을 지정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

Untitled 6

borderμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λͺ¨λ“  속성을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


[4] column-gap

단과 단 μ‚¬μ΄μ˜ 간격을 지정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€. (default: normal)

Untitled 7




[3] CSS Filter

filterλŠ” 말 κ·ΈλŒ€λ‘œ μš”μ†Œμ— λ‹€μ–‘ν•œ ν•„ν„° 효과λ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

filterμ—λŠ” λ§Žμ€ μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

Filter MDN λ¬Έμ„œ


[3-1] filter

λͺ‡κ°€μ§€ 예λ₯Ό λ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ¨Όμ € filterλŠ” μ—¬λŸ¬ ν•¨μˆ˜λ₯Ό ν•œλ²ˆμ— μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

.container {
  filter: blur(4px) grayscale(); /* μ—¬λŸ¬κ°€μ§€ filter ν•¨μˆ˜λ“€μ„ λ™μ‹œμ— 적용 κ°€λŠ₯ */
}


  • blur() : 흐림
  • grayscale() : ν‘λ°±νš¨κ³Ό
  • invert() : 색 λ°˜μ „
  • drop-shadow(x y κ·Έλ¦Όμžμ˜νλ¦Όμ •λ„ 색) : 그림자 생성
  • brightness() : λͺ…도 쑰절
  • contrast() : λŒ€λΉ„ 쑰절
  • opacity() : 투λͺ…도 쑰절
  • saturate() : 채도 쑰절
  • sepia() : μ„Έν”Όμ•„ 톀 쑰절
  • hue-rotate() : 색쑰 쑰절


[3-2] backdrop-filter

filter와 λΉ„μŠ·ν•˜μ§€λ§Œ, backdrop-filterλŠ” 자기 μžμ‹ μ˜ 배경에 λ³΄μ—¬μ§€λŠ” μš”μ†Œλ“€μ— ν•„ν„°λ₯Ό μ μš©ν•©λ‹ˆλ‹€.

.cover {
  width: 150px;
  height: 200px;
  border: 4px solid;
  position: fixed;
  top: 30px;
  left: 30px;
  backdrop-filter: blur(10px);
}

Untitled 8

backdrop-filter의 ν•¨μˆ˜λ“€μ€ filter와 λ™μΌν•©λ‹ˆλ‹€.




[4] CSS λ³€μˆ˜

CSS νŒŒμΌμ—μ„œ μ „μ—­μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” :rootλΌλŠ” 가상 클래슀 μ„ νƒμžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

:rootλŠ” htmlκ³Ό λ™μΌν•œ 의미이며, λͺ…μ‹œλ„ μ μˆ˜κ°€ λ†’μ•„ 쑰금 더 μ•ˆμ •μ μ΄λΌλŠ” 차이가 μžˆμŠ΅λ‹ˆλ‹€.

:root {
  --color-primary: tomato; /* λ³€μˆ˜ 이름은 --둜 μ‹œμž‘ν•©λ‹ˆλ‹€. */
  --color-danger: red;
  --color-success: skyblue;
}

λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  땐, var() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

.primary {
  background-color: var(--color-primary);
}
.danger {
  background-color: var(--color-danger);
}
.success {
  background-color: var(--color-success);
}

Untitled 9

λ§Œμ•½ λ³€μˆ˜μ— 값이 없을 λ•Œ μ΄ˆκΈ°κ°’μ„ 지정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.
var(β€”color-success, orange)


[4-1] λ³€μˆ˜ μŠ€μ½”ν”„

λ§Œμ•½ :rootκ°€ μ•„λ‹Œ νŠΉμ • 클래슀 μ„ νƒμž, id μ„ νƒμž 내뢀에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄

λ³€μˆ˜λŠ” ν•΄λ‹Ή 클래슀 λ˜λŠ” id μš”μ†Œμ— μ’…μ†λ©λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή ν΄λž˜μŠ€λ‚˜ idλ₯Ό 가진 μš”μ†Œμ˜ ν˜•μ œ μš”μ†Œλ‚˜ λΆ€λͺ¨ μš”μ†Œμ—μ„œλŠ” ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.


λ˜ν•œ μ „μ—­ λ³€μˆ˜λ₯Ό 후손 μš”μ†Œμ—μ„œ μž¬ν• λ‹Ή ν•˜λ©΄

ν•΄λ‹Ή 후손 μš”μ†Œμ—μ„œ μƒˆλ‘œμš΄ μŠ€μ½”ν”„λ₯Ό κ°€μ§€λŠ” λ³€μˆ˜λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή 후손 μš”μ†Œκ°€ μ•„λ‹Œ 쑰상 μš”μ†Œλ‚˜ ν˜•μ œ μš”μ†ŒλŠ” 이전에 μ •μ˜λœ μ „μ—­ λ³€μˆ˜μ˜ 값을 λ”°λ¦…λ‹ˆλ‹€.




[5] @supports

@supports CSS κ·œμΉ™μ€ 주어진 ν•˜λ‚˜ μ΄μƒμ˜ CSS κΈ°λŠ₯을 λΈŒλΌμš°μ €κ°€ μ§€μ›ν•˜λŠ”μ§€μ— 따라
λ‹€λ₯Έ μŠ€νƒ€μΌ 선언을 ν•  수 μžˆλŠ” 방법을 제곡
ν•©λ‹ˆλ‹€.

이λ₯Ό κΈ°λŠ₯ 쿼리(feature query)라 ν•©λ‹ˆλ‹€.

@supports MDN λ¬Έμ„œ

@supports (display: grid) {
  /* display:gridλ₯Ό μ§€μ›ν•˜λ©΄ μ€‘κ΄„ν˜Έ μ•ˆμ˜ μŠ€νƒ€μΌ 적용 */
  div {
    display: grid;
  }
}

@supports not (display: grid) {
  /* μ§€μ›ν•˜μ§€ μ•Šμ„ 경우의 μŠ€νƒ€μΌ */
  div {
    float: right;
  }
}

λ˜ν•œ @supports λ¬Έλ²•μ—μ„œλŠ” μ—¬λŸ¬κ°œμ˜ κΈ°λŠ₯적인 쑰건을 지정해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

@supports () and () or () {
  .container {
    ...;
  }
}

@supports not (() and () or ()) {
  .container {
    ...;
  }
}

κΈ°λŠ₯적인 쑰건은 λ™μž‘κ³ΌλŠ” 관련이 μ „ν˜€ μ—†μŠ΅λ‹ˆλ‹€.
λ‹¨μˆœνžˆ λΈŒλΌμš°μ €μ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 μ§€μ›ν•˜λŠ”κ°€μ— λŒ€ν•œ 쑰건을 λͺ…μ‹œν•œ 것 μž…λ‹ˆλ‹€.




[6] @media

@media CSS κ·œμΉ™μ€ μŠ€νƒ€μΌ μ‹œνŠΈμ˜ 일뢀λ₯Ό ν•˜λ‚˜ μ΄μƒμ˜ λ―Έλ””μ–΄ 쿼리 결과에 따라 μ μš©ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

κΈ°λ³Έ ν˜•νƒœλŠ” @media νƒ€μž… and (κΈ°λŠ₯) { μŠ€νƒ€μΌ }을 λ”°λ¦…λ‹ˆλ‹€.

.box {
  width: 100px;
  height: 100px;
  background-color: orange;
}

@media screen and (max-width: 500px) {
  .box {
    width: 200px;
    background-color: royalblue;
  }
}

Untitled 10

Untitled 11

@media의 νƒ€μž…μ˜ 기본값은 allμž…λ‹ˆλ‹€.

기본값이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— νƒ€μž… λΆ€λΆ„κ³Ό and 뢀뢄을 μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@media (max-width: 500px) {
  .box {
    width: 200px;
    background-color: royalblue;
  }
}


쑰건을 μ—¬λŸ¬κ°œ λͺ…μ‹œν•  수 있으며 @support와 λΉ„μŠ·ν•˜κ²Œ not μ—°μ‚°μžλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ§Œ not μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  땐 λ―Έλ””μ–΄ νƒ€μž…μ„ μƒλž΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@media (max-width: 500px) and (min-width: 300px) {
  .box {
    width: 200px;
    background-color: royalblue;
  }
}
@media not all and ((max-width: 500px) and (min-width: 300px)) {
  .box {
    width: 200px;
    background-color: royalblue;
  }
}


λ˜ν•œ μ—¬λŸ¬κ°œμ˜ λ―Έλ””μ–΄ 쿼리λ₯Ό ν•œλ²ˆμ— μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ΅¬λΆ„μžλŠ” μ‰Όν‘œμž…λ‹ˆλ‹€.

@media all and (max-width: 500px), tv and (display-mode: fullscreen) {
  .box {
    width: 200px;
    background-color: royalblue;
  }
}


[6-1] orientation

@media κΈ°λŠ₯ 뢀뢄에 적을 수 μžˆλŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.

μ„Έλ‘œ 화면이 더 긴지, κ°€λ‘œ 화면이 더 긴지 νŒλ‹¨ν•˜λ©°, 주둜 μŠ€λ§ˆνŠΈν°μ„ κ°€λ‘œλ‘œ λˆ•ν˜”λŠ”μ§€ μ„Έμ› λŠ”μ§€μ— 따라 UIλ₯Ό λ³€ν™˜ν•  λ•Œ μ“°μž…λ‹ˆλ‹€.

  • portrait : μŠ€λ§ˆνŠΈν°μ„ λ³΄λŠ” 것 처럼 μ„Έλ‘œ λ„ˆλΉ„κ°€ κ°€λ‘œ λ„ˆλΉ„λ³΄λ‹€ κΈ΄ 상황
  • landscape : κ°€λ‘œ λ„ˆλΉ„κ°€ μ„Έλ‘œ λ„ˆλΉ„λ³΄λ‹€ κΈ΄ 상황


[6-2] media CSS μž‘μ„±

보톡 λ°˜μ‘ν˜• 웹을 κ΅¬ν˜„ν•  λ•Œ, css νŒŒμΌμ€ λ”°λ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

λ˜ν•œ 링크 νƒœκ·Έμ˜ media 속성을 톡해 ν•΄λ‹Ή νŒŒμΌμ„ 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€.

<link rel="stylesheet" hred="./css/main.css" />
<link rel="stylesheet" hred="./css/main-md.css" media="(max-width: 700px)" />





좜처

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μΉ΄ν…Œκ³ λ¦¬: ,

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°