1. Scheletul unui document HTML
<!DOCTYPE html>
<html lang="ro">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Clubul de Informatica</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Clubul de Informatica</h1>
<p>Ne intalnim marti, in laboratorul 2.</p>
</body>
</html>
<!DOCTYPE html> care spune browserului sa foloseasca regulile HTML5, un element radacina <html>, si in el exact doua zone — head (informatii despre pagina, nimic vizibil) si body (tot ce se vede in fereastra).<meta charset="UTF-8">
Fara ea, diacriticele si caracterele speciale pot aparea stricate.
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Fara ea, telefonul simuleaza un ecran lat si micsoreaza pagina.
<title>...</title>
Textul din tab-ul browserului si titlul afisat in rezultatele cautarii.
<link rel="stylesheet" href="style.css">
Aduce fisierul CSS extern.
lang="ro" pe tag-ul html
Spune cititoarelor de ecran si traducatoarelor automate in ce limba e textul.
<div class="antet"> scrii <header>: acelasi rezultat pe ecran, dar browserul, motoarele de cautare si cititoarele de ecran inteleg structura.<body>
<header> <!-- antetul paginii: logo, titlu -->
<h1>Clubul de Informatica</h1>
<nav> <!-- meniul de navigare -->
<a href="index.html">Acasa</a>
<a href="probleme.html">Probleme</a>
</nav>
</header>
<main> <!-- continutul principal: O SINGURA DATA in pagina -->
<section id="anunturi">
<h2>Anunturi</h2>
<article> <!-- o bucata de sine statatoare -->
<h3>Concurs local, 12 martie</h3>
<p>Inscrieri pana pe 5 martie.</p>
</article>
</section>
<aside> <!-- continut secundar, legat de subiect -->
<p>Resurse utile pentru pregatire.</p>
</aside>
</main>
<footer> <!-- subsolul: contact, drepturi -->
<p>Colegiul Tehnic, 2026</p>
</footer>
</body>
<main> apare o singura data intr-o pagina si nu se pune in interiorul lui header, nav, aside sau footer.
<section> = o zona tematica din pagina, de obicei cu titlul ei. <article> = o bucata care ar avea sens si scoasa din pagina (un anunt, o postare, un card de problema).
<div> ramane util, dar doar cand nu exista niciun tag semantic potrivit: el nu inseamna nimic, e o simpla cutie.
2. Continutul: text, liste, legaturi, imagini, tabele
<h2>Algoritmi pentru concursul de martie</h2>
<p>Ordinea de studiu este <strong>obligatorie</strong>: fara sortari
nu se poate intra in cautarea binara.</p>
<ol>
<li>Sortare prin interclasare</li>
<li>Cautare binara</li>
<li>Programare dinamica</li>
</ol>
<p>Enunturile stau pe <a href="probleme.html">pagina de probleme</a>.</p>
<img src="img/schema-arbore.png" alt="Arbore binar de cautare cu 7 noduri">
<table>
<caption>Rezultate la simularea din februarie</caption>
<thead>
<tr><th>Elev</th><th>Punctaj</th></tr>
</thead>
<tbody>
<tr><td>Andrei M.</td><td>87</td></tr>
<tr><td>Ioana P.</td><td>92</td></tr>
</tbody>
</table>
nume="valoare". Doua atribute sunt obligatorii in practica: href la legaturi si src plus alt la imagini.h1 ... h6 titluri, in ordine descrescatoare de importanta
(un singur h1 pe pagina; nu sari trepte: dupa h2 vine h3)
p paragraf de text
ul / ol / li lista neordonata (buline) / ordonata (numere) / element de lista
a legatura; href = adresa tinta
href="probleme.html" -> alt fisier din acelasi folder
href="#anunturi" -> o ancora din aceeasi pagina
href="https://..." -> alt site
img imagine; src = adresa fisierului, alt = descrierea in cuvinte
table tabel; thead/tbody = antet/corp, tr = rand,
th = celula de antet, td = celula de date, caption = titlul tabelului
strong / em important / accentuat (SENS)
b / i ingrosat / inclinat (doar ASPECT - preferi strong si em)
br / hr rand nou fortat / linie orizontala de separare
span bucata de text fara sens propriu, ca sa o poti stiliza
Imagine fara alt. Pagina pare in regula pe ecranul tau, dar un utilizator nevazator nu afla nimic despre ea, iar daca fisierul lipseste nu apare nici macar un indiciu.
Titluri alese dupa marime, nu dupa rol. Un h4 pus pentru ca arata mai bine
strica structura documentului. Marimea se schimba din CSS, nu prin alegerea altui tag.
Taguri neinchise sau incrucisate. <p><strong>text</p></strong> este gresit: ultimul tag deschis se inchide primul.
3. Cum se leaga CSS-ul de HTML si cum arata o regula
<!-- 1. EXTERN: fisier separat, adus din head. Recomandat. -->
<head>
<link rel="stylesheet" href="assets/css/style.css">
</head>
/* in style.css: */
h1 { color: #3b82f6; }
<!-- 2. INTERN: bloc style in head. Doar pentru pagini mici, izolate. -->
<head>
<style>
h1 { color: #3b82f6; }
</style>
</head>
<!-- 3. INLINE: atribut style pe element. De evitat. -->
<h1 style="color: #3b82f6;">Clubul de Informatica</h1>
proprietate: valoare;..card h3 { color: #f1f5f9; margin-bottom: 8px; }
-------- ------------------------------------
selector bloc de declaratii
color: #f1f5f9;
----- --------
proprietate valoare ; incheie declaratia
/* Comentariu CSS: se scrie asa si nu apare in pagina. */
!important bate orice), apoi specificitatea selectorului (atomul urmator), si abia la egalitate perfecta ordinea din fisier — ultima regula scrisa castiga./* in style.css */
h1 { color: red; }
h1 { color: green; } /* castiga fata de red: scrisa mai tarziu */
/* in blocul style din pagina, incarcat DUPA link */
h1 { color: blue; } /* castiga fata de green: aceeasi specificitate,
dar vine mai tarziu in ordinea de incarcare */
<!-- pe element -->
<h1 style="color: orange;"> /* castiga fata de toate: stil inline */
Rezultat afisat: orange.
Daca stergi atributul style, ramane blue.
Un fisier CSS extern se scrie o data si se foloseste in toate paginile site-ului; browserul il pastreaza in memoria cache, deci a doua pagina se incarca mai repede.
Stilul inline se aplica unui singur element, nu se poate refolosi, nu poate contine pseudo-clase precum :hover si este cel mai greu de suprascris. Il vei intalni totusi in cod generat de JavaScript — vezi lectia 3.
4. Selectori si specificitate
<nav class="meniu">
<a href="index.html" class="activ">Acasa</a>
<a href="probleme.html">Probleme</a>
</nav>
<section id="anunturi">
<article class="card">
<h3>Concurs local</h3>
<p>Inscrieri pana pe 5 martie.</p>
</article>
</section>
/* CSS */
a { color: #94a3b8; } /* TIP: toate legaturile */
.card { padding: 16px; } /* CLASA: orice element cu class="card" */
#anunturi { margin-top: 24px; } /* ID: unicul element cu id="anunturi" */
.card p { color: #f1f5f9; } /* DESCENDENT: p oriunde in .card */
.card > h3 { font-size: 20px; } /* COPIL DIRECT: h3 fiu imediat al .card */
h2, h3 { font-weight: 700; } /* GRUPARE: si h2, si h3 */
a:hover { color: #06b6d4; } /* PSEUDO-CLASA: cand mouse-ul e deasupra */
a.activ { color: #10b981; } /* legatura care are SI clasa activ */
a[href$=".html"] { text-decoration: none; } /* ATRIBUT: href se termina in .html */
>), grupare (virgula), pseudo-clasa (doua puncte).p -> (0, 0, 1) un tip .card -> (0, 1, 0) o clasa #anunturi -> (1, 0, 0) un id .card p -> (0, 1, 1) o clasa + un tip a.activ:hover -> (0, 2, 1) o clasa + o pseudo-clasa + un tip #anunturi .card p -> (1, 1, 1) un id + o clasa + un tip Comparatie: #anunturi (1,0,0) BATE .meniu .card a.activ (0,3,1) Un singur id invinge oricate clase, pentru ca prima pozitie decide. Deasupra tuturor: stilul inline (atributul style) -> bate orice selector din fisier !important -> bate inclusiv stilul inline Amandoua se folosesc rar: fac depanarea foarte grea.
Am schimbat culoarea in CSS si nu se intampla nimic.
In 9 cazuri din 10 nu e vina fisierului: exista alta regula, cu specificitate mai mare, care castiga.
Solutia buna nu este sa adaugi !important, ci sa tintesti mai precis (adaugi o clasa) sau sa stergi regula prea puternica. In DevTools (F12, tab-ul Elements) regulile invinse apar taiate cu o linie — asa vezi imediat cine a castigat.
5. Box model: cat loc ocupa de fapt un element
.card {
width: 300px;
padding: 20px;
border: 5px solid #2d2d44;
margin: 16px;
}
/* Implicit (box-sizing: content-box): */
latime ocupata = 300 + 20 + 20 + 5 + 5 = 350px
continut padding border
(marginea de 16px se adauga in AFARA acestor 350px)
/* Cu box-sizing: border-box: */
.card { box-sizing: border-box; width: 300px; padding: 20px; border: 5px solid; }
latime ocupata = 300px exact
continutul se ingusteaza singur: 300 - 40 - 10 = 250px
+-------------------------------------------+ | MARGIN | spatiu spre vecini (transparent) | +-----------------------------------+ | | | BORDER | | chenarul desenat | | +---------------------------+ | | | | | PADDING | | | spatiu interior; ia culoarea | | | +-------------------+ | | | de fundal a elementului | | | | CONTINUT | | | | textul, imaginea | | | +-------------------+ | | | | | +---------------------------+ | | | +-----------------------------------+ | +-------------------------------------------+
padding: 20px; toate cele 4 laturi = 20px
padding: 10px 20px; sus-jos = 10px, stanga-dreapta = 20px
padding: 10px 20px 30px; sus = 10, stanga-dreapta = 20, jos = 30
padding: 10px 20px 30px 40px; sus, dreapta, jos, stanga (in sensul acelor de ceas)
margin: 0 auto; sus-jos = 0; auto = centreaza pe orizontala
un element block care are o latime declarata
1. Cardul care iese din container. Trei carduri de width: 33% cu padding si border nu incap pe un rand de 100%, pentru ca padding-ul si border-ul se adauga peste procent. Fix-ul standard, pus o singura data la inceputul foii de stil:
* { box-sizing: border-box; }
Din acel moment width inseamna latime totala, cu tot cu padding si border
, si calculele in procente ies.
2. Marginile verticale care se comaseaza. Daca un paragraf are margin-bottom: 20px si urmatorul are margin-top: 30px, intre ele nu apar 50px, ci 30px: la elementele block asezate normal una peste alta, marginile verticale invecinate se contopesc si ramane cea mai mare. Marginile orizontale nu se comaseaza niciodata.
6. Layout: display si fluxul normal al paginii
<span class="eticheta">C++</span>
<span class="eticheta">Python</span>
<span class="eticheta">Pascal</span>
/* A. implicit pentru span: inline */
.eticheta { width: 120px; height: 60px; background: #1a1a2e; }
-> cele trei stau pe acelasi rand,
DAR width si height sunt ignorate: cutia ramane cat textul.
/* B. block */
.eticheta { display: block; width: 120px; height: 60px; }
-> width si height functioneaza,
DAR fiecare eticheta trece pe randul ei, una sub alta.
/* C. inline-block */
.eticheta { display: inline-block; width: 120px; height: 60px; }
-> raman pe acelasi rand SI respecta width si height. Ce voiam.
display: block rand nou, toata latimea; width/height functioneaza
(implicit la: div, p, h1-h6, ul, li, section, header)
display: inline ramane in randul de text; width/height IGNORATE;
padding stanga-dreapta functioneaza, cel sus-jos
se deseneaza dar nu impinge randurile vecine
(implicit la: span, a, strong, em, img)
display: inline-block ramane in rand SI accepta width, height, padding
(butoane de meniu, etichete, celule mici)
display: none elementul dispare complet: nu se deseneaza si nu
mai ocupa loc. Altceva decat visibility: hidden,
care il face invizibil dar ii pastreaza locul gol.
display: flex transforma elementul in container flexibil si
aseaza copiii pe o axa - subiectul lectiei 2
<nav class="meniu">
<a href="index.html">Acasa</a>
<a href="probleme.html">Probleme</a>
<a href="contact.html">Contact</a>
</nav>
.meniu a {
display: inline-block; /* raman pe un rand, dar primesc dimensiuni */
padding: 10px 18px; /* zona de click devine confortabila */
min-width: 110px; /* toate butoanele la fel de late */
text-align: center;
text-decoration: none;
background: #1a1a2e;
border-radius: 8px;
}
.meniu a:hover { background: #2d2d44; }
Fluxul normal plus inline-block te duc pana la un meniu si un rand de carduri. De acolo incolo, alinierea pe verticala, spatierea egala si trecerea automata pe randul urmator cer alt instrument: display: flex.
Il vei folosi in lectia 2, impreuna cu media queries, ca sa faci aceeasi pagina sa arate bine si pe telefon. Tot ce ai recapitulat aici — structura semantica, selectorii, box model-ul — ramane baza pe care se aseaza acele reguli.