ЁЯз▒ рдзрдбрд╛ 02 тАФ HTML рд░рдЪрдирд╛: рдлрд▓рдХрд╛рдЪрд╛ рд╕рд╛рдВрдЧрд╛рдбрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-ui ┬╖ рдкреБрдвреЗ: lesson-03-css-layout
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЖрдгрд┐ рд╕рд╛рдВрдЧрд╛рдбрд╛: semantic elements (landmarks), рдЕрд░реНрдердкреВрд░реНрдг forms (labels, required, types), рдЖрдгрд┐ mouse рд╡рд╛рдкрд░рдгрд╛рд▒реНрдпрд╛рдВрд╢рд┐рд╡рд╛рдп рдЗрддрд░ рдХреЛрдгреА рдлрд▓рдХ рд╡рд╛рдкрд░реВ рд╢рдХреЗрд▓ рдХреА рдирд╛рд╣реА рд╣реЗ рдард░рд╡рдгрд╛рд░реЗ рдЫреЛрдЯреЗ attributes.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рджреЛрди рдлрд▓рдХ рдЕрдЧрджреА рд╕рд╛рд░рдЦреЗ рджрд┐рд╕реВ рд╢рдХрддрд╛рдд рдЖрдгрд┐ рдЖрддреВрди рдкреВрд░реНрдгрдкрдгреЗ рд╡реЗрдЧрд│реЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд.
рдПрдХ рдлрд▓рдХ рдмрд┐рдирд╛рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдЖрдпрддрд╛рдВрдиреА рдмрдирд▓реЗрд▓рд╛ рдЖрд╣реЗ: рдЗрдереЗ <div>, рддрд┐рдереЗ <div>, button рд╕рд╛рд░рдЦрд╛
рджрд┐рд╕рд╛рд╡рд╛ рдореНрд╣рдгреВрди рд░рдВрдЧрд╡рд▓реЗрд▓рд╛ рдПрдХ <div onclick>. рджреБрд╕рд░рд╛ рдлрд▓рдХ рдЖрдкрд▓реНрдпрд╛ рднрд╛рдЧрд╛рдВрдирд╛ рдирд╛рд╡реЗ рджреЗрддреЛ:
рд╣рд╛ header рдЖрд╣реЗ, рд╣реЗ navigation рдЖрд╣реЗ, рд╣рд╛ main рдордЬрдХреВрд░ рдЖрд╣реЗ,
рд╣реА рдкрд╛рдЪ items рдЪреА list рдЖрд╣реЗ, рд╣реЗ button рдЖрд╣реЗ, рдЖрдгрд┐ рдпрд╛
input рдЪреЗ label "Name" рдЖрд╣реЗ.
рдлрдХреНрдд рджреБрд╕рд░рд╛ рдлрд▓рдХ screen reader рд╡рд╛рдЪреВ рд╢рдХрддреЛ ("list, five itemsтАж"), keyboard рдиреЗ рдЪрд╛рд▓рд╡рддрд╛ рдпреЗрддреЛ (Tab buttons рдЖрдгрд┐ links рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЛ, Enter рддреНрдпрд╛рдВрдирд╛ рджрд╛рдмрддреЛ), search engine рд▓рд╛ рд╕рдордЬрддреЛ, рдХрд┐рдВрд╡рд╛ "Enrol рдирд╛рд╡рд╛рдЪреЗ button" рдорд╛рдЧрдгрд╛рд░рд╛ robot рддреНрдпрд╛рдЪреА test рдХрд░реВ рд╢рдХрддреЛ. рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреЛ рдЕрд░реНрде рд╕рд╛рдВрдЧрд╛рдпрдЪрд╛ рдЖрд╣реЗ рддреЛрдЪ рдЕрд░реНрде рдЕрд╕рд▓реЗрд▓рд╛ element рдирд┐рд╡рдбреВрди рд╣реЗ рд╕рдЧрд│реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдлреБрдХрдЯ рдорд┐рд│рддреЗ.
рдкрд╣рд┐рд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдирд┐рдпрдо:
<html lang="en">тАФ рдлрд▓рдХ рдХреЛрдгрддреНрдпрд╛ рднрд╛рд╖реЗрдд рдЖрд╣реЗ (screen readers рдЙрдЪреНрдЪрд╛рд░ рдмрджрд▓рддрд╛рдд).- рдПрдХ
<h1>, рдордЧ рддреНрдпрд╛рдЦрд╛рд▓реА<h2>тАФ headings рдореНрд╣рдгрдЬреЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛, рдЬрд┐рдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рд▓реЛрдХ рдкрд╛рдирд╛рд╡рд░ рдлрд┐рд░рддрд╛рдд. - Landmarks:
<header>,<nav>,<main>,<section>,<footer>. - рдХреГрддреАрдВрд╕рд╛рдареА
<button>, рдХреБрдареЗрддрд░реА рдЬрд╛рдгреНрдпрд╛рд╕рд╛рдареА<a href>. Click рдХрд░рддрд╛ рдпреЗрдгрд╛рд░рд╛<div>рдХрдзреАрдЪ рдирд╛рд╣реА. - рдкреНрд░рддреНрдпреЗрдХ
<input>/<select>рд▓рд╛<label for="id">рдорд┐рд│рддреЗ. Placeholder рдореНрд╣рдгрдЬреЗ label рдирд╛рд╣реА тАФ type рдХрд░рд╛рдпрд▓рд╛ рд▓рд╛рдЧрд▓реНрдпрд╛рд╡рд░ рддреЗ рдирд╛рд╣реАрд╕реЗ рд╣реЛрддреЗ. - рдкреНрд░рддреНрдпреЗрдХ
<img>рд▓рд╛altрдорд┐рд│рддреЗ тАФ рд╡рд░реНрдгрди, рдХрд┐рдВрд╡рд╛ рдЪрд┐рддреНрд░ рдлрдХреНрдд рд╕рдЬрд╛рд╡рдЯ рдЕрд╕реЗрд▓ рддрд░alt=""(рдЖрдкрд▓реНрдпрд╛ avatars рд╕рд╛рд░рдЦреЗ, рдЬреЗ рд╢реЗрдЬрд╛рд░реАрдЪ рдирд╛рд╡ рдкреБрдиреНрд╣рд╛ рджрд╛рдЦрд╡рддрд╛рдд).
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph page["ЁЯУД ui/index.html"]
sk["ЁЯФЧ skip link (first tab stop)"]
hd["ЁЯз▒ header тАФ h1 + nav + theme button"]
mn["ЁЯз▒ main"]
s1["section#students тАФ h2, filter, ul.cards"]
s2["section#enrol тАФ h2, form: label+input, label+select, button"]
s3["section#about тАФ h2, prose"]
ft["ЁЯз▒ footer"]
sk --> hd --> mn --> s1 --> s2 --> s3 --> ft
end
free["free with the right element:<br/>keyboard ┬╖ focus ┬╖ screen-reader names ┬╖ tests that ask for roles"]
page -.-> free
тЭУ рдХрд╛рдп
- Semantic elements рд╕реЛрдмрдд рдПрдХ role рдЕрд╕рддреЛ рдЬреЛ browser рд╕рд╣рд╛рдпреНрдпрдХ
рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рд▓рд╛ рджрд╛рдЦрд╡рддреЛ:
<button>тЖТ button,<nav>тЖТ navigation,<ul><li>тЖТ list,<main>тЖТ main landmark.<div>рдЪрд╛ role "generic" рдЕрд╕рддреЛ тАФ рдореНрд╣рдгрдЬреЗ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА. - Forms:
<label for="name">рд╢рдмреНрджрд╛рдВрдирд╛ field рд╢реА рдЬреЛрдбрддреЗ (label рд╡рд░ click рдХреЗрд▓реНрдпрд╛рд╕ field рд╡рд░ focus рдЬрд╛рддреЛ). Attributes рдореНрд╣рдгрдЬреЗ рд╡рд╛рдЧрдгреЗ:required,minlength,type="email",autocomplete.<button type="submit">form рдкрд╛рдард╡рддреЗ;type="button"рдкрд╛рдард╡рдд рдирд╛рд╣реА. <template>: рдирд┐рд╖реНрдХреНрд░рд┐рдп HTML, рдЬреЗ рддреБрдореНрд╣реА JavaScript рдордзреНрдпреЗ clone рдХрд░рддрд╛ тАФ рдЖрдкрд▓реЗ student card JS string рдРрд╡рдЬреА рддрд┐рдереЗ рд░рд╛рд╣рддреЗ (lesson 04 рддреЗ рд╡рд╛рдкрд░рддреЛ).- рд╕рдЬрд╛рд╡рдЯ рдирд╕рд▓реЗрд▓реЗ attributes:
lang,alt, рдкрд╛рдирд╛рд╡рд░рдЪреЗtitle, status рднрд╛рдЧрд╛рд╡рд░рдЪреЗaria-live(lesson 06),for/idрдЬреЛрдбреНрдпрд╛. - Document outline:
h1тЖТh2тЖТh3, рдПрдХрд╣реА рдкрд╛рддрд│реА рди рд╡рдЧрд│рддрд╛. рдбреЛрд│рд╕ users рдЬрд╕реЗ рдкрд╛рди рд╡рд░рд╡рд░ рдкрд╛рд╣рддрд╛рдд, рддрд╕реЗ screen reader users heading рд╡рд░реВрди heading рд╡рд░ рдЙрдбреНрдпрд╛ рдорд╛рд░рддрд╛рдд. - Validation attributes рддреБрдореНрд╣рд╛рд▓рд╛ browser рдЪреНрдпрд╛ рдлреБрдХрдЯ рддрдкрд╛рд╕рдгреНрдпрд╛ рдЖрдгрд┐ рддреБрдордЪреЗ
рд╕реНрд╡рддрдГрдЪреЗ рд╕рдВрджреЗрд╢ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЬрд╛рдЧрд╛ рджреЗрддрд╛рдд (lesson 04 рдордзреНрдпреЗ
input.checkValidity()).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг semantics рдореНрд╣рдгрдЬреЗ рддреБрдореНрд╣реА рдХрдзреАрд╣реА рд╡рд┐рдХрдд рдШреНрдпрд╛рд▓ рдЕрд╢реА рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд accessibility, SEO рдЖрдгрд┐
testability: рддреБрдореНрд╣реА <div> рдРрд╡рдЬреА <button> рд▓рд┐рд╣рд┐рддрд╛ рдЖрдгрд┐ keyboard
support, focus, roles рдЖрдгрд┐ рдирд╛рд╡ рдорд┐рд│рддреЗ тАФ рдХрд╛рд╣реАрд╣реА рди рдореЛрдЬрддрд╛. рдирдВрддрд░ рддреЗ рдЬреЛрдбрд╛рдпрдЪреЗ
рдореНрд╣рдгрдЬреЗ ARIA рд╡рд╛рдкрд░реВрди browser рд╣рд╛рддрд╛рдиреЗ рдкреБрдиреНрд╣рд╛ рдмрдирд╡рдгреЗ, рддреЗрд╣реА рд╡рд╛рдИрдЯ рдкрджреНрдзрддреАрдиреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
ui/index.html рд╡рд░рдкрд╛рд╕реВрди рдЦрд╛рд▓рдкрд░реНрдпрдВрдд рд╡рд╛рдЪрд╛ тАФ рддреЗ рдЫреЛрдЯреЗ рдЖрд╣реЗ тАФ 80 рдУрд│реАрдВрдкреЗрдХреНрд╖рд╛ рдХрдореА тАФ рдЖрдгрд┐
рдкреНрд░рддреНрдпреЗрдХ element рддреНрдпрд╛рдЪреНрдпрд╛ рдЕрд░реНрдерд╛рд╕рд╛рдареА рдирд┐рд╡рдбрд▓рд╛ рдЖрд╣реЗ: skip link, рдПрдХ h1 рдЕрд╕рд▓реЗрд▓рд╛
header, рд╕реНрд╡рддрдГрдЪреЗ h2 рдЕрд╕рд▓реЗрд▓реЗ рддреАрди section, рдЬрд┐рдереЗ рдкреНрд░рддреНрдпреЗрдХ control рд▓рд╛ label
рдЖрд╣реЗ рдЕрд╕рд╛ form, card рд╕рд╛рдареА рдПрдХ <template>, рдЖрдгрд┐ рд╕рдЬрд╛рд╡рдЯреАрдЪреНрдпрд╛ avatars рд╡рд░ alt="".
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 ui/mock_api.py # then open http://127.0.0.1:8000/
# 1) keyboard tour: press Tab from the top тАФ skip link, nav links, theme button, filter, form fields, Enrol
# 2) break it on purpose: change <button type="submit"> to <div>Enrol</div>, reload, and try Tab + Enter
# 3) put it back, then remove the <label for="name"> and run:
python3 ui/smoke_test.py # тЭМ every input has a label
# 4) add a real section of your own: <section id="homework" aria-labelledby="hw-h"><h2 id="hw-h">Homework</h2>тАж</section>
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Tab рдкреНрд░рддреНрдпреЗрдХ control рдкрд░реНрдпрдВрдд рджрд┐рд╕рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗрдЪ рдкреЛрд╣реЛрдЪрддреЛ рдЖрдгрд┐ focus ring рд╕реНрдкрд╖реНрдЯ рджрд┐рд╕рддреЗ.
<div> рдЕрд╕рддрд╛рдирд╛ Tab рддреНрдпрд╛рд▓рд╛ рдкреВрд░реНрдгрдкрдгреЗ рд╡рдЧрд│рддреЛ рдЖрдгрд┐ Enter рдХрд╛рд╣реАрдЪ рдХрд░рдд рдирд╛рд╣реА тАФ button
рддреБрдореНрд╣реА рдХрдзреАрдЪ рди рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдЪрд╛рд░ рдХрд╛рдореЗ рдХрд░рдд рд╣реЛрддреЗ. Label рдирд╕рд▓реНрдпрд╛рд╡рд░ smoke test fail рд╣реЛрддреЛ рдЖрдгрд┐
рддреЗ рдкрд░рдд рд▓рд╛рд╡рд▓реНрдпрд╛рд╡рд░ рдкреБрдиреНрд╣рд╛ pass рд╣реЛрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдпреЛрдЧреНрдп element рддреБрдореНрд╣рд╛рд▓рд╛ keyboard, focus, roles рдЖрдгрд┐ рдирд╛рд╡реЗ рдлреБрдХрдЯ рджреЗрддреЛ тАФ рдЖрдгрд┐ рдПрдХ robot рддреЗ рджрд╣рд╛ рдУрд│реАрдВрдд рддрдкрд╛рд╕реВ рд╢рдХрддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
<button>рдРрд╡рдЬреА<div onclick>(keyboard рдирд╛рд╣реА, focus рдирд╛рд╣реА, role рдирд╛рд╣реА)<label>рдРрд╡рдЬреА placeholder- heading рдкрд╛рддрд│реНрдпрд╛ рд╡рдЧрд│рдгреЗ, рдХрд┐рдВрд╡рд╛ "рдмрд░реЛрдмрд░ рджрд┐рд╕рддрд╛рдд рдореНрд╣рдгреВрди" рддреАрди
<h1> - рд╕рдЬрд╛рд╡рдЯреАрдЪреНрдпрд╛ рдЪрд┐рддреНрд░рд╛рдВрдирд╛ рд░рдЪрд▓реЗрд▓рд╛ alt text тАФ
alt=""рд╡рд╛рдкрд░рд╛ - рдЕрдВрддрд░рд╛рд╕рд╛рдареА
<br>(рддреЗ CSS рдЪреЗ рдХрд╛рдо рдЖрд╣реЗ) рдЖрдгрд┐ рдорд╛рдВрдбрдгреАрд╕рд╛рдареА tables
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: accessibility рдЪреЗ рдЦрдЯрд▓реЗ, fail рдЭрд╛рд▓реЗрд▓реА audits рдЖрдгрд┐ "tests
.btn-3рдирд┐рд╡рдбрддрд╛рдд рдореНрд╣рдгреВрди flaky рдЖрд╣реЗрдд" тАФ рдпрд╛ рд╕рдЧрд│реНрдпрд╛рдВрдЪреЗ рдореВрд│ рдпрд╛ рдзрдбреНрдпрд╛рдд рдЖрд╣реЗ. Roles рдЖрдгрд┐ labels рдорд╛рдЧрдгрд╛рд▒реНрдпрд╛ tests (lesson 10) redesigns рдирдВрддрд░рд╣реА рдЯрд┐рдХрддрд╛рдд; class names рдорд╛рдЧрдгрд╛рд▒реНрдпрд╛ tests рдЯрд┐рдХрдд рдирд╛рд╣реАрдд.
тПня╕П рдкреБрдвреЗ
рд╕рд╛рдВрдЧрд╛рдбрд╛ рдмрд░реЛрдмрд░ рдЖрд╣реЗ; рдЖрддрд╛ рддреЛ рдкреНрд░рддреНрдпреЗрдХ screen рд╡рд░ рдиреАрдЯ рджрд┐рд╕реЗрд▓ рдЕрд╕реЗ рдХрд░рд╛: CSS layout тАФ box model, flexbox, grid, responsive.
git checkout lesson-03-css-layout