ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

Glo Academy

Glo Academy

Открыть в Telegram

Бесплатные уроки по HTML/CSS/JavaScript, лайфхаки для верстальщика и бесплатные дизайн-макеты для портфолио. По рекламе — @yankovsky_ads Купить рекламу напрямую https://telega.in/c/glo_academy

Больше
3 759
Подписчики
-124 часа
+37 дней
-930 дней
Привлечение подписчиков
окт. '26
октябрь '26
+26
в 0 каналах
сентябрь '26
+18
в 0 каналах
Get PRO
август '26
+35
в 1 каналах
Get PRO
июль '26
+6
в 0 каналах
Get PRO
июнь '26
+5
в 0 каналах
Get PRO
май '26
+9
в 0 каналах
Get PRO
апрель '26
+14
в 0 каналах
Get PRO
март '26
+11
в 0 каналах
Get PRO
февраль '26
+23
в 0 каналах
Get PRO
январь '26
+8
в 0 каналах
Get PRO
декабрь '25
+15
в 0 каналах
Get PRO
ноябрь '25
+16
в 0 каналах
Get PRO
октябрь '25
+10
в 0 каналах
Get PRO
сентябрь '25
+19
в 0 каналах
Get PRO
август '25
+16
в 0 каналах
Get PRO
июль '25
+19
в 0 каналах
Get PRO
июнь '25
+10
в 0 каналах
Get PRO
май '25
+13
в 0 каналах
Get PRO
апрель '25
+17
в 0 каналах
Get PRO
март '25
+20
в 0 каналах
Get PRO
февраль '25
+19
в 0 каналах
Get PRO
январь '25
+16
в 0 каналах
Get PRO
декабрь '24
+35
в 0 каналах
Get PRO
ноябрь '24
+25
в 0 каналах
Get PRO
октябрь '24
+32
в 0 каналах
Get PRO
сентябрь '24
+43
в 0 каналах
Get PRO
август '24
+52
в 0 каналах
Get PRO
июль '24
+49
в 0 каналах
Get PRO
июнь '24
+40
в 0 каналах
Get PRO
май '24
+30
в 0 каналах
Get PRO
апрель '24
+42
в 0 каналах
Get PRO
март '24
+44
в 0 каналах
Get PRO
февраль '24
+47
в 0 каналах
Get PRO
январь '24
+43
в 0 каналах
Get PRO
декабрь '23
+55
в 0 каналах
Get PRO
ноябрь '23
+65
в 0 каналах
Get PRO
октябрь '23
+50
в 0 каналах
Get PRO
сентябрь '23
+41
в 0 каналах
Get PRO
август '23
+72
в 0 каналах
Get PRO
июль '23
+74
в 0 каналах
Get PRO
июнь '23
+37
в 0 каналах
Get PRO
май '23
+85
в 0 каналах
Get PRO
апрель '23
+71
в 0 каналах
Get PRO
март '23
+49
в 0 каналах
Get PRO
февраль '23
+67
в 0 каналах
Get PRO
январь '23
+51
в 0 каналах
Get PRO
декабрь '22
+59
в 0 каналах
Get PRO
ноябрь '22
+102
в 0 каналах
Get PRO
октябрь '22
+63
в 0 каналах
Get PRO
сентябрь '22
+57
в 0 каналах
Get PRO
август '22
+103
в 0 каналах
Get PRO
июль '22
+64
в 0 каналах
Get PRO
июнь '22
+63
в 0 каналах
Get PRO
май '22
+50
в 0 каналах
Get PRO
апрель '22
+93
в 0 каналах
Get PRO
март '22
+82
в 0 каналах
Get PRO
февраль '22
+46
в 0 каналах
Get PRO
январь '22
+75
в 0 каналах
Get PRO
декабрь '21
+76
в 0 каналах
Get PRO
ноябрь '21
+110
в 0 каналах
Get PRO
октябрь '21
+123
в 0 каналах
Get PRO
сентябрь '21
+99
в 0 каналах
Get PRO
август '21
+139
в 0 каналах
Get PRO
июль '21
+149
в 0 каналах
Get PRO
июнь '21
+224
в 0 каналах
Get PRO
май '21
+183
в 0 каналах
Get PRO
апрель '21
+190
в 0 каналах
Get PRO
март '21
+263
в 0 каналах
Get PRO
февраль '21
+290
в 0 каналах
Get PRO
январь '21
+477
в 0 каналах
Get PRO
декабрь '20
+7 655
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
24 октября+1
23 октября+1
22 октября0
21 октября0
20 октября+1
19 октября0
18 октября+4
17 октября+6
16 октября+1
15 октября+4
14 октября0
13 октября0
12 октября0
11 октября+1
10 октября0
09 октября0
08 октября0
07 октября+1
06 октября+1
05 октября+1
04 октября+2
03 октября+1
02 октября+1
01 октября0
Посты канала
📐 Интернет-магазин сантехники Макет средней сложности на русском языке без адаптива @glo_academy | #макеты

2
🧰 Pretty TS Errors Ошибки TypeScript в VS Code приходят одной строкой. Пока типы простые, это терпимо. Но передал в функцию
🧰 Pretty TS Errors Ошибки TypeScript в VS Code приходят одной строкой. Пока типы простые, это терпимо. Но передал в функцию объект с одним неверным полем, и в подсказке весь тип целиком: скобки, точки с запятой, кавычки, а где именно ошибка, искать глазами. Pretty TS Errors переписывает это окно. Тип из ошибки разворачивается по строкам и подсвечивается цветами твоей темы, а названия типов и полей стоят отдельными плашками. На ролике одна и та же ошибка: слева как её показывает VS Code, справа с расширением. Сразу видно, что не так с полем zip в address. Рядом с ошибкой расширение ставит ссылки на её разбор на typescript.tv и на перевод на простой английский. Работает в .ts и .tsx, а ещё в Vue, Svelte и Astro, если там включён TypeScript. Ставится из маркетплейса VS Code поиском по pretty-ts-errors, в Cursor тоже есть. https://github.com/yoavbls/pretty-ts-errors 🔥 — если было полезно @glo_academy | #инструменты
176
3
🪓 @glo_academy
🪓 @glo_academy
239
4
⚡ Группировка массива без reduce Разложить заказы по статусам, например для канбан-доски, обычно пишут через reduce: заводят
⚡ Группировка массива без reduce Разложить заказы по статусам, например для канбан-доски, обычно пишут через reduce: заводят пустой объект, проверяют, есть ли уже массив под ключ, и пушат в него. Несколько строк, в которых легко ошибиться. Теперь это один вызов: const orders = [ { id: 1, status: 'new' }, { id: 2, status: 'paid' }, { id: 3, status: 'new' }, ]; const byStatus = Object.groupBy(orders, (o) => o.status); // { new: [заказы 1 и 3], paid: [заказ 2] } Object.groupBy проходит по массиву и для каждого элемента вызывает функцию. Что она вернёт, то и станет ключом, а элемент попадёт в массив под этим ключом. Группировать можно по чему угодно: по статусу, по первой букве имени, по цене «до 1000» и «дороже». На гифке заказы из одного списка разъезжаются по колонкам статусов. Элементы в группах не копируются, это те же объекты, что в исходном массиве. Работает в Chrome 117+, Firefox 119+, Safari 17.4+. 🔥 — если было полезно @glo_academy | #js_day
267
5
✂️ +7 в поле телефона, который нельзя стереть +7 перед номером часто пишут прямо в value поля. Пользователь стирает номер, и
✂️ +7 в поле телефона, который нельзя стереть +7 перед номером часто пишут прямо в value поля. Пользователь стирает номер, и плюс семёрка уходит вместе с ним. А если он вставит номер из буфера, получится +7+7. Надёжнее держать префикс вне ввода: рамку рисует обёртка, а input внутри без рамки: <label class="field"> <span>+7</span> <input type="tel"> </label> .field { display: flex; border: 1px solid #ccc; } .field:focus-within { border-color: #4f5bd5; } .field input { border: 0; outline: 0; flex: 1; } label делает префикс частью поля: клик по +7 ставит курсор в ввод. Псевдокласс :focus-within срабатывает у обёртки, когда фокус внутри, поэтому рамка подсвечивается целиком, как у обычного поля. На сервер уходит только input, без +7. На гифке сверху +7 записан в value и стирается вместе с номером. Снизу он в обёртке, и стереть его нельзя. Так же ставят ₽ после суммы или https:// перед адресом. Работает во всех браузерах. ❤️ — если было полезно @glo_academy | #snippets
256
6
🎨 Поле для отзыва растёт по тексту без JS Поле для отзыва обычно растягивают скриптом: на каждый ввод сбрасывают высоту и ст
🎨 Поле для отзыва растёт по тексту без JS Поле для отзыва обычно растягивают скриптом: на каждый ввод сбрасывают высоту и ставят новую по scrollHeight. Без скрипта textarea остаётся в две строки, и длинный текст уезжает под скролл. Теперь хватает одного свойства: textarea { field-sizing: content; min-height: 3lh; max-height: 10lh; } field-sizing: content говорит браузеру считать размер поля по тексту внутри. min-height не даёт пустому полю схлопнуться, max-height останавливает рост, дальше появляется скролл. Единица lh равна высоте строки, 3lh значит три строки. На гифке в оба поля печатается один и тот же отзыв. Сверху обычная textarea, текст прячется под скролл. Снизу поле растёт вместе с текстом. Где свойства нет, поле останется обычным, так что ставить его можно уже сейчас. Работает в Chrome 123+, Firefox 152+, Safari 26.2+. 🔥 — если было полезно @glo_academy | #css_day
273
7
📐 Интернет-магазин ретро-электрики Сложный макет на русском языке без адаптива @glo_academy | #макеты
📐 Интернет-магазин ретро-электрики Сложный макет на русском языке без адаптива @glo_academy | #макеты
309
8
🧰 Tabler Icons Берёшь иконки из трёх разных наборов, и в интерфейсе они спорят: у одной линия тоньше, у другой углы круглее,
🧰 Tabler Icons Берёшь иконки из трёх разных наборов, и в интерфейсе они спорят: у одной линия тоньше, у другой углы круглее, третья залита целиком. Даже если не можешь объяснить, что не так, глаз это замечает. В Tabler Icons больше 6200 иконок, и все нарисованы по одной сетке 24×24 с линией в 2 пикселя. Цвет иконка берёт из currentColor, то есть красится так же, как текст рядом. Толщину линии меняет атрибут stroke-width прямо в разметке. На ролике слева одни и те же иконки становятся то тоньше, то толще: тонкие подойдут для мелкого интерфейса, жирные для крупных кнопок, а файл при этом один. Справа меняется только цвет текста в меню, и иконки перекрашиваются вместе с ним. Ставится пакетом под React, Vue, Svelte или Angular, а можно скопировать SVG с tabler.io/icons и вставить в разметку. Лицензия MIT, у тысячи иконок есть залитая версия. https://github.com/tabler/tabler-icons 🔥 — если было полезно @glo_academy | #инструменты
337
9
🐈 @glo_academy
🐈 @glo_academy
351
10
⚡ Цена в любой валюте без регулярок Цену с пробелами и знаком ₽ часто собирают своей функцией с регуляркой. Появятся покупате
⚡ Цена в любой валюте без регулярок Цену с пробелами и знаком ₽ часто собирают своей функцией с регуляркой. Появятся покупатели из других стран, и её придётся переписывать под доллары. А в JS уже есть форматтер для любой валюты: const price = (sum, currency, locale) => new Intl.NumberFormat(locale, { style: 'currency', currency, }).format(sum); price(1234567.5, 'RUB', 'ru-RU'); // 1 234 567,50 ₽ price(1234567.5, 'USD', 'en-US'); // $1,234,567.50 price(1234567.5, 'EUR', 'de-DE'); // 1.234.567,50 € В currency идёт код валюты из стандарта ISO 4217: RUB, USD, EUR, GBP и любой другой. Локаль решает, как цену пишут в этой стране: какие разделители и где стоит знак. Поэтому у доллара знак впереди, а у рубля в конце. На гифке одна сумма проходит через пять валют. Копейки форматтер дописывает сам, убрать их можно опцией maximumFractionDigits: 0. Работает в Chrome 24+, Firefox 29+, Safari 10+. 🔥 — если было полезно @glo_academy | #js_day
338
11
🎨 Зебра в таблице не ломается после фильтра Таблицу делают полосатой через tr:nth-child(odd), и всё хорошо, пока не включишь
🎨 Зебра в таблице не ломается после фильтра Таблицу делают полосатой через tr:nth-child(odd), и всё хорошо, пока не включишь фильтр. Скрытая строка пропадает с экрана, но в счёте остаётся, и две серые строки встают подряд. Считать только видимые строки можно прямо в селекторе: /* было: скрытые строки тоже считаются */ tr:nth-child(odd) { background: #e4e7f2; } /* стало: считаются только видимые */ tr:nth-child(odd of :not(.hidden)) { background: #e4e7f2; } Запись odd of :not(.hidden) работает в два шага. Сначала браузер отбирает строки без класса hidden, потом нумерует только их и красит нечётные. Скрытые строки в нумерацию больше не попадают. На гифке включается фильтр «Только в наличии». Слева обычный nth-child, и полосы сбиваются. Справа новая запись, полосы идут через одну. Если фильтр прячет строки атрибутом hidden, а не классом, в скобках пиши :not([hidden]). Работает в Chrome 111+, Firefox 113+, Safari 9+. 🔥 — если было полезно @glo_academy | #css_day
328
12
🧰 HyperUI Нужна на сайт секция с тарифами или карточки товаров, а верстать их с нуля долго. Готовые UI-библиотеки обычно ста
🧰 HyperUI Нужна на сайт секция с тарифами или карточки товаров, а верстать их с нуля долго. Готовые UI-библиотеки обычно ставятся пакетом, и ради пары блоков в проект едут лишние зависимости. В HyperUI больше 300 бесплатных блоков на Tailwind: шапки, тарифы, футеры, формы, таблицы, модалки. Ставить ничего не надо. Находишь блок на hyperui.dev, жмёшь Copy и вставляешь разметку к себе. На ролике так переезжает блок тарифов: слева сайт HyperUI, справа твоя страница. Дальше это обычный HTML с классами Tailwind, и править его можно как угодно. Заменил в разметке indigo на emerald, и тариф стал зелёным, как в конце ролика. У многих блоков есть тёмная версия. Написаны блоки под Tailwind 4, в проекте на третьей версии часть классов называется иначе. https://github.com/markmead/hyperui 🔥 — если было полезно @glo_academy | #инструменты
421
13
🦜 @glo_academy
🦜 @glo_academy
440
14
⚡ Прогресс загрузки файла на fetch без XHR await fetch(url) возвращается, как только пришли заголовки. Тело ещё качается, и е
⚡ Прогресс загрузки файла на fetch без XHR await fetch(url) возвращается, как только пришли заголовки. Тело ещё качается, и его можно читать по кускам через response.body. const res = await fetch(url); const total = +res.headers.get('Content-Length'); const reader = res.body.getReader(); const chunks = []; let loaded = 0; while (true) { const { done, value } = await reader.read(); if (done) break; chunks.push(value); loaded += value.length; progress.value = loaded / total; } Каждый reader.read() приносит следующий кусок: складываешь длины, делишь на размер файла из Content-Length и двигаешь полосу загрузки. Так умеют Chrome с 43-й версии, Firefox с 65-й и Safari с 10.1. Если сервер сжимает ответ, в Content-Length окажется размер сжатого файла, а reader отдаёт распакованные байты, и прогресс уедет за 100%. Заголовка может и не быть, тогда показывай, сколько мегабайт уже скачано. Прогресс отправки так не посчитать, для неё по-прежнему берут XHR. 🔥 — если было полезно @glo_academy | #js_day
438
15
🎨 Тултип у края экрана переворачивается без JS Тултип над кнопкой обычно ставят через position: absolute и bottom: 100%. Сто
🎨 Тултип у края экрана переворачивается без JS Тултип над кнопкой обычно ставят через position: absolute и bottom: 100%. Стоит кнопке оказаться у верхнего края, и подсказка уезжает за экран. Раньше это чинили JS-библиотекой вроде Floating UI. Сейчас хватает CSS: .button { anchor-name: --save; } .tooltip { position: absolute; position-anchor: --save; position-area: top; margin-bottom: 8px; position-try-fallbacks: flip-block; } anchor-name даёт кнопке имя, position-anchor привязывает к нему тултип, а position-area: top ставит его над кнопкой. Последняя строка нужна для края экрана: если сверху места не хватает, flip-block переносит тултип под кнопку. Отступ из margin-bottom переезжает вместе с ним. На гифке кнопка едет вверх. Слева старый способ: подсказку срезает край. Справа она переворачивается вниз. Пересчитывать позицию при скролле и ресайзе браузер тоже будет сам, без обработчиков в JS. Работает в Chrome 129+, Firefox 147+, Safari 26+. 🔥 — если было полезно @glo_academy | #css_day
408
16
🧰 svgo Экспортируешь иконку колокольчика из графического редактора, а файл весит почти 2 КБ. Нарисованы в нём две линии, ост
🧰 svgo Экспортируешь иконку колокольчика из графического редактора, а файл весит почти 2 КБ. Нарисованы в нём две линии, остальное служебное: комментарий редактора, метаданные, пустые группы, скрытый слой и координаты вида 2.000000. Всё это браузер скачивает вместе с иконкой. svgo чистит файл одной командой npx svgo bell.svg. На ролике тот самый колокольчик: красным подсвечено то, что svgo удалит, жёлтым то, что перепишет короче. Было 1911 байт, стало 353, а иконка не изменилась. На странице с двадцатью такими иконками это около 30 КБ лишнего. Обычно svgo подключают к сборщику, и иконки чистятся сами при каждой сборке. svgo удаляет и переименовывает id внутри файла. Если твой CSS или JS находит части иконки по id, отключи в настройках плагин cleanupIds. https://github.com/svg/svgo 🔥 — если было полезно @glo_academy | #инструменты
425
17
🤳 @glo_academy
🤳 @glo_academy
436
18
✂️ Шрифт как в нативном приложении без загрузки файлов Подключаешь красивый шрифт с сервера, и на медленном интернете человек
✂️ Шрифт как в нативном приложении без загрузки файлов Подключаешь красивый шрифт с сервера, и на медленном интернете человек первые секунды смотрит на пустые карточки. Браузер прячет текст, пока файл не догрузится, а потом перерисовывает страницу. Если шрифт не часть бренда, файл можно не грузить совсем. body { font-family: system-ui, sans-serif; } system-ui берёт шрифт, который уже стоит у пользователя: San Francisco на macOS и iOS, Segoe UI на Windows, Roboto на Android. Текст виден с первого кадра, и сайт выглядит так же привычно, как приложения в этой системе. На гифке слева карточка ждёт свой шрифт, а справа текст на месте сразу. На каждой системе шрифт свой, поэтому ширина строк немного гуляет: проверяй вёрстку хотя бы на маке и на Windows. sans-serif в конце — запасной вариант для старых браузеров. Работает в Chrome 56+, Firefox 92+, Safari 11+. ❤️ — если было полезно @glo_academy | #snippets
477
19
🎨 Звёздочка у обязательного поля озвучится словами Ставишь звёздочку у обязательного поля через ::after — и незрячий пользов
🎨 Звёздочка у обязательного поля озвучится словами Ставишь звёздочку у обязательного поля через ::after — и незрячий пользователь слышит «Телефон звёздочка». Символ до него дошёл, а смысл нет: из «звёздочки» никак не следует, что поле обязательное. Чинится одной косой чертой. .required::after { content: '*' / 'обязательное поле'; } После значения в content ставь косую черту и пиши альтернативный текст. На экране остаётся та же звёздочка, а скринридер прочитает «Телефон обязательное поле». На гифке форма не меняется, меняется только то, что слышит пользователь: сначала «Телефон звёздочка», потом «Телефон обязательное поле». Так же чинится любой декор из content: галочка, стрелка в хлебных крошках. Если символ нужен только глазам, поставь после черты пустые кавычки, и скринридер его пропустит. Работает в Chrome 77+, Firefox 128+, Safari 17.4+. 🔥 — если было полезно @glo_academy | #css_day
414
20
📐 Лендинг жилого комплекса Макет средней сложности без адаптива на русском языке @glo_academy
📐 Лендинг жилого комплекса Макет средней сложности без адаптива на русском языке @glo_academy
418