Code Ready | Frontend
21.6K subscribers
1.22K photos
519 videos
17 files
926 links
Авторский канал по Frontend разработке.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_c

РКН: https://clck.ru/3NJCKs

Реклама на бирже: https://telega.in/c/code_ready
Download Telegram
«Опять лагает»: где искать слабые места во фронтенде

Если сайт тормозит и работает не так быстро, как вам хотелось бы, ему нужен аудит — на это потребуется примерно 1 рабочий день.

Роман Игнатович, фронт-тимлид Далее, готов сэкономить эти бесценные 8 часов вашего рабочего времени. Он собрал чек-лист типичных ошибок во фронтенде, из-за которых всё лагает, с понятными способами их устранения.

Больше технических разборов кейсов, советов и вакансий для разработчиков — в канале Далее.

Подписывайтесь!
#реклама
О рекламодателе
🔥1
👩‍💻 Textarea, которая растёт по контенту без JavaScript!

Автоматическое изменение высоты textarea — частая задача в формах, чатах и комментариях. Обычно для этого используют JavaScript, но современные браузеры уже умеют делать это нативно через CSS.

Как работает:
field-sizing: content включает автоматический расчёт размеров поля;

textarea начинает подстраиваться под объём текста;

высота увеличивается по мере ввода;

браузер сам рассчитывает размеры без JS-логики.


🔥 Это отличный способ упростить формы, чаты и интерфейсы ввода текста.

📣 Code Ready | #фишка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍268🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
🐱 html-cheatsheet-rus — полезнейшая шпаргалка по HTML!

Крутой материал для тех, кто изучает frontend или хочет быстро освежить базу по HTML. Здесь собрана действительно большая база — от структуры HTML-документа, тегов и атрибутов до форм, семантической вёрстки, мультимедиа, HTML5 API и accessibility.

Оставляю ссылочку: GitHub 📱


📣 Code Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
116👍7🔥6
Почему textarea часто ломает layout?

По умолчанию textarea можно тянуть во все стороны.

Пользователь легко может растянуть её по ширине и сломать grid, flex или весь form-layout.

Обычно никто это не контролирует.
textarea {
resize: both;
}


Из-за этого форма начинает разъезжаться, особенно в боковых панелях, модальных окнах и узких контейнерах.

Лучше сразу ограничить направление resize.
textarea {
resize: vertical;
}


Теперь пользователь может увеличить высоту, но ширина layout остаётся стабильной.

Если resize вообще не нужен:
textarea {
resize: none;
}


Это особенно полезно для сложных форм.
.modal textarea,
.sidebar textarea {
resize: vertical;
}


🔥 Контроль resize убирает неприятные layout-баги в формах и делает UI заметно стабильнее.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
115👍8🔥4🤝2
👩‍💻 Можно ли вывести видео поверх всех окон на странице или даже за пределы браузера?

Псевдокласс :picture-in-picture в CSS применяется к видео, которое находится в режиме «картинка в картинке». Он позволяет стилизовать элемент <video>, когда пользователь вынес его в плавающее окно поверх других приложений или вкладок.

Как это используется:
изменение оформления видео в PiP-режиме;
визуальная индикация активного режима воспроизведения;
адаптация интерфейса под плавающее окно.


Комбинируйте с соседними селекторами (~, +) и :has(), чтобы менять другие элементы интерфейса, пока видео в PiP.

📣 Code Ready | #свойство
Please open Telegram to view this post
VIEW IN TELEGRAM
114🔥8👍7
Почему innerHTML += иногда ведёт себя не так, как ожидаешь?

На первый взгляд это выглядит как самый простой способ что-то добавить в DOM — вроде бы просто дописал кусок HTML и всё. Но внутри браузер работает не так, и из-за этого появляются странные эффекты, когда вроде ничего особенного не сделал, а поведение страницы меняется.
const list = document.querySelector('.list');

list.innerHTML += `
<li>Новый элемент</li>
`;


По ощущениям просто добавили один li, но на деле браузер не дописывает HTML внутрь DOM. Он делает иначе: берёт текущее содержимое, сериализует его в строку, добавляет новый кусок и затем заново парсит HTML, пересоздавая DOM-узлы внутри контейнера.

Упрощённо это примерно вот так:
list.innerHTML = list.innerHTML + `
<li>Новый элемент</li>
`;


И уже отсюда становится понятно, почему начинают вылезать побочные эффекты.

Допустим, у тебя есть кнопка с обработчиком:
button.addEventListener('click', () => {
console.log('click');
});

container.innerHTML += `
<div>Новый блок</div>
`;


После такого обновления DOM-поддерево контейнера заменяется новым. Визуально ты видишь тот же интерфейс, но старые узлы уничтожаются и создаются заново. Поэтому все обработчики событий, навешанные через addEventListener, на этих элементах теряются.

Та же история с ссылками на элементы:
const item = document.querySelector('.item');

container.innerHTML += `
<div>Новый блок</div>
`;

console.log(item.isConnected); // false


item остаётся в переменной, но к текущему DOM он уже не привязан. Он существует как объект, но находится вне дерева документа, потому что был заменён старый поддерево контейнера.

И это особенно хорошо видно, когда начинаешь делать такие вещи в цикле:
for (let i = 0; i < 1000; i++) {
list.innerHTML += `<li>${i}</li>`;
}


Каждый раз браузер берёт текущее содержимое, сериализует его, парсит заново и пересоздаёт DOM внутри контейнера. На маленьких объёмах это почти незаметно, но когда элементов становится много — начинает сильно тормозить, потому что ты постоянно пересоздаёшь одно и то же дерево.

Поэтому в реальной практике так обычно не делают и используют более прямые DOM-методы.
const li = document.createElement('li');

li.textContent = 'Новый элемент';

list.append(li);


Тут уже всё проще: создаёшь узел и просто добавляешь его в DOM, без пересборки контейнера.

Есть ещё вариант со строками, но без пересоздания всего содержимого:
list.insertAdjacentHTML(
'beforeend',
'<li>Новый элемент</li>'
);


Он вставляет кусок точечно в DOM, не пересоздавая существующие узлы, поэтому поведение стабильнее.

Если нужно добавить много элементов сразу, обычно используют DocumentFragment, чтобы не дёргать DOM по сто раз:
const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {
const li = document.createElement('li');
li.textContent = i;
fragment.appendChild(li);
}

list.appendChild(fragment);


Тут всё собирается в памяти и вставляется одной операцией, без промежуточных пересборок и перерисовок.

🔥 Коротко, суть в том, что innerHTML += — это не добавить элемент, как это выглядит интуитивно. Это скорее пересобери мне весь контейнер заново через HTML-строку и вставь результат. Поэтому в живых интерфейсах он иногда ведёт себя неожиданно и может неприятно влиять и на логику, и на производительность.

📣 Code Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
115👍11🔥6
📱 Раскрывающийся блок FAQ без библиотек!

Привет! В этом гайде соберём аккордеон для часто задаваемых вопросов — лёгкий и доступный.

Ключевые моменты:
• HTML: семантическая разметка и aria-атрибуты для доступности.

• CSS: плавное открытие/закрытие блоков без прыжков.

• JavaScript: простой toggle и синхронизация с aria-expanded.


Полезный UI-паттерн, который улучшает читаемость и делает интерфейс чище.

📣 Code Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍6🤝5👎1🔥1
Генерируем UUID без библиотек!

Очень частая задача: создать уникальный id для пользователя, заказа, файла или любой сущности.

Раньше для этого почти всегда тянули библиотеки типа uuid.
import { v4 as uuid } from 'uuid';


Хотя в современном JavaScript это уже есть нативно.
crypto.randomUUID()


Метод сразу возвращает криптографически стойкий UUID v4.
const id = crypto.randomUUID();


Результат выглядит так:
36b8f84d-df4e-4d49-b662-bcde71a8764f

Подходит для случаев, где нужен уникальный идентификатор: id сущностей, ключи записей, request/session id, временные идентификаторы.

Для секретных токенов (reset password, API tokens) лучше использовать crypto.getRandomValues() или crypto.randomBytes().

В браузере работает в secure context — HTTPS или localhost.

🔥 crypto.randomUUID() — простой способ получать уникальные id.

📣 JS Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍23🔥75