ЁЯУМ рдзрдбрд╛ 01 тАФ UI рдХрд╛: рд╕реВрдЪрдирд╛ рдлрд▓рдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-html-structure
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдЗрддрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рд│рд╛ рдЬреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдЪреНрдпрд╛ рджрд┐рд╢реЗрдиреЗ рдмрд╛рдВрдзрддреЗ рддреА рдЧреЛрд╖реНрдЯ тАФ рдЖрдгрд┐ рддреА рдмрдирд╡рдгрд╛рд▒реНрдпрд╛ рддреАрди files. рдЦрд▒реНрдпрд╛ files, рдЬреНрдпрд╛ рддреБрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рд╡рд╛рдкрд░рд╛рд▓:
- ui/index.html тАФ рд╕реНрд╡рддрдГ рд╕реВрдЪрдирд╛ рдлрд▓рдХ (~80 рдУрд│реА)
- ui/styles.css тАФ рдЧрдгрд╡реЗрд╢ рдЖрдгрд┐ рдорд╛рдВрдбрдгреА (~50 рдУрд│реА)
- ui/app.js тАФ state, events рдЖрдгрд┐ fetch (~90 рдУрд│реА, рдХреЛрдгрддрд╛рд╣реА framework рдирд╛рд╣реА)
- ui/mock_api.py тАФ рдлрд▓рдХрд╛рд▓рд╛ рдмреЛрд▓рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рдЙрдВрдЯрд░
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХ browser рдЖрдгрд┐ Python 3 рд▓рд╛рдЧреЗрд▓ (рдлрдХреНрдд рдлрд▓рдХ рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдЫреЛрдЯрд╛ рдХрд╛рдЙрдВрдЯрд░ serve рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА). Node рдирд╛рд╣реА, npm рдирд╛рд╣реА, framework рдирд╛рд╣реА, build step рдирд╛рд╣реА. рдЪрд╛рдВрдЧрд▓реЗ рд╢реЗрдЬрд╛рд░реА: API рд╢рд╛рд│рд╛ (рд╣рд╛ рдлрд▓рдХ рдЬреНрдпрд╛ рдХрд╛рдЙрдВрдЯрд░рд╕рд╛рдареА slips рднрд░рддреЛ рддреЛ) рдЖрдгрд┐ CI/CD рд╢рд╛рд│рд╛ (рдлрд▓рдХ рдХрд╕рд╛ рд▓рд╛рд╡рд▓рд╛ рдЬрд╛рддреЛ). рд╣рд╛ рдХреЛрд░реНрд╕ рдХрд╛рдп рдирд╛рд╣реА: React рдХреЛрд░реНрд╕ рдирд╛рд╣реА тАФ рддреБрдореНрд╣реА рд╣рд╛рддрд╛рдиреЗ рдХрд░реВрди рдкрд╛рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░ frameworks рдХрд╛рдп automate рдХрд░рддрд╛рдд рддреЗ lesson 07 рджрд╛рдЦрд╡рддреЛ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдХрдбреЗ рдПрдХ рд╕реБрдВрджрд░ рдиреЛрдВрджреА рдареЗрд╡рдгреНрдпрд╛рдЪреА рдЦреЛрд▓реА ЁЯЧДя╕П (Database рд╢рд╛рд│рд╛) рдЖрдгрд┐ рдПрдХ рдирдореНрд░ рд╕рдореЛрд░рдЪреЗ рдХрд╛рд░реНрдпрд╛рд▓рдп ЁЯПв (API рд╢рд╛рд│рд╛) рдЖрд╣реЗ. рдПрдХ рдкрд╛рд▓рдХ рдЖрдд рдпреЗрддрд╛рддтАж рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдХрд╛рд╣реАрдЪ рджрд┐рд╕рдд рдирд╛рд╣реА. рддрд┐рдереЗ рд╕реВрдЪрдирд╛ рдлрд▓рдХ рдирд╛рд╣реА.
рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рдПрдХ рдлрд▓рдХ рд▓рд╛рд╡рддреЗ ЁЯУМ. рддреНрдпрд╛рд╡рд░: рд╡рд░реНрдЧрд╛рдЪреА рдпрд╛рджреА, рдирд╡реАрди рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдЪреЗ рдирд╛рд╡ рдиреЛрдВрджрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ form, рдЖрдгрд┐ рд╣рд╛ рдлрд▓рдХ рдХрд╛рдп рдЖрд╣реЗ рдпрд╛рдмрджреНрджрд▓ рдПрдХ рдЯреАрдк. рдлрд▓рдХ рддреАрди рдЧреЛрд╖реНрдЯреАрдВрдиреА рдмрдирд▓реЗрд▓рд╛ рдЖрд╣реЗ, рдЖрдгрд┐ рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рджрд┐рд╡рд╢реА рддреНрдпрд╛ рдбреЛрдХреНрдпрд╛рдд рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдареЗрд╡рдгреЗ рдлрд╛рдпрджреНрдпрд╛рдЪреЗ рдЖрд╣реЗ:
- HTML тАФ рдХрд╛рдп рд▓рд╛рд╡рд▓реЗ рдЖрд╣реЗ. рдпрд╛рджреА, form, headings. рд░рдЪрдирд╛ рдЖрдгрд┐ рдЕрд░реНрде: рд╣реЗ heading рдЖрд╣реЗ, рддреЗ button рдЖрд╣реЗ, рд╣реА рдкрд╛рдЪ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдЖрд╣реЗ.
- CSS тАФ рддреЗ рдХрд╕реЗ рджрд┐рд╕рддреЗ. рд░рдВрдЧ, рдЕрдВрддрд░, рд░реБрдВрдж рднрд┐рдВрддреАрд╡рд░ рджреЛрди рд╕реНрддрдВрдн рдЖрдгрд┐ phone рд╡рд░ рдПрдХ. рдЕрд░реНрдерд╛рдмрджреНрджрд▓ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА; рд╕рдЧрд│реЗ рдХрд╛рд╣реА рд╕рд╛рджрд░реАрдХрд░рдгрд╛рдмрджреНрджрд▓.
- JavaScript тАФ рдХреЛрдгреА рд╕реНрдкрд░реНрд╢ рдХреЗрд▓реНрдпрд╛рд╡рд░ рдХрд╛рдп рд╣реЛрддреЗ. рдпрд╛рджреА filter рдХрд░рдгреЗ, form рдкрд╛рдард╡рдгреЗ, рдХрд╛рдЙрдВрдЯрд░рдХрдбреВрди рддрд╛рдЬреА рдирд╛рд╡реЗ fetch рдХрд░рдгреЗ.
Browser HTML рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ objects рдЪреЗ рдЭрд╛рдб тАФ DOM тАФ рдмрд╛рдВрдзрддреЛ, рдордЧ рддреЗ рд░рдВрдЧрд╡рддреЛ. CSS рддреНрдпрд╛ рдЭрд╛рдбрд╛рд▓рд╛ рд╕рдЬрд╡рддреЗ; JavaScript рддреЗ рдмрджрд▓рддреЗ. рдпрд╛ рдХреЛрд░реНрд╕рдордзрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рдпрд╛ рддрд┐рдШрд╛рдВрдкреИрдХреА рдПрдХ рдЖрд╣реЗ, рдХрд┐рдВрд╡рд╛ рддреЗ рдПрдЦрд╛рджреНрдпрд╛ рдорд╛рдгрд╕рд╛рдкрд░реНрдпрдВрдд рдХрд╕реЗ рдкреЛрд╣реЛрдЪрддрд╛рдд рддреЗ рдЖрд╣реЗ.
рдЖрдгрд┐ рдлрд▓рдХ рджрд┐рд╕рддреЛ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдХрд╛ рдЖрд╣реЗ: рд▓реЛрдХрд╛рдВрдирд╛ рдЬреЗ рджрд┐рд╕рддреЗ рддреЗрдЪ product рдЖрд╣реЗ. рдиреЛрдВрджреАрдВрдЪреА рдЦреЛрд▓реА рдкрд░рд┐рдкреВрд░реНрдг рдЕрд╕реВ рд╢рдХрддреЗ рдЖрдгрд┐ рдХрд╛рдЙрдВрдЯрд░ рдЬрд▓рдж, рдкрдг рдЬрд░ рдлрд▓рдХ рдЧреЛрдВрдзрд│рд╛рдЪрд╛ рдЕрд╕реЗрд▓, keyboard рдиреЗ рд╡рд╛рдкрд░рддрд╛ рдпреЗрдд рдирд╕реЗрд▓, рдХрд┐рдВрд╡рд╛ phone рд╡рд░ рдордВрдж рдЕрд╕реЗрд▓, рддрд░ рдЬреНрдпрд╛ рд▓реЛрдХрд╛рдВрд╕рд╛рдареА рд╢рд╛рд│рд╛ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареАрдЪ рддреА рдореЛрдбрд▓реЗрд▓реА рдЖрд╣реЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph back["ЁЯЧДя╕ПЁЯУи the back office"]
db["Database school<br/>the record room"]
api["API school<br/>the counter"]
db --- api
end
subgraph board["ЁЯУМ the notice board тАФ this course"]
h["ЁЯз▒ HTML тАФ what is pinned (structure + meaning)"]
c["ЁЯОи CSS тАФ how it looks"]
j["тЪб JavaScript тАФ what happens when touched"]
h --> c --> j
end
api -->|"fetch /api/students"| board
board -->|"the browser builds the DOM and paints"| person["ЁЯСА a person"]
тЭУ рдХрд╛рдп
- Browser HTML download рдХрд░рддреЛ, рддреНрдпрд╛рдЪреЗ parsing рдХрд░реВрди DOM (nodes рдЪреЗ рдЭрд╛рдб) рдмрдирд╡рддреЛ, CSS рд▓рд╛рд╡реВрди render tree рддрдпрд╛рд░ рдХрд░рддреЛ, рдЖрдгрд┐ paint рдХрд░рддреЛ. JavaScript DOM рдХрдзреАрд╣реА рдмрджрд▓реВ рд╢рдХрддреЗ; browser рдкреБрдиреНрд╣рд╛ paint рдХрд░рддреЛ.
- HTML = рд░рдЪрдирд╛ рдЖрдгрд┐ рдЕрд░реНрде (semantics тАФ lesson 02). CSS = рджрд┐рд╕рдгреЗ рдЖрдгрд┐ рдорд╛рдВрдбрдгреА (lesson 03). JavaScript = рд╡рд╛рдЧрдгреЗ (lessons 04тАУ05).
- DevTools (F12 / right-click тЖТ Inspect) рддрд┐рдиреНрд╣реА live рджрд╛рдЦрд╡рддреЗ: Elements panel рдореНрд╣рдгрдЬреЗ DOM, Styles рдореНрд╣рдгрдЬреЗ рдЬрд┐рдВрдХрд▓реЗрд▓реА CSS, Console JS рдЪрд╛рд▓рд╡рддреЗ, Network рдХрд╛рдЙрдВрдЯрд░рдХрдбреЗ рдкрд╛рдард╡рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ slip рджрд╛рдЦрд╡рддреЗ.
- рдлрд▓рдХ рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд files тАФ HTML, CSS, JS тАФ рдореНрд╣рдгреВрдирдЪ lesson 12 рддреЛ рдХреЛрдгрддреНрдпрд╛рд╣реА static host рд╡рд░ рдПрдХрд╛ рдорд┐рдирд┐рдЯрд╛рдд рд▓рд╛рд╡реВ рд╢рдХрддреЛ.
- "web app", "single-page app", "React app" рд╣реЗ рд╕рдЧрд│реЗ рд╣реЗрдЪ рдЖрд╣реЗрдд, рдлрдХреНрдд рдЬрд╛рд╕реНрдд рдпрдВрддреНрд░рдгреЗрд╕рд╣. Framework рдордзрд▓реА рдХреЛрдгрддреАрд╣реА рдЧреЛрд╖реНрдЯ DOM + CSS + events рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдЬрд╛рдд рдирд╛рд╣реА.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг UI рдордзреНрдпреЗрдЪ рдмрд░реЛрдмрд░рдкрдгрд╛ рдЙрдкрдпреЛрдЧреА рдард░рддреЛ. рдпрд╛ рдорд╛рд▓рд┐рдХреЗрддрд▓реА рдЗрддрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рд│рд╛ рдХрд╛рд╣реАрддрд░реА рдЦрд░реЗ рдмрдирд╡рддреЗ; рд╣реА рд╢рд╛рд│рд╛ рддреЗ рджрд┐рд╕рдгрд╛рд░реЗ, рд╕рдордЬрдгрд╛рд░реЗ рдЖрдгрд┐ рд╡рд╛рдкрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ рдмрдирд╡рддреЗ тАФ keyboard, screen reader, рдХрд┐рдВрд╡рд╛ рдордВрдж рд░реЗрд▓реНрд╡реЗрдд рдкрд╛рдЪ рд╡рд░реНрд╖реЗ рдЬреБрдирд╛ phone рд╡рд╛рдкрд░рдгрд╛рд▒реНрдпрд╛рдВрд╕рд╛рдареАрд╕реБрджреНрдзрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
ui/mock_api.py рддрд┐рдиреНрд╣реА files рдЖрдгрд┐ рдПрдХ рдЫреЛрдЯрд╛ /api/students рдХрд╛рдЙрдВрдЯрд░ serve рдХрд░рддреЛ,
рдореНрд╣рдгрдЬреЗ рдлрд▓рдХ рддреБрдордЪреНрдпрд╛ laptop рд╡рд░рд╕реБрджреНрдзрд╛ production рдордзреНрдпреЗ рд╡рд╛рдЧреЗрд▓ рдЕрдЧрджреА рддрд╕рд╛рдЪ рд╡рд╛рдЧрддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (60 рд╕реЗрдХрдВрдж тАФ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕, live)
python3 ui/mock_api.py # terminal 1 тЖТ http://127.0.0.1:8000/
python3 ui/smoke_test.py # terminal 2 тЖТ ten checks
рдордЧ browser рдордзреНрдпреЗ: рдПрдЦрд╛рджрд╛ рд╡рд░реНрдЧ filter рдХрд░рд╛, рдПрдХрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдЪреЗ рдирд╛рд╡ рдиреЛрдВрджрд╡рд╛, ЁЯМЩ Dark рд╡рд░ click рдХрд░рд╛, рдЕрдЧрджреА рд╡рд░реВрди Tab рджрд╛рдмрд╛ (рдПрдХ рд▓рдкрд▓реЗрд▓реА "Skip to content" link рд╕рд░реНрд╡рд╛рдд рдЖрдзреА рджрд┐рд╕рддреЗ), рдЖрдгрд┐ filter рдХрд░рддрд╛рдирд╛ DOM рдХрд╕рд╛ рдмрджрд▓рддреЛ рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА DevTools тЖТ Elements рдЙрдШрдбрд╛.
Smoke test рдордзреВрди рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ:
тЬЕ lang attribute on <html> тЬЕ one <h1> тЬЕ every input has a label
тЬЕ images have alt тЬЕ skip link + live region
тЬЕ design tokens defined тЬЕ dark theme via tokens тЬЕ focus is visible
тЬЕ API returns students тЬЕ API rejects a bad form (400)
ЁЯОЙ the board stands
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рдлрд▓рдХрд╛рд╡рд░ рдкрд╛рдЪ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдЪреА рдпрд╛рджреА рджрд┐рд╕рддреЗ; рд╡рд░реНрдЧ filter рдкрд╛рди reload рди рдХрд░рддрд╛ рдпрд╛рджреА рд▓рд╣рд╛рди рдХрд░рддреЛ;
рдирд╛рд╡ рдиреЛрдВрджрд╡рд▓реНрдпрд╛рд╡рд░ рдПрдХ card рдЬреЛрдбрд▓реЗ рдЬрд╛рддреЗ рдЖрдгрд┐ "тАж is on the board." рдЫрд╛рдкрд▓реЗ рдЬрд╛рддреЗ; smoke test
ЁЯОЙ the board stands рдиреЗ рд╕рдВрдкрддреЛ. DevTools тЖТ Network рдордзреНрдпреЗ load рд╣реЛрддрд╛рдирд╛ рдлрд▓рдХ рдХрд░рдд рдЕрд╕рд▓реЗрд▓реА
рдПрдХрдореЗрд╡ GET /api/students request рддреБрдореНрд╣реА рдкрд╛рд╣реВ рд╢рдХрддрд╛.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдПрдХ рдЦрд░рд╛, interactive, accessible web app рдореНрд╣рдгрдЬреЗ рддреАрди text files рдЖрдгрд┐ рдПрдХ browser тАФ рдЖрдгрд┐ рддрд┐рдиреНрд╣реА рднрд╛рдЧ рдПрдХрддреНрд░ рдХрд╛рдо рдХрд░рддрд╛рдирд╛ рддреБрдореНрд╣реА рдЖрдзреАрдЪ рдкрд╛рд╣реВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
ui/index.htmlрдереЗрдЯ file system рдордзреВрди рдЙрдШрдбрдгреЗ тАФ рдХрд╛рдЙрдВрдЯрд░рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛fetchрдЕрдбрд╡рд▓рд╛ рдЬрд╛рддреЛ; рдиреЗрд╣рдореАpython3 ui/mock_api.pyрдиреЗ serve рдХрд░рд╛- files рдмрджрд▓рд▓реНрдпрд╛ рддрд░реА рдмрджрд▓ рди рджрд┐рд╕рдгреЗ тАФ hard-reload рдХрд░рд╛ (Cmd/Ctrl + Shift + R); lesson 09 cache рд╕рдордЬрд╛рд╡рддреЛ
- "UI" рдореНрд╣рдгрдЬреЗ "design" рдЕрд╕реЗ рд╕рдордЬрдгреЗ тАФ рддреЗ рд░рдЪрдирд╛, рд╡рд╛рдЧрдгреЗ рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдВрдирд╛ рд╡рд╛рдкрд░рддрд╛ рдпреЗрдгреЗ рдЖрд╣реЗ, рдЬреНрдпрд╛рддрд▓рд╛ рджреГрд╢реНрдп design рд╣рд╛ рдлрдХреНрдд рдПрдХ рднрд╛рдЧ рдЖрд╣реЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: users рдирд╛ рдЦрд░реЛрдЦрд░ рдЬрд╛рдгрд╡рдгрд╛рд░реА рдкреНрд░рддреНрдпреЗрдХ incident рдЗрдереЗрдЪ рдШрдбрддреЗ: phone рд╡рд░реВрди рдкрд╛рдард╡рддрд╛ рди рдпреЗрдгрд╛рд░рд╛ form, screen reader рд▓рд╛ рди рд╕рд╛рдкрдбрдгрд╛рд░реЗ button, 3G рд╡рд░ рдЖрда рд╕реЗрдХрдВрдж рдШреЗрдгрд╛рд░реЗ рдкрд╛рди. рдорд╛рдЧрдЪреЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдЕрджреГрд╢реНрдп рдЕрд╕рддреЗ; рдлрд▓рдХ рд╣реЗрдЪ product рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдиреЗрдордХреЗ рдХрд╛рдп рд▓рд╛рд╡рд╛рдпрдЪреЗ, рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдд? HTML рд░рдЪрдирд╛ тАФ semantic elements, forms, labels рдЖрдгрд┐ alt text.
git checkout lesson-02-html-structure