Вадим Макеев, HTML Academy
Цвета | Прозрачность | Анимация | |
---|---|---|---|
SVG | Много | Да | Да |
SVG — это программируемая графика, как Canvas.
Цвета | Прозрачность | Анимация | |
---|---|---|---|
GIF | 256 | Да | Да |
PNG | 256 и больше | Да, альфа | Да * |
JPEG | Много | Нет | Нет |
WebP | 256 и больше | Да, альфа | Да |
HEIC | Много | Да, альфа | Да |
Гифка — это жанр,
а не формат графики.
<video autoplay loop muted>
<source type="video/webm" src="bolt.webm">
<source type="video/mp4" src="bolt.mp4">
</video>
$ ffmpeg -i bolt.gif -movflags faststart -pix_fmt yuv420p -crf 0 bolt.mp4
<picture>
<source type="image/webp" srcset="bolt.webp">
<img src="bolt.gif" alt="Болт кривляется">
</picture>
$ gif2webp bolt.gif -o bolt.webp
<div class="burger">
<div class="burger__line burger__line--1"></div>
<div class="burger__line burger__line--2"></div>
<div class="burger__line burger__line--3"></div>
</div>
.burger {
position: relative;
width: 12px;
height: 10px;
}
.burger__line {
position: absolute;
left: 0;
width: 12px;
height: 2px;
background-color: #4b86c2;
}
.burger__line--1 {
top: 0;
}
.burger__line--2 {
top: 4px;
}
.burger__line--1 {
top: 8px;
}
.burger {
width: 12px; height: 10px;
background-image: repeating-linear-gradient(
#4b86c2, #4b86c2 2px,
#fff 2px, #fff 4px
);
}
<svg width="120" viewBox="0 0 12 10" fill="#4b86c2">
<rect width="12" height="2" x="0" y="0"/>
<rect width="12" height="2" x="0" y="4"/>
<rect width="12" height="2" x="0" y="8"/>
</svg>
div {
--burger-color: #4b86c2;
background-image: url('burger.png');
background-image: paint(burger);
}
CSS.paintWorklet.addModule('burger.js');
class Shape {
static get inputProperties() {
return ['--burger-color'];
}
paint(context, geometry, properties) { … }
}
registerPaint('burger', Shape);
const color = properties.get(
'--burger-color'
);
context.fillStyle = color;
context.fillRect(0, 0, 120, 20);
context.fillRect(0, 40, 120, 20);
context.fillRect(0, 80, 120, 20);
div:hover {
--burger-color: #32b332;
}
<desc>Created using Figma</desc>
<path d="m269.246984 855.728762 78.364445-47.425016
c15.118222 26.804825 28.871111 49.483175 61.858539
49.483175 31.620064 0 51.555556-12.368864 51.5555
56-60.481016v-327.192381h96.229587v328.553651c0
99.669333-58.422857 145.03619-143.660698…"/>
<svg><image xlink:href="data:image/png;base64,iVBORw0KGgo
AAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGV
Kw4bAAAIXUlEQVR4nO3WMQEAIAzAsIF/z+ACjiYKenbNzBkAIGX/DgAA3
jMAABBkAAAgyAAAQJABAIAgAwAAQQYAAIIMAAAEGQAACDIAABBkAAAgyA
AAQJABAIAgAwAAQQYAAIIMAAAEGQAACDIAABBkAAAgyAAAQJABAIAgAwA
AQQYAAIIMAAAEGQAACDIAABBkAAAgyAAAQJABAIAgAwAAQQYAAIIMAAAE
GQAACDIAABBkAAAgyAAAQJABAIAgAwAAQQYAAIIMAAAEGQA…"/></svg>
PNG | PNG 8 | JPG | SVG | |
---|---|---|---|---|
Photoshop | 852 | 155 | 3596 | 130 |
Affinity | 1555 | 856 | 10793 | 602 |
Sketch | 5639 | … | 3836 | 525 |
Figma | 2179 | … | 7797 | 153 |
Руки | 111 | 111 | 1144 | 98 |
Хороший интерфейс
как прогресс-бар.
<img src="cat.jpg" alt="Рыжий кот">
<figure>
<img src="cat.jpg" alt="Рыжий кот">
<figcaption>Мой кот самый лучший</figcaption>
</figure>
Идеально для контентных картинок.
<picture>
<source type="image/webp"
srcset="cat@2x.webp 2x
cat.webp 1x">
<img srcset="cat@2x.jpg 2x"
src="cat.jpg" alt="Рыжий кот">
</picture>
<img srcset="cat@3x.jpg 3x"
srcset="cat@2x.jpg 2x"
src="cat.jpg"
alt="Рыжий кот">
Для ретины достаточно атрибута srcset
.
button {
background-image: url(icon.png);
}
@media (min-resolution: 2dppx) {
button {
background-image: url(icon@2x.png);
}
}
Не забудьте про Autoprefixer -webkit-min-device-pixel-ratio
.
@supports (background-image: url(icon.webp)) {
button {
background-image: url(icon.webp);
}
}
Другой формат в стилях просто не подсунуть, см. Modernizr.
div.picture {
background-image: url(picture.png);
background-size: cover;
}
img, video {
object-fit: cover;
object-position: 25% 0;
}
a::before {
content: url(icon.png);
}
Вставляет оформление в контент стилями.
<svg class="burger" viewBox="0 0 12 10" aria-label="Меню">
<rect class="burger__line" x="0" y="0"/>
<rect class="burger__line" x="0" y="4"/>
<rect class="burger__line" x="0" y="8"/>
</svg>
Видно из стилей, удобно менять цвета.
.burger {
fill: #4b86c2;
}
.burger:hover {
fill: #32b332;
}
<svg width="120" height="100"
viewBox="0 0 12 10" aria-label="Меню">
<use xlink:href="#burger"></use>
</svg>
Видно из стилей, удобно менять цвета.
<svg width="120" height="100"
aria-label="Меню">
<use xlink:href="sprite.svg#burger"></use>
</svg>
К сожалению, стили уже не пробьются внутрь. Но оно вам точно нужно?
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="burger" viewBox="0 0 12 10">
<rect width="12" height="2" x="0" y="0"/>
<rect width="12" height="2" x="0" y="4"/>
<rect width="12" height="2" x="0" y="8"/>
</symbol>
</svg>
button {
background-image: url('data:image/png;base64,iVBORw0K EUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGV AAgyAAAQJABAIAgAwAAQQYAAIIMAAAEGQAACDIAABBkAAAgyA MAAAEGQAACDIAABBkAAAgyAAAQJABAIAgAwAAQQYAAIIMAAAE ABBkAAAgyAAAQJABLJBGFFAIAgAwAAQQYAAIIMAAAEGQA…');
}
button {
background-image: url('data:image/svg+xml,%3Csvg xmlns ='http://www.w3.org/2000/svg' viewBox='0 0 12 10' fill='%234b86c2'%3E%3Crect width='12' height='2' x='0' y='0'/%3E%3Crect width='12' height='2' x='0' y='4'/%3E%3Crect width='12' height='2' x='0' y…');
}
<img src="picture.jpg" loading="lazy">
lazy
— подходит для ленивой загрузкиeager
— не подходит, загрузить сразуauto
— браузер сам решит, как загружать
<img src="picture.jpg" importance="low">
high
— повышает приоритет загрузкиlow
— понижает приоритет загрузкиЕсли очень-очень нужно, то осторожно можно:
<link rel="preload" href="picture.jpg" as="image">
<img src="picture.jpg" async="on">
on
— ждёт, когда у браузера будет возможностьoff
— декодирует сразу, блокируя основной потокconst img = new Image();
img.src = 'picture.png';
img.onload = () => {
// Вставка img
};
img.decode().then(() => {
// Вставка img
});
Пока только в Chrome, см. MDN и ждите счастья.
const img = new Image();
img.src = 'picture.webp';
img.decode().then(() => {
console.info('WebP');
}).catch(() => {
console.warn('Извини');
});