Никита Дубко, Яндекс
Никита Дубко, разработчик интерфейсов
<table>
<tr>
<td colspan="3" id="header">header</td>
</tr>
<tr>
<td id="left" width="300">Left</td>
<td id="center">Lorem ipsum...</td>
<td id="right" width="250">Right</td>
</tr>
<tr>
<td colspan="3" id="footer">footer</td>
</tr>
</table>
Нет 😞
Отрисовка во время загрузки 😣
Много лишнего кода 😭
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<div class="header">header</div>
<div class="container">
<div class="center" class="column">
Lorem ipsum...
</div>
<div class="left" class="column">Left</div>
<div class="right" class="column">Right</div>
</div>
<div class="footer">footer</div>
.container {
padding-left: 300px;
padding-right: 250px;
}
.container .column {
position: relative;
float: left;
}
.footer {
clear: both;
}
.center {
width: 100%;
}
.left {
width: 300px;
right: 300px;
margin-left: -100%;
}
.right {
width: 250px;
margin-right: -250px;
}
.section {
padding: 3rem 5rem;
}
@media screen and (min-width: 900px) {
.section {
padding: 1rem 3rem;
}
}
/* Большие экраны и общие стили */
@media (max-width: 979px) {
/* Десктоп */
}
@media (max-width: 767px) {
/* Планшет */
}
@media (max-width: 480px) {
/* Смартфон */
}
/* Смартфон и общие стили */
@media (min-width: 480px) {
/* Планшет */
}
@media (min-width: 767px) {
/* Десктоп */
}
@media (min-width: 979px) {
/* Большие экраны */
}
display: flex;
flex-direction: row | row-reverse | column | column-reverse;
flex-wrap: nowrap | wrap | wrap-reverse;
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
align-items: stretch | flex-start | flex-end | center | baseline;
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
order: <integer>;
flex-grow: <number>;
flex-shrink: <number>;
flex-basis: <length> | auto;
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
align-self: auto | flex-start | flex-end | center | baseline | stretch;
<div class="header">header</div>
<div class="center">
Lorem ipsum...
</div>
<div class="left">
Left
</div>
<div class="right">
Right
</div>
<div class="footer">footer</div>
<header class="header">header</header>
<article class="center">
Lorem ipsum...
</article>
<nav class="left">
Left
</nav>
<aside class="right">
Right
</aside>
<footer class="footer">footer</footer>
body {
display: flex;
flex-wrap: wrap;
}
.header {
width: 100%;
}
.footer {
width: 100%;
order: 4;
}
.center {
flex: 999 999 500px;
order: 2;
}
.left {
flex: 1 1 300px;
order: 1;
}
.right {
flex: 1 1 250px;
order: 3;
}
grid-template-columns: 40px 50px auto 50px 40px;
grid-template-columns: [first] 40px [line2] 50px [end];
grid-template-columns: repeat(5, 1fr);
grid-template-columns: 3fr minmax(500px, max-content) 2fr;
<header class="header">header</header>
<article class="center">
Lorem ipsum...
</article>
<nav class="left">
Left
</nav>
<aside class="right">
Right
</aside>
<footer class="footer">footer</footer>
body {
display: grid;
min-height: 100vh;
grid-template-rows: min-content auto min-content;
grid-template-columns: 300px auto 250px;
grid-template-areas:
'h h h'
'l c r'
'f f f';
}
body {
display: grid;
min-height: 100vh;
grid-template-rows: min-content auto min-content;
grid-template-columns: 300px auto 250px;
grid-template-areas:
'🎩 🎩 🎩'
'👈 ✏️ 👉'
'🦶 🦶 🦶';
}
.header { grid-area: 🎩; }
.center { grid-area: ✏️; }
.left { grid-area: 👈; }
.right { grid-area: 👉; }
.footer { grid-area: 🦶; }
<picture>
<source type="image/webp" media="(min-width: 1150px)"
srcset="img-desktop@1x.webp 1x, img-desktop@2x.webp 2x">
<source type="image/webp"
srcset="img-mobile@1x.webp 1x, img-mobile@2x.webp 2x">
<source media="(min-width: 1150px)"
srcset="img-desktop@1x.jpg 1x, img-desktop@2x.jpg 2x">
<img src="img-mobile@1x.jpg" srcset="img-mobile@2x.jpg 2x"
alt="Привет, ШРИ!" width="20" height="18">
</picture>
<picture>
<source type="image/webp" media="(min-width: 1150px)" srcset="img-desktop@1x.webp 1x, img-desktop@2x.webp 2x">
<source type="image/webp" srcset="img-mobile@1x.webp 1x, img-mobile@2x.webp 2x">
<source media="(min-width: 1150px)" srcset="img-desktop@1x.jpg 1x, img-desktop@2x.jpg 2x">
<img src="img-mobile@1x.jpg" srcset="img-mobile@2x.jpg 2x" alt="Привет, ШРИ!" width="20" height="18">
</picture>
<img srcset="img-320w.jpg 320w,
img-480w.jpg 480w,
img-800w.jpg 800w"
sizes="(max-width: 320px) 280px,
(max-width: 480px) 440px,
800px"
src="img-800w.jpg" alt="Привет, ШРИ!">
srcset
— задаем каждому размеру свое изображение;sizes
— вычисляем размер, который нужно применить;srcset
самое подходящее по размеру изображение..yandex {
background-image: url('img/yandex.jpg');
}
.yandex {
background-image: url('img/yandex-mobile.jpg');
}
@media (min-width: 1050px) {
.yandex {
background-image: url('img/yandex-desktop.jpg');
}
}
.yandex {
background-image: url('img/yandex@1x.jpg');
}
@media (-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi),
(min-resolution: 2dppx) {
.yandex {
background-image: url('img/yandex@2x.jpg');
}
}
<html>
<body>
<div class="content">
<p>Привет, ШРИ!</p>
</div>
</body>
</html>
html { font-size: 10px; }
.content { font-size: 20px; }
p { font-size: 1em; } /* сколько в пикселях? */
<html>
<body>
<div class="content">
<p>Привет, ШРИ!</p>
</div>
</body>
</html>
html { font-size: 10px; }
.content { font-size: 20px; }
p { font-size: 1rem; } /* сколько в пикселях? */
<html>
<body>
<div class="content">
<p>Привет, ШРИ!</p>
</div>
</body>
</html>
html { font-size: 10px; }
.content { font-size: 1rem; }
p { font-size: 2em; } /* сколько в пикселях? */
width: calc(100% / 3 - 2 * 1em - 2 * 1px);
h1 { font-size: 1.5rem; }
p { font-size: .9375rem; }
@media (min-width: 320px) {
h1 { font-size: calc( 1.5rem + 2.5vw - 8px ); }
p { font-size: calc( .9375rem + .46875vw - 1.5px ); }
}
@media (min-width: 960px) {
h1 { font-size: calc(1.5rem + 16px); }
p { font-size: calc( .9375rem + 3px ); }
}
Жив, но нужен ли он вам? 🤷♂️