ЁЯОи рдзрдбрд╛ 03 тАФ CSS layout: рдПрдХрдЪ рдлрд▓рдХ, рдкреНрд░рддреНрдпреЗрдХ screen
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-html-structure ┬╖ рдкреБрдвреЗ: lesson-04-javascript-events
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рдлрд▓рдХ рдХрд╕рд╛ рдорд╛рдВрдбрд▓рд╛ рдЖрд╣реЗ: box model, рдЧреЛрд╖реНрдЯреАрдВрдЪреНрдпрд╛ рдПрдХрд╛ рдУрд│реАрд╕рд╛рдареА flexbox, рднрд╛рдЧрд╛рдВрдиреА рдмрдирд▓реЗрд▓реНрдпрд╛ рдкрд╛рдирд╛рд╕рд╛рдареА grid, рдЖрдгрд┐ рдПрдХрдЪ рдлрд▓рдХ phone рд╡рд░ рдЖрдгрд┐ рднрд┐рдВрддреАрд╡рд░ рдЪрд╛рд▓рд╡рдгрд╛рд▒реНрдпрд╛ рдХрд╛рд╣реА рдореЛрдЬрдХреНрдпрд╛ рд╕рд╡рдпреА.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдлрд▓рдХрд╛рд╡рд░рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ element рдПрдХ box ЁЯУж рдЖрд╣реЗ, рдЖрдгрд┐ box рд▓рд╛ рдЖрддреВрди рдмрд╛рд╣реЗрд░ рдЪрд╛рд░ рдерд░
рдЕрд╕рддрд╛рдд: content, padding (рдЪреМрдХрдЯреАрдЪреНрдпрд╛ рдЖрддрд▓реА рдЬрд╛рдЧрд╛),
border (рдЪреМрдХрдЯ), рдЖрдгрд┐ margin (рддрд┐рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░рдЪреА рдЬрд╛рдЧрд╛). рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛рдЪ рдПрдХрджрд╛
box-sizing: border-box рд▓рд╛рд╡рд╛, рдореНрд╣рдгрдЬреЗ box рдЪреА рд╕рд╛рдВрдЧрд┐рддрд▓реЗрд▓реА width рд╣реАрдЪ рддреНрдпрд╛рдЪреА
рдмрд╛рд╣реЗрд░рдЪреА width рдард░рддреЗ тАФ рд╕рдЧрд│реЗ рд▓реЛрдХ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЕрд╕рд╛рдЪ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛рдд.
рдордЧ boxes рдорд╛рдВрдбрдгреНрдпрд╛рдЪреЗ рджреЛрди рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд:
- Flexbox тЖФя╕П тАФ рдЧреЛрд╖реНрдЯреАрдВрдЪреА рдПрдХ рдУрд│, рдПрдХ row (рдХрд┐рдВрд╡рд╛ column) рд╡рд╛рдЯреВрди рдШреЗрдгрд╛рд░реА. рдЖрдкрд▓рд╛ header
flex рдЖрд╣реЗ: title, nav, theme button, рддреНрдпрд╛рдВрдЪреНрдпрд╛рдордзреНрдпреЗ
gapрдЖрдгрд┐margin-left: autonav рд▓рд╛ рдЙрдЬрд╡реАрдХрдбреЗ рдврдХрд▓рддреЛ. "рдпрд╛ рдЧреЛрд╖реНрдЯреА рдПрдХрд╛ рдУрд│реАрдд рдЬрд╛рддрд╛рдд" рдЕрд╕рд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдд рдЕрд╕рд╛рд▓ рддреЗрд╡реНрд╣рд╛ flex рд╡рд╛рдкрд░рд╛. - Grid тЦж тАФ рднрд╛рдЧрд╛рдВрдЪреЗ рдкрд╛рди, rows рдЖрдгрд┐ columns рдПрдХрд╛рдЪ рд╡реЗрд│реА. рдЖрдкрд▓реЗ
maingrid рдЖрд╣реЗ: рд░реБрдВрдж screen рд╡рд░ "students" рджреЛрди рднрд╛рдЧ рдШреЗрддреЛ рдЖрдгрд┐ "enrol" рдПрдХ; phone рд╡рд░ рдПрдХрдЪ column. "рд╣рд╛ рднрд╛рдЧ, рддреЛ рднрд╛рдЧ" рдЕрд╕рд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдд рдЕрд╕рд╛рд▓ рддреЗрд╡реНрд╣рд╛ grid рд╡рд╛рдкрд░рд╛.
рдЖрдгрд┐ рдлрд▓рдХ рд╕рдЧрд│реАрдХрдбреЗ рдЪрд╛рд▓рд╡рдгрд╛рд░рд╛ рдирд┐рдпрдо: рдЖрдзреА phone рдЪрд╛ layout рд▓рд┐рд╣рд╛,
рдордЧ media query рдиреЗ рдореЛрдареНрдпрд╛ screens рд╕рд╛рдареА columns рдЬреЛрдбрд╛. рд╕рд╛рдкреЗрдХреНрд╖
units (rem, %, fr) рддрд╛рдгрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд; рдард░рд╛рд╡реАрдХ pixel widths рддрд╛рдгрд▓реНрдпрд╛ рдЬрд╛рдд рдирд╛рд╣реАрдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
box["ЁЯУж box model: content тЖТ padding тЖТ border тЖТ margin<br/>box-sizing: border-box, always"]
flex["тЖФя╕П flexbox тАФ a row of things<br/>display:flex ┬╖ gap ┬╖ align-items ┬╖ margin-left:auto"]
grid["тЦж grid тАФ areas<br/>grid-template-columns: 2fr 1fr ┬╖ auto-fill minmax(200px,1fr)"]
resp["ЁЯУ▒тЖТЁЯЦея╕П mobile first<br/>one column; @media (min-width:720px) тЖТ two"]
box --> flex --> grid --> resp
тЭУ рдХрд╛рдп
- Box model:
width/height,padding,border,margin;box-sizing: border-boxрдореБрд│реЗ width рдордзреНрдпреЗ padding рдЖрдгрд┐ border рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рд╣реЛрддрд╛рдд. - Flexbox:
display: flex,flex-direction,gap,justify-content,align-items,flex-wrap: wrap, рд╡рд╛рдврдгреНрдпрд╛рд╕рд╛рдареАflex: 1. рдПрдХ рдорд┐рддреА. - Grid:
display: grid,grid-template-columns,gap,frunits, рдЖрдкреЛрдЖрдк рдкреБрдиреНрд╣рд╛ рдорд╛рдВрдбрд▓реЗ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ card grids рд╕рд╛рдареАrepeat(auto-fill, minmax(200px, 1fr)). рджреЛрди рдорд┐рддреА. - Selectors рдЖрдгрд┐ cascade: рдирдВрддрд░рдЪреЗ рдирд┐рдпрдо рдЖрдгрд┐ рдЬрд╛рд╕реНрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ selectors рдЬрд┐рдВрдХрддрд╛рдд
(
#id>.class>element). Specificity рдХрдореА рдЖрдгрд┐ рд╕рдкрд╛рдЯ рдареЗрд╡рд╛;!importantрд╢реЗрд╡рдЯрдЪрд╛ рдЙрдкрд╛рдп рдореНрд╣рдгреВрдирдЪ рд╡рд╛рдкрд░рд╛. - Units: рдЕрдХреНрд╖рд░реЗ рдЖрдгрд┐ рдЕрдВрддрд░рд╛рд╕рд╛рдареА
rem(user рдЪреНрдпрд╛ font size рдЪрд╛ рдЖрджрд░ рдХрд░рддреЗ), layout рд╕рд╛рдареА%рдЖрдгрд┐fr, рдмрд╛рд░реАрдХ рд░реЗрд╖рд╛ рдЖрдгрд┐ radii рд╕рд╛рдареАpx. - Media queries:
@media (min-width: 720px) { тАж }тАФ screen рдореЛрдард╛ рд╣реЛрдИрд▓ рддрд╢реА рдЧреБрдВрддрд╛рдЧреБрдВрдд рд╡рд╛рдврд╡рд╛, рдХрдзреАрд╣реА рдЙрд▓рдЯ рдирд╛рд╣реА. - рд╣реЗрд╕реБрджреНрдзрд╛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХрдкрдгреЗ:
prefers-reduced-motion(рдЖрдкрд▓реА hover lift рддреНрдпрд╛рдЪрд╛ рдЖрджрд░ рдХрд░рддреЗ) рдЖрдгрд┐prefers-color-scheme(lesson 08).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "рдорд╛рдЭреНрдпрд╛ laptop рд╡рд░ рдЪрд╛рд▓рддреЗ" рд╣реЗ рд╡рд╛рдХреНрдп layout рдордзреНрдпреЗрдЪ рдорд░рддреЗ. Flex, grid рдЖрдгрд┐ рд╕рд╛рдкреЗрдХреНрд╖ units рд╡рд╛рдкрд░реВрди mobile-first рдмрд╛рдВрдзрд▓реЗрд▓рд╛ рдлрд▓рдХ рджреБрд╕рд▒реНрдпрд╛ codebase рд╢рд┐рд╡рд╛рдп рдХреЛрдгрддреНрдпрд╛рд╣реА screen рд▓рд╛ рдЬреБрд│рд╡реВрди рдШреЗрддреЛ; рдард░рд╛рд╡реАрдХ widths рдЖрдгрд┐ absolute positioning рдиреЗ рдмрд╛рдВрдзрд▓реЗрд▓рд╛ рдлрд▓рдХ рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрди device рд╕рд╛рдареА рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
ui/styles.css рд╕реБрдорд╛рд░реЗ рдкрдиреНрдирд╛рд╕ рдУрд│реАрдВрдЪреЗ рдЕрд╕реВрди рддреАрди рднрд╛рдЧрд╛рдВрдд рдЖрд╣реЗ: tokens
(lesson 08), layout (рд╣рд╛ рдзрдбрд╛ тАФ body, .board-head flex, main grid,
.cards auto-fill grid), рдордЧ components. min-width: 720px рд╡рд░рдЪреА
рдПрдХрдореЗрд╡ media query рд╣реЗрдЪ рд╕рдВрдкреВрд░реНрдг "desktop" design рдЖрд╣реЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 ui/mock_api.py # http://127.0.0.1:8000/
# 1) shrink the browser to ~380px wide (or DevTools тЖТ device toolbar): one column, nothing clipped
# 2) delete the @media block in styles.css and reload at desktop width тАФ one column everywhere
# 3) change .cards to grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)) тАФ watch cards reflow
# 4) set body { max-width: none } and read a paragraph at 1600px тАФ that is why max-width exists
# 5) find the winner: DevTools тЖТ Elements тЖТ Styles on a .card, see which rules applied and which were struck through
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Phone width рд╡рд░ рдлрд▓рдХ рдПрдХрд╛рдЪ column рдордзреНрдпреЗ рдЕрд╕рддреЛ рдЖрдгрд┐ рдЖрдбрд╡рд╛ scrollbar рдирд╕рддреЛ; тЙе720px рд╡рд░ students рдЖрдгрд┐ enrol рд╢реЗрдЬрд╛рд░реА рд╢реЗрдЬрд╛рд░реА рдмрд╕рддрд╛рдд. Media query рдирд╕реЗрд▓ рддрд░ desktop рд╡рд░рд╣реА рдПрдХрдЪ column рдЕрд╕рддреЛ (mobile-first рдореНрд╣рдгрдЬреЗ рдкрд╛рдпрд╛ mobile рдЕрд╕рддреЛ). рддреБрдореНрд╣реА рдЖрдХрд╛рд░ рдмрджрд▓рддрд╛ рддрд╕реЗ card grid рд╕реНрд╡рддрдГрд╣реВрди columns рдЪреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рджреЛрди layout рдкрджреНрдзрддреА рдЖрдгрд┐ рдПрдХрд╛ media query рдиреЗ рдкреНрд░рддреНрдпреЗрдХ screen рд╕рд╛рдареА рд╕рдВрдкреВрд░реНрдг рдлрд▓рдХ рдорд╛рдВрдбрд▓рд╛, рдЖрдгрд┐ рдХреЛрдгрддрд╛ рдирд┐рдпрдо рдЬрд┐рдВрдХрд▓рд╛ рддреЗ DevTools рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдиреЗрдордХреЗ рджрд╛рдЦрд╡рд▓реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- container рд╡рд░ рдард░рд╛рд╡реАрдХ
width: 1200px(phones рд╡рд░ рдЖрдбрд╡рд╛ scroll) тАФmax-widthрд╡рд╛рдкрд░рд╛ - flex/grid рдРрд╡рдЬреА layout рд╕рд╛рдареА
position: absolute - desktop-first media queries (
max-width) тАФ screens рд╡рд╛рдврддреАрд▓ рддрд╢рд╛ рддреНрдпрд╛ рддреБрдордЪреНрдпрд╛рд╢реА рднрд╛рдВрдбрддрд╛рдд !importantрд╡рд░ рд╕рдВрдкрдгрд╛рд░реА specificity рдЪреА рдпреБрджреНрдзреЗgapрдирд╛рд╣реА, рдореНрд╣рдгреВрди cards рдордзрд▓реЗ margins рдЕрдирдкреЗрдХреНрд╖рд┐рддрдкрдгреЗ collapse рд╣реЛрддрд╛рдд
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЦрд▒реНрдпрд╛ traffic рдкреИрдХреА рдЕрд░реНрдзреНрдпрд╛рд╣реВрди рдЬрд╛рд╕реНрдд phones рд╡рд░реВрди рдпреЗрддреЗ. рдпрд╛ рдзрдбреНрдпрд╛рддрд▓реНрдпрд╛ рджреЛрди рд╕рд╡рдпреА тАФ mobile-first рдЖрдгрд┐ рд╕рд╛рдкреЗрдХреНрд╖ units тАФ рдореНрд╣рдгрдЬреЗ рдПрдХ stylesheet рдЖрдгрд┐ рдлрд▓рдХрд╛рд╡рд░рдЪрд╛ рдХрд╛рдпрдордЪрд╛ "mobile bug" column рдпрд╛рдВрдЪреНрдпрд╛рддрд▓рд╛ рдлрд░рдХ.
тПня╕П рдкреБрдвреЗ
рдлрд▓рдХ рдмрд░реЛрдмрд░ рджрд┐рд╕рддреЛ; рдЖрддрд╛ рддреЛ рдХрд╛рд╣реАрддрд░реА рдХрд░реЗрд▓ рдЕрд╕реЗ рдХрд░рд╛: JavaScript рдЖрдгрд┐ events тАФ clicks, forms, рдЖрдгрд┐ рдХрд╛рдЙрдВрдЯрд░рдХрдбреВрди fetch рдХрд░рдгреЗ.
git checkout lesson-04-javascript-events