Доступность (accessibility): 5 простых советов для улучшения интерфейсов 🔼
Доступность (accessibility) помогает сделать сайт удобным для людей с ограниченными возможностями: людей с особенностями зрения, слуха, моторики. 🧑🦽🧑🦯
Поэтому в современной разработке интерфейсов этот вопрос часто всплывает на собеседованиях, особенно в зарубежных компаниях. 🌍
Вот 5 лёгких шагов, которые помогут сделать твои интерфейсы доступнее:
1️⃣ Используй семантический HTML 🏗
Структурируй страницу с помощью <header>, <nav>, <main>, <footer>.
А заголовки выстраивай логически: <h1> → <h2> → <h3>. Это упрощает навигацию для экранных читалок. 🛠️
2️⃣ Добавляй описания 🖼️
Для изображений: добавь понятный alt. Если картинка декоративная, оставь alt="".
Для кнопок: используй aria-label. Например:
3️⃣ Обеспечь навигацию с клавиатуры ⌨️
Убедись, что пользователи могут перемещаться по сайту с помощью Tab.
Для кастомных элементов добавляй tabindex="0". 🔑
4️⃣ Добавь фокусные состояния 🎯
Не убирай outline у кнопок и ссылок — это важно для клавиатурной навигации. Но можешь его кастомизировать:
5️⃣ Проверь масштабируемость 🔍
Твой текст должен оставаться читабельным при увеличении масштаба до 200%. Используй относительные единицы (rem, em), чтобы всё выглядело гармонично.
И не забывай тестировать! 🧪
Пройди по сайту только с клавиатурой. Проверь его через Lighthouse, Axe или экранные читалки (VoiceOver, NVDA). 🎧
Доступность — это забота о пользователях и шаг к профессионализму. Сделай свои интерфейсы удобнее для всех! 💪💻
#accessibility #html #frontend
Доступность (accessibility) помогает сделать сайт удобным для людей с ограниченными возможностями: людей с особенностями зрения, слуха, моторики. 🧑🦽🧑🦯
Поэтому в современной разработке интерфейсов этот вопрос часто всплывает на собеседованиях, особенно в зарубежных компаниях. 🌍
Вот 5 лёгких шагов, которые помогут сделать твои интерфейсы доступнее:
1️⃣ Используй семантический HTML 🏗
Структурируй страницу с помощью <header>, <nav>, <main>, <footer>.
А заголовки выстраивай логически: <h1> → <h2> → <h3>. Это упрощает навигацию для экранных читалок. 🛠️
2️⃣ Добавляй описания 🖼️
Для изображений: добавь понятный alt. Если картинка декоративная, оставь alt="".
Для кнопок: используй aria-label. Например:
<button aria-label="Открыть меню">☰</button>
3️⃣ Обеспечь навигацию с клавиатуры ⌨️
Убедись, что пользователи могут перемещаться по сайту с помощью Tab.
Для кастомных элементов добавляй tabindex="0". 🔑
4️⃣ Добавь фокусные состояния 🎯
Не убирай outline у кнопок и ссылок — это важно для клавиатурной навигации. Но можешь его кастомизировать:
button:focus {
outline: 2px solid #005fcc;
}
5️⃣ Проверь масштабируемость 🔍
Твой текст должен оставаться читабельным при увеличении масштаба до 200%. Используй относительные единицы (rem, em), чтобы всё выглядело гармонично.
И не забывай тестировать! 🧪
Пройди по сайту только с клавиатурой. Проверь его через Lighthouse, Axe или экранные читалки (VoiceOver, NVDA). 🎧
Доступность — это забота о пользователях и шаг к профессионализму. Сделай свои интерфейсы удобнее для всех! 💪💻
#accessibility #html #frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡ Задача дня
❓ Что выведет этот код?
✅ Ответ:
1
undefined
Если возникли трудности, почитайте про this в JavaScript:
https://learn.javanoscript.ru/object-methods
Разбирайтесь в теме, вы супер! 💪😊
#javanoscript #собеседования
❓ Что выведет этот код?
const obj = {
a: 1,
b: function() {
return this.a;
}
};
const fn = obj.b;
console.log(obj.b());
console.log(fn());
✅ Ответ:
Если возникли трудности, почитайте про this в JavaScript:
https://learn.javanoscript.ru/object-methods
Разбирайтесь в теме, вы супер! 💪😊
#javanoscript #собеседования
❤1
⚡ Задача дня
❓ Что выведет этот код?
✅ Ответ:
"object"
true
false
false
true
Если возникли трудности, почитайте про null, undefined и сравнения в JavaScript:
https://learn.javanoscript.ru/comparison
#javanoscript #собеседования
❓ Что выведет этот код?
console.log(typeof null);
console.log(null == undefined);
console.log(null === undefined);
console.log(null > 0);
console.log(null >= 0);
✅ Ответ:
Если возникли трудности, почитайте про null, undefined и сравнения в JavaScript:
https://learn.javanoscript.ru/comparison
#javanoscript #собеседования
⚡ Задача дня
❓ Что выведет этот код?
✅ Ответ:
"Sync"
"Promise"
"Timeout"
Если возникли трудности, почитайте про очередь микрозадач и макрозадач в JavaScript:
https://learn.javanoscript.ru/event-loop
#javanoscript #собеседования
❓ Что выведет этот код?
setTimeout(() => console.log("Timeout"), 0);
Promise.resolve().then(() => console.log("Promise"));
console.log("Sync");
✅ Ответ:
Если возникли трудности, почитайте про очередь микрозадач и макрозадач в JavaScript:
https://learn.javanoscript.ru/event-loop
#javanoscript #собеседования
⚡ Задача дня
❓ Что произойдет, если в HTML будет такой код?
✅ Ответ:
<p>Параграф 1</p><p>Параграф 2</p><p>Параграф 3</p>
Если возникли трудности, почитай про свойство innerHTML:
https://learn.javanoscript.ru/dom-nodes
Ты на верном пути, продолжай! 💡✨
#javanoscript #собеседования
❓ Что произойдет, если в HTML будет такой код?
<div>
<p>Параграф 1</p>
<p>Параграф 2</p>
<p>Параграф 3</p>
</div>
<noscript>
const div = document.querySelector('div');
console.log(div.innerHTML);
</noscript>
✅ Ответ:
Если возникли трудности, почитай про свойство innerHTML:
https://learn.javanoscript.ru/dom-nodes
Ты на верном пути, продолжай! 💡✨
#javanoscript #собеседования
⚡ Задача дня
❓ Какой цвет будет у текста, если есть такие стили?
✅ Ответ:
Синий
Если возникли трудности, почитай про !important и приоритеты в CSS:
https://developer.mozilla.org/ru/docs/Web/CSS/Specificity
Ты молодец, продолжай развиваться! 🌟💻
#javanoscript #собеседования
❓ Какой цвет будет у текста, если есть такие стили?
p {
color: blue !important;
}
.container p {
color: red;
}
p.special {
color: green;
}
<div class="container">
<p class="special">Привет!</p>
</div>
✅ Ответ:
Если возникли трудности, почитай про !important и приоритеты в CSS:
https://developer.mozilla.org/ru/docs/Web/CSS/Specificity
Ты молодец, продолжай развиваться! 🌟💻
#javanoscript #собеседования
⚡ Задача дня
❓ Что выведет этот код?
✅ Ответ
Промис создан
Код завершён
Успех!
Если возникли трудности, читай про эту тему здесь:
https://learn.javanoscript.ru/promise-basics
Промисы — мощная вещь, главное понять, как они работают. Ты справишься! 🚀
#javanoscript #собеседования
❓ Что выведет этот код?
const promise = new Promise((resolve, reject) => {
console.log("Промис создан");
resolve("Успех!");
});
promise.then((result) => console.log(result));
console.log("Код завершён");
✅ Ответ
Если возникли трудности, читай про эту тему здесь:
https://learn.javanoscript.ru/promise-basics
Промисы — мощная вещь, главное понять, как они работают. Ты справишься! 🚀
#javanoscript #собеседования
⚡ Задача дня
❓ Что выведет этот код?
✅ Ответ
15
Если возникли трудности, читай про эту тему здесь:
https://learn.javanoscript.ru/array-methods#reduce-reduceright
#javanoscript #собеседования
❓ Что выведет этот код?
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum);
✅ Ответ
Если возникли трудности, читай про эту тему здесь:
https://learn.javanoscript.ru/array-methods#reduce-reduceright
#javanoscript #собеседования
⚡ Задача дня
❓ Что выведет этот код?
✅ Ответ
Деление на ноль!
Операция завершена
Если возникли трудности, читай про эту тему здесь:
https://learn.javanoscript.ru/try-catch
Ошибки — это не страшно, если знаешь, как с ними справляться! 💪✨
#javanoscript #собеседования
❓ Что выведет этот код?
try {
const num = 10 / 0;
if (!isFinite(num)) {
throw new Error("Деление на ноль!");
}
} catch (error) {
console.log(error.message);
} finally {
console.log("Операция завершена");
}
✅ Ответ
Если возникли трудности, читай про эту тему здесь:
https://learn.javanoscript.ru/try-catch
Ошибки — это не страшно, если знаешь, как с ними справляться! 💪✨
#javanoscript #собеседования
Самые полезные операторы TypeScript: typeof и keyof
TypeScript даёт нам два классных оператора, которые делают работу с типами удобнее:
🔹 typeof — позволяет взять тип у уже существующей переменной:
Теперь AgeType будет всегда таким же, как тип переменной age. Это полезно, когда нужно создать новый тип на основе уже объявленных данных.
Другой пример:
Теперь UserType — это { name: string; age: number }, и если user изменится, тип автоматически обновится.
🔹 keyof — даёт список ключей объекта в виде строкового типа:
Теперь UserKeys — это "name" | "age", и мы можем использовать это, например, в функции:
Это помогает избежать ошибок, если случайно передать неправильное имя ключа.
Итог:
typeof помогает взять существующий тип.
keyof позволяет получить список ключей объекта.
Простые, но мощные штуки, которые делают код более надёжным! 🚀
TypeScript даёт нам два классных оператора, которые делают работу с типами удобнее:
🔹 typeof — позволяет взять тип у уже существующей переменной:
const age = 30;
type AgeType = typeof age; // number
Теперь AgeType будет всегда таким же, как тип переменной age. Это полезно, когда нужно создать новый тип на основе уже объявленных данных.
Другой пример:
onst user = {
name: "Alice",
age: 25,
};
type UserType = typeof user;
Теперь UserType — это { name: string; age: number }, и если user изменится, тип автоматически обновится.
🔹 keyof — даёт список ключей объекта в виде строкового типа:
type UserKeys = keyof UserType; // "name" | "age"
Теперь UserKeys — это "name" | "age", и мы можем использовать это, например, в функции:
function printUserInfo(key: UserKeys) {
console.log(key);
}
printUserInfo("name"); // ✅ Работает
// printUserInfo("email"); // ❌ Ошибка, такого ключа нет
Это помогает избежать ошибок, если случайно передать неправильное имя ключа.
Итог:
typeof помогает взять существующий тип.
keyof позволяет получить список ключей объекта.
Простые, но мощные штуки, которые делают код более надёжным! 🚀
⚡ Задача дня
Вот код:
❓ Какой тип будет у переменной key?
✅ Ответ
"id" | "name" | "isAdmin"
Если возникли трудности, можно почитать тут:
🔗 https://www.typenoscriptlang.org/docs/handbook/2/keyof-types.html
🔗 https://www.typenoscriptlang.org/docs/handbook/2/typeof-types.html
Вот код:
const user = {
id: 1,
name: "Alice",
isAdmin: true,
};
type UserKeys = keyof typeof user;
let key: UserKeys;
❓ Какой тип будет у переменной key?
✅ Ответ
Если возникли трудности, можно почитать тут:
🔗 https://www.typenoscriptlang.org/docs/handbook/2/keyof-types.html
🔗 https://www.typenoscriptlang.org/docs/handbook/2/typeof-types.html
This media is not supported in your browser
VIEW IN TELEGRAM
Кто сказал, что фастфуд только вредит?!
А если так?)
А если так?)
⚡ Задача дня
❓ Что выведет в консоль этот код?
✅ Ответ
Начало
Конец
Успех
Финально
Следующий then
💡 Запутался? Почитай подробнее про finally:
👉 https://learn.javanoscript.ru/promise-chaining
❓ Что выведет в консоль этот код?
const promise = new Promise((resolve, reject) => {
console.log("Начало");
resolve("Успех");
});
promise
.then((result) => {
console.log(result);
return "Следующий then";
})
.finally(() => {
console.log("Финально");
})
.then((data) => {
console.log(data);
});
console.log("Конец");
✅ Ответ
💡 Запутался? Почитай подробнее про finally:
👉 https://learn.javanoscript.ru/promise-chaining
❤1
⚡ Задача дня
❓ Что выведет консоль?
✅ Ответ
[undefined, 4, undefined, 8, undefined]
📚 Почитать про map можно здесь:
https://learn.javanoscript.ru/array-methods#map
❓ Что выведет консоль?
const numbers = [1, 2, 3, 4, 5];
const result = numbers.map(num => {
if (num % 2 === 0) {
return num * 2;
}
});
console.log(result);
✅ Ответ
📚 Почитать про map можно здесь:
https://learn.javanoscript.ru/array-methods#map
Принципы программирования
Чтобы писать нормальный код, который легко читать, поддерживать и расширять, нужно знать несколько ключевых принципов:
DRY (Don't Repeat Yourself — Не повторяйся)
Не дублируй код, где можно вынести в общую функцию, модуль или переменную. Чем меньше повторов, тем проще вносить изменения и понимать, что вообще происходит.
KISS (Keep It Simple, Stupid — Не усложняй)
Чем проще код, тем лучше. Если можно сделать что-то понятнее и короче — делай. Не надо усложнять без причины.
Разделяй обязанности (Separation of Concerns, SoC)
Код должен быть разбит на логические куски, каждый из которых отвечает за свою задачу.
Принцип единственной ответственности (SRP)
Каждый модуль, класс или функция должны заниматься чем-то одним. Чем меньше у них причин меняться, тем проще их тестировать и обновлять.
Открыто для расширения, закрыто для модификации (OCP)
Не трогай старый код, если можно добавить что-то новое без его изменения. Для этого есть наследование, интерфейсы и прочие штуки.
Закон Деметры (LoD) — принцип "меньше знаешь, крепче спишь"
Модули (или объекты) не должны лезть внутрь друг друга. Пусть взаимодействуют только по предоставленному API.
Не оптимизируй раньше времени
Пиши понятный код, а потом уже думай о скорости. Оптимизация ради оптимизации только запутает всех, включая тебя самого через месяц.
Пиши так, будто твой код будут читать другие
Даже если пишешь для себя, через пару месяцев ты уже не вспомнишь, что там было. Так что называй переменные понятно, добавляй комментарии и не превращай код в ребус.
Разработка через тестирование (TDD)
Сначала пиши тесты, потом код. Так ты точно будешь знать, что все работает как надо, и рефакторить код будет проще.
YAGNI (You Aren’t Gonna Need It — Тебе это не понадобится)
Не пиши функционал, который может пригодиться в будущем. Скорее всего, он не пригодится, а вот код засорит.
Соблюдая эти принципы, можно писать чистый, удобный и понятный код, который не стыдно показать коллегам. 🚀
Чтобы писать нормальный код, который легко читать, поддерживать и расширять, нужно знать несколько ключевых принципов:
DRY (Don't Repeat Yourself — Не повторяйся)
Не дублируй код, где можно вынести в общую функцию, модуль или переменную. Чем меньше повторов, тем проще вносить изменения и понимать, что вообще происходит.
KISS (Keep It Simple, Stupid — Не усложняй)
Чем проще код, тем лучше. Если можно сделать что-то понятнее и короче — делай. Не надо усложнять без причины.
Разделяй обязанности (Separation of Concerns, SoC)
Код должен быть разбит на логические куски, каждый из которых отвечает за свою задачу.
Принцип единственной ответственности (SRP)
Каждый модуль, класс или функция должны заниматься чем-то одним. Чем меньше у них причин меняться, тем проще их тестировать и обновлять.
Открыто для расширения, закрыто для модификации (OCP)
Не трогай старый код, если можно добавить что-то новое без его изменения. Для этого есть наследование, интерфейсы и прочие штуки.
Закон Деметры (LoD) — принцип "меньше знаешь, крепче спишь"
Модули (или объекты) не должны лезть внутрь друг друга. Пусть взаимодействуют только по предоставленному API.
Не оптимизируй раньше времени
Пиши понятный код, а потом уже думай о скорости. Оптимизация ради оптимизации только запутает всех, включая тебя самого через месяц.
Пиши так, будто твой код будут читать другие
Даже если пишешь для себя, через пару месяцев ты уже не вспомнишь, что там было. Так что называй переменные понятно, добавляй комментарии и не превращай код в ребус.
Разработка через тестирование (TDD)
Сначала пиши тесты, потом код. Так ты точно будешь знать, что все работает как надо, и рефакторить код будет проще.
YAGNI (You Aren’t Gonna Need It — Тебе это не понадобится)
Не пиши функционал, который может пригодиться в будущем. Скорее всего, он не пригодится, а вот код засорит.
Соблюдая эти принципы, можно писать чистый, удобный и понятный код, который не стыдно показать коллегам. 🚀
⚡ Задача дня
❓ Что выведет в консоль следующий код?
✅ Ответ
2
null
3
0
"Привет"
Если возникли трудности, можно почитать про логические операторы и оператор нулевого слияния тут:
🔗 https://learn.javanoscript.ru/logical-operators
🔗 https://learn.javanoscript.ru/nullish-operators
❓ Что выведет в консоль следующий код?
console.log(null || 2 || undefined);
console.log(1 && null && 3);
console.log(!1 || 2 && 3);
console.log(0 ?? 5);
console.log(null ?? 'Привет');
✅ Ответ
Если возникли трудности, можно почитать про логические операторы и оператор нулевого слияния тут:
🔗 https://learn.javanoscript.ru/logical-operators
🔗 https://learn.javanoscript.ru/nullish-operators
⚡ Задача дня
❓ Что выведет в консоль этот код?
💡 Запутался? Почитай подробнее про async/await и обработку ошибок:
👉 https://learn.javanoscript.ru/async-await
❓ Что выведет в консоль этот код?
async function foo() {
try {
return await Promise.reject("Ошибка!");
} catch (error) {
console.log("Ошибка поймана:", error);
}
}
foo().then((res) => console.log("Результат:", res));
💡 Запутался? Почитай подробнее про async/await и обработку ошибок:
👉 https://learn.javanoscript.ru/async-await
⚡ Задача дня
❓ Что выведет в консоль следующий код?
✅ Ответ
1 2
15 25
Если возникли трудности, можно почитать про оператор нулевого слияния и присваивание через ??= тут:
🔗 https://learn.javanoscript.ru/nullish-operators#operator-nulevogo-prisvaivaniya
❓ Что выведет в консоль следующий код?
let a = 1;
let b = 2;
a ??= 10;
b ??= 20;
console.log(a, b);
let c = null;
let d = undefined;
c ??= 15;
d ??= 25;
console.log(c, d);
✅ Ответ
Если возникли трудности, можно почитать про оператор нулевого слияния и присваивание через ??= тут:
🔗 https://learn.javanoscript.ru/nullish-operators#operator-nulevogo-prisvaivaniya
⚡ Задача дня
❓ Что выведет консоль?
✅ Ответ
[15, 20]
📚 Почитать про reduce можно здесь:
https://learn.javanoscript.ru/array-methods#reduce-reduceright
❓ Что выведет консоль?
const arr = [10, 20, 30, 40];
const result = arr.reduce((acc, num) => {
if (num > 20) {
acc.push(num / 2);
}
return acc;
}, []);
console.log(result);
✅ Ответ
📚 Почитать про reduce можно здесь:
https://learn.javanoscript.ru/array-methods#reduce-reduceright