Cat Painting
Il Progetto
Dipinto di un gatto creato interamente con CSS, utilizzando tecniche avanzate come position: absolute, transform, border-radius e gradienti lineari.
Codice Sorgente
- index.html
- styles.css
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>fCC Cat Painting</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<main>
<div class="cat-head">
<div class="cat-ears">
<div class="cat-left-ear">
<div class="cat-left-inner-ear"></div>
</div>
<div class="cat-right-ear">
<div class="cat-right-inner-ear"></div>
</div>
</div>
<div class="cat-eyes">
<div class="cat-left-eye">
<div class="cat-left-inner-eye"></div>
</div>
<div class="cat-right-eye">
<div class="cat-right-inner-eye"></div>
</div>
</div>
<div class="cat-nose"></div>
<div class="cat-mouth">
<div class="cat-mouth-line-left"></div>
<div class="cat-mouth-line-right"></div>
</div>
<div class="cat-whiskers">
<div class="cat-whiskers-left">
<div class="cat-whisker-left-top"></div>
<div class="cat-whisker-left-middle"></div>
<div class="cat-whisker-left-bottom"></div>
</div>
<div class="cat-whiskers-right">
<div class="cat-whisker-right-top"></div>
<div class="cat-whisker-right-middle"></div>
<div class="cat-whisker-right-bottom"></div>
</div>
</div>
</div>
</main>
</body>
</html>
* {
box-sizing: border-box;
}
body {
background-color: #c9d2fc;
}
.cat-head {
position: absolute;
right: 0;
left: 0;
top: 0;
bottom: 0;
margin: auto;
background: linear-gradient(#5e5e5e 85%, #45454f 100%);
width: 205px;
height: 180px;
border: 1px solid #000;
border-radius: 46%;
}
.cat-left-ear {
position: absolute;
top: -26px;
left: -31px;
z-index: 1;
border-top-left-radius: 90px;
border-top-right-radius: 10px;
transform: rotate(-45deg);
border-left: 35px solid transparent;
border-right: 35px solid transparent;
border-bottom: 70px solid #5e5e5e;
}
.cat-right-ear {
position: absolute;
top: -26px;
left: 163px;
z-index: 1;
transform: rotate(45deg);
border-top-left-radius: 90px;
border-top-right-radius: 10px;
border-left: 35px solid transparent;
border-right: 35px solid transparent;
border-bottom: 70px solid #5e5e5e;
}
.cat-left-inner-ear {
position: absolute;
top: 22px;
left: -20px;
border-top-left-radius: 90px;
border-top-right-radius: 10px;
border-bottom-right-radius: 40%;
border-bottom-left-radius: 40%;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
border-bottom: 40px solid #3b3b4f;
}
.cat-right-inner-ear {
position: absolute;
top: 22px;
left: -20px;
border-top-left-radius: 90px;
border-top-right-radius: 10px;
border-bottom-right-radius: 40%;
border-bottom-left-radius: 40%;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
border-bottom: 40px solid #3b3b4f;
}
.cat-left-eye {
position: absolute;
top: 54px;
left: 39px;
border-radius: 60%;
transform: rotate(25deg);
width: 30px;
height: 40px;
background-color: #000;
}
.cat-right-eye {
position: absolute;
top: 54px;
left: 134px;
border-radius: 60%;
transform: rotate(-25deg);
width: 30px;
height: 40px;
background-color: #000;
}
.cat-left-inner-eye {
position: absolute;
top: 8px;
left: 2px;
width: 10px;
height: 20px;
transform: rotate(10deg);
background-color: #fff;
border-radius: 60%;
}
.cat-right-inner-eye {
position: absolute;
top: 8px;
left: 18px;
transform: rotate(-5deg);
width: 10px;
height: 20px;
background-color: #fff;
border-radius: 60%;
}
.cat-nose {
position: absolute;
top: 108px;
left: 85px;
border-top-left-radius: 50%;
border-bottom-right-radius: 50%;
border-bottom-left-radius: 50%;
transform: rotate(180deg);
border-left: 15px solid transparent;
border-right: 15px solid transparent;
border-bottom: 20px solid #442c2c;
}
.cat-mouth div {
width: 30px;
height: 50px;
border: 2px solid #000;
border-radius: 190%/190px 150px 0 0;
border-color: black transparent transparent transparent;
}
.cat-mouth-line-left {
position: absolute;
top: 88px;
left: 74px;
transform: rotate(170deg);
}
.cat-mouth-line-right {
position: absolute;
top: 88px;
left: 91px;
transform: rotate(165deg);
}
.cat-whiskers-left div {
width: 40px;
height: 1px;
background-color: #000;
}
.cat-whiskers-right div {
width: 40px;
height: 1px;
background-color: #000;
}
.cat-whisker-left-top {
position: absolute;
top: 120px;
left: 52px;
transform: rotate(10deg);
}
.cat-whisker-left-middle {
position: absolute;
top: 127px;
left: 52px;
transform: rotate(3deg);
}
.cat-whisker-left-bottom {
position: absolute;
top: 134px;
left: 52px;
transform: rotate(-3deg);
}
.cat-whisker-right-top {
position: absolute;
top: 120px;
left: 109px;
transform: rotate(-10deg);
}
.cat-whisker-right-middle {
position: absolute;
top: 127px;
left: 109px;
transform: rotate(-3deg);
}
.cat-whisker-right-bottom {
position: absolute;
top: 134px;
left: 109px;
transform: rotate(3deg);
}
L’Esperienza di Sviluppo
Mi è piaciuto davvero molto! Mi ci è voluto meno di un weekend per completarlo. Non mi sono limitato a eseguire il codice così come richiesto, ma come faccio spesso sono andato a modificare i vari valori e, a volte, ho provato a raggiungere la soluzione in modi diversi rispetto a quelli proposti nell’esercizio. Ho sperimentato creando forme differenti proprio per testare le tecniche che avevo imparato.
L’Approccio Sperimentale
Nella maggior parte dei casi non riesco ancora a trovare soluzioni alternative funzionanti, non essendo padrone dell’argomento, ma a volte sì. Ne cito una interessante che mi ha fatto capire un concetto importante.
Una Domanda Interessante
Ho posto al Code Tutor una domanda su una parte del codice:
«Se il risultato è sempre 4rem, perché non scrivere semplicemente:
min-width: 4rem;
max-width: 4rem;
Invece di:
width: 100vw;
min-width: 4rem;
max-width: 4rem;
La risposta: dal punto di vista pratico, funziona allo stesso modo!
È come dire:
- Metodo lungo: «Voglio tutto il buffet, ma massimo una fetta di pizza e minimo una fetta»
- Metodo corto: «Voglio una fetta di pizza»
Risultato: in entrambi i casi mangi una fetta di pizza.
La differenza sta nella chiarezza dell’intento e nella compatibilità con browser molto vecchi, ma per questo caso specifico il mio approccio più diretto ha funzionato perfettamente.
Riflessione Importante
So che questi strumenti tendono a rafforzare bias, come il confirmation bias in questo caso, ma questa volta la domanda ha portato a una comprensione reale di un concetto fondamentale del CSS. Ho scoperto che spesso, in CSS, esistono più modi per ottenere lo stesso risultato.
Cosa Ho Imparato
- Positioning assoluto per creare forme complesse
- Transform e rotate per orientare gli elementi
- Trucchi con i border per creare forme geometriche
- Z-index per gestire le sovrapposizioni
- Gradienti lineari per effetti di colore
- L’importanza di sperimentare oltre le istruzioni
Prossimo Progetto: Imparare il Responsive Web Design costruendo un Piano