λ©μ¬ EF 3κΈ° μ²νμ μΌ μΊλ¦ν° κ²½μ§λν
λ©μμ΄μ¬μ νλ‘ νΈμλ μ€μΏ¨μμ HTMLκ³Ό CSSλ‘ λλ§μ μΊλ¦ν°λ₯Ό λ§λλ λνκ° μμλ€.
κ·μ½κ³ μ¬λ―Έμλ μμ΄λμ΄κ° λ§μμ 보λ μ¬λ―Έκ° μμλ€.
λκΈ°λΆλ€μ΄ μ μΆνμ κ²λ€μ 보면μ κ³μ κ°ννλ€.
λλ μ΄λ² λνμμ κ°μ¬νκ²λ λμμ λ°μ μ μμλ€.
νκ³ λ ν κ²Έ μμ κ³Όμ μ κ°λ¨νκ²λλ§ κΈ°λ‘μΌλ‘ λ¨κ²¨λ³΄λ €κ³ νλ€.
λ°λͺ¨
https://sduu.github.io/character-contest/
Github
https://github.com/sduu/character-contest
μΉμΉ λΌ νΈμ°μ΄
λ§ν¬μ
μ 체 λ§ν¬μ
<div class="character">
<!-- 머리 -->
<div class="head">
<div class="ear left">
<div class="fur">
<div class="fur-item1"></div>
<div class="fur-item2"></div>
</div>
</div>
<div class="ear right">
<div class="fur">
<div class="fur-item1"></div>
</div>
</div>
<div class="necklace">
<div class="ribbon">
<div class="ribbon-left">
<div class="ribbon-item1"></div>
<div class="ribbon-item2"></div>
<div class="ribbon-item3"></div>
</div>
<div class="ribbon-right">
<div class="ribbon-item1"></div>
<div class="ribbon-item2"></div>
<div class="ribbon-item3"></div>
</div>
<div class="ribbon-center"></div>
</div>
</div>
<div class="face">
<div class="cheek left"></div>
<div class="cheek right"></div>
<div class="blush left"></div>
<div class="blush right"></div>
<div class="face-item">
<div class="eyebrow"></div>
<div class="eye left">
<div class="eye-item"></div>
</div>
<div class="eye right">
<div class="eye-item"></div>
</div>
<div class="nose"></div>
<div class="dimple"></div>
<div class="mouth">
<div class="mouth-item">
<div class="teeth"></div>
</div>
</div>
</div>
</div>
</div>
<!-- // 머리 -->
<!-- λͺΈν΅ -->
<!-- // λͺΈν΅ -->
</div>
μλ§¨ν± ν λ§ν¬μ μ ν νμλ μλ€κ³ νλ¨ν΄μ λͺ¨λ [ic]div[/ic] νκ·Έλ‘ μμ νμλ€.
κΈμ μμ±νλ©΄μ μκ°ν΄ 보λ μ κ·Όμ±μ μν΄ μΊλ¦ν°λ₯Ό μ€λͺ νλ ν μ€νΈλ₯Ό λ£μ΄μ£Όλ©΄ λ μ’μ κ² κ°λ€.
ν΄λμ€
head, cheek, eyeμ κ°μ΄ ν΄λΉ λΆμμ μ΄λ¦μ ν΄λμ€λ‘ λΆμ¬μ£Όμλ€.
μμ μ ν΄λμ€λ§ λ΄λ μ΄λ€ μν μ νλμ§ νμ ν μ μλλ‘ νκ³ μΆμλ€.
ꡬ쑰
<div class="necklace">
<div class="ribbon">
<div class="ribbon-left">
<div class="ribbon-item1"></div>
<div class="ribbon-item2"></div>
<div class="ribbon-item3"></div>
</div>
<div class="ribbon-right">
<div class="ribbon-item1"></div>
<div class="ribbon-item2"></div>
<div class="ribbon-item3"></div>
</div>
<div class="ribbon-center"></div>
</div>
</div>
μΉ΄ν κ³ λ¦¬ λ³λ‘ λΆλͺ¨ μμλ₯Ό λ§λ€κ³ κ·Έ μΉ΄ν κ³ λ¦¬μ ν΄λΉνλ μμ μμ΄ν λ€μ μμ μμλ‘ λ£μ΄μ£Όμλ€.
μ΄λ κ² μμ νλ μμΉλ₯Ό μ‘°μ ν λλ λΆλͺ¨ μμλ§ μ΄λνλ©΄ λμ΄μ μ μ§λ³΄μκ° νΈνλ€.
λͺ¨μ μμ μ ν λ ν¬κ² λ©μ΄λ¦¬λ‘ μμ§μΌ λΆλΆκ³Ό μμ νλνλ μμΈνκ² μμ§μΌ λΆλΆμ λλμ΄μ μμ νκΈ°μλ μ©μ΄νλ€.
μ€νμΌλ§
CSS λ³μ νμ©
:root {
--bg: #9fe0fa;
--body: #c7c3c0;
--body-border: #99908f;
--black: #3a302f;
--white: #fff;
--red: #fa4c46;
--red-border: #b43935;
--pink: #fdb0aa;
--yellow: #ffe5d4;
}
λ°λ³΅λλ μ»¬λ¬ κ°λ€μ λ³μλ‘ μ μΈνκ³ μ¬μ©νλ€. λ³μλ₯Ό μ¬μ©νλ©΄ CSS μμ±μ΄ κ°κ²°ν΄μ§κ³ μ μ§ λ³΄μκ° μ¬μμ§λ€.
λ°λ³΅λλ μ€νμΌμ κ³΅ν΅ ν΄λμ€λ‘
.cheek {
position: absolute;
width: 151px;
height: 150px;
border: 3px solid var(--body-border);
border-radius: 50%;
background-color: var(--body);
}
.cheek.left {
left: -27px;
bottom: 0;
}
.cheek.right {
right: -27px;
bottom: 0;
}
νΈμ°μ΄λ μ’μ°κ° λμΉμΈ λμμΈμ κ°μ‘κΈ° λλ¬Έμ μ€νμΌμ΄ λ λ²μ© λ°λ³΅λλ μΌμ΄ λ§μλ€.
λ°λ³΅λλ μ€νμΌμ κ³΅ν΅ ν΄λμ€λ‘ μ²λ¦¬νκ³ left, right ν΄λμ€λ₯Ό μΆκ°ν΄μ μ’, μ° μμΉ μ‘°μ μ ν΄μ£Όμλ€.
ν΅ν΅ν λΊ¨ ꡬν
.face::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate3D(-50%, -50%, 0);
width: 265px;
height: 230px;
border-radius: 50% 50% 40% 40%;
background-color: var(--body);
z-index: 10;
}
λ₯κΈνκ² κ³‘μ μΌλ‘ μ΄λ£¨μ΄μ§ μΌκ΅΄μ νννλ κ²μ΄ 첫 λ²μ§Έ κ³Όμ μλ€.
μΈ κ°μ μμ λ§λ€μ΄λκ³ κ°μ μμλ₯Ό μΆκ°νμ¬ μ€κ°μ 보μ΄λ μ μ μμ μ ν¬λν μΌκ΅΄μ ννν΄ μ£Όμλ€.
κ· μνΈ κ΅¬ν
λ°μ λ κ°λ₯Ό κ²Ήμ³μ λ»μ΄μλ μνΈμ λͺ¨μμ λ§λ€μ΄ μ£Όμλ€.
λμ΄ λ₯κ·Ό 리본 λ§λ€κΈ°
CSSλ‘ μΌκ°νμ λ§λλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μλ€.
νμ§λ§ λ΄κ° μνλ κ²μ λμ΄ λ₯κ·Ό μΌκ°νμ΄κΈ° λλ¬Έμ λ°©λ²μ κ³ λ―Όν΄ λ³΄μλ€.
μ°μ [ic]border[/ic]λ₯Ό μ΄μ©ν΄μ λ§λλ μΌκ°νμ λμ λ₯κΈκ² λ§λ€ μ μκΈ° λλ¬Έμ ν¨μ€νλ€.
[ic]clip-path[/ic]λ₯Ό μ¬μ©νλ©΄ κ°λ¨νκ² μ§λ§ CSS νΈλ¦(?)μ μ¬μ©ν΄ λ³΄κ³ μΆμ΄μ ν¨μ€!
μ΄λ² κ³Όμ μμλ νν μ¬λ³ν μΈ κ°λ‘ μΌκ°νμ λ§λλ λ°©λ²μ μ¬μ©νλ€.
.parallelogram {
width: 100px;
height: 100px;
transform: skew(20deg);
background: skyblue;
}
μ°μ [ic]transform[/ic] μ [ic]skew[/ic] λ₯Ό μ΄μ©ν΄μ νν μ¬λ³νμ λ§λ€μ΄μ€λ€.
.triangle {
width: 100px;
height: 100px;
background: skyblue;
transform: rotate(-60deg) skewX(-30deg) scale(1, 0.866);
}
.triangle::after,
.triangle::before {
position: absolute;
width: 100%;
height: 100%;
background-color: inherit;
}
.triangle::after {
transform: rotate(-135deg) skewX(-45deg) scale(1.414, 0.707) translate(0, -50%);
}
.triangle::before {
transform: rotate(135deg) skewY(-45deg) scale(0.707, 1.414) translate(50%);
}
νν μ¬λ³ν μΈ κ°λ₯Ό μ‘°ν©νλ©΄ μΌκ°νμ λ§λ€ μ μλ€.
μ¬κΈ°μ [ic]border-radius[/ic]λ₯Ό μ μ©μν€λ©΄ λμ΄ λ₯κ·Ό μΌκ°ν μμ±!
@keyframes λͺ¨μ
@keyframes head-move {
30% {
transform: translate3D(-50%, -50%, 0);
}
40% {
transform: translate3D(-50%, calc(-50% + -5px), 0);
}
70% {
transform: translate3D(-50%, calc(-50% + -5px), 0);
}
80% {
transform: translate3D(-50%, -50%, 0);
}
}
μμλ€μ΄ μ κΈ°μ μΌλ‘ μμ§μΌ μ μλλ‘ [ic]animation[/ic]μ [ic]duration[/ic]μ ν΅μΌνκ³ [ic]@keyframes 100%[/ic]λ₯Ό μκ° λ³λ‘ μͺΌκ°μ λͺ¨μ μ μ‘°μ νλ€.
μΊλ¦ν°λ νλ©΄μ΄μ§λ§ λͺ¨μ μ ν΅ν΄ μ 체κ°μ νννκ³ μΆμμΌλ... μκ°ν λ§νΌμ μ ꡬνλμ§ μμμ μμ½λ€.
맀λ ₯ μλ λͺ¨μ μ΄λ μΈν°λμ μ λ§λ€κΈ° μν΄μλ κΈ°μ λ μ€μνμ§λ§ μ’μ μμ λ₯Ό 보면μ κ°κ°μ μ΅νλ κ²λ μ€μν κ² κ°λ€.
κ²°κ³Ό
CSSλ‘ μΊλ¦ν°λ₯Ό λ§λλ κ²μ κ΅μ₯ν λ Έκ°λ€κ΅¬λ...π
νμμ κ±°μ λ€λ£° μΌμ΄ μλ transitionμ skewλ @keyframesμ λ§μ Έλ³Ό μ μμ΄μ μ¦κ±°μ λ€.
λ€μμλ μ½λλ λ κΉλνκ² μ 리νκ³ , μλ‘ λ°°μ΄ μμ±μ μ’ λ νμ©ν΄μ λ§λ€μ΄λ³΄κ³ μΆλ€.