English | Українська | Pусский
Великі блоки HTML складніше читати, розуміти та підтримувати. Окрім цього, великий DOM може негативно впливати на продуктивність.
<div class="outer-margin">
<div class="inner-padding">
<p>Ані муки, ні кайдани — Дух зломить не зможуть твій.</p>
</div>
</div>
<div class="description">
<p>Ані муки, ні кайдани — Дух зломить не зможуть твій.</p>
</div>
Надавайте перевагу елементам, що мають відповідне семантичне значення над елементами загального призначення
Семантично коректний HTML легше читати, розуміти та підтримувати. Це краще з точки зору доступності, нариклад для програм читання з екрану. Не кажучи вже про роботів та всіляких парсерів, включаючи пошукових ботів.
- The practical value of semantic HTML
- HTML: A good basis for accessibility
- Understanding why Semantic HTML is important, as told by TypeScript.
- The SEO Advantages of Machine-Readable HTML5 Semantic Markup
- Semantics in HTML 5
<span>20 хвилин тому.</span>
<time datetime="2020-09-01T20:00:00">20 хвилин тому.</time>
Таким чином ми матимемо надійне рішення, а користувач водночас отримає максимум, який дозволяє його платформа, від програмного продукту.
- Progressive Enhancement: What It Is, And How To Use It?
- Do websites need to look exactly the same in every browser?
<p data-lines="3" class="abstract">Коли замовкли стріли пістолів і одспівали весілля, а жінка пригнала до загороди вівці й корови, Іван був задоволений навіть. Його Палагна була з багацького роду, фудульна, здорова дівка, з грубим носом й воластою шиєю. Правда, вона любила пишне лудіння, і немало десь піде грошей на шовкові хустки та дорогі згарди, але то байка! Поглядаючи на овечки, що блеяли в загородах, на свій писаний ботей (стадо), на корови, що дзвонили та рули по випасах в лісі,— він не журився.</p>
<style>
.abstract {
width: 20rem;
font-size: 0.75rem;
line-height: 1rem;
}
</style>
<script>
const truncateElement = document.querySelector('.abstract');
const truncateText=truncateElement.textContent;
const lines = parseInt(truncateElement.dataset.lines);
const getLineHeight = function(element) {
const lineHeight = window.getComputedStyle(truncateElement)['line-height'];
if (lineHeight === 'normal') {
return 1.16 * parseFloat(window.getComputedStyle(truncateElement)['font-size']);
} else {
return parseFloat(lineHeight);
}
}
truncateElement.innerHTML= truncateText;
const truncateTextParts= truncateText.split(' ');
const lineHeight = getLineHeight(truncateElement);
while(lines * lineHeight < truncateElement.clientHeight) {
truncateTextParts.pop();
truncateElement.innerHTML = truncateTextParts.join(' ') + '…';
}
</script>
<p class="abstract">Коли замовкли стріли пістолів і одспівали весілля, а жінка пригнала до загороди вівці й корови, Іван був задоволений навіть. Його Палагна була з багацького роду, фудульна, здорова дівка, з грубим носом й воластою шиєю. Правда, вона любила пишне лудіння, і немало десь піде грошей на шовкові хустки та дорогі згарди, але то байка! Поглядаючи на овечки, що блеяли в загородах, на свій писаний ботей, на корови, що дзвонили та рули по випасах в лісі,— він не журився.</p>
<style>
.abstract {
width: 20rem;
font-size: 0.75rem;
line-height: 1rem;
max-height: 3rem;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
</style>
Майже неможливо зробити UX кращим за той, який забезпечують розробники браузерів. Ми не маємо їх ресурсів: ні часу, ні людей. Неможливо знайти всі підводні камені, пов'язані з вирішенням конкретної проблеми. Не кажучи вже про те, що нативні елементи зазвичай значно продуктивніші.
- Створення кастомного рішення потребує значно більше часу, ніж використання нативного.
- Кастомне рішення неможливо так само глибоко інтегрувати із системою, як нативне.
- Ми не контролюємо зовнішні залежності.
- Зовнішні рішення часто-густо погано впливають на розмір бандла.
- Неможливо передбачити, де виникнуть проблеми в зовнішньому рішенні, чи воно доступне, що з локалізацією та інтернаціоналізацією.
- Нативним елементам не потрібне завантаження JS-бандлів. Отже, вони готові до використання одразу як завантажиться HTML.
- Продуктивність нативних елементів зазвичай значно краща, ніж кастомних.
- Нові можливості та виправлені помилки користувач отримує з оновленням браузеру.
- Розробникам легше працювати з нативним рішенням, ніж з кастомним. Бо воно стандартизоване і поширене.
<div class="details">
<h2>Cокира</h2>
<div class="details-content">
Вони обоє знали, що то бродить по лісі невидима сокира, гупа об дерева і хека з втомлених грудей. Ляк проганяв їх звідти в долину, де потік плив спокійніше. Вони робили собі курбало у потоці, глибоке місце, і, роздягтись, бовтались в нім, як двоє лісних звірят, що не знають, що таке сором. Сонце спочивало на їх яснім волоссі і било в очі, а льодова вода потоку щипала тіло.
</div>
</div>
<script>
const toggler = (event) => {
event.currentTarget.parentNode.classList.toggle("details-open");
}
document.querySelectorAll(".details").forEach((element) => {
element.querySelector("h2").addEventListener("click", toggler);
});
</script>
<style>
.details h2 {
all: unset;
}
.details h2::before {
content: "►";
margin-right: .5em;
font-size: small;
display: inline;
}
.details .details-content {
display: none;
}
.details.details-open .details-content {
display: block;
}
.details.details-open h2::before {
content: "▼";
}
</style>
<details>
<summary>Cокира</summary>
Вони обоє знали, що то бродить по лісі невидима сокира, гупа об дерева і хека з втомлених грудей. Ляк проганяв їх звідти в долину, де потік плив спокійніше. Вони робили собі курбало у потоці, глибоке місце, і, роздягтись, бовтались в нім, як двоє лісних звірят, що не знають, що таке сором. Сонце спочивало на їх яснім волоссі і било в очі, а льодова вода потоку щипала тіло.
</details>
Навіть якщо у вашому браузері все виглядає добре, у браузері користувача сторінка може виглядати зламаною, бо корекція помилок працює по-різному в різних браузерах. Окрім цього, це може збити з пантелику розробників, котрі будуть супроводжувати ваш код. Потенційно валідний HTML може бути корисним з точки зору пошукової оптимізації та доступності.
<dl>
<h1>Словник</h1>
<dt>Котюга</dt>
<dd>Пес</dd>
<dt>Дроб'єта</dt>
<dd>Вівці і кози, дрібна худоба</dd>
<dt>Помана</dt>
<dd>Посмертний дарунок, спадщина худобою. Це від слів «поминати, згадувати»</dd>
</dl>
<h1>Словник</h1>
<dl>
<dt>Котюга</dt>
<dd>Пес</dd>
<dt>Дроб'єта</dt>
<dd>Вівці і кози, дрібна худоба</dd>
<dt>Помана</dt>
<dd>Посмертний дарунок, спадщина худобою. Це від слів «поминати, згадувати»</dd>
</dl>
Легше розуміти та підтримувати код, у якому структура та презентація відокремлені. Це краще для доступності. Добре з точки зору пошукової оптимізації.
- Separation: The Web Designer’s Dilemma
- Developing With Web Standards – Recommendations and best practices
- Separation of content and presentation
- G140: Separating information and structure from presentation to enable different presentations
<nav class="breadcrumbs">
<ol>
<li><a href="/home/">Головна</a></li>
<li>→</li>
<li><a href="/home/cluster/">Кластер</a></li>
<li>→</li>
<li>Сервіс</li>
</ol>
</nav>
<style>
.breadcrumbs ol{
display: flex;
list-style: none;
align-items: center;
}
.breadcrumbs li{
margin: 0 5px 0 0;
}
</style>
<nav class="breadcrumbs">
<ol>
<li><a href="/home/">Головна</a></li>
<li><a href="/home/cluster/">Кластер</a></li>
<li>Сервіс</li>
</ol>
</nav>
<style>
.breadcrumbs ol{
display: flex;
list-style: none;
align-items: center;
}
.breadcrumbs li:not(:last-child):after {
content: "→";
margin: 0 5px;
pointer-events: none;
}
</style>