Biblioteca
Tutora
BibliotecaInformatică și TIC › clasa a XI-a

Tehnologii web – HTML, CSS și JavaScript de bază

Crearea și stilizarea paginilor web statice și introducere în programarea client-side.

Structura unui document HTML5

HTML nu este un limbaj de programare, ci un limbaj de marcare (markup): el nu execută instrucțiuni și nu are decizii sau bucle, ci descrie structura și semnificația conținutului. Această distincție e prima întrebare de teză.

Un document HTML5 corect are următoarea schelă:

Elementele au forma `<etichetă atribut=„valoare”>conținut</etichetă>`. Există și elemente vide (self-closing), care nu au conținut și deci nici etichetă de închidere: `<img>`, `<br>`, `<hr>`, `<input>`, `<meta>`.

HTML5 a introdus elementele semantice, care înlocuiesc mulțimea de `<div>`-uri fără sens: `<header>`, `<nav>`, `<main>`, `<section>`, `<article>`, `<aside>`, `<footer>`. Ele nu schimbă aspectul, dar ajută motoarele de căutare și cititoarele de ecran să înțeleagă pagina — de aceea sunt preferate.

Două atribute globale sunt esențiale pentru restul capitolului: `id`, care trebuie să fie unic în pagină, și `class`, care poate fi folosit de oricâte elemente și chiar mai multe pe același element (`class=„buton principal”`). Confuzia id/class se plătește imediat când ajungi la selectorii CSS.

Elemente HTML de bază: text, liste, imagini, legături, tabele

Conținutul se organizează cu un set restrâns de elemente, pe care examenul le cere efectiv scrise corect.

Text și titluri: `<h1>` … `<h6>` marchează ierarhia secțiunilor, nu mărimea literei — dacă vrei text mare, folosești CSS, nu un `<h1>` nepotrivit. Paragraful e `<p>`. Pentru accent semantic se folosesc `<strong>` (importanță) și `<em>` (emfază), preferate lui `<b>` și `<i>`, care descriu doar aspectul.

Liste: - `<ul>` – listă neordonată, cu marcatori; - `<ol>` – listă ordonată, numerotată; - în ambele, fiecare element este `<li>`; - `<dl>` cu `<dt>` și `<dd>` – listă de definiții.

Imagini: `<img src=„poza.jpg” alt=„descriere”>`. Atributul `alt` este obligatoriu în practică: el se afișează dacă imaginea nu se încarcă și este citit de cititoarele de ecran pentru persoanele nevăzătoare.

Legături (hyperlink): `<a href=„https://exemplu.ro”>text</a>`. Atributul `href` dă destinația și poate fi o adresă absolută, una relativă (`pagina2.html`, `../imagini/logo.png`) sau o ancoră internă (`#contact`, care sare la elementul cu acel `id`). `target=„_blank”` deschide în filă nouă.

Tabele: `<table>` conține rânduri `<tr>`, iar în rânduri celule de date `<td>` sau celule de antet `<th>` (îngroșate și centrate implicit). Structura completă adaugă `<thead>`, `<tbody>`, `<tfoot>` și `<caption>`. Îmbinarea celulelor se face cu atributele `colspan` (pe orizontală, coloane) și `rowspan` (pe verticală, rânduri) — ordinea lor se confundă des.

O regulă de fond: tabelele se folosesc doar pentru date tabelare. Construirea layout-ului paginii cu tabele este o practică depășită; pentru asta există CSS.

Foi de stil CSS: selectori, cascadă, specificitate

CSS separă prezentarea de structură. O regulă are forma:

``` selector { proprietate: valoare; } ```

Stilurile pot fi aplicate în trei moduri, în ordinea crescătoare a priorității: extern (fișier .css legat cu `<link rel=„stylesheet” href=„stil.css”>`, singura variantă recomandată pentru un site real), intern (bloc `<style>` în `<head>`) și inline (atributul `style` pe element, greu de întreținut).

Selectorii de bază:

Două mecanisme explică de ce „stilul meu nu se aplică”:

Confuzia clasică la examen: un elev crede că regula de la sfârșitul fișierului bate întotdeauna. Nu — ordinea decide doar între reguli cu aceeași specificitate; un selector `#meniu a` bate un `.link` scris mai jos.

Box model și dispunerea elementelor cu flexbox

Fiecare element din pagină este redat ca o cutie dreptunghiulară, formată din patru straturi, dinspre interior spre exterior:

1. content – conținutul propriu-zis (`width`, `height`); 2. padding – spațiul interior, între conținut și chenar; ia culoarea de fundal a elementului; 3. border – chenarul; 4. margin – spațiul exterior, care separă elementul de vecini; este întotdeauna transparent.

Capcana numărul unu a CSS-ului: implicit (`box-sizing: content-box`), `width` se referă doar la conținut, așa că lățimea reală ocupată = width + padding stânga/dreapta + border stânga/dreapta. Un element cu `width: 200px; padding: 20px; border: 5px` ocupă în realitate 250px. Soluția practică, folosită azi în toate proiectele, este `box-sizing: border-box`, care face ca `width` să includă padding și border.

O a doua subtilitate: marginile verticale adiacente se colapsează (dintre 30px și 20px rămâne 30px, nu 50px), în timp ce marginile orizontale se adună normal.

Proprietatea `display` decide comportamentul cutiei: `block` (ocupă toată lățimea disponibilă, începe pe rând nou — `div`, `p`, `h1`), `inline` (ocupă doar cât conținutul, stă în rând cu textul, iar `width` și `height` nu au efect — `span`, `a`), `inline-block` (stă în rând, dar acceptă dimensiuni) și `none` (elementul dispare complet, fără să lase spațiu — spre deosebire de `visibility: hidden`, care îl ascunde, dar îi păstrează locul).

Flexbox rezolvă alinierea într-o singură direcție. Se activează cu `display: flex` pe container, iar copiii devin elemente flexibile. Proprietățile-cheie ale containerului: `flex-direction` (`row` implicit, sau `column`), `justify-content` (aliniere pe axa principală), `align-items` (aliniere pe axa transversală), `gap` (spațiul dintre elemente) și `flex-wrap`. Confuzia sigură la teză: dacă `flex-direction` este `column`, axa principală devine verticala, deci `justify-content` aliniază pe verticală, iar `align-items` pe orizontală — exact invers față de cazul obișnuit.

Introducere în JavaScript: variabile, funcții, evenimente

JavaScript este singurul limbaj de programare propriu-zis din acest capitol: el se execută în browser (client-side) și face pagina interactivă. Se include cu `<script src=„script.js”></script>`, de regulă înainte de `</body>`, ca să existe deja elementele pe care le manipulează.

Variabile: se declară cu `let` (valoare care se poate schimba) și `const` (valoare care nu se reatribuie); `var`, forma veche, are un comportament derutant al vizibilității și nu se mai recomandă. Tipurile de bază sunt `number`, `string`, `boolean`, `null`, `undefined`, plus obiectele și tablourile. JavaScript are tipizare dinamică: aceeași variabilă poate primi valori de tipuri diferite.

O capcană specifică, foarte iubită la teze: operatorul `==` face conversie de tip înainte de comparație, așa că `„5” == 5` este adevărat, în timp ce `===` compară și valoarea, și tipul, deci `„5” === 5` este fals. Regula practică: folosește întotdeauna `===`.

Funcții: `function suma(a, b) { return a + b; }` sau varianta modernă, funcția săgeată: `const suma = (a, b) => a + b;`. Structurile de control (`if`, `for`, `while`, `switch`) sunt cele cunoscute din C++.

Accesul la elementele paginii (DOM): pagina este reprezentată în memorie ca un arbore de obiecte (DOM). Elementele se obțin cu `document.getElementById(„id”)` sau, mai general, cu `document.querySelector(„.clasa”)`, care acceptă orice selector CSS. Conținutul se schimbă cu `textContent` (text simplu, varianta sigură) sau `innerHTML` (interpretează HTML).

Evenimente: codul se leagă de acțiunile utilizatorului. Modul recomandat este:

``` buton.addEventListener(„click”, function () { ... }); ```

Evenimente uzuale: `click`, `submit`, `change`, `input`, `keydown`, `mouseover`, `load`. În interiorul funcției, obiectul `event` descrie ce s-a întâmplat, iar `event.preventDefault()` oprește comportamentul implicit — cel mai des, retrimiterea paginii la trimiterea unui formular.

Formulare HTML și validarea datelor

Formularul este mecanismul prin care utilizatorul trimite date către server. Elementul `<form>` are două atribute esențiale: `action` (adresa care primește datele) și `method`.

Diferența GET vs. POST este o întrebare aproape sigură:

Atenție: POST nu criptează nimic. Confidențialitatea o dă HTTPS, nu metoda.

Câmpurile se creează cu `<input>`, al cărui atribut `type` decide comportamentul: `text`, `password`, `email`, `number`, `date`, `checkbox`, `radio`, `file`, `submit`. Alte elemente: `<textarea>` pentru text lung, `<select>` cu `<option>` pentru liste derulante.

Două atribute pe care elevii le tratează superficial:

La butoanele radio, toate opțiunile dintr-un grup trebuie să aibă același `name` — altfel utilizatorul le poate bifa pe toate simultan, ceea ce contrazice ideea de alegere unică.

Validarea are două straturi. Cea din HTML5 se face declarativ, cu `required`, `min`, `max`, `minlength`, `maxlength`, `pattern` (expresie regulată) și cu tipuri ca `email` sau `number`; browserul afișează singur mesajele. Cea din JavaScript permite verificări complexe (parolele coincid, CNP-ul e coerent) și mesaje personalizate.

Regula de aur, valabilă indiferent de cât de bine validezi în pagină: validarea pe client este pentru confortul utilizatorului, nu pentru securitate. Ea poate fi ocolită complet, așa că datele trebuie validate obligatoriu și pe server.

De reținut

HTML
limbaj de marcare care descrie structura și semnificația conținutului unei pagini web, nu un limbaj de programare
element vid (self-closing)
element HTML fără conținut și fără etichetă de închidere, precum img, br, hr, input, meta
atributul alt
text alternativ al unei imagini, afișat când imaginea nu se încarcă și citit de tehnologiile asistive
selector de clasă
selector CSS scris cu punct înaintea numelui, care vizează toate elementele având atributul class respectiv
specificitate CSS
mecanism care stabilește ce regulă se aplică atunci când mai multe vizează același element: inline, apoi id, apoi clasă, apoi element
box model
modelul cutiei unui element, format din content, padding, border și margin
flexbox
model de dispunere unidimensională activat prin display: flex, care aliniază elementele-copil pe axa principală și pe cea transversală
DOM
reprezentarea paginii web ca arbore de obiecte, prin care JavaScript poate citi și modifica elementele documentului
operatorul ===
operator JavaScript de egalitate strictă, care compară atât valoarea, cât și tipul, fără conversie implicită
metoda POST
metodă de trimitere a datelor unui formular prin corpul cererii HTTP, fără afișarea lor în URL și fără limita de lungime a metodei GET

Greșeli frecvente

Greșit: Același id este folosit pentru mai multe elemente din pagină
Corect: Atributul id trebuie să fie unic în document; pentru a stiliza mai multe elemente la fel se folosește class, care poate fi repetat
Greșit: Un element cu width: 200px și padding: 20px ocupă 200px pe ecran
Corect: Implicit width se referă doar la conținut, deci elementul ocupă 200 + 2×20 plus chenarul; pentru ca width să includă padding și border se folosește box-sizing: border-box
Greșit: În CSS câștigă întotdeauna regula scrisă ultima în fișier
Corect: Ordinea decide doar între reguli cu aceeași specificitate; un selector cu id bate un selector de clasă, oriunde ar fi scris
Greșit: În JavaScript, comparația cu == este echivalentă cu ===
Corect: Operatorul == face conversie de tip, deci „5” == 5 este adevărat, în timp ce === compară și tipul, deci „5” === 5 este fals
Greșit: Dacă formularul este validat cu JavaScript, datele sunt sigure
Corect: Validarea pe client poate fi ocolită complet, cu instrumentele browserului sau prin cereri directe; datele trebuie validate obligatoriu și pe server

Test — 6 întrebări ca la examen

1. Care dintre următoarele elemente HTML nu are etichetă de închidere?
  1. <p>
  2. <div>
  3. <img>
  4. <a>
Vezi răspunsul
<img>. Elementul img este un element vid: nu are conținut între etichete, ci doar atribute precum src și alt. Elementele p, div și a au conținut, deci se închid obligatoriu; p este distractorul tentant pentru că browserele îi tolerează adesea lipsa închiderii, dar sintaxa corectă o cere.
2. Selectorul CSS care vizează toate elementele cu class=„mesaj” este:
  1. #mesaj
  2. .mesaj
  3. mesaj
  4. *mesaj
Vezi răspunsul
.mesaj. Clasele se selectează cu punct înaintea numelui. Varianta cu diez este distractorul principal, dar el selectează elementul cu id=„mesaj”, care poate exista o singură dată în pagină.
3. Un element are stilul width: 300px; padding: 10px; border: 2px solid; box-sizing: content-box. Ce lățime totală ocupă în pagină?
  1. 300px
  2. 312px
  3. 324px
  4. 320px
Vezi răspunsul
324px. Cu content-box, width acoperă doar conținutul, deci se adaugă padding-ul pe ambele laturi (2×10) și chenarul pe ambele laturi (2×2): 300 + 20 + 4 = 324px. Răspunsul 300px este capcana clasică și ar fi corect doar cu box-sizing: border-box.
4. Într-un container cu display: flex și flex-direction: column, proprietatea justify-content aliniază elementele:
  1. pe orizontală, pentru că este axa principală
  2. pe verticală, pentru că axa principală a devenit verticala
  3. pe ambele axe simultan
  4. doar în interiorul fiecărui element-copil
Vezi răspunsul
pe verticală, pentru că axa principală a devenit verticala. justify-content acționează întotdeauna pe axa principală, iar flex-direction: column mută axa principală pe verticală. Prima variantă e distractorul puternic, pentru că descrie situația implicită row, unde axa principală chiar este orizontala.
5. Ce afișează secvența JavaScript: let x = „5”; if (x === 5) console.log(„egal”); else console.log(„diferit”);
  1. egal
  2. diferit
  3. nimic, deoarece apare o eroare de sintaxă
  4. 5
Vezi răspunsul
diferit. x este un șir de caractere, iar 5 este un număr; operatorul === compară și tipul, deci condiția este falsă și se afișează diferit. Varianta egal ar fi corectă doar cu ==, care face conversie de tip înainte de comparație.
6. Un formular de autentificare trimite corect datele către server, dar parola apare vizibilă în bara de adrese a browserului. Ce trebuie modificat?
  1. atributul type al câmpului, din text în password
  2. atributul method al formularului, din GET în POST
  3. atributul action al formularului
  4. atributul name al câmpului de parolă
Vezi răspunsul
atributul method al formularului, din GET în POST. Apariția datelor în URL este semnătura metodei GET; POST le trimite în corpul cererii, deci nu mai sunt afișate în bara de adrese. Schimbarea lui type în password este distractorul tentant, dar aceea doar maschează caracterele pe ecran cu puncte și nu are nicio influență asupra modului de trimitere.
Deschide varianta interactivă — cu AI care îți explică
← Securitatea datelor și protecția informațieiSisteme de operare →
BiologieChimieEconomieFilosofieFizicăGeografieInformatică și TICIstorieLogică și argumentareMatematicăPsihologieLimba și literatura română