[DAY-31] CSS μ¬ν (3)
π ν·κ°λ Έλ & λͺ°λλ λΆλΆλ€λ§ μ 리νλ λλ§μ 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μ°¨μ λ³ν ν¨μμμλ§ μ μ©ν©λλ€.
λ°λΌμ μ΄λ¬ν ν¨κ³Όλ₯Ό μ£ΌκΈ° μν΄μλ 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μΆ */
μκ·Όλ²μ κΈ°μ€μ΄ λ¬λΌμ§λ κ²μ νμΈν μ μμ΅λλ€.
[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);
}
μμ μμ λΆλΆμΈ boxμμλ 3μ°¨μ λ³νμ΄ μΌμ΄λλ κ²μ νμΈν μ μμ΅λλ€.
βΌ λ€λ§ μμ μμμλ§ μ μ©λλ©°, νμ μμμλ λ³νμ΄ μ μ©λμ§ μμ΅λλ€.
[3] backface-visibility
λ·λ©΄μ΄ 보μ΄μ§ μκ² νλ μ΅μ μ λλ€.
ν΄λΉ κΈ°λ₯μ μμ©ν΄ νλ©΄μ μλ©΄κ³Ό λ·λ©΄μ λ°λ‘ μ§μ νμ¬ λ λλ§ν μ μμ΅λλ€.
.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
μ μλ₯Ό λ리면, λ¨μ κ°―μλ λμ΄λ©λλ€.
[2] column-width
column-count
κ° 2 μ΄μμ΄λ©΄, column-width
λ₯Ό μ§μ ν μ μμ΅λλ€.
column-width
μ κΈ°λ³Έκ°μ autoμ
λλ€.
columns μμ±μ μ¬μ©νμ¬ column-count, column-widthλ₯Ό λ¨μΆνμ¬ μμ±ν μ μμ΅λλ€.
columns: 300px 3;
[3] column-rule
λ¨κ³Ό λ¨ μ¬μ΄μ ꡬλΆμ μ μ§μ ν΄μ€ μ μμ΅λλ€.
border
μμ μ¬μ©ν μ μλ λͺ¨λ μμ±μ μ¬μ©ν μ μμ΅λλ€.
[4] column-gap
λ¨κ³Ό λ¨ μ¬μ΄μ κ°κ²©μ μ§μ ν΄μ€ μ μμ΅λλ€. (default: normal)
[3] CSS Filter
filterλ λ§ κ·Έλλ‘ μμμ λ€μν νν° ν¨κ³Όλ₯Ό μ μ©ν μ μμ΅λλ€.
filterμλ λ§μ μ΅μ μ΄ μμ΅λλ€.
[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);
}
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);
}
λ§μ½ λ³μμ κ°μ΄ μμ λ μ΄κΈ°κ°μ μ§μ ν΄μ€ μ μμ΅λλ€.
var(βcolor-success, orange)
[4-1] λ³μ μ€μ½ν
λ§μ½ :rootκ° μλ νΉμ ν΄λμ€ μ νμ, id μ νμ λ΄λΆμ λ³μλ₯Ό μ μΈνλ©΄
λ³μλ ν΄λΉ ν΄λμ€ λλ id μμμ μ’ μλ©λλ€.
λ°λΌμ ν΄λΉ ν΄λμ€λ idλ₯Ό κ°μ§ μμμ νμ μμλ λΆλͺ¨ μμμμλ ν΄λΉ λ³μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
λν μ μ λ³μλ₯Ό νμ μμμμ μ¬ν λΉ νλ©΄
ν΄λΉ νμ μμμμ μλ‘μ΄ μ€μ½νλ₯Ό κ°μ§λ λ³μλ₯Ό κ°μ§κ² λ©λλ€.
λ°λΌμ ν΄λΉ νμ μμκ° μλ μ‘°μ μμλ νμ μμλ μ΄μ μ μ μλ μ μ λ³μμ κ°μ λ°λ¦ λλ€.
[5] @supports
@supports
CSS κ·μΉμ μ£Όμ΄μ§ νλ μ΄μμ CSS κΈ°λ₯μ λΈλΌμ°μ κ° μ§μνλμ§μ λ°λΌ
λ€λ₯Έ μ€νμΌ μ μΈμ ν μ μλ λ°©λ²μ μ 곡ν©λλ€.
μ΄λ₯Ό κΈ°λ₯ 쿼리(feature query)λΌ ν©λλ€.
@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;
}
}
@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)" />
λκΈλ¨κΈ°κΈ°