<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>CSS</title>
    <description>Практические пособия по языку разметки и использованию CSS-препроцессоров.</description>
    <link>https://tproger.ru/tag/css</link>
    <atom:link href="https://tproger.ru/tag/css/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 27 Sep 2026 20:58:01 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>CSS</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>CSS-функции sibling-index() и sibling-count() заработали во всех движках</title>
      <link>https://tproger.ru/news/css-funkcii-sibling-index-i-sibling-count-zarabotali-vo-vseh</link>
      <comments>https://tproger.ru/news/css-funkcii-sibling-index-i-sibling-count-zarabotali-vo-vseh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/css-funkcii-sibling-index-i-sibling-count-zarabotali-vo-vseh</guid>
      <description><![CDATA[<p>С Firefox 154 функции sibling-index() и sibling-count() есть во всех трёх движках. Как задать задержку анимации по номеру элемента без JS и где они вернут 0.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/css-funkcii-sibling-index-i-sibling-count-zarabotali-vo-vseh">CSS-функции sibling-index() и sibling-count() заработали во всех движках</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 08:40:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Функции sibling-index() и sibling-count() стали доступны во всех трёх основных браузерных движках: последним 18 августа их <a href="https://web-platform-dx.github.io/web-features-explorer/features/sibling-count/">поддержал</a> Firefox 154, а 2 сентября разработчики <a href="https://www.reddit.com/r/css/comments/1w52o07/siblingindex_and_siblingcount_the_css_functions/">разобрали</a> в r/css, что это меняет. Функции возвращают номер элемента среди соседей и общее число детей у родителя, и оба значения можно использовать в calc().</p><p>Практический смысл простой: то, что раньше делали через --i в инлайн-стиле каждого элемента или через JavaScript, теперь считает сам браузер. Ступенчатые задержки анимации в списке, ширина колонок по числу карточек, позиционирование по индексу без нумерации в разметке. По данным Web Platform DX, функции получили статус «newly available» с 18 августа 2026 года; статус «widely available» по правилам Baseline ожидается 18 февраля 2029 года, то есть старые браузеры ещё долго будут требовать запасного варианта.</p><ul><li>sibling-index() возвращает позицию элемента среди соседей, начиная с 1; sibling-count() возвращает число прямых детей родителя, включая текущий.</li><li>Поддержка: Chrome и Edge 138 (июнь 2025), Safari 26.2 (декабрь 2025), Firefox 154 (18 августа 2026).</li><li>Функции считают по дереву DOM, а не по flat tree; при попытке пересечь границу Shadow DOM результат может быть 0.</li><li>Типичные применения: transition-delay и animation-delay по номеру, размер элемента в зависимости от числа соседей, раскладка без JavaScript.</li><li>CSSWG допускает будущую форму с фильтром of, чтобы считать только соседей по селектору.</li></ul><h2>Как это выглядит в коде</h2><p>Классический пример из обсуждения: список, где каждый следующий пункт появляется чуть позже предыдущего. Раньше для этого либо писали style="--i: 3" в каждом li, либо перечисляли :nth-child() вручную. Теперь достаточно одного правила:</p><p>Обе функции возвращают целое число без единиц, поэтому умножение на 80ms или на 100px внутри calc() работает как с обычной переменной. В спецификации CSS Values and Units Level 5 их называют tree-counting functions, функциями подсчёта по дереву.</p><h2>Где функции ведут себя не так, как ожидается</h2><ul><li>Считается дерево DOM, а не flat tree: слоты и элементы внутри Shadow DOM учитываются иначе, чем при рендеринге; на границе теневого дерева функция может вернуть 0, чтобы не раскрывать его содержимое.</li><li>Учитываются все элементы-соседи, а не только подходящие под селектор. Если в списке есть скрытый li, он всё равно попадёт в счёт; форма с фильтром of пока только обсуждается в CSSWG.</li><li>Индексация начинается с 1, как у :nth-child(), а не с 0.</li></ul><h2>Можно ли использовать в проде</h2><p>Для декоративных эффектов вроде задержек анимации можно уже сейчас: в браузере без поддержки calc(sibling-index() * 80ms) будет невалидным значением, и правило просто не применится, элементы появятся одновременно. Для раскладки, от которой зависит читаемость, стоит завернуть правило в @supports:</p><p>Кому это ничего не даст: проектам, которые обязаны поддерживать браузеры старше Chrome 138 и Safari 26.2, а также тем, кто уже генерирует индексы на сервере. По данным Web Platform DX, Chrome и Chrome Android получили функции в версии 138 от 24 июня 2025 года, Edge 138 от 26 июня 2025 года, Safari и iOS Safari в 26.2 от 12 декабря 2025 года, Firefox и Firefox Android в 154 от 18 августа 2026 года.</p><p>Из соседних CSS-новостей на сайте: Firefox 155 <a href="https://tproger.ru/news/firefox-dlya-ios-poluchil-vstroennyj-blokirovshhik-reklamy-a-firefo">добавил</a> функцию progress(), а в Chrome 154 beta появились режимы links и tabs у scroll-marker-group. Черновик спецификации с формальным описанием функций лежит на <a href="https://drafts.csswg.org/css-values-5/">сайте CSSWG</a>.</p><p>Источники: <a href="https://www.reddit.com/r/css/comments/1w52o07/siblingindex_and_siblingcount_the_css_functions/">Обсуждение в r/css</a>, <a href="https://web-platform-dx.github.io/web-features-explorer/features/sibling-count/">Web Platform DX: sibling-count и sibling-index</a>, <a href="https://drafts.csswg.org/css-values-5/">CSS Values and Units Module Level 5</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Chrome 154 beta принёс постквантовое шифрование в Web Crypto</title>
      <link>https://tproger.ru/news/chrome-154-beta-prinyos-postkvantovoe-wifrovanie-v-web-crypto</link>
      <comments>https://tproger.ru/news/chrome-154-beta-prinyos-postkvantovoe-wifrovanie-v-web-crypto?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/chrome-154-beta-prinyos-postkvantovoe-wifrovanie-v-web-crypto</guid>
      <description><![CDATA[<p>Chrome 154 beta: ML-KEM и ML-DSA в Web Crypto, options bag и targetAddressSpace у WebSocket, режимы links и tabs у scroll-marker-group, CORS в Background Fetch.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/chrome-154-beta-prinyos-postkvantovoe-wifrovanie-v-web-crypto">Chrome 154 beta принёс постквантовое шифрование в Web Crypto</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 03:20:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Google 2 сентября <a href="https://developer.chrome.com/blog/chrome-154-beta">перевела</a> Chrome 154 в бету для Android, ChromeOS, Linux, macOS и Windows; desktop-сборка имеет номер 154.0.8037.0, для Android и ChromeOS сборки выходят отдельно. Самое заметное для веб-разработчиков: в Web Crypto API добавили постквантовые алгоритмы ML-KEM и ML-DSA, WebSocket научился принимать объект настроек и ходить в локальную сеть с явным разрешением, а у CSS-свойства scroll-marker-group появились режимы links и tabs.</p><p>Бета обычно доживает до стабильного релиза без крупных изменений, поэтому всё перечисленное стоит проверять уже сейчас: часть новинок меняет поведение существующего кода. Background Fetch начинает применять CORS, а AbortController теперь передаёт причину отмены в Response и ReadableStream. Автор поста в блоге Chrome for Developers Рэйчел Эндрю; отдельных региональных ограничений на бету в источнике нет.</p><ul><li>Web Crypto получил ML-KEM 768 и 1024, ML-DSA 44, 65 и 87, ChaCha20-Poly1305 и гибридную схему X-Wing.</li><li>WebSocket принимает options bag: new WebSocket(url, { protocols: "soap" }); новое поле targetAddressSpace позволяет подключаться к локальным адресам при secure context и разрешении Local Network Access.</li><li>scroll-marker-group получил режимы links и tabs; в режиме tabs активный маркер остаётся единственным tab-stop, а неактивный контент скрывается из дерева доступности.</li><li>CSSStyleValue и связанные конструкторы доступны в воркерах; text-decoration-inset принимает auto, длину, процент и одно-/двухзначную запись; FontFace.width стал алиасом stretch.</li><li>Background Fetch теперь соблюдает CORS; WebGPU получил модификаторы frag_depth less и greater, которые позволяют не терять ранний Z-тест.</li></ul><h2>Что даёт постквантовая криптография в браузерном API</h2><p>До сих пор постквантовые алгоритмы в Chrome работали только на уровне TLS, незаметно для страницы. В 154 они выходят в JavaScript: через crypto.subtle можно генерировать ключи и выполнять инкапсуляцию ML-KEM (стандарт NIST для обмена ключами) и подписи ML-DSA. Добавлены также ChaCha20-Poly1305 и X-Wing, гибрид классического X25519 и ML-KEM. На практике это нужно тем, кто делает сквозное шифрование в веб-приложениях: мессенджерам, хранилищам паролей, локальным подписям документов. Проверить у себя просто: вызвать crypto.subtle.generateKey с новым именем алгоритма в бете и убедиться, что он не бросает NotSupportedError.</p><h2>Зачем WebSocket объект настроек и локальная сеть</h2><p>Конструктор WebSocket много лет принимал только URL и строку или массив протоколов. Теперь второй аргумент может быть объектом: new WebSocket(url, { protocols: "soap" }). Это задел под будущие опции без ломки сигнатуры. Второе поле, targetAddressSpace, решает конкретную боль: страница с публичного HTTPS-сайта не могла открыть сокет к устройству в локальной сети. В 154 это возможно, но при трёх условиях: secure context, разрешение пользователя по механизму Local Network Access и имя хоста, которое резолвится в локальный IP. Сценарий типичный для панелей управления IoT и локальных серверов разработки.</p><h2>Что меняется в CSS</h2><p>Свойство scroll-marker-group, которое вместе с псевдоэлементами ::scroll-marker позволяет делать карусели и табы без JavaScript, получило два режима. links ведёт себя как набор ссылок, tabs как настоящий tablist: активный маркер единственный останавливается по Tab, а контент неактивных вкладок исключается из accessibility tree. Это закрывает главную претензию к CSS-каруселям: раньше скринридер видел все панели сразу.</p><p>Из остального: text-decoration-inset позволяет отступать подчёркивание от краёв текста и принимает auto, длину, процент и запись из одного или двух значений; FontFace.width и дескриптор font-width в @font-face стали алиасами stretch и font-stretch; типизированная объектная модель CSS (CSSStyleValue и конструкторы) теперь доступна в воркерах, что упрощает расчёты стилей вне главного потока.</p><h2>Что может сломаться после обновления</h2><ul><li>Background Fetch теперь применяет CORS: фоновые загрузки с чужих доменов без правильных заголовков начнут падать.</li><li>AbortController прокидывает reason в Response и ReadableStream: код, который сравнивал ошибку отмены с конкретным AbortError, может получить другой объект.</li><li>По заметкам к релизу, браузер в ряде сценариев использует события click вместо пары pointerdown/pointerup; обработчики, завязанные на порядок этих событий, стоит перепроверить.</li><li>В WebGPU появились модификаторы frag_depth less и greater: шейдеры, которые пишут глубину, могут вернуть себе ранний Z-тест, но это требует правки WGSL.</li></ul><h2>Как попробовать</h2><p>Бета ставится параллельно со стабильным Chrome со <a href="https://www.google.com/chrome/beta/">страницы загрузки Chrome Beta</a>; анонс сборки опубликован в <a href="https://chromereleases.googleblog.com/2026/09/chrome-beta-for-desktop-update.html">Chrome Releases</a>; на Android доступна через бета-программу в магазине. Стабильный релиз 154 по обычному графику Chrome выходит примерно через четыре недели после беты, точную дату Google в посте не называет. До этого времени полезно прогнать сайт с включёнными фоновыми загрузками и WebSocket-подключениями к локальным устройствам.</p><p>Что происходит в других движках, можно сравнить с недавними релизами: WebKit <a href="https://tproger.ru/news/safari-27-poluchit-perepisannyj-zagruzchik-modulej-i-rabochij-top-l">переписал загрузчик модулей</a> для Safari 27, а Firefox 155 <a href="https://tproger.ru/news/firefox-dlya-ios-poluchil-vstroennyj-blokirovshhik-reklamy-a-firefo">добавил</a> CSS-функцию progress(). Полный список изменений Chrome 154 с примерами кода лежит в <a href="https://developer.chrome.com/blog/chrome-154-beta">блоге Chrome for Developers</a>.</p><p>Источники: <a href="https://developer.chrome.com/blog/chrome-154-beta">Chrome for Developers: Chrome 154 beta</a>, <a href="https://chromereleases.googleblog.com/2026/09/chrome-beta-for-desktop-update.html">Chrome Releases: Chrome Beta for Desktop Update</a></p><p>Изображение на обложке: Google, логотип Chrome</p>]]></content:encoded>
    </item>
    <item>
      <title>Firefox для iOS получил блокировщик рекламы, а Firefox 155 функцию progress()</title>
      <link>https://tproger.ru/news/firefox-dlya-ios-poluchil-vstroennyj-blokirovshhik-reklamy-a-firefo</link>
      <comments>https://tproger.ru/news/firefox-dlya-ios-poluchil-vstroennyj-blokirovshhik-reklamy-a-firefo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/firefox-dlya-ios-poluchil-vstroennyj-blokirovshhik-reklamy-a-firefo</guid>
      <description><![CDATA[<p>Mozilla добавила в Firefox для iOS встроенный блокировщик рекламы на WebKit Content Blocker и EasyList. Одновременно вышел Firefox 155 с CSS-функциями progress() и alpha(), Promise.allKeyed() и исправлениями уязвимостей высокого уровня. Что включить и что проверить.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/firefox-dlya-ios-poluchil-vstroennyj-blokirovshhik-reklamy-a-firefo">Firefox для iOS получил блокировщик рекламы, а Firefox 155 функцию progress()</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 01 Sep 2026 17:25:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Mozilla 1 сентября <a href="https://blog.mozilla.org/en/firefox/ad-blocker-on-ios/">добавила</a> в <b>Firefox для iOS</b> встроенный блокировщик рекламы. На iPhone это важнее, чем звучит: расширения в iOS-версии Firefox, по формулировке Mozilla, «недоступны таким же образом», как на десктопе и Android, а браузер работает на движке WebKit от Apple, поэтому uBlock Origin туда не поставить. Теперь блокировка есть в настройках, но выключена по умолчанию.</p><p>В тот же день вышел <b>Firefox 155</b> для десктопа, и для верстальщиков в нём есть чем заняться: CSS-функции progress() и alpha(), свойство font-width, attr() в любом свойстве, а в JavaScript Promise.allKeyed(). Обновиться стоит и без новинок: бюллетень безопасности MFSA 2026-82 закрывает несколько уязвимостей высокого уровня.</p><ul><li>Блокировщик в Firefox для iOS включается в Settings, затем Browsing, затем Ad Blocker; по умолчанию выключен, расширение ставить не нужно.</li><li>Работает на технологии Apple WebKit Content Blocker и списке EasyList; рекламу в поисковой выдаче и рекламу самих сайтов может пропускать.</li><li>Firefox 155: CSS progress(), alpha(), font-width, attr() везде; Promise.allKeyed() и allSettledKeyed(); согласование QUIC v2 для HTTP/3; NDJSON в JSON Viewer.</li><li>MFSA 2026-82 закрывает уязвимости высокого уровня, среди них CVE-2026-84119, 84143 и 84144, и повышение привилегий в Firefox для Android.</li><li>Минимальную версию iOS для блокировщика Mozilla не назвала; доступность функции по регионам анонс не описывает.</li></ul><h2>Почему блокировщик пришлось встраивать</h2><p>Apple разрешает сторонним браузерам блокировать контент только через свой механизм <b>Content Blocker</b>: приложение отдаёт WebKit готовый список правил, а сам движок решает, какие запросы не выполнять. Расширение не может «посмотреть» на страницу и вмешаться в её код, как это делает uBlock Origin на десктопе. Mozilla взяла список EasyList, самый распространённый набор правил для рекламы, и упаковала его в такой блок правил внутри приложения.</p><blockquote>Ad Blocker uses Apple's WebKit Content Blocker technology and the EasyList filter list.</blockquote><p>Из этой архитектуры следуют ограничения, которые Mozilla перечисляет сама. Реклама, которую сайт отдаёт с собственного домена, может остаться, потому что её не отличить от контента по URL. Реклама в результатах поиска не блокируется. Рекламные ярлыки на стартовой странице самого Firefox к блокировщику не относятся. Включается всё в три касания: Settings, Browsing, Ad Blocker; там же выключается, если сайт перестал работать.</p><h2>Что Firefox 155 даёт верстальщику</h2><p>По <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/155">заметкам для разработчиков на MDN</a>, самое полезное в CSS — функция progress(): она возвращает долю от 0 до 1, показывающую, где значение находится между двумя границами. Раньше такой расчёт делали руками через calc(), теперь адаптивные размеры шрифта и отступов записываются короче. Функция alpha() меняет прозрачность цвета без переписывания его в rgb(), а attr() отныне работает в любом свойстве, а не только в content.</p><p>В JavaScript добавились Promise.allKeyed() и Promise.allSettledKeyed(): они принимают объект с промисами и возвращают объект с теми же ключами, так что не нужно сопоставлять результаты по индексам массива. Свойство font-width заменило font-stretch, старое имя оставлено как псевдоним. Если импорт модуля упал из-за временной ошибки сервера, повторный импорт теперь может выполниться успешно; это касается JS, JSON, CSS и текстовых модулей. В сетевом стеке появилось согласование QUIC version 2 для HTTP/3, а JSON Viewer в DevTools научился читать NDJSON построчно.</p><p>Для автотестов: в WebDriver BiDi исправлены перезагрузка фреймов, подписки и конфликт с DevTools, в WebRTC добавлена поддержка двухбайтовых RTP-заголовков с идентификаторами от 15 и новые поля статистики. Перед использованием progress() и alpha() в проде стоит сверить поддержку в Chrome и Safari на caniuse: MDN описывает только Firefox.</p><h2>Почему обновиться сегодня</h2><p><a href="https://www.mozilla.org/en-US/security/advisories/mfsa2026-82/">Бюллетень MFSA 2026-82</a> сопровождает релиз набором исправлений. CVE-2026-84119 (выход из песочницы через use-after-free в навигации DOM), CVE-2026-84143 и CVE-2026-84144 помечены как уязвимости высокого уровня, CVE-2026-84142 объединяет внутренне найденные ошибки памяти умеренного уровня. Отдельно для Firefox на Android бюллетень называет повышение привилегий (CVE-2026-84117, высокий уровень) и раскрытие информации через WebExtensions (CVE-2026-84127, умеренный уровень). Обновление на 155 закрывает всё это разом; на десктопе и Android оно важнее новых функций.</p><h2>Что дальше</h2><p>Mozilla объясняет встроенный блокировщик ограничениями расширений на iOS и формулирует их как «недоступны таким же образом», а не «невозможны навсегда»: в ЕС и Японии Apple уже допускает альтернативные движки, и если Firefox на iOS когда-нибудь перейдёт на Gecko, вопрос с расширениями встанет заново. Пока же блокировщик работает ровно в тех пределах, которые задаёт Content Blocker API.</p><p>Источники: <a href="https://blog.mozilla.org/en/firefox/ad-blocker-on-ios/">Introducing Ad Blocker for Firefox on iOS (Mozilla)</a>, <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/155">Firefox 155 for developers (MDN)</a>, <a href="https://www.mozilla.org/en-US/security/advisories/mfsa2026-82/">Mozilla Foundation Security Advisory 2026-82</a></p><p>Изображение на обложке: Mozilla</p>]]></content:encoded>
    </item>
    <item>
      <title>Кнопка «наверх» в Django: почему в проде это уже не три строки JavaScript</title>
      <link>https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j</link>
      <comments>https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Фёдор Малков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j</guid>
      <description><![CDATA[<p>Как добавить кнопку «наверх» в Django-сайт и Django Admin: настройка, CSP, доступность, мобильная версия и работа рядом с cookie-баннерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/knopka-naverh-v-django-pochemu-v-prode-eto-uzhe-ne-tri-stroki-j">Кнопка «наверх» в Django: почему в проде это уже не три строки JavaScript</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[CDN]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Jul 2026 13:01:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Как сделать scroll-to-top для сайта и Django Admin, не забыв про мобильные устройства, CSP, доступность, плавающие виджеты и нормальную настройку без правки шаблонов.</p><p>На первый взгляд кнопка «наверх» — задача на пять минут. Добавил<i> position: fixed</i>, обработчик window.scrollTo()  — готово.</p><p>Но стоит этой кнопке появиться в живом проекте, как выясняется, что она пересекается с cookie-баннером, мешает чату поддержки, выглядит иначе в мобильной версии, не дружит со строгим CSP или пропадает из Django Admin.</p><p>В итоге маленькая UI-деталь начинает обрастать условиями. Я решил собрать их в отдельный Django-пакет — django-scroll-to-top</p><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/000bf08b-be8e-4252-82ce-dbef3556426e.webp" alt="Пример кнопки &quot;Наверх&quot; на демо сайте" /><figcaption>Пример кнопки "Наверх" на демо сайте</figcaption></figure><h2>Когда трёх строк JavaScript достаточно</h2><p>Для небольшого сайта, где нет сложной верстки, админки, CSP и требований к повторному использованию, самый простой вариант действительно выглядит примерно так:</p><p>Это нормальное решение. Не всегда стоит тянуть пакет ради одной кнопки.</p><p>Но в реальном Django-проекте быстро появляются дополнительные вопросы:</p><ul><li>когда именно показывать кнопку: после 300 пикселей, одного экрана или только при прокрутке вверх;</li><li>что делать на коротких страницах;</li><li>как не перекрыть cookie-баннер, чат, toast-уведомления или нижнюю мобильную навигацию;</li><li>как дать пользователю закрыть кнопку;</li><li>как не сломать клавиатурную навигацию и режим reduced motion;</li><li>как сделать отдельное оформление для сайта и Django Admin;</li><li>как не заставлять проект добавлять unsafe-inline в Content Security Policy;</li><li>как позволить редактору или администратору изменить цвет, положение и иконку без нового деплоя.</li></ul><p>Именно в этот момент «три строки JavaScript» превращаются в отдельный компонент.</p><h2>Что я хотел получить</h2><p>Цель была не в том, чтобы сделать ещё одну стрелку в правом нижнем углу. Хотелось собрать переиспользуемый компонент со следующими свойствами:</p><ol><li>Подключение сайта одной template-тегом.</li><li>Отдельная поддержка обычных страниц и стандартного Django Admin.</li><li>Настройка внешнего вида через админку, а не через постоянную правку CSS.</li><li>Без jQuery, CDN, фронтенд-фреймворка и обязательной сборки.</li><li>Безопасная работа при строгой CSP.</li><li>Прогрессивное улучшение: без JavaScript остаётся обычная ссылка в начало страницы.</li><li>Возможность жить рядом с другими фиксированными элементами интерфейса.</li></ol><p>Пакет в итоге хранит обычные настройки установки в settings.py, а визуальное поведение — в базе данных. Это позволяет менять кнопку через Django Admin, публиковать новую версию настроек и при необходимости откатываться на предыдущую. В проекте есть отдельные профили для публичного сайта и Django Admin, а ревизии могут быть черновыми, опубликованными или архивными.</p><h2>Быстрое подключение</h2><p>Базовый сценарий начинается с установки:</p><p>В settings.py добавляем приложение. Если нужна поддержка стандартной админки, пакет должен идти раньше django.contrib.admin:</p><p>Включаем области, где должна работать кнопка:</p><p>Для публичной части добавляем URLConf пакета:</p><p>А в общий шаблон сайта — один тег:</p><p>На стандартном Django Admin ничего дополнительно вставлять не нужно: пакет использует обычный механизм разрешения шаблонов Django. Если же в проекте переопределён admin/base_site.html  тег можно добавить вручную в блок footer</p><h2>Настройка без превращения админки в редактор CSS</h2><p>Мне не хотелось хранить в базе шаблоны, произвольный CSS или JavaScript. Это неудобно для сопровождения и создаёт лишнюю поверхность для ошибок.</p><p>Поэтому визуальная часть собрана из контролируемых вариантов:</p><ul><li>круг, квадрат, скруглённый квадрат или pill;</li><li>заливка solid, outline, soft, ghost, glass или gradient;</li><li>положение в любом углу экрана;</li><li>отдельные размеры для desktop и mobile;</li><li>светлая и тёмная тема;</li><li>встроенные иконки, иконки от разработчика или загружаемые SVG;</li><li>настройки тени, границы, opacity и focus ring.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/90107109-2271-460a-9dea-815592d468e7.webp" alt="Настройки кнопки" /><figcaption>Настройки кнопки</figcaption></figure><h2>Что происходит, когда рядом есть cookie-баннер или чат</h2><p>Нижний правый угол страницы редко бывает свободен. Там часто живут:</p><ul><li>cookie-баннер;</li><li>компактная кнопка после закрытия баннера;</li><li>чат поддержки;</li><li>кнопка обратного звонка;</li><li>мобильная навигация;</li><li>toast-уведомления.</li></ul><p>Пакет умеет рассматривать такие элементы как препятствия. Для этого можно пометить элемент атрибутом:</p><p>Дальше для кнопки можно выбрать поведение: игнорировать препятствия, сдвинуться вдоль края, попробовать другой угол или скрыться, если безопасного места не осталось.</p><p>Для сложных виджетов есть отдельный адаптер: он может отслеживать появление и исчезновение элементов, например компактного launcher после закрытия cookie-баннера. При этом ни cookie-пакет, ни чат не становятся зависимостями  django-scroll-to-top</p><h2>Доступность — не отдельная галочка в конце</h2><p>У кнопки есть понятное имя для screen reader, поддержка клавиатуры, видимый focus-visible, минимальный размер области нажатия и режим prefers-reduced-motion.</p><p>Если пользователь отключил анимации на уровне системы, плавная прокрутка не будет навязываться. Если JavaScript не загрузился, кнопка остаётся обычной ссылкой на начало документа.</p><p>Полный независимый аудит WCAG 2.2 AA и тестирование масштабирования 200% и 400% пока находятся в roadmap, поэтому называть компонент полностью сертифицированным по WCAG было бы неправильно. Но структурные требования — клавиатурная доступность, фокус, reduced motion, forced-colors и безопасная работа без JavaScript — уже заложены в компонент и покрываются тестами.</p><h2>CSP и загружаемые SVG</h2><p>В корпоративных проектах часто нельзя просто добавить inline-скрипт и включить unsafe-inline ради одной кнопки.</p><p>По умолчанию компонент использует same-origin CSS и JavaScript. Для него подходит политика такого вида:</p><p>Настраиваемые цвета и размеры отдаются не через inline-стили, а через версионированный stylesheet endpoint. Это позволяет сохранить простой контракт с одним template-тегом и не ослаблять CSP.</p><p>Отдельно пришлось подумать о загружаемых SVG. Админ не рендерит исходный файл как есть: SVG проходит санитарную обработку. Скрипты, обработчики событий, внешние ресурсы, встроенные документы и небезопасные namespace отклоняются. Для загружаемых иконок также хранится информация об авторе, источнике и лицензии.</p><h2>Ревизии, публикация и откат</h2><p>Одна из самых полезных вещей в пакете — не сама кнопка, а жизненный цикл её настроек.</p><p>Можно создать черновик, посмотреть результат в live preview, опубликовать изменения или вернуться к предыдущей версии. Это особенно удобно, когда кнопку настраивает не разработчик, а контент-менеджер или дизайнер.</p><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/c9840966-4e32-4506-807a-ac78830fecfa.webp" alt="Живой предпросмотр" /><figcaption>Живой предпросмотр</figcaption></figure><p>У ревизий есть три состояния:</p><ul><li>draft — редактируемый черновик;</li><li>published — текущая активная конфигурация;</li><li>archived — сохранённая версия для отката.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/139342/2026-06-29/2fcf0cfc-b29e-4ce1-b1de-9c07aac1fce0.webp" alt="настройки ревизий профиля кнопки" /><figcaption>настройки ревизий профиля кнопки</figcaption></figure><h2>Где пакет уместен, а где нет</h2><p>django-scroll-to-top имеет смысл, когда кнопка нужна в нескольких проектах, должна работать в Django Admin, настраиваться без деплоя или жить в окружении со строгими требованиями к CSP и интерфейсу.</p><p>Для лендинга на одну страницу проще и правильнее написать несколько строк самостоятельно. Это будет быстрее, понятнее и дешевле в сопровождении.</p><p>Но если такая маленькая деталь начинает повторяться в нескольких продуктах, появляется необходимость поддерживать мобильную версию, доступность, независимые настройки для сайтов и админки, то отдельный компонент уже перестаёт быть избыточным.</p><p>Сейчас пакет выпущен как beta-версия 0.2.0, требует Python 3.10+ и поддерживает Django 4.2 LTS, 5.x и 6.0. Лицензия — MIT.</p><p>Исходный код, документация и примеры использования доступны в GitHub-репозитории проекта.</p><p>Пакет опубликован в PyPI под именем django-scroll-to-top.</p><p>Обратная связь, баг-репорты и предложения по интеграции с кастомными Django Admin-темами приветствуются в Issues.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как сделать 3D-вращение изображений при скролле: разбираем эффект от Codrops</title>
      <link>https://tproger.ru/articles/kak-sdelat-3d-vrashhenie-izobrazhenij-pri-skrolle-razbiraem-effek</link>
      <comments>https://tproger.ru/articles/kak-sdelat-3d-vrashhenie-izobrazhenij-pri-skrolle-razbiraem-effek?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-sdelat-3d-vrashhenie-izobrazhenij-pri-skrolle-razbiraem-effek</guid>
      <description><![CDATA[<p>Разбираем, как устроен эффект 3D-вращения картинок из свежей статьи Codrops. Примеры кода на GSAP, Lenis и CSS-трансформации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-sdelat-3d-vrashhenie-izobrazhenij-pri-skrolle-razbiraem-effek">Как сделать 3D-вращение изображений при скролле: разбираем эффект от Codrops</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Jun 2026 08:09:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>Хотите, чтобы лендинг или портфолио запомнили с первого взгляда? Попробуйте добавить изображениям объёмное вращение при скролле. Эффект выглядит дорого и кинематографично, но под капотом — обычные CSS 3D-трансформации и немного JavaScript.</p><p>В начале июня команда Codrops опубликовала небольшую, но наглядную демонстрацию: галерея фотографий проезжает через вьюпорт, пока каждая картинка медленно кувыркается в трёхмерном пространстве. Идея позаимствована у аниматора Jason Booth, а код выложен на GitHub вместе с пятью готовыми вариациями.</p><p>В этой статье разберёмся, как устроен эффект, из чего состоит математика и как быстро повторить его у себя — без WebGL, Canvas и тяжёлых библиотек.</p><p>Эффект строится на CSS-свойствах perspective и transform-style: preserve-3d, а анимация крутит rotationX/Y/Z и translateZ по прогрессу скролла.</p><p>Для синхронизации с прокруткой используется GSAP ScrollTrigger с параметром scrub: true; плавность даёт библиотека Lenis.</p><p>Codrops предлагает пять вариаций: от мягкого волнообразного движения до агрессивного разворота с blur и изменением яркости.</p><p>Всего нужно три ингредиента: разметка с фоновыми изображениями, CSS для 3D-контекста и 30—40 строк JS, которые связывают скролл с трансформациями.</p><h2>Как устроен базовый эффект</h2><p>В основе лежит простая мысль: каждая картинка — это не плоский прямоугольник, а объект в 3D-пространстве. Пока пользователь скроллит страницу, объект проходит перед «камерой» и меняет ориентацию. Входная точка анимации начинается, когда элемент появляется снизу экрана, а заканчивается, когда уходит вверх.</p><p>Для реализации используется связка GSAP + ScrollTrigger. Параметр scrub: true привязывает анимацию напрямую к позиции скролла: чем дальше прокручено, тем сильнее трансформация. Библиотека Lenis отвечает за плавность: без неё колёсико мыши на Windows или трекпад на macOS могут давать рваное движение, и вся магия растворится.</p><h3>Разметка и CSS</h3><p>HTML минимален: контейнер .gallery и набор .gallery__item с фоновыми картинками. Главное — обернуть каждый item дополнительным .gallery__item-wrap и задать ему perspective. Именно обёртка создаёт 3D-контекст, внутри которого вращается сама картинка.</p><h3>Плавный скролл и триггеры</h3><p>Перед запуском анимации инициализируем Lenis и связываем её с GSAP. Это стандартный «боеприпас» для большинства современных сайтов с анимацией по скроллу.</p><h3>Математика вращения</h3><p>Каждой картинке случайно задаётся начальная ориентация по трём осям. Затем GSAP анимирует от этих значений до противоположных, создавая эффект «переворота» на 180°. В обработчике onUpdate вычисляется смещение по оси Z: чем ближе элемент к центру экрана, тем глубже он «погружается» в пространство.</p><p><b>Совет:</b> если вы убираете плавный скролл, протестируйте эффект на мобильном устройстве. Нативный скролл на iOS и Android может дать менее плавную картинку, и тогда имеет смысл оставить Lenis или добавить @media (prefers-reduced-motion) для доступности.</p><h2>Пять вариаций одной идеи</h2><p>Codrops не ограничивается одной анимацией: в репозитории пять HTML-файлов, каждый из которых демонстрирует, как одно и то же ядро превращается в разное настроение. Вот краткая карта отличий.</p><ul><li><b>Вариант 1.</b> Мягкое волнообразное расположение картинок по горизонтали, случайные углы rotationX 70—120° и небольшой зазор по Z (−50 px). Универсальная, спокойная подача.</li><li><b>Вариант 2.</b> Больший размах по rotationX (240—290°) и усиленная глубина до −300 px. Картинки буквально переворачиваются перед глазами.</li><li><b>Вариант 3.</b> Триггер вычисляет поворот через cos(progress * π), добавляет сдвиг по Y (yPercent) и фильтры saturate/brightness. Получается «подводное» движение.</li><li><b>Вариант 4.</b> Акцент на скорости: в обработчике Lenis отслеживается velocity, и чем быстрее скролл, тем сильнее blur и ниже насыщенность. Динамично и спортивно.</li><li><b>Вариант 5.</b> Агрессивное искажение масштаба: scaleX и scaleY меняются в противофазе, картинки растягиваются и сжимаются, проходя через центр экрана.</li></ul><h2>Мини-руководство: повторяем у себя</h2><p>Чтобы не копировать всю демку целиком, можно взять только схему и адаптировать под свой проект. Ниже — самый короткий путь от макета до рабочей анимации.</p><h2>FAQ</h2><h2>Выводы</h2><p>3D-анимации по скроллу — это способ сделать обычную галерею запоминающейся без тяжёлых WebGL-сцен. Хватает CSS-свойств perspective и transform-style, пары строк GSAP и библиотеки Lenis для плавности.</p><p>Главное, что предлагает Codrops, — не готовый плагин, а отправная точка. Пять вариаций показывают, как одну и ту же идею можно растянуть от спокойного волнообразного движения до агрессивного искажения с blur. Возьмите базовую схему, подберите углы и фильтры под свои картинки — и получите эффект, который будет выглядеть так, будто над ним работала целая команда аниматоров.</p><blockquote>Пользователь не запоминает интерфейс, который просто красив. Он запоминает тот, который отзывается на его действия.</blockquote><p>Источники: оригинальная статья <a href="https://tympanus.net/codrops/2026/06/18/exploring-3d-image-rotations-on-scroll/">Codrops</a>, демо <a href="https://tympanus.net/Development/RotatingOnScrollAnimations/">Rotating On-Scroll Animations</a> и исходный код на <a href="https://github.com/codrops/RotatingOnScrollAnimations">GitHub</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Фреймворк-независимые дизайн-системы: практический подход к веб-компонентам</title>
      <link>https://tproger.ru/translations/frejmvork-nezavisimye-dizajn-sistemy-prakticheskij-podhod-k-veb-2</link>
      <comments>https://tproger.ru/translations/frejmvork-nezavisimye-dizajn-sistemy-prakticheskij-podhod-k-veb-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/frejmvork-nezavisimye-dizajn-sistemy-prakticheskij-podhod-k-veb-2</guid>
      <description><![CDATA[<p>Как построить дизайн-систему без привязки к фреймворку, используя веб-стандарты и веб-компоненты. Пошаговое руководство с примерами кода и документацией. Разбираем на практике.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/frejmvork-nezavisimye-dizajn-sistemy-prakticheskij-podhod-k-veb-2">Фреймворк-независимые дизайн-системы: практический подход к веб-компонентам</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 14 Jun 2026 07:00:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод статьи Scott Riley (Piccalilli), оригинал: https://piccalil.li/blog/framework-agnostic-design-systems-part-1/<br /><br />Прежде чем мы начнём, небольшое примечание: это практическое руководство, которое охватывает управление, создание и упаковку компонентов дизайн-системы. Невозможно углубляться в каждый шаг до мельчайших деталей, не превратив материал в полноценный курс. Предполагается наличие некоторых базовых знаний:</p><ul><li>Базовые знания HTML и CSS</li><li>Базовое понимание веб-компонентов</li><li>Установленные Node.js и npm</li><li>Умение работать в терминале на уровне, достаточном для установки пакетов</li><li>Базовые знания конфигурационных файлов и JSON</li><li>Понимание революционной идеи о том, что &lt;button&gt; — это не &lt;div&gt;</li></ul><p>Наконец, это довольно длинный пост. Считайте каждый h2 приглашением сделать перерыв на чай и подышать свежим воздухом.</p><p><a href="https://www.youtube.com/watch?v=AWM5ZNdWlqw">Okayyyyylet’sgo</a>.</p><h2>Фреймворк-независимые компоненты</h2><p>Из всех недавних хайпов/пузырей/назовите их как хотите в мире технологий тот, что одновременно волновал и ставил в тупик меня в равной степени, — это бум дизайн-систем. Общая концепция определённо фантастическая, и почти любая команда или проект могут извлечь пользу из какой-либо формы централизованного хранилища дизайнерских решений. Но, как и любой другой бум, он породил много <i>странностей</i>. Люди сошлись на определённых способах восприятия дизайна в «эпоху дизайн-систем», слайды <a href="https://atomicdesign.bradfrost.com/chapter-2/">Atomic Design</a> в каждой конференц-презентации стали мемом, а дизайн-токены стали целой личностью для некоторых.</p><p>Этот пост — не обо всех странностях, но нам нужно опереться на что-то более конкретное, чем <i>крутая технология — это круто</i>. И одна из моих наименее любимых странностей из курса «Дизайн-системы: странности 101» довольно специфична, но при этом является источником настоящей физической боли для меня: <i>библиотеки компонентов, привязанные к конкретному фреймворку</i>.</p><p>Идея о том, что наши дизайн-системы могут, и даже должны, работать на компонентах, написанных под конкретный фреймворк, кажется мне дикой. Дизайн-системы, по крайней мере частично, должны быть про универсальность, компонуемость и переносимость. Встраивание привязки к фреймворку в уравнение с самого первого дня абсолютно нелепо.</p><p>Я понимаю, что веб-стандарты немного отставали на заре дизайн-систем, а веб-компоненты и кастомные элементы отставали от всех тех приятных возможностей, которые предлагают реактивные фреймворки с управлением состоянием. К счастью для нас, это больше не так, и существует ряд замечательных инструментов, построенных вокруг создания и потребления стандартных веб-компонентов.</p><p>На самом деле, я бы даже сказал, что на момент написания этого поста веб-компоненты — <i>единственно лучший подход</i> к созданию библиотеки компонентов. Они переносимы, используют веб-стандарты, и любой фреймворк, который не является полным бардаком (и многие, которые являются, смотрю на тебя, React), будет поддерживать их либо напрямую, либо с минимальной конфигурацией.</p><p>Отвлечения в сторону, этот пост будет максимально практичным введением в создание веб-компонентов с использованием веб-стандартов, современного CSS и некоторых удобных инструментов, которые помогут нам ускориться. Он также будет весьма субъективным и сильно опираться на идею, что мы должны поставлять нашу библиотеку вместе с документацией в одном репозитории. Вы не <i>обязаны</i> заниматься всеми этими штуками с документацией, если не хотите, но я настоятельно рекомендую попробовать. Весь код здесь для вас, так почему бы и нет!</p><h2>Принципы</h2><p>Сначала рассмотрим несколько принципов. Если они вам близки — читайте дальше; если нет — можете закрыть вкладку, заварить чай и заняться своими делами.</p><h3>Минимально возможный уровень</h3><p>Хотя существует масса инструментов, которые превращают компоненты для конкретного фреймворка (давайте будем честны — почти всегда это React) в веб-компоненты, я не думаю, что такой подход соответствует тому, что мы <i>говорим</i>, что хотим от наших библиотек компонентов и паттернов по духу.</p><p>Когда мы создаём компоненты и проектируем API компонентов, мы разрабатываем некоторые из самых атомарных элементов дизайн-системы. В таком сценарии, на мой взгляд, есть явная, ощутимая польза от работы максимально близко к платформе доставки. Для веб-продуктов это означает работу непосредственно с веб-стандартами.</p><p>На уровне компонентов я гораздо более настроен на удаление слоёв абстракции и работу ближе к веб-стандартам. Вместо того чтобы сразу прыгать в модный фреймворк, я гораздо больше предпочитаю работать с инструментами сборки и лёгкими обёртками. Это означает, что вы всегда находитесь в «режиме веб-стандартов», идёте прямым путём. Горжусь вами.</p><h3>Максимально простые компоненты</h3><p>Компоненты должны быть максимально примитивными. Даже самый, казалось бы, сложный компонент можно представить как очень простую конечную машину состояний. Мне ещё не встречался компонент, который нельзя было бы выразить таким образом, и вам не нужно по умолчанию обращаться к раздутому фреймворку для простых вариантов компонентов и изолированного состояния.</p><p>Я бы даже сказал, что многие реактивные компоненты — это антипаттерн. Реактивность обычно означает логику, и очень часто это приводит нас в область «бизнес-логики» и общего состояния на уровне контейнера или приложения. Простая реактивность на уровне компонента часто необходима — представьте кнопку, которая показывает спиннер загрузки, пока что-то обрабатывается, и возвращается в исходное состояние, когда всё готово, — но добавление тонн состояний и реактивности в изолированном коде компонента всегда <i>кажется</i> мне красным флагом.</p><p>По моему опыту, компоненты наиболее полезны, когда им явно сообщают, какое состояние они должны отражать и какой контент содержать. Они намеренно ограничены и явно декларативны. Обработка сложного состояния и реактивности в вашем приложении, даже если это означает комбинирование нескольких примитивов в паттерн, специфичный для приложения, гораздо более разумна, чем попытка централизовать сложный громадный компонент, который пытается слишком многое обрабатывать.</p><h3>Максимально устойчиво к будущему</h3><p>Устоявшиеся фреймворки со временем становятся устаревшими технологиями. Учитывая всю работу по «переписыванию Angular-проектов на React», на которой некоторые из нас спокойно прожили целых два года, мы должны это понимать. Сам React становится (можно спорить, <a href="https://adactio.com/journal/20618">уже стал</a>) устаревшей технологией, а «переписывание нашего React-приложения на Solid/Svelte» — теперь обычное дело. Я вполне ожидаю, что это будет повторяться до тошноты.</p><p>Веб-стандарты — хотя, признаюсь, они развиваются медленнее и поддерживаются утомительными, своеобразными процессами выпуска — всегда будут с нами. Веб-стандарты выдержали проверку времени и последовательно доказывают, что они заметно более надёжны, чем ваш проблемный любимый, переусложнённый фреймворк.</p><p>Фреймворки тоже по-настоящему замечательны, когда используются правильно. Говоря по опыту, попытка написать состоятельные, реактивные приложения на ванильном HTML, CSS и JS — закаляющая, но в конечном счёте неразумная задача. Однако примитивные компоненты — это не сложные, состоятельные, реактивные веб-приложения. Это маленькие куски атомарного веб-кода, и создавать их со всеми накладными расходами и своеобразиями полноценного фреймворка — это просто приглашение к будущему устареванию.</p><p>Создавая <i>непосредственно с помощью веб-стандартов</i>, мы получаем более низкоуровневое понимание того, как работают наши компоненты, встроенную защиту от будущего, избегая модного фреймворка, и по сути более прогрессивную, доступную (или, по крайней мере, более легко делаемую доступной) и нативную для веба библиотеку компонентов.</p><p>Разделяя ваши атомарные компоненты дизайн-системы от ваших <i>компонентов приложения</i>, вы получаете лучшее из обоих миров: переносимые, примитивные компоненты на уровне системы; сложные и реактивные компоненты и обёртки на уровне приложения.</p><p>Таким образом, когда вам действительно понадобится переписать приложение на Solid/Svelte, вам хотя бы не придётся переписывать всю библиотеку компонентов вместе с ним.</p><h3>Принимать решения в коде</h3><p>Я абсолютно готов стоять насмерт на этой позиции. Инструменты для дизайна — <i>ужасные</i> места для принятия решений по <i>дизайн-системе</i>. Это отчасти потому, насколько оторваны такие инструменты, как Figma, от того, как на самом деле работают дизайн-системы, вплоть до откровенно катастрофического несоответствия словаря и концепций.</p><p>Как человек, который по сути больше дизайнер, чем разработчик, я создал и работал с более чем дюжиной «дизайн-систем» в Figma. Как человек, который также проводит гораздо больше времени в коде, чем в инструментах дизайна, я считаю себя вправе сказать, что ни одна из них не отражала того, чем должна быть хорошая системная основа. Это не укол в сторону дизайнеров, которые не пишут код, скорее просто показывает, насколько сложной <i>сами инструменты</i> делают эту часть нашей работы.</p><p>Инструменты для дизайна — это места для быстрого тестирования разных идей и экспериментов со стилем и компоновкой. Они абсолютно ужасны для кодификации системных решений, отчасти из-за своей самой природы: они предоставляют очень маленькое, проприетарное подмножество возможностей нашего реального носителя — браузера.</p><blockquote>Так же и браузер, но я рискую укрепиться на том самом холме.</blockquote><p>Окончательные системные дизайнерские решения должны приниматься в браузере. Токены цвета могут использовать современные цветовые пространства. Токены размеров и отступов должны выражаться в относительных единицах, где это возможно. Почти каждый тип токена может выиграть от какой-либо математики, включая логарифмические шкалы для типографики или программные сдвиги оттенка и светлоты для цветов. API компонентов также следует строить с помощью надёжных, хорошо типизированных определений. Инструменты дизайна могут предложить лишь подобие этих концепций.</p><p>Если вы начинаете с Figma — это вполне нормально, но это ужасный источник истины. Воспринимайте свой инструмент дизайна как точный инструмент прототипирования, а не как конечную цель для дизайнерских решений.</p><h3>Документировать по ходу разработки</h3><p>Опираясь на последний принцип, если лучшее место для принятия решений — код, то лучшее время для документирования этих решений — фаза сборки, пока они свежи в вашей голове. Разрабатываете props? Ну посмотрите-ка, у вас уже есть прекрасный набор определений типов для этих props, неплохо было бы добавить туда маленький комментарий <a href="https://jsdoc.app/">JSDoc</a> и заняться своими делами.</p><p>Мне нравится идти дальше и разворачивать библиотеку компонентов прямо в документирующем фреймворке вроде <a href="https://vitepress.dev/">VitePress</a>, активно создавая человекочитаемую документацию параллельно с разработкой самих компонентов. Это не только в итоге станет «официальной» документацией дизайн-системы, но и позволит проверить, насколько переносимы ваши компоненты.</p><p>Это делает мой мозг счастливым, потому что полное кодовое представление моих дизайн-систем (что абсолютно, всегда включает фактическую документацию) живёт в одном репозитории. Всю систему можно развернуть, не жонглируя зависимостями, и это заставляет меня относиться к документации как к необходимому шагу к релизу.</p><h2>Давайте создадим (и задокументируем)</h2><p>Ладно, хватит болтать, давайте на самом деле создадим что-то практичное. Мы соберём основы для централизованной, независимой от фреймворка библиотеки компонентов. Мы будем прорабатывать документацию по мере создания компонентов, что даст нам действительно чистый тестовый стенд для самих компонентов. Настоящий порочный круг, если таковой вообще был.</p><p>Вот что у нас будет в конце этой статьи:</p><ul><li>Основа для нашей гибридной библиотеки компонентов/документации «всё-в-одном» дизайн-системы</li><li>Стильная, хорошо задокументированная кнопка как веб-компонент</li><li>Развёртываемый сайт документации, который показывает, как замечательна наша кнопка</li><li>Готовая к продакшену библиотека компонентов, которую можно опубликовать в вашем любимом пакетном менеджере</li></ul><p>Нам действительно нужно беспокоиться только о двух инструментах: <a href="https://elenajs.com/">Elena</a> для сборки и распространения нашей библиотеки компонентов и <a href="https://vitepress.dev/">VitePress</a> для создания нашей документации.</p><h3>Elena</h3><p>Клей для всего этого проекта — Elena. Фантастическая библиотека от непобедимого <a href="https://arielsalminen.com/">Ariel Salminen</a> для создания прогрессивных веб-компонентов. Я не буду углубляться в философию того, что означает «прогрессивный» в этом контексте, потому что это уже <a href="https://arielsalminen.com/2026/progressive-web-components/">исключительно хорошо задокументировано</a> самим Ariel.</p><p>Elena — это крошечная библиотека, которая делает Just Enough Abstraction™ поверх стандартных веб-компонентов. Мы получаем такие вещи, как props (отражаемые как пользовательские атрибуты), изолированную реактивность, методы жизненного цикла и даже классные штуки вроде миксинов для компонуемости. Мы не будем углубляться <i>слишком</i> сильно в Elena, но следите за ходом мысли и, если вам понравятся основы, я очень рекомендую погрузиться во всё, что она предлагает. Это круто.</p><p>Цитата из <a href="https://elenajs.com/#why-should-i-use-elena">документации Elena</a>:</p><blockquote>[Elena] берёт на себя межфреймворковую сложность (синхронизация prop/атрибута, делегирование событий, совместимость с фреймворками), чтобы вы могли сосредоточиться на создании компонентов, а не на инфраструктуре.</blockquote><p>Именно этого я и хочу от такого инструмента: позвольте мне писать код, не абстрагируйте веб-стандарты, разберитесь со всей странной ерундой, которую я не хочу трогать.</p><h3>VitePress</h3><p>Я не буду тратить много времени на VitePress, потому что, честно говоря, это просто самое удобное готовое решение для документации, которое не называется Storybook. Пара npm install — и у нас есть надёжное, основанное на Markdown решение для документации, готовое к работе.</p><p>Позже мы сделаем несколько классных штук с VitePress, JSDoc и нашим сгенерированным Elena манифестом пользовательских элементов, что поможет ускорить процесс документирования, но, честно говоря, иметь <i>где-то</i> документировать гораздо важнее, чем то, <i>во что</i> мы документируем.</p><h3>Структура проекта</h3><p>Здесь всё может изначально показаться немного странным. Хотя нам нужно собирать и распространять наши компоненты как отдельную библиотеку, нам также нужно их видеть и тестировать. Самый простой способ — это слепить статический сайт и просто свалить все компоненты на одну страницу. Это <i>вполне нормально,</i> и, по сути, я бы поощрил это, если вы просто экспериментируете с Elena, но по причинам, изложенным выше, я считаю, что имеет большой смысл создавать <i>внутри</i> нашей документации.</p><p>У нас по сути будет что-то вроде монорепозитория: Elena будет делать своё дело на уровне компонентов, а сам сайт документации будет статически генерироваться с помощью VitePress.</p><h2>Создание каркаса проекта</h2><p>Здесь довольно много движущихся частей, поэтому вместо того, чтобы просто кидать вам дикую цепочку склеенных npm install, давайте разберём настройку шаг за шагом.</p><p>Для начала создадим папку проекта:</p><p>Замените my-ds на любое название, которое хотите дать своему проекту.</p><p>Затем инициализируем npm:</p><p>Команда npm init -y создаст файл package.json в корне проекта. Эта корневая папка напрямую ничего не будет делать — она просто склеивает наши компоненты и документацию вместе в монорепозитории.</p><p>Приведём в порядок наш package.json:</p><p>Здесь происходит кое-что, что пока не имеет особого смысла (и даже не будет работать) — это станет понятно чуть позже. Настройка workspaces позволит нам обращаться со сборкой библиотеки компонентов как с пакетом, не публикуя его, а скрипты dev, а также различные watch и build позволят нам отслеживать и собирать либо документацию, либо компоненты (либо оба варианта одновременно с помощью команды dev).</p><p>Кстати, давайте установим пару штук:</p><p>Это установит concurrently, который позволит нам запускать команду watch Elena и команду dev VitePress одновременно. Мы будем держать её запущенной, пока работаем. Также установится VitePress и его тема по умолчанию. Если хотите заморочиться — можете использовать другую тему.</p><h3>Настройка VitePress</h3><p>Настроим документацию. Для начала создадим папку docs:</p><p>Затем создайте docs/.vitepress/config.mjs:</p><p>Проверьте расширение!Обратите внимание: мы используем .mjs, а не .js — это заставляет Node трактовать файл как ESM. Это необходимо, потому что мы импортируем из vitepress. Вам не обязательно знать, что это значит. Честно говоря, я не уверен, что сам это понимаю. Просто убедитесь, что используете .mjs. Ладно, спасибо.</p><p>Здесь мы используем postIsolateStyles, чтобы ограничить область действия встроенных стилей .vp-doc VitePress и не дать им просочиться в наши примеры компонентов. Без этого встроенные стили VitePress <i>могут</i> переопределять стили ваших компонентов (включая инкапсулированные сбросы) из-за того, как Vite внедряет таблицы стилей во время выполнения.</p><p>Далее создайте минимальный docs/index.md, чтобы у VitePress была домашняя страница:</p><p>Сейчас хороший момент, чтобы проверить, всё ли работает:</p><p>Вы должны увидеть очень простой локальный сайт на VitePress! По умолчанию он будет доступен по адресу <a href="http://localhost:5173/">http://localhost:5173/</a>.</p><h3>Настройка Elena</h3><p>Теперь, для MVP нашей дизайн-системы, давайте установим Elena. Мы будем использовать Elena для создания компонентов и в конечном итоге распространять их в виде пакета. Именно здесь некоторые вещи из корневого package.json начинают обретать смысл.</p><p>Начнём с создания папки компонентов и инициализации npm для нашего пакета компонентов:</p><p>Далее отредактируйте packages/components/package.json:</p><p>Затем установите Elena:</p><p>Это установит Elena, её бандлер и CLI-инструмент.</p><p>Мы будем использовать CLI-инструмент Elena для создания каркаса наших компонентов. По сути, он проведёт нас через создание компонента, позволяя запустить команду, которая генерирует нужную папку и создаёт js- и css-файлы для любого компонента, который мы захотим создать. Подробнее об этом позже!</p><p>Пока что нам нужно настроить Elena. Во многих случаях можно пропустить этот шаг и просто использовать настройки по умолчанию. Однако мы ведём себя как глупые гуси и совмещаем документацию и компоненты в одном проекте, так что, возможно, придётся кое-что подкрутить. Плюс я люблю, когда конфиги явные, а не невидимые.</p><p>Создайте конфиг Elena по пути packages/components/elena.config.mjs:</p><p>Это говорит Elena, где искать наши компоненты (src), куда выводить собранные компоненты (dist) и где искать точку входа нашей библиотеки (src/index.js). Обратите внимание: все эти пути относительны директории packages/components, <b>а не</b> корня проекта. Наши инструменты Elena и библиотека компонентов самодостаточны.</p><p>Эта точка входа важна, если мы хотим импортировать все наши веб-компоненты через bundle.js, который генерирует Elena. Пока что создадим пустую.</p><p>Создайте packages/components/src/index.js. Пока что он может быть просто пустым или содержать комментарий-заглушку:</p><p>По мере создания компонентов мы сможем добавлять соответствующие export в этот файл, чтобы они попадали в наш production-бандл.</p><p>Убедитесь, что Elena работает: перейдите в корень проекта и выполните:</p><p>К сведениюЕсли вы запускаете это на Mac с Apple Silicon, то, скорее всего, столкнётесь с ошибкой. По моему опыту, это из-за зависимости Elena (lightningcss), которая немного кривая (простите за такую техническую терминологию). Если при попытке сборки вы получаете ошибку 'MODULE_NOT_FOUND', выполните следующее из корня проекта: Code languagebashCopy to clipboard rm -rf node_modules packages/components/node_modules package-lock.json &amp;&amp; npm install Это уничтожит папку node_modules и переустановит зависимости, разложив всё по своим местам. Если эта ошибка случилась однажды, то, скорее всего, придётся запускать это каждый раз при установке новой зависимости. Мне жаль. Управление пакетами — как всегда, Очень Приятное Занятие.</p><h2>И выдохнем…</h2><p>Отойдём на шаг назад, поставим чайник и посмотрим, что у нас есть. Ваша структура проекта должна выглядеть так:</p><p>Наша корневая папка по сути просто контейнер, так что особо беспокоиться о ней не стоит.</p><p>Наша папка docs — это место, где будет жить всё, связанное с VitePress. В конечном итоге это станет полноценной документацией дизайн-системы, и мы будем использовать её для предпросмотра и документирования наших компонентов по мере их создания.</p><p>Наша папка packages/components — это место, где мы будем работать со всем, связанным с компонентами. Папка packages/components/src — это место, где мы будем создавать компоненты, а index.js в ней — точка входа нашей библиотеки, где мы просто будем export'ировать любые компоненты, которые хотим включить в бандл.</p><p>Наша папка dist в packages/components — это место, где будут храниться собранная библиотека компонентов и манифест кастомных элементов. Затем мы сможем импортировать отсюда в наш проект VitePress так, будто это установленный пакет.</p><p>Однако чтобы дойти до этого, нам нужны какие-то реальные компоненты для распространения.</p><h2>Создаём наш первый компонент</h2><p>Теперь, когда всё настроено, мы наконец-то можем начать создавать компоненты! В этой статье мы будем держать всё просто и сосредоточимся на, возможно, самом распространённом компоненте: прекрасной кнопке.</p><p>По невероятному стечению обстоятельств ваш собственный веб-мастер Piccalilli, <a href="https://piccalil.li/author/andy-bell/">Andy Bell</a>, уже написал <i>великолепную</i> статью о <a href="https://piccalil.li/blog/how-i-build-a-button-component/">создании компонентов кнопок</a> на стандартном HTML и CSS. Мы будем опираться на эти принципы здесь, с небольшими изменениями, чтобы получить максимум от нашей настройки веб-компонентов.</p><p>Статья Andy отлично объясняет <i>почему</i> стоят за многими семантическими и структурными решениями, касающимися самих кнопок, поэтому я не буду углубляться в это слишком сильно. Andy прошёл путь, чтобы мы могли бежать. Какой человек.</p><h3>Композитные, примитивные и декларативные компоненты</h3><p>В основе концепции Elena «прогрессивные веб-компоненты» лежит разделение компонентов на три основные категории: <a href="https://elenajs.com/components/overview#_1-composite">композитные</a>, <a href="https://elenajs.com/components/overview#_2-primitive">примитивные</a> и <a href="https://elenajs.com/components/overview#_3-declarative">декларативные</a>. Документация Elena прекрасно объясняет различия подробно, но важно помнить, <i>что все это всё ещё просто веб-компоненты.</i> Нас не заставляют принимать нестандартные концепции или методы, скорее нас поощряют <i>думать</i> о наших компонентах в этих терминах.</p><p>Я позволю документации Elena сделать основную работу с этими определениями, но вот основные моменты:</p><ul><li><b>Композитные</b> компоненты оборачивают и расширяют свой внутренний HTML. Они отлично подходят для таких вещей, как слайдеры, аккордеоны, карточки и многослойные макеты — там, где вы чаще всего позволяете HTML и CSS делать основную работу и расширяете возможности с помощью JS в нужной области. Композитные компоненты также отлично подходят для <i>паттернов</i>, где мы можем захотеть объединить примитивные компоненты и HTML в переиспользуемые <i>«макро»</i> компоненты с определённым поведением. Подумайте о таких вещах, как диалоги, fieldsets и баннеры уведомлений — там, где структура и поведение фиксированы, но содержимое внутри остаётся гибким и определяется потребителем.</li><li><b>Примитивные</b> компоненты объявляют и рендерят свой собственный HTML и поставляются с собственной функцией render(). Это, вероятно, самые распространённые компоненты, которые мы будем использовать в дизайн-системе — подумайте о таких вещах, как кнопки, поля ввода, индикаторы загрузки, бейджи и т.д.</li><li><b>Декларативные</b> компоненты — это комбинация обоих типов и могут объединять Light DOM и декларативный Shadow DOM. Если мы не знаем, что нам <i>действительно</i> нужна инкапсуляция с Shadow DOM, мы можем практически игнорировать его для библиотек компонентов. Я не углублялся <i>слишком</i> сильно в это, но мои первые мысли таковы, что декларативные компоненты были бы отличны для полностью инкапсулированных компонентов, таких как веб-редакторы контента или блоки кода с подсветкой синтаксиса/редакторы, где инкапсуляция и изоляция часто критичны.</li></ul><p>На этот раз мы строим примитивный компонент. Наша кнопка будет объявлять и рендерить свой собственный HTML, и мы будем стилизовать её с помощью CSS в ограниченной области.</p><h3>Создаём каркас компонента</h3><p>Мы будем использовать CLI-помощник Elena для генерации папки и файлов, которые нам нужны для нашего компонента.</p><p>Пространства имён компонентов и пользовательские элементыМы используем сугубо учебный префикс my- для нашей кнопки, но зачем вообще нужен префикс? Это возвращает нас к тому, как пользовательские элементы требуют наличия - в имени тега, чтобы избежать конфликтов с нативными HTML-элементами. Если бы у нас был полный контроль, и мы создали компонент &lt;button&gt;, мы бы конфликтовали с настоящим HTML-элементом &lt;button&gt;, и у нас было бы Очень Плохое Время. Поэтому мы просто не можем этого делать — все наши пользовательские элементы должны быть в формате &lt;{prefix}-{component}&gt;.Жёсткого требования, чтобы наши файлы тоже были с дефисом, нет, но лично мне нравится аккуратность, когда имена файлов и папок совпадают с нашим фактическим элементом. Так что выберите префикс и придерживайтесь его. Для моей дизайн-системы Mindful Design я использую префикс md- — так что все мои пользовательские элементы выглядят примерно как &lt;md-button&gt;, &lt;md-card&gt; и т.д. Web Awesome использует wa-. Вы можете использовать всё, что пожелает ваше сердце. Главное — будьте последовательны.</p><p>Из папки packages/components выполните:</p><p>Затем вам будет предложено выбрать, какие функции и язык вы хотите. Для нашей кнопки нужно выбрать:</p><ul><li>Props</li><li>CSS-переменные</li><li>CSS-инкапсуляция</li><li>Комментарии в коде</li></ul><p>Нажмите Enter, затем выберите JavaScript в качестве языка.</p><p>Установите выходную директорию в src/. По умолчанию Elena использует src/components/, но нам не нужен такой уровень вложенности.</p><p>Это создаст каркас наших файлов с несколькими примерными значениями и комментариями, так что мы не будем смотреть на пустые файлы. Нажмите Enter после выбора функций, языка и директории, и Elena сгенерирует папку my-button с соответствующими JS и CSS файлами. О стилизации мы позаботимся позже, сейчас мы хотим спроектировать API нашего компонента.</p><p>Откройте следующий файл:</p><p>Здесь происходит много всего для простого boilerplate, но мы разберём каждый раздел по мере продвижения!</p><h3>Добавление props</h3><p>Компонентные <a href="https://elenajs.com/components/props">props</a> позволят нам управлять стилизацией и поведением компонента декларативным образом. Затем мы можем использовать эти props для создания вариантов наших компонентов. Для нашей кнопки давайте упростим и используем следующие props:</p><ul><li>variant: стилевой вариант нашей кнопки, например «primary», «danger»</li><li>disabled: отключена ли кнопка или нет</li><li>href: куда должна вести кнопка, также определяет, будет ли кнопка рендериться как ссылка или как кнопка</li></ul><p>Это небольшое подмножество props, которые потребуются кнопке в продакшене, но этого достаточно, чтобы двигаться дальше. Если после этого вы почувствуете себя уверенно, можете вернуться и добавить больше props — size или icon prop были бы отличной отправной точкой!</p><p>Давайте добавим эти props в наш компонент кнопки:</p><p>Объявление static props позволяет нам определить конечный массив props, которые будет принимать наш компонент. По умолчанию все эти props будут отражаться на нашем отрендеренном компоненте как HTML-атрибуты. Вам почти всегда нужно, чтобы это было так, особенно если вы используете нестандартные атрибуты вроде disabled, download и т.д.</p><p>Прямо под этим массивом вы найдёте заготовленные значения props по умолчанию, каждое с небольшим комментарием сверху. Давайте последуем примеру Elena и установим значения по умолчанию для добавленных нами props:</p><p>Комментарии над каждым определением — это JSDoc-комментарии. Они могут выглядеть немного непривычно, но позволяют документировать наши компоненты и props и могут служить источником истины для документирования API наших компонентов. Это также даёт нам немного «мягкой типизации» без необходимости использовать TypeScript. Большинство IDE будут подсвечивать или предупреждать вас, если вы установите prop в значение/тип, не указанный в синтаксисе JSDoc.</p><p>В приведённом выше примере мы определяем наш prop variant, задаём ему значение по умолчанию «default» и мягко типизируем его с помощью определения @type. В данном случае мы принимаем только одно из четырёх перечисленных значений.</p><p>На этом этапе это может показаться немного бессмысленным, но следите за своими JSDoc-комментариями по мере создания компонентов. Мы будем использовать их позже. Пока мы на этом, мы могли бы также задать более точное описание для нашего компонента.</p><p>Измените верхний комментарий в следующем файле:</p><p>Мы также удалили определения @cssprop из этого комментария. Они были сгенерированы, потому что мы выбрали «CSS Variables» при создании нашего компонента, и позволяют нам раскрыть кастомные свойства, используемые для стилизации наших компонентов. Если вы работаете над темизируемой или headless библиотекой компонентов, вы, возможно, захотите оставить их, в противном случае я предпочитаю пропускать определение этих свойств и не раскрывать их в своей документации.</p><p>Давайте взглянем на нашу функцию render():</p><p>Если у вас нет тяжёлого случая React Brain, вы, возможно, заметите хотя бы одну из пары проблем: во-первых, button — это не div. Дико, правда? Это не вина Elena, мы просто создали базовый компонент, и div — это, безусловно, самый распространённый HTML-элемент. Нам нужно самим отрендерить правильную, семантическую, доступную разметку.</p><p>Во-вторых, мы только что добавили href как prop, а это атрибут a, а не button. Нам нужно условно рендерить <i>либо</i> a, <i>либо</i> button в зависимости от того, установлен ли href.</p><h3>Условный рендеринг</h3><p>Дискуссия «должны ли ссылки когда-либо стилизоваться как кнопки?» старше, чем бородка вашего отчима, и точно так же как-то ещё сохраняется сквозь века. Я слишком стар и устал, чтобы беспокоиться об этом, а реальность такова, что кнопки-ссылки CTA — одна из самых распространённых вещей, которые вы увидите на сайте, в конкуренции только с баннерами cookie и плохой доступностью в своей повсеместности.</p><p>Так что вы будете делать это, нравится нам это или нет, и вам лучше делать это правильно.</p><p>Самый чистый подход к этому — абстрагировать наш рендеринг, добавив две новые функции:</p><p>Затем мы можем заменить функцию render() нашего компонента:</p><p>Супер просто: если href присутствует, это ссылка, если нет — это кнопка. Нам не нужно добавлять новые props, просто используем тот, что у нас уже есть.</p><p>Мы используем nothing в этой функции, и если вы попробуете собрать/запустить watch прямо сейчас, вы получите ошибку. Это потому, что nothing — это помощник Elena для безопасного рендеринга, ну, <i>ничего</i>.</p><p>Давайте импортируем его в начало нашей кнопки. Отредактируйте первую строку следующего файла:</p><p>Теперь давайте соберём нашу библиотеку компонентов, чтобы включить нашу новую кнопку в продакшенный bundle.js. Отредактируйте packages/components/src/index.js:</p><p>Затем из корня проекта выполните:</p><p>Если повезёт, сборка пройдёт без проблем, и мы наконец-то сможем встроить нашу кнопку в документацию.</p><h3>Предпросмотр нашей кнопки</h3><p>На данный момент у нас есть всё необходимое, чтобы отрендерить нашу кнопку и увидеть её на странице. Потребовалось немного настроек, чтобы дойти до этого, но мы сделали это!</p><p>Благодаря тому, как наш проект настроен, мы теперь можем подключать наши собранные компоненты так, как будто они являются отдельным пакетом. Нам просто нужно настроить VitePress для импорта бандла, который генерирует Elena, и сказать ему обрабатывать наши импортированные компоненты как веб-компоненты (по умолчанию VitePress ожидает Vue-компоненты).</p><p>Создайте docs/.vitepress/theme/index.js:</p><p>Это говорит нашей теме VitePress импортировать файлы бандла, которые сгенерировала Elena. @my-ds/components загружается асинхронно, так как это клиентская часть, а VitePress по умолчанию использует серверный рендеринг. @my-ds/components/dist/bundle.css импортируется напрямую в начале нашего файла, потому что это просто старый добрый CSS.</p><p>Примечание о серверном рендеринге (SSR)Если вы знаете, что вам нужен SSR, есть несколько способов включить его с Elena. В зависимости от вашего фреймворка/генератора сайта на выбор, вам, возможно, потребуется выполнить несколько дополнительных шагов конфигурации. Обратитесь к документации Elena за советами по SSR и на страницу интеграций с фреймворками для более продвинутых интеграций.</p><p>Далее обновите docs/.vitepress/config.mjs:</p><p>Это немного хакерский способ, но по сути он говорит VitePress рассматривать любой тег с - как пользовательский элемент вместо Vue-компонента. Учитывая, что пользовательские элементы требуют -, чтобы избежать конфликтов с нативными HTML-элементами, этого достаточно для наших целей.</p><p>Теперь давайте соберём нашу фактическую документацию по кнопке. Создайте docs/components/button.md:</p><p>Это должно дать нам всё необходимое для предпросмотра нашей кнопки! Запустите процесс разработки, если вы ещё этого не сделали:</p><p>Это запустит документацию VitePress в режиме разработки и одновременно запустит скрипт watch Elena, давая нам довольно удобный опыт live-reload. Перейдите на <a href="http://localhost:5173/components/button.html">http://localhost:5173/components/button.html</a>, и вы должны увидеть свою прекрасную кнопку!</p><p>Держите сервер разработки запущеннымКоманда npm run dev запустит ваш dev-сервер документации и будет держать Elena в фоне, отслеживая изменения компонентов. Вы будете получать live reloads всякий раз, когда вносите изменения, и теперь вы можете плавно вносить и тестировать изменения компонентов и документации.</p><p>Если вы откроете инспектор браузера и посмотрите на отрендеренную кнопку, вы увидите что-то вроде этого:</p><p>Наш хост-элемент &lt;my-button&gt; оборачивает разметку из своей функции render(), и мы имеем наш первый веб-компонент, отрендеренный в браузере! Я знаю, я знаю. Это выглядит совсем не круто, но оно там есть! Давайте придадим ему стиль.</p><h2>Стилизация нашей кнопки</h2><p>Если вы дошли до этого места, то, возможно, заметили явное отсутствие дискуссий о дизайн-токенах. Не потому, что они неважны, а потому что управление токенами и их распространение — это крайне объёмная тема, а эта статья и без того получается очень уж длинной. Скорее всего, мы разберём рабочие процессы с токенами в отдельном посте!</p><p>Пока что мы будем придерживаться простого подхода и использовать стили с ограниченной областью видимости Elena. Это позволяет нам частично нейтрализовать каскад в CSS и гарантировать, что стили не выйдут за пределы оформления отдельного компонента.</p><p>Мы также сделаем кое-что, чего я <b>не рекомендую</b> для production-компонентов, особенно если вы хотите строить темизируемые дизайн-системы, наследующие разумные глобальные стили (спойлер: вы хотите), — а именно, сбросим стили компонента перед применением собственных. В итоге мы получаем компонент, который не пропускает стили наружу (благодаря ограниченной области видимости) и не позволяет глобальным стилям проникать внутрь (благодаря сбросу на уровне компонента).</p><h3>Стили с ограниченной областью видимости</h3><p>Откройте следующий файл:</p><p>По умолчанию Elena генерирует at-правило @scope для любого создаваемого компонента. Вы <i>не обязаны</i> использовать стили с ограниченной областью видимости. Важно помнить: это <b>всё обычный CSS</b>. Мы не делаем ничего дикого или хрупкого вроде CSS-in-JS, мы просто используем конкретную стандартную возможность CSS. Вы с таким же успехом можете писать неограниченный CSS с пространствами имён и получить в целом те же результаты.</p><p>Более того, если вам нужно поддерживать браузеры, которые не поддерживают @scope, то использование пространств имён может быть тем самым подходом, который вам нужен. Для этого примера (и для моей собственной production-работы) меня вполне устраивает @scope — я считаю его гораздо более чистым способом стилизации компонентов.</p><p>Поскольку при создании компонента мы выбрали «CSS Encapsulation», вы видите, что Elena сгенерировала следующее:</p><p>По сути это означает, что наш компонент не будет наследовать стили из более высоких уровней каскада. В зависимости от вашего подхода к стилизации в дизайн-системе, это может быть как тем, что нужно, так и нет. Для <i>этого конкретного сценария</i> это самый простой способ гарантировать полный контроль над каждым компонентом. Однако во многих реальных сценариях вам действительно стоит <i>хотеть</i> некоторой степени наследования или стилей по умолчанию в компонентах.</p><p>Примечание об инкапсулированном сбросеИспользование all: unset и display: revert сбросит любые стили, определённые до тех пор, пока эти правила не встретятся. Это не предотвратит применение дальнейших неограниченных стилей в файлах или тегах </p>]]></content:encoded>
    </item>
    <item>
      <title>Как правильно использовать поля HTML-форм: гайд для разработчиков</title>
      <link>https://tproger.ru/articles/kak-pravilno-ispolzovat-polya-html-form-polnyj-gajd</link>
      <comments>https://tproger.ru/articles/kak-pravilno-ispolzovat-polya-html-form-polnyj-gajd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-pravilno-ispolzovat-polya-html-form-polnyj-gajd</guid>
      <description><![CDATA[<p>Разбираем типы полей HTML-форм, правила доступности, ARIA-атрибуты и лучшие практики. Узнайте, как создавать удобные и конверсионные формы для любых устройств.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-pravilno-ispolzovat-polya-html-form-polnyj-gajd">Как правильно использовать поля HTML-форм: гайд для разработчиков</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Фронтенд-разработка с нуля]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 Jun 2026 09:55:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Неправильно свёрстанная форма — серьёзный источник раздражения пользователей на сайте. Поле email без подходящей клавиатуры на телефоне, чекбокс без label, который невозможно попасть пальцем, или форма, которая отправляется при случайном нажатии Enter — всё это ежедневно встречается даже на крупных проектах. Разбираем, как избежать этих ошибок и сделать формы удобными для всех пользователей.</p><h2>Что такое поля форм</h2><p>Поля форм — это интерактивные элементы HTML, через которые пользователь взаимодействует с веб-страницей. Браузер отображает их по-разному в зависимости от типа: для email показывает клавиатуру с символом @, для даты — календарь, для файла — диалог выбора документа.</p><p>Главное правило: под каждую задачу существует своё поле. Использовать универсальный &lt;input type="text"&gt; везде — значит лишать пользователя встроенных удобств браузера.</p><p>{'id': 'a94adbf9d2', 'data': {'text': '<b>Правильный тип input</b> — залог удобства: браузер сам подставит нужную клавиатуру и проверит формат.'}, 'type': 'paragraph'}</p><p>{'id': 'd3748dda0e', 'data': {'text': '<b>Label обязателен</b> для каждого поля: связывайте его через атрибут for с id поля.'}, 'type': 'paragraph'}</p><p>{'id': 'c924682827', 'data': {'text': '<b>Группируйте связанные поля</b> в &lt;fieldset&gt; с &lt;legend&gt; — это помогает средствам чтения с экрана и структурирует форму.'}, 'type': 'paragraph'}</p><p>{'id': '49afc5a27c', 'data': {'text': '<b>Не забывайте name</b>: без него данные не попадут в запрос при отправке формы.'}, 'type': 'paragraph'}</p><p>{'id': 'ab33c8052b', 'data': {'text': '<b>Используйте &lt;button type="submit"&gt;</b> вместо устаревшего &lt;input type="submit"&gt; — это гибче и семантичнее.'}, 'type': 'paragraph'}</p><h2>Основные элементы форм</h2><h3>input — универсальный инструмент ввода</h3><p>Элемент &lt;input&gt; — самый распространённый в формах. Его внешний вид и поведение полностью зависят от атрибута type. Браузер поддерживает свыше 20 типов: от классического text до специализированных date, tel, range и даже color.</p><p>Когда вы выбираете конкретный тип, браузер берёт на себя три задачи: отображает подходящий интерфейс, показывает оптимальную экранную клавиатуру на мобильных устройствах и применяет встроенную проверку. Например, type="email" проверит наличие символа @ до отправки на сервер.</p><p>Вот типы input, которые стоит знать каждому фронтенд-разработчику:</p><ul><li>text — текстовая строка, базовый тип.</li><li>email — проверяет наличие @ и домена, показывает email-клавиатуру.</li><li>tel — цифровая клавиатура на мобильных устройствах.</li><li>number — ограничивает ввод числами, добавляет стрелки.</li><li>date — нативный календарь браузера.</li><li>checkbox и radio — выбор одного или нескольких вариантов.</li><li>file — загрузка файлов с нативным диалогом выбора.</li><li>range — ползунок для выбора значения из диапазона.</li><li>color — нативный выбор цвета.</li><li>search — поле поиска с кнопкой очистки.</li></ul><p>Атрибут required делает поле обязательным для заполнения, а pattern позволяет задать регулярное выражение для проверки введённых данных без JavaScript.</p><h3>label — связываем текст с полем</h3><p>Без подписи поле ввода теряет смысл. Элемент &lt;label&gt; решает эту задачу и одновременно делает форму доступной для пользователей с ограничениями зрения.</p><p>Есть два способа связать label с полем. Первый — явный: атрибут for на label должен совпадать с id на input. Второй — вложенный: input размещается внутри label. Оба варианта работают, но явная связь через for гибче: позволяет располагать label и input в разных частях разметки.</p><p><b>Важно:</b><br />Клик по label автоматически переводит фокус в связанное поле. Это удобно на десктопе и критично на мобильных устройствах, где площадь касания имеет значение.</p><h3>textarea — когда одной строки мало</h3><p>Для длинных текстов — комментариев, отзывов, описаний — используйте &lt;textarea&gt;. В отличие от &lt;input&gt;, он поддерживает переносы строк и растягивается по содержимому. Атрибуты rows и cols задают начальные размеры, а CSS — финальное оформление.</p><h3>select и datalist — выбор из вариантов</h3><p>Когда нужно предложить пользователю готовый список вариантов, на помощь приходит &lt;select&gt;. Он отображает выпадающий список, в котором можно выбрать один или несколько пунктов. По умолчанию выбран первый элемент, но через атрибут selected можно задать другой.</p><p>Альтернатива — &lt;datalist&gt;. Он работает как автодополнение: пользователь может как выбрать вариант из списка, так и ввести свой собственный текст. Это удобно для полей вроде «профессия» или «название компании», где невозможно предусмотреть все варианты.</p><h3>fieldset и legend — группируем поля</h3><p>Формы с десятком полей выглядят как стена текста. Чтобы структурировать их, используйте &lt;fieldset&gt; с обязательным дочерним элементом &lt;legend&gt;. Такая группировка помогает пользователям ориентироваться и критична для средств чтения с экрана: они объявляют legend перед каждым полем в группе.</p><h3>ARIA-атрибуты для сложных форм</h3><p>Для скринридеров и пользователей с ограничениями зрения важно не только правильное использование label, но и дополнительные ARIA-атрибуты. Например, aria-required="true" сообщает о необходимости заполнения, а aria-describedby связывает поле с текстом подсказки или сообщения об ошибке.</p><p>Атрибут aria-live="polite" на контейнере с ошибками позволяет скринридеру озвучить сообщение без прерывания текущего действия пользователя. Это особенно важно для динамических форм, где ошибки появляются после асинхронной проверки на сервере.</p><h3>Как отправить форму</h3><p>Для отправки данных используйте &lt;button type="submit"&gt;. Это семантично, стилизуется гибче, чем &lt;input type="submit"&gt;, и поддерживает вложенный HTML-контент — например, иконку рядом с текстом.</p><p><b>Важно:</b><br />Если у кнопки не указан атрибут type, браузер считает её кнопкой отправки по умолчанию. Чтобы избежать случайной отправки, всегда явно указывайте type="button" для кнопок, которые не должны отправлять форму.</p><p>Помимо клика по кнопке, форма отправляется при нажатии клавиши Enter в однострочных полях ввода. В многострочном &lt;textarea&gt; Enter добавляет перенос строки. Это стандартное поведение браузера, которое стоит учитывать при проектировании многошаговых форм: случайная отправка на середине заполнения раздражает пользователей.</p><h2>Чек-лист: правильная форма за 5 минут</h2><ul><li>Каждое поле имеет связанный &lt;label&gt; через for и id.</li><li>Выбран подходящий type для &lt;input&gt; — не везде text.</li><li>У всех полей есть атрибут name, иначе данные не уйдут на сервер.</li><li>Связанные поля объединены в &lt;fieldset&gt; с &lt;legend&gt;.</li><li>Для длинных текстов используется &lt;textarea&gt;, а не многострочный input.</li><li>Кнопка отправки — &lt;button type="submit"&gt;, а не устаревший input.</li><li>Форма работает без JavaScript: базовая проверка и отправка происходят на уровне HTML.</li></ul><h2>Выводы</h2><p>Поля HTML-форм — это не просто визуальные элементы, а полноценный интерфейс взаимодействия пользователя с вашим приложением. Правильный выбор типов input, связь через label, группировка в fieldset, ARIA-атрибуты и семантичная кнопка отправки — всё это влияет на удобство, доступность и конверсию.</p><blockquote>Доступность не добавляется в проект в конце — она закладывается на этапе разметки. Правильно свёрстанная форма работает для всех пользователей без дополнительных усилий.</blockquote><p>Если хотите углубиться в тему — изучите <a href="https://web.dev/learn/forms/">полный курс по формам от Google</a>. Там разбираются проверка данных, оформление, доступность и даже usability-тестирование поведения пользователей при заполнении форм.</p><p>Источник: <a href="https://web.dev/learn/forms/form-fields/">web.dev — Help users enter data in forms</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Отказ от Tailwind: как структурировать CSS без фреймворка</title>
      <link>https://tproger.ru/translations/otkaz-ot-tailwind-kak-strukturirovat-css-bez-frejmvorka</link>
      <comments>https://tproger.ru/translations/otkaz-ot-tailwind-kak-strukturirovat-css-bez-frejmvorka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/otkaz-ot-tailwind-kak-strukturirovat-css-bez-frejmvorka</guid>
      <description><![CDATA[<p>Опыт перехода с Tailwind v2 на ванильный CSS: компонентный подход, CSS custom properties, Grid без media queries и esbuild. Разбираем систему — берите за основу.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/otkaz-ot-tailwind-kak-strukturirovat-css-bez-frejmvorka">Отказ от Tailwind: как структурировать CSS без фреймворка</a>»</p>]]></description>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 17 May 2026 08:39:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Восемь лет назад Джулия Эванс <a href="https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/">открыла для себя Tailwind</a> и была в восторге. Теперь она провела неделю, переводя несколько сайтов обратно на семантический HTML и ванильный CSS — и делится практической системой из девяти составных частей: reset, компоненты, цвета, размеры шрифтов, утилиты, базовые стили, отступы, адаптивный Grid и сборка через esbuild.</p><p>Tailwind обучает системам: reset, цветовая палитра, шкала размеров — всё это переносится в CSS custom properties без зависимостей.</p><p>Компонентный подход (один класс — один CSS-файл) резко снижает когнитивную нагрузку: 100 строк компонента — это только 100 строк.</p><p>CSS Grid с auto-fit и minmax() создаёт гибкие сетки без единого media query.</p><p>В dev-режиме сборщик не нужен: браузер понимает нативные @import и вложенные селекторы. Для production — одна команда esbuild.</p><p>Tailwind v2 без сборщика весит 2,8 МБ (270 КБ gzip) в каждом проекте — и это один из аргументов для миграции.</p><h2>Зачем уходить с Tailwind</h2><p>Прежде чем разбирать систему, — почему вообще стоит её строить, если Tailwind под рукой.</p><ul><li><b>Build-система стала обязательной.</b> Tailwind v3+ требует JIT-компилятора. Без сборщика вы застряли на v2 — а это <b>2,8 МБ CSS</b> (270 КБ gzip) в каждом проекте.</li><li><b>Смесь стилей неудобна.</b> Когда в одном проекте живут и ванильный CSS, и Tailwind — сопровождение становится болезненным.</li><li><b>Tailwind ограничивает.</b> grid-template-areas технически работает через arbitrary values, но синтаксис настолько громоздкий, что на практике им никто не пользуется. Container queries, @layer, @scope — туда же.</li><li><b>Накопленный опыт.</b> После нескольких лет работы ванильный CSS уже не пугает.</li><li><b>Ценность CSS-экспертизы.</b> Джулия упоминает эссе «Tailwind and the Femininity of CSS»: Tailwind косвенно транслирует идею, что CSS — не настоящее программирование. Она больше не хочет поддерживать этот нарратив.</li></ul><p>При этом Tailwind честно обучал хорошим системам. Миграция — не отказ от этих систем, а их присвоение в виде нативного CSS.</p><h2>Что Tailwind успел дать</h2><p>Приступая к миграции, Джулия поняла: у неё уже есть многое из нужного. Любая CSS-кодовая база состоит из нескольких слоёв — раскладка, шрифты, цвета, переиспользуемые компоненты. Для каждого нужна система, иначе хаос. Tailwind эти системы давал: reset-стили, цветовую палитру, шкалу размеров шрифтов. Переход — это не изобретение колеса заново, а перенос уже понятых систем в нативный CSS.</p><h2>Девять аспектов структуры CSS</h2><p>Как Джулия организует свою CSS-кодовую базу сегодня.</p><h3>1. Reset-стили</h3><p>Простейшее решение — скопировать первые ~200 строк Tailwind Preflight из tailwind.css. За годы работы привыкаешь к box-sizing: border-box и line-height: 1.5 как к умолчаниям. Перенос preflight сохраняет привычное поведение без npm-зависимости.</p><h3>2. Компоненты</h3><p>Это ядро подхода. Идея та же, что в Vue или React-компонентах — но без JavaScript. Три правила:</p><ul><li>У каждого компонента — уникальный CSS-класс.</li><li>CSS одного компонента никогда не перекрывает стили другого.</li><li>Каждый компонент живёт в собственном CSS-файле.</li></ul><p>При редактировании ста строк компонента нужно думать только о ста строках. Нативные вложенные CSS-селекторы (поддерживаются всеми браузерами с 2023 года) делают код компактным:</p><h3>3. Цвета</h3><p>Одно правило: все цвета сайта объявляются в colours.css через <a href="https://developer.mozilla.org/ru/docs/Web/CSS/Using_CSS_custom_properties">CSS custom properties</a> — никакого хардкода в компонентах.</p><h3>4. Размеры шрифтов</h3><p>Вместо классов text-lg — переменные, взятые из Tailwind. Не нужно помнить, в каких единицах задавать размер (em, px или rem):</p><h3>5. Утилитарные классы</h3><p>Небольшой файл для вещей, которые встречаются в разных компонентах — кнопки, .sr-only для скринридеров и т.п. Держится маленьким намеренно.</p><h3>6. Базовые стили</h3><p>Стили, применяемые ко всему сайту. Джулия намеренно ограничивает этот файл двумя правилами — и планирует пополнять его снизу вверх, когда паттерн из компонентов повторяется несколько раз:</p><h3>7. Отступы</h3><p>Наименее завершённая часть системы. Основной принцип: за внешние отступы отвечает родительский контейнер, а не сами компоненты. Паттерн «owl selector» (или «lobotomized owl» — селектор вида * + *) даёт отступ между любыми соседними дочерними элементами, не трогая первый:</p><p>Дополняет это принцип «no outer margin»: компоненты не задают собственные внешние отступы — ими управляет исключительно родитель. Это предотвращает коллизии при вставке компонента в разные контексты.</p><h3>8. Адаптивный дизайн: больше Grid</h3><p>Вместо Tailwind-классов вида md:text-xl — гибкие сетки <a href="https://developer.mozilla.org/ru/docs/Web/CSS/CSS_grid_layout">CSS Grid</a>, которые сами адаптируются без брейкпоинтов. auto-fit — директива Grid, которая создаёт столько колонок, сколько умещается в контейнер (может быть 4, 3, 2 или 1 — в зависимости от ширины):</p><p>Ещё одна возможность, неудобная в Tailwind, — grid-template-areas (именованные зоны сетки): в Tailwind её можно задать через arbitrary values, но синтаксис настолько громоздкий, что в реальных проектах это нечитаемо. В ванильном CSS это просто:</p><h3>9. Система сборки: esbuild</h3><p>В dev-режиме сборщик не нужен совсем: современный CSS поддерживает нативные @import и вложенные селекторы в браузере без препроцессоров.</p><p>Для production-бандла Джулия использует <a href="https://esbuild.github.io/">esbuild</a> — сборщик на Go, распространяемый как нативный бинарник (без Node.js в runtime), который работает в десятки раз быстрее webpack:</p><h2>Возможности CSS, которые стоит изучить</h2><p>В процессе миграции Джулия наткнулась на несколько возможностей CSS, которые пока не использовала:</p><ul><li><a href="https://developer.mozilla.org/ru/docs/Web/CSS/@layer">@layer</a> — каскадные слои для управления приоритетом стилей без повышения специфичности.</li><li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@scope">@scope</a> — ограничение области действия CSS-правил конкретным поддеревом DOM.</li><li>Container queries — медиазапросы относительно размера родительского контейнера, а не viewport.</li><li>Subgrid — вложенные сетки, наследующие треки родительской Grid.</li></ul><h2>Итог</h2><p>Главный вывод: Tailwind — это не магия, а набор систем. Reset-стили, цветовая палитра, шкала размеров шрифтов — всё это существует в нативном CSS как custom properties. Компонентный подход решает те же задачи изоляции. CSS Grid делает большинство media queries ненужными. А esbuild заменяет тяжёлый toolchain одним бинарником.</p><p>Начать можно с трёх шагов: скопировать Preflight → добавить custom properties для цветов и размеров → разбить стили по файлам-компонентам. Оригинальная статья Джулии Эванс доступна на <a href="https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/">jvns.ca</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как связаны Atomic CSS и Функциональное программирование</title>
      <link>https://tproger.ru/articles/kak-svyazany-atomic-css-i-funkcionalnoe-programmirovanie</link>
      <comments>https://tproger.ru/articles/kak-svyazany-atomic-css-i-funkcionalnoe-programmirovanie?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рамазан Максютов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-svyazany-atomic-css-i-funkcionalnoe-programmirovanie</guid>
      <description><![CDATA[<p>Почему подход Atomic CSS называют функциональным? Именно на этот вопрос я постараюсь ответить в данной статье! Сначала я опишу вам базовые принципы ФП, а затем расскажу про основы Atomic CSS, проводя аналогии с функциональным программированием. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-svyazany-atomic-css-i-funkcionalnoe-programmirovanie">Как связаны Atomic CSS и Функциональное программирование</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 27 Apr 2026 07:46:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всем привет, друзья!</p><p>Меня зовут Рамазан, я Frontend-разработчик и энтузиаст, который любит искать свежий взгляд на привычные вещи в Web-разработке.</p><p>Думаю, что вы слышали когда-либо про функциональное программирование (далее - ФП). Это парадигма для которой характерно применение чистых функций и сохранение иммутабельности данных. Существует ряд языков, в которых принципы ФП преобладают: Haskell, OCaml и Elixir. Однако и другие языки вроде JavaScript, Python, C++ поддерживают этот подход, хотя только им не ограничиваются.</p><p>Но внимательный читатель посмотрит на название и спросит: "Функциональное программирование - это хорошо. А причём здесь Atomic CSS?". Сейчас отвечу! Всё дело в том, что ещё на заре появления атомарного подхода у него существовало и другое название - Functional CSS. Кто-то довольно часто использует его и сейчас, чтобы не путать с одноимёнными <a href="https://css-tricks.com/the-atomics/" rel="nofollow">терминами</a>. Но почему этот подход к CSS-стилизации называют функциональным?</p><p>Именно на этот вопрос я постараюсь ответить в данной статье! Сначала я опишу вам базовые принципы ФП, а затем расскажу про основы Atomic CSS (далее - ACSS), проводя аналогии с функциональным программированием. Кроме того, я постараюсь на простых примерах показать, какие проблемы решаются, если применять Atomic CSS при стилизации. Когда я готовил материалы для этой статьи, я много опирался на <a href="https://www.youtube.com/watch?v=7g0BHu0kWXo" rel="nofollow">этот </a>и на <a href="https://www.youtube.com/watch?v=uHVqbCPnOwU" rel="nofollow">этот </a>доклады. Наконец, хотел заметить, что это перевод моей оригинальной <a href="https://www.freecodecamp.org/news/atomic-and-functional-css" rel="nofollow">статьи</a> на английском языке — так что можете глянуть и её.</p><p>Ну что, держитесь крепче - мы начинаем!</p><h2>Что нужно знать</h2><p>Чтобы разобраться в этой статье, все, что вам нужно, - это базовое понимание HTML, CSS и JavaScript. Также в статье имеется несколько примеров, в которых мы будем использовать Atomic CSS фреймворк [mlut](https://mlut.style/), но вам не обязательно знать его синтаксис, потому что я привёл расшифроку его утилит в рукописном CSS.</p><h2>Базовые принципы ФП</h2><p>Функциональное программирование - это большая область, в которой написано немало сложных статей и которой посвящен целый <a href="https://www.cambridge.org/core/journals/journal-of-functional-programming" rel="nofollow">научный журнал</a>. Поэтому я в своей статье сосредоточусь на том, чтобы изучить только базовые принципы ФП и провести аналогию с ними в Atomic CSS.</p><p>Этот подход основывается на том, что все необходимые для нас действия в программе мы должны совершать посредством вызова некоторых функций и их композиций.</p><p>Давайте я приведу основные понятия, через которые попытаюсь раскрыть суть данного подхода:</p><p>1) Чистые функции;</p><p>2) Иммутабельность;</p><p>3) Композиция функций.</p><h3>Чистые функции</h3><p>Функция называется чистой, если она:</p><p>- при одних и тех же входных параметрах возвращает одно и то же значение;</p><p>- не имеет побочных эффектов (изменений внешних значений или сущностей).</p><p>Приведу для наглядности пару примеров.</p><p>Первая функция чистая, ведь, если мы будем вводить одни и те же аргументы, то будем получать один и тот же результат. Кроме того, никакие глобальные переменные эта функция не меняет, а объекты не мутирует.</p><p>Вторая функция не попала в понятие чистоты по обоим пунктам. Она меняет внешнюю переменную `s` и использует для вычислений другую внешнюю переменную `c`, которая может меняться.</p><p>Чистые функции позволяют писать более предсказуемый код. Приложение может разрастись, а функция с неявным параметром, который может меняться со временем, может привести к большим сложностям в дебаге и поддержке кода.</p><h3>Иммутабельность</h3><p>Иммутабельность - это принцип, в соответствии с которым объекты данных не должны меняться после создания. Чтобы произвести изменения над данными, необходимо создать новый их экземпляр и работать с ним.</p><p>Поначалу может показаться, что таким образом мы лишаем себя гибкости в процессе разработки и уменьшаем скорость работы программы. Но в действительности, если в языке или рантайме есть оптимизации для иммутабельных данных, соблюдение этого принципа помогает избегать многих ошибок и использовать параллельные вычисления.</p><p>Вот довольно простой пример: возьмём компонент React, который отображает задачу в списке дел. Состояние задачи описывается объектом. И чтобы React правильно перерисовал состояние компонента задачи, когда пользователь что-то в нём изменяет, необходимо передать в качестве нового состояния не измененный старый объект, а новый экземпляр объекта с текущим состоянием. Вот пример, где для состояния задачи используется иммутабельный объект:</p><p>Здесь мы увидим, что нажатие на кнопку приведёт к изменению состояния задачи и вызовет повторную прорисовку компонента. Однако мы могли бы определить функцию `toggleDone()` иным способом, используя мутации объекта:</p><p>При использовании такого обработчика событий эффект не будет достигнут, поскольку ссылка на объект остаётся прежней, несмотря на то что сам объект был изменён.</p><h3>Композиция функций</h3><p>Композиция функций подразумевает применение результата выполнения одной функции в качестве аргумента другой функции. Приведём пример программы, которая делает первую букву каждого слова заглавной:</p><p>Здесь мы определили функцию `compose(f1, f2)`, которая возвращает композицию функций, переданных ей в аргументах. Дальше мы используем эту функцию для создания функции `capitalize()`, которая будет как раз делать только первые буквы слов заглавными посредством композиции функций `lower()` и `upperEveryFirst()`. Сначала выполняется первая из них, и она возвращает строку со всеми строчными буквами в аргумент второй функции. Вторая же функция делает первую букву каждого слова заглавной.</p><p>В больших проектах и при необходимости сложных вычислений такие композиции могут быть и несколько больше, а логика в них может быть куда более богатой. И в этих случаях такой подход к проведению вычислений помогает разбить очень объёмные преобразования на серию относительно простых и компактных функций, которые применяются одна за другой. Это повышает удобство разработки, рефакторинга и отладки кода.</p><h2>Как принципы ФП находят отражение в Atomic CSS</h2><p>Теперь, когда мы узнали немного про функциональное программирование, попробуем ответить на вопрос: "А причём здесь Atomic CSS?". Проведём аналогию между этими подходами на уровне описанных выше принципов.</p><h3>О том, что такое Atomic CSS</h3><p>Но сначала уделим немного времени тому, что такое Atomic CSS. Это методология вёрстки, в которой мы используем маленькие атомарные CSS-правила, каждое из которых делает одно действие. Эти классы называют утилитами. Обычно они применяют одно CSS-свойство, но не обязательно одно. Например, во фреймворке [mlut](https://mlut.style/) утилите `Bgc-red` соответствует свойство `background-color: red`, а утилите `-Sz50p` - сразу два свойства `width: 50%` и `height: 50%`.</p><p>Современные Atomic CSS фреймворки, типа mlut и Tailwind, внутри используют так называемый JIT-движок. Это компонент, который генерирует CSS на основе только тех утилит, которые вы использовали в разметке.</p><h3>Чистота</h3><p>Чистота в CSS определяется тем, какими селекторами, а если конкретнее - классами, задаётся стилизация элементов. В чистом CSS поведение элемента должно определяться исключительно теми классами, которые привязаны к нему в атрибуте `class`. То есть в файле со стилями в идеале не должно быть селекторов вроде `section`, `div &gt; ul`.</p><p>Во-первых, они задают слишком общие правила, которые с большой вероятностью должны быть нарушены или дополнены в той или иной части проекта. Поэтому, когда мы будем стилизовать конкретные элементы, нам придётся постоянно держать в голове эти стили, чтобы понять, как аккуратно достичь необходимой стилизации, ничего не испортив.</p><p>Во-вторых, нарушается чистота CSS для каждого конкретного элемента. Допустим, мы имеем следующую разметку:</p><p>А CSS будет таким:</p><p>В итоге мы получим, что первая кнопка окрашивается в красный цвет, а вложенная - в зелёный. На таком примере это кажется довольно безобидным, но это будет приносить неудобства, когда структура проекта сильно разрастётся. И здесь мы видим, что результат работы собственных стилей класса `.greeting` зависит от того, где соответствующий элемент находится. Это аналогично тому, что функция при одних и тех же вводных данных даёт разные результаты в зависимости от того, где вызывается.</p><p>Atomic CSS позволяет такого эффекта избежать. В этом подходе в большинстве случаев стили применяются только к тем элементам, для которых прописаны соответствующие классы. Если же необходимо сделать несколько одинаковых элементов, то одна и та же утилита прописывается в атрибут `class` каждого такого элемента.</p><p>Аналогичный пример можно переписать на mlut вот так:</p><p>Где JIT-движок mlut сгенерирует такие стили:</p><p>Здесь мы уже видим, что стили элементов в таком подходе будут зависеть только от классов, которые им приписаны.</p><p><i>Замечание</i>: здесь, правда, стоит заметить, что синтаксис mlut позволяет делать вещи, которые отходят от строгого понятия чистоты CSS. Иногда это бывает необходимо для создания относительно более сложных эффектов. Допустим, мы хотим реализовать такую карточку, при наведении на которую меняется цвет фона у вложенной в неё кнопки. Тогда на mlut нужно будет написать следующее:</p><h3>Иммутабельность</h3><p>Под иммутабельностью CSS я буду подразумевать то, что стили элементов не переписываются. Иммутабельность в ACSS означает, что утилиты, как правило, не мутируют друг друга. Например, в BEM основные стили задаёт блок или элемент, а модификатор эти стили мутирует. А в других подходах, где используются комбинированные селекторы, это мутирование происходит чаще и менее явно.</p><p>Попробую привести простой пример. Пусть у нас есть карточка с товаром, которая может быть в своём дефолтном состоянии, либо в состоянии выделения. В BEM это бы выглядело примерно следующим образом:</p><p>В этом примере мы видим, что класс `product-card` задаёт красный цвет фона карточки по умолчанию. И, чтобы как-то обозначить выбранную карточку посредством другого цвета фона, нам приходится добавлять класс-модификатор, который изменяет цвет с красного на зелёный. И делает он это посредством переписывания свойства `background-color`, то есть с помощью мутирования стилей блока.</p><p>В подходе Atomic CSS эта проблема решается, так как утилиты позволяют задавать CSS-свойства независимо друг от друга и задавать модификации, не прибегая к мутации. Вот так будет выглядеть данный пример, если использовать mlut:</p><h3>Композиция</h3><p>В функциональном программировании повсеместно используются композиции функций. В атомарном CSS аналогом композиции функций служит композиция утилит при стилизации элементов. Как в ФП мы посредством последовательного применения множества простых функций получаем сложное поведение, так и в ACSS посредством множества простых утилит мы можем получить нетривиальную стилизацию.</p><p>Для примера покажу простой смайлик, который сделан посредством только лишь Atomic CSS:</p><p>Так будет выглядеть наш результат:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-03-31/3d47e497-4595-4167-af65-b9b4ece345c8.webp" alt="Простой CSS арт" /><figcaption>Простой CSS арт</figcaption></figure><p>Таким образом, применяя утилиты одну за другой, мы получили даже небольшой CSS-арт.</p><h2>Заключение</h2><p>Подводя итоги, скажу, что Atomic CSS действительно воплощает в себе базовые принципы функционального программирования. Конечно, не буквально, но в том смысле, который актуален для Frontend-разработчиков и верстальщиков. Я был бы рад услышать ваши дополнения и возражения в комментариях - будет интересно их почитать и над ними подумать!</p><p>Напоследок скажу: смотрите на привычные вещи свежим взглядом!</p><p>И, как обычно, успехов вам в увлекательном пути Frontend-разработки!</p>]]></content:encoded>
    </item>
    <item>
      <title>CSS Studio: визуальный редактор, который правит ваш код руками ИИ-агента</title>
      <link>https://tproger.ru/news/css-studio-vizualnyj-redaktor-kotoryj-pravit-vaw-kod-rukami-i</link>
      <comments>https://tproger.ru/news/css-studio-vizualnyj-redaktor-kotoryj-pravit-vaw-kod-rukami-i?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/css-studio-vizualnyj-redaktor-kotoryj-pravit-vaw-kod-rukami-i</guid>
      <description><![CDATA[<p>Автор Motion выпустил CSS Studio — визуальный редактор стилей в dev-сборке. Правите CSS руками, изменения через MCP уходят в Claude Code или Cursor.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/css-studio-vizualnyj-redaktor-kotoryj-pravit-vaw-kod-rukami-i">CSS Studio: визуальный редактор, который правит ваш код руками ИИ-агента</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Apr 2026 17:15:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы регулярно объясняете <a href="https://claude.com/claude-code">Claude Code</a> или <a href="https://cursor.com">Cursor</a> текстом, какой именно padding вам нужен, — вот инструмент, который делает это за вас руками. Мэтт Перри, автор библиотеки <a href="https://motion.dev">Motion</a> (бывший Framer Motion), выпустил <a href="https://cssstudio.ai/">CSS Studio</a> — визуальный редактор стилей, который живёт прямо в вашей dev-сборке и шлёт изменения в ваш ИИ-агент через MCP. Запуск вылетел в топ Show HN.</p><ul><li>CSS Studio — визуальный WYSIWYG-редактор, который встраивается в ваш dev-сайт через npm-пакет.</li><li>Вы двигаете padding, шрифты, отступы, анимации руками; изменения через MCP-сервер уходят в Claude Code, Cursor или любой другой агент с MCP-поддержкой.</li><li>Агент правит код по месту: классы в Tailwind-проектах, объект стилей в CSS-in-JS, селектор в стайлшитах. Специальной поддержки Tailwind-токенов пока нет — token-режим в планах.</li><li>Цена: $99 за одно место.</li></ul><h2>Что это и зачем</h2><p>Сейчас типичный ИИ-воркфлоу для фронтенда выглядит так: вы открываете сайт в браузере, замечаете кривой отступ, идёте в чат агента и пишете «сделай padding у кнопки-подписки на два пикселя меньше и выровняй по базовой линии». Агент угадывает, какой компонент вы имели в виду, промахивается, вы поправляете. Через десять сообщений нужный padding наконец встал куда надо.</p><p>CSS Studio заменяет эту итерацию прямым редактированием. Вы добавляете npm-пакет в dev-сборку, запускаете её, в углу страницы появляется панель редактора. Кликаете на элемент, двигаете ползунки или тянете за точки — padding меняется в реальном времени в браузере. Когда результат нравится, нажимаете «Apply» (или включаете auto-apply). В этот момент подключённый ИИ-агент через MCP получает JSON-патч с описанием изменений и дописывает реальные файлы.</p><p>То есть вы получаете WYSIWYG-редактор, но результат приземляется в ваш настоящий код. Что с Tailwind — отдельный вопрос. Специальной интеграции с ним пока нет: визуальная панель показывает вычисленные CSS-значения, а агент уже сам догадывается, как их вернуть в исходник, — вслепую, без понимания Tailwind-токенов. Перри пообещал token/strict-режим с распознаванием Tailwind-классов и CSS-переменных, но это пока план. С CSS-in-JS и обычными стайлшитами проще: агент дотягивается до объекта стилей в компоненте или до нужного селектора в файле.</p><h2>Как это работает технически</h2><p>Всё завязано на <a href="https://modelcontextprotocol.io/">Model Context Protocol</a> — стандарт от Anthropic, который позволяет агентам подключаться к локальным инструментам (файлы, БД, сервисы) как к плагинам, без кастомной интеграции под каждый. CSS Studio поднимает локальный MCP-сервер рядом с вашим dev-сервером (подружиться с Vite получилось сразу, судя по отзыву разработчика mpeg на HN).</p><p>В Claude Code или Cursor вы запускаете команду /studio — и агент начинает слушать MCP-сервер. Когда вы в браузере двигаете слайдер padding, CSS Studio стримит агенту JSON вида «компонент такой-то, свойство такое-то, новое значение — вот такое, плюс информация о viewport и URL». Агент видит текущий контекст проекта, находит нужный файл и вносит правку по правилам кодовой базы.</p><p>Перри также упоминает, что для низкой задержки MCP-сервер может использовать Claude Channels — малоизвестную фичу Claude Code для стриминга. В обычном режиме агент периодически опрашивает MCP-сервер; Claude Channels снимают эту задержку.</p><h2>Что умеет</h2><ul><li><b>Стили</b> — padding, margin, цвета, шрифты, тени, бордеры, flex/grid-настройки через визуальные контролы.</li><li><b>Текст и контент</b> — прямое редактирование содержимого элементов без захода в файлы.</li><li><b>Лейаут</b> — добавление и удаление элементов, перестановка.</li><li><b>Анимации</b> — таймлайн-редактор для motion-эффектов (что логично от автора Motion).</li><li><b>Breakpoints</b> — редактор понимает, в каком брейкпоинте вы сейчас правите; canvas-режим для параллельного просмотра нескольких вьюпортов Перри дорабатывает прямо сейчас.</li><li><b>Рисование</b> — инструмент для набросков новых блоков на странице, потом отдаёте агенту на реализацию.</li></ul><h2>Кому полезно</h2><p>Первый очевидный сценарий — фронтендеры, которые уже сидят на ИИ-агентах для написания кода и устали от словесных описаний CSS-правок. Второй — дизайнеры и продакт-менеджеры, у которых нет доступа к репозиторию, но им нужно быстро подкрутить что-то на лендинге. Раньше они писали тикет, теперь — двигают слайдеры сами, агент пишет изменения в файлы.</p><p>Третий — QA и владельцы агентств, которые собирают десятки маркетинговых сайтов: визуальные правки через браузер с автоматической синхронизацией в код ускоряют финальную полировку. В комментариях на HN несколько человек отдельно отметили, что до этого сами писали похожие инструменты «на коленке» — значит потребность назрела.</p><h2>Что не так</h2><p>Цена — $99 за одно место, и комьюнити на HN это обсуждает активно. Сравнивают с Figma (около $160 за место) и с Cursor (те же $20 в месяц). Для команды из пяти человек выходит $495 в год. Перри в комментариях пообещал подумать над ценообразованием, а пока рассчитывает на ранних энтузиастов.</p><p>Второе — лендинг. Несколько комментаторов заметили, что сайт продукта для дизайна выглядит «как сгенерированный LLM» — слишком много фиолетового, шаблонная композиция, анимации fade-in. Для инструмента, который продаёт дизайн, это, мягко говоря, неловко. Перри признал и пообещал переделать.</p><p>Третье — зависимость от ИИ-агента с MCP. Если вы не сидите на Claude Code / Cursor / Windsurf и не планируете, CSS Studio для вас пока бесполезен: он не генерирует код самостоятельно, а только командует вашим агентом. Отдельная боль для российских разработчиков — оплата: Stripe из РФ не работает, нужна зарубежная карта или сервис-посредник. Зато живое демо на сайте cssstudio.ai доступно без регистрации, попробовать можно.</p><h2>Что это значит</h2><p>CSS Studio — один из первых публичных примеров того, как MCP превращается в инструмент «человек рисует, агент кодирует». До этого WYSIWYG-редакторы либо жили в отдельной вселенной (как Figma и Webflow), либо редактировали код напрямую, но теряли контекст проекта. MCP даёт третий путь: визуальный фронтенд + реальный агент с доступом к вашей кодовой базе.</p><p>Если такой подход взлетит, ждите аналогичных инструментов для других доменов: визуальный редактор схемы базы данных → агент правит миграции, визуальный редактор API → агент правит OpenAPI и генерирует клиент, визуальный редактор Grafana-дашбордов → агент правит Terraform. Базовая механика одна и та же.</p><p>Источники: <a href="https://cssstudio.ai/">cssstudio.ai</a>, <a href="https://news.ycombinator.com/item?id=47702196">обсуждение на Hacker News</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик построил DOOM на чистом CSS — можно поиграть прямо в браузере</title>
      <link>https://tproger.ru/news/razrabotchik-postroil-doom-na-chistom-css---rendering-bez-edinoj-s</link>
      <comments>https://tproger.ru/news/razrabotchik-postroil-doom-na-chistom-css---rendering-bez-edinoj-s?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/razrabotchik-postroil-doom-na-chistom-css---rendering-bez-edinoj-s</guid>
      <description><![CDATA[<p>Разработчик построил DOOM целиком на CSS transforms: стены через hypot(), углы через atan2(), анимации на transitions. Логика на JS, графика — чистый CSS.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/razrabotchik-postroil-doom-na-chistom-css---rendering-bez-edinoj-s">Разработчик построил DOOM на чистом CSS — можно поиграть прямо в браузере</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 29 Mar 2026 05:33:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Веб-разработчик Нильс Ленхер (Niels Leenheer) построил полноценный DOOM на чистом CSS. Каждая стена, пол, бочка и имп — это &lt;div&gt;, позиционированный в 3D-пространстве через CSS transforms. Игровая логика работает на JavaScript, но <b>весь рендеринг — исключительно CSS</b>.</p><p><b>Поиграть прямо в браузере:</b> <a href="https://cssdoom.wtf/">cssdoom.wtf</a> — полноценный первый уровень DOOM, целиком на CSS. Chrome или Safari, WASD + мышь.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-29/89e75765-8bbd-4917-a64f-221772d95ffb.webp" alt="CSS DOOM — DOOM работающий на чистом CSS в браузере" /><figcaption>DOOM на CSS — все стены, полы и спрайты отрисованы через CSS transforms</figcaption></figure><p>Ленхер — автор нескольких экспериментальных проектов, включая DOOM на осциллографе 1980-х годов. Новый проект использует координаты из оригинального WAD-файла (формат хранения данных карт DOOM) 1993 года и современные CSS-функции: @property, shape() и clip-path (свойство CSS для обрезки элемента по произвольному контуру) с правилом evenodd (правило заливки SVG-путей: закрашиваются области, ограниченные нечётным числом линий). <a href="https://nielsleenheer.com/articles/2026/css-is-doomed/">Исходная статья</a> набрала 306 очков и 67 комментариев на <a href="https://news.ycombinator.com/item?id=47557960">Hacker News</a>, а код <a href="https://github.com/NielsLeenheer/cssDOOM">опубликован на GitHub</a>.</p><p>— CSS умеет считать тригонометрию: ширина стены через hypot(), угол через atan2()</p><p>— Камеры в CSS нет — двигается весь мир вокруг игрока через translate3d с инвертированными координатами</p><p>— Двери, лифты и снаряды анимируются через CSS transitions и CSS animations без JS animation loop</p><p>— Освещение секторов работает через filter: brightness(), наследуемый по каскаду</p><p>— @property регистрирует custom properties как числа, что позволяет анимировать их плавно</p><h2>Как это работает — CSS как 3D-движок</h2><p>Сцена строится из нескольких тысяч &lt;div&gt;-элементов. Каждый получает сырые координаты из оригинального WAD-файла DOOM в виде CSS custom properties: две пары x/y-координат, высоту пола и потолка. CSS сам вычисляет всё остальное.</p><h3>Тригонометрия в CSS</h3><p>Ширина стены — это расстояние между двумя точками, которое вычисляется по теореме Пифагора через функцию hypot(). Угол поворота — это арктангенс, вычисляемый через atan2(). Обе функции добавлены в CSS специально для подобных расчётов.</p><p>JavaScript передаёт сырые данные DOOM. CSS считает тригонометрию. Это разделение — ключевой архитектурный принцип проекта.</p><h3>Движение мира вместо камеры</h3><p>В CSS нет понятия камеры. Вместо этого используется классический трюк: перемещается весь мир в направлении, противоположном движению игрока. JavaScript задаёт всего четыре custom property — --player-x, --player-y, --player-z и --player-angle. CSS делает остальное:</p><p>Обратите внимание на инвертированные знаки: если игрок шагает вперёд — мир сдвигается назад. Если игрок поднимается по лестнице — лестница опускается вниз.</p><h2>Полы, текстуры и клипы</h2><p>DOM-элементы по умолчанию вертикальны — существуют в плоскости x/y. Чтобы превратить &lt;div&gt; в пол, достаточно rotateX(90deg) — элемент «ложится» горизонтально.</p><h3>Сложные формы через clip-path</h3><p>Секторы DOOM — это произвольные многоугольники: L-образные комнаты, неправильные формы, закруглённые коридоры. Для них используется clip-path с polygon(). Для секторов с отверстиями (колонны, платформы, окна) — clip-path с path() и правилом заливки evenodd.</p><p>Однако polygon() работает с процентами, а path() требует координат в пространстве CSS — что нарушает чистоту разделения. Решение нашлось в новой функции shape(), которая поддерживает проценты и evenodd одновременно.</p><h3>Выравнивание текстур</h3><p>Два соседних сектора с одинаковой текстурой пола должны бесшовно стыковаться. Поскольку background-image повторяется бесконечно, достаточно выровнять начало паттерна по мировым координатам:</p><p>Каждый сектор ссылается на одну и ту же текстурную сетку — независимо от того, где расположен его &lt;div&gt;. В результате переход между секторами выглядит бесшовным.</p><h2>Анимации — двери, снаряды, спрайты</h2><p>Прежде чем перейти к деталям — важный термин: <b>billboarding</b>. Это техника, при которой 2D-спрайт всегда повёрнут лицом к камере, независимо от положения игрока. В DOOM все враги, бочки и снаряды — billboarded-элементы.</p><h3>Двери и лифты на CSS transitions</h3><p>Открытие двери в DOOM — это поднятие потолка сектора. В CSS все элементы двери группируются в контейнер, а анимация запускается переключением атрибута data-state:</p><p>Никакого JS animation loop — достаточно установить атрибут состояния на элементе. CSS transitions берут анимацию на себя.</p><p>С лифтами всё сложнее: игрок едет вместе с платформой, поэтому --player-z должен обновляться синхронно с CSS transition. Но --player-z управляется из JavaScript. Поэтому для лифтов JS вынужден использовать функцию cubic ease-in-out (t² * (3 - 2t)), чтобы оставаться в синхронизации с CSS-анимацией — это признанное ограничение текущей архитектуры.</p><h3>Снаряды на CSS animations</h3><p>Ракеты и файерболы импов — это billboarded &lt;div&gt;. При создании снаряда JavaScript вычисляет конечную точку и длительность полёта, а CSS анимирует перемещение от точки A к точке B:</p><p>Благодаря разделению translate и rotate как отдельных CSS-свойств анимация управляет только позицией, а rotate реагирует на --player-angle — файербол продолжает смотреть на камеру при движении игрока.</p><p>Параллельно с CSS-анимацией игровой цикл на JavaScript рассчитывает позицию снаряда тем же линейным методом — для обнаружения столкновений (collision detection). Когда снаряд попадает в стену, пол, игрока или врага, JS удаляет элемент посреди полёта и порождает взрыв.</p><h3>Спрайты с billboarding и mirroring</h3><p>Враги в DOOM — 2D-спрайты, которые всегда повёрнуты к камере (billboarding). Оригинальная игра хранит 5 уникальных наборов кадров из 8 ракурсов — ракурсы 6-8 это зеркальные отражения 2-4. CSS воспроизводит это через scaleX(-1):</p><p>Анимация ходьбы — это spritesheet (набор кадров анимации в одном изображении) со сдвигом background-position-x через steps(). При атаке или смерти JavaScript меняет data-state, и CSS переключается на другой фрагмент spritesheet.</p><p>Одна из проблем: изначально все враги маршировали идеально в ногу — левая нога каждого зомби касалась земли в один и тот же момент. Решение — случайный animation-delay, задаваемый из JavaScript. Когда в браузерах появится CSS-функция random(), этот параметр можно будет перенести целиком в CSS.</p><h2>Освещение и @property</h2><p>DOOM хранит уровень освещённости для каждого сектора. В CSS это реализовано через custom property --light на контейнере сектора:</p><p>Каскад CSS идеально подходит для этого: все стены, полы и спрайты в тёмном секторе автоматически затемняются — без необходимости устанавливать яркость на каждом элементе отдельно. Мерцающие лампы — это @keyframes-анимации переменной --light.</p><p>Но анимировать custom properties можно только если они зарегистрированы через @property. Без этого браузер воспринимает их как строки:</p><p>Эта регистрация позволяет плавно анимировать --player-z — например, при падении игрока с уступа CSS сам создаёт плавный переход.</p><h2>Что делает JavaScript, а что CSS</h2><p>Автор чётко разделил ответственности:</p><ul><li><b>JavaScript</b> — игровой цикл, состояние игры, коллизии, порождение и удаление DOM-элементов, установка custom properties и data-атрибутов</li><li><b>CSS</b> — все 3D-трансформации, вычисление геометрии (тригонометрия), анимации дверей и снарядов, освещение, CSS рендеринг спрайтов</li></ul><p>По словам Ленхера, game loop на JavaScript — наименее интересная часть проекта. Исходный код DOOM на C доступен публично уже много лет, поэтому для портирования он <a href="https://nielsleenheer.com/articles/2026/css-is-doomed/">использовал Claude</a>, чтобы сосредоточиться на CSS-рендеринге.</p><h2>Выводы</h2><blockquote>Я хотел найти границы того, на что способен браузер. Увидеть, насколько мощным стал современный CSS. И потому что это DOOM. На CSS. Вам правда нужна ещё какая-то причина?</blockquote><p>Проект демонстрирует, как далеко продвинулся CSS за 30 лет. Функции вроде hypot(), atan2() и @property превращают каскадные таблицы стилей в полноценный инструмент для 3D-вычислений. Разделение на JS game loop и CSS-рендеринг оказалось не только возможным, но и элегантным.</p><p>Исходный код: <a href="https://github.com/NielsLeenheer/cssDOOM">GitHub</a>. Подробный разбор: <a href="https://nielsleenheer.com/articles/2026/css-is-doomed/">CSS is DOOMed</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик создал эмулятор процессора x86 на чистом CSS — без единой строчки JavaScript</title>
      <link>https://tproger.ru/news/emulyator-processora-x86-na-chistom-css--ni-strochki-javascript</link>
      <comments>https://tproger.ru/news/emulyator-processora-x86-na-chistom-css--ni-strochki-javascript?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/emulyator-processora-x86-na-chistom-css--ni-strochki-javascript</guid>
      <description><![CDATA[<p>Lyra Rebane создал полноценный эмулятор процессора x86 на чистом CSS — без JavaScript и WebAssembly. Проект использует экспериментальные функции CSS: if(), style queries и @function.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/emulyator-processora-x86-na-chistom-css--ni-strochki-javascript">Разработчик создал эмулятор процессора x86 на чистом CSS — без единой строчки JavaScript</a>»</p>]]></description>
      <category><![CDATA[Красивый хак]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 Mar 2026 07:44:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Lyra Rebane создал(а) <a href="https://lyra.horse/x86css/">x86CSS</a> — полноценный эмулятор процессора архитектуры x86 на чистом CSS. Никакого JavaScript или WebAssembly — все вычисления происходят исключительно силами браузерного движка стилей.</p><h2>Как это работает</h2><p>Эмулятор исполняет реальный машинный код для процессоров <a href="https://en.wikipedia.org/wiki/Intel_8086">Intel 8086</a>. Тактовый генератор построен на CSS-анимациях в сочетании со style container queries, поэтому система работает автономно и не требует от пользователя никакого взаимодействия — программа крутится сама.</p><p>Логика реализована благодаря новым возможностям CSS, которые пока доступны только в экспериментальном виде:</p><ul><li>условные операторы <b>if()</b></li><li><b>style queries</b> (стилевые запросы контейнера)</li><li>кастомные <b>@function</b></li></ul><p>На странице проекта есть скрипт-тег, но он лишь ускоряет работу тактового генератора. Если отключить JavaScript, эмулятор продолжит работать — просто чуть медленнее и менее стабильно.</p><h2>Запуск собственных программ</h2><p>В эмуляторе можно запускать собственные программы. Достаточно написать код на C и скомпилировать его через <a href="https://gitlab.com/tkchia/build-ia16">gcc-ia16</a> с помощью скрипта из <a href="https://github.com/rebane2001/x86css">репозитория</a> автора. На выходе — готовый HTML-файл со стилями, внутри которого исполняется ваш бинарник.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-03-06/46d28142-b0a2-47e0-85cf-923ecfdd4f03.webp" alt="Репозиторий x86CSS на GitHub" /><figcaption>Репозиторий проекта на GitHub — 726 звёзд, лицензия GPL-3.0</figcaption></figure><p>По умолчанию эмулятору доступно 1,5 КБ памяти, но этот лимит можно увеличить в конфигурации. Программа загружается по адресу 0x100, предусмотрены специальные адреса ввода-вывода для взаимодействия с «железом» — экранным выводом и клавиатурой.</p><h2>Ограничения и совместимость</h2><p>Практического применения у проекта нет — производительность крайне низкая. Зато это отличная демонстрация того, что современный CSS действительно стал тьюринг-полным.</p><p>Из-за использования экспериментальных CSS-функций запустить демку пока можно <b>только в браузерах на базе Chromium</b> (Chrome, Edge, Opera и т.д.). Firefox и Safari пока не поддерживают нужные спецификации, хотя все используемые фичи входят в официальный стандарт CSS.</p><p>Отдельно автор подчёркивает: проект создан полностью вручную, <b>без использования ИИ</b>. CSS написан в Sublime Text, а для генерации повторяющихся частей кода использовался Python-скрипт.</p><p>Попробовать эмулятор можно на <a href="https://lyra.horse/x86css/">сайте проекта</a>, исходный код доступен на <a href="https://github.com/rebane2001/x86css">GitHub</a> под лицензией GPL-3.0.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как работают браузеры: понятное техническое объяснение</title>
      <link>https://tproger.ru/articles/kak-rabotayut-brauzery--samoe-ponyatnoe-obyasnenie</link>
      <comments>https://tproger.ru/articles/kak-rabotayut-brauzery--samoe-ponyatnoe-obyasnenie?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-rabotayut-brauzery--samoe-ponyatnoe-obyasnenie</guid>
      <description><![CDATA[<p>Это простая техническая статьи, из которой вы поймете детали и сформируете интуитивное понимание работы браузеров.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-rabotayut-brauzery--samoe-ponyatnoe-obyasnenie">Как работают браузеры: понятное техническое объяснение</a>»</p>]]></description>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 09 Feb 2026 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Это адаптированный перевод материала <a href="https://howbrowserswork.com">How Browsers Work</a>, подготовленный специально для читателей Tproger.</i></p><h2>Зачем это нужно?</h2><p>Эту статью написали для разработчиков и всех, кто пользуется браузерами каждый день, но никогда не разбирался в том, как они устроены изнутри.</p><p>Автор посчитал, что большинство существующих гайдов либо слишком технические и детализированные, либо, наоборот, поверхностные. Поэтому он решил выбрать другой подход.</p><p>Руководство построено на небольших примерах, чтобы понять технические детали и сформировать интуитивное понимание работы браузеров.</p><p>Чтобы материал оставался кратким и по существу, автор намеренно опустил многие критические детали: разные версии HTTP-протокола, SSL, TLS, нюансы работы DNS и многое другое.</p><h2>Браузеры работают с URL</h2><p>Вы можете ввести в адресную строку буквально что угодно. Но под капотом браузеры работают с URL:</p><ul><li>Случайный текст вроде «pizza» будет преобразован в поисковый URL типа https://google.com/search?q=pizza</li><li>Доменное имя вроде example.com будет нормализовано в полный URL: https://example.com</li></ul><p>Чтобы увидеть, как это работает на практике, попробуйте ввести «pizza» или «example.com» в адресную строку браузера.</p><h2>Превращение URL в HTTP-запрос</h2><p>Когда браузер знает точный URL, который нужно посетить, он может отправить запрос на сервер, чтобы получить ресурс и отобразить его. Браузеры общаются с серверами по протоколу HTTP.</p><p>Чтобы понять, как URL переводится в формат HTTP-запроса, рассмотрим пример с полным URL вроде <b>example.com.</b></p><p>HTTP-запросы содержат заголовки в таком формате:</p><p>Один из заголовков — это заголовок Host. Он используется для идентификации сервера, на который отправляется запрос: <b>example.com</b>.</p><h2>Определение адреса сервера</h2><p>Браузеры не могут отправлять запросы на имена вроде<b> example.com</b>.</p><p>Компьютеры общаются с IP-адресами, поэтому браузер сначала обращается к системе DNS, чтобы преобразовать доменное имя в IP-адрес, прежде чем подключиться к серверу и отправить HTTP-запрос.</p><p>Например, если вы введёте в терминале команду для разрешения домена, DNS вернёт соответствующий IP-адрес:</p><h2>Установка TCP-соединения</h2><p>После того как DNS предоставил браузеру IP-адрес, всё ещё требуется надёжное соединение с сервером. TCP — это протокол, который устанавливает такое соединение до того, как будут отправлены любые HTTP-данные.</p><p>TCP устанавливает соединение с помощью трёхэтапного согласия, которое подтверждает, что обе стороны готовы отправлять и получать данные:</p><ol><li>SYN: клиент отправляет свой порядковый номер (seq=1000), чтобы открыть соединение</li><li>SYN-ACK: сервер подтверждает пакет, добавляя свой порядковый номер (seq=5000) и подтверждая номер клиента, увеличивая его на 1 (ack=1001)</li><li>ACK: клиент подтверждает номер сервера, увеличивая его на 1 (ack=5001), и соединение готово</li></ol><p>Эти номера показывают, как клиент и сервер отслеживают диалог. Они считают байты, поэтому обе стороны согласны с тем, где начинается поток данных и что должно произойти дальше. Если какие-то данные не приходят, отправитель видит разрыв и повторно передаёт недостающие байты. Именно так TCP поддерживает порядок данных и надёжность после установки соединения.</p><p>Когда вы начинаете отправлять пакеты и пытаетесь нарушить работу сети, вы можете увидеть, как TCP справляется с потерями данных и восстанавливает передачу.</p><h2>HTTP-запросы и ответы</h2><p>После установки TCP-соединения браузер может отправить HTTP-запрос на сервер.</p><p>Представьте, что вы наблюдаете за тем, как HTTP-запрос путешествует к серверу, а HTTP-ответ возвращается в браузер:</p><p>БРАУЗЕР (КЛИЕНТ)</p><p>СЕРВЕР</p><p>Когда приходит HTTP-ответ, браузер читает сырой HTTP-ответ и начинает рендеринг HTML-контента.</p><h2>Парсинг HTML для построения DOM-дерева</h2><p>После того как приходит HTTP-ответ, браузер отделяет заголовки от тела и направляет HTML-байты в парсер. Парсер превращает теги вроде<b> &lt;h1&gt;</b> в токены и строит DOM-дерево.</p><p>Посмотрите, как HTML-поток парсится в DOM-дерево:</p><p>DOM-дерево:</p><p>Парсинг происходит потоково и устойчив к ошибкам: браузер начинает строить узлы ещё до того, как документ полностью загружен, и вставляет недостающие теги, чтобы дерево оставалось валидным. Когда появляется тег <b>&lt;script&gt;</b>, парсинг может приостановиться, чтобы выполнить скрипт.</p><p>DOM-дерево затем объединяется с CSS, чтобы создать render tree (дерево рендеринга), которое используется для расчёта layout и отрисовки пикселей.</p><h2>О важности DOM</h2><p>DOM — это внутренняя модель документа в памяти браузера. Это общий контракт между HTML-парсером, движком CSS-селекторов и средой выполнения JavaScript. Изменения в DOM немедленно влияют на layout, стили и то, с чем пользователи могут взаимодействовать.</p><p>DOM обеспечивает всё: от выборки элементов до динамической стилизации и обработки событий. Попробуйте отредактировать JavaScript-код и посмотрите, как меняется DOM:</p><p>Редактируемый JavaScript:</p><p>Живой DOM:</p><h2>Layout, Paint и Composite</h2><p>После того как DOM и CSS готовы, браузер запускает конвейер рендеринга: Layout (reflow) для расчёта размеров и позиций, Paint для заполнения пикселей, затем Composite для сшивки слоёв на GPU.</p><p>Не каждое изменение запускает все этапы заново. Изменение цвета обычно требует только перерисовки (repaint), тогда как изменение размеров заставляет пересчитывать layout и paint.</p><p>Этапы рендеринга:</p><ol><li>Layout — пересчёт размеров и позиций</li><li>Paint — заполнение пикселей в слои</li><li>Composite — сшивка слоёв на GPU</li></ol><p>Пример DOM:</p><p>Composite всегда смешивает слои в финальный кадр.</p><p>Именно поэтому страницы с большим количеством layout-операций ощущаются медленнее: больше работы нужно выполнить, прежде чем можно будет показать следующий кадр.</p><p>Вот и всё! Если вы разобрались со всеми примерами, у вас должна сформироваться чёткая ментальная модель работы браузеров.</p><p>Теперь вы понимаете путь от ввода URL в адресную строку до отображения пикселей на экране: разрешение DNS, установку TCP-соединения, отправку HTTP-запросов, парсинг HTML, построение DOM и конвейер рендеринга с этапами Layout, Paint и Composite.</p>]]></content:encoded>
    </item>
    <item>
      <title>CSS counters в подходе Atomic CSS - часть 2</title>
      <link>https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-2</link>
      <comments>https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рамазан Максютов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-2</guid>
      <description><![CDATA[<p>В этом посте мы более глубоко погрузимся в то, как работать с CSS Counters в Atomic CSS. В частности, мы разберемся в процессе наследования счётчиков и их значений, а также увидим как отличается отображение счётчиков в разных браузерах. Будет интересно!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-2">CSS counters в подходе Atomic CSS - часть 2</a>»</p>]]></description>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 25 Jan 2026 03:42:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всем привет, друзья!</p><p>В <a href="https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-1">первой статье</a> про CSS counters мы с вами разобрались, как с ними работать на базовом уровне. Мы изучили основные CSS свойства и функции для работы с ними, а также привели базовые примеры с помощью фреймворка <a href="https://mlut.style/">mlut</a>.</p><p>В этой статье мы углубим наши познания в области кастомных CSS счётчиков, опираясь на <a href="https://www.w3.org/TR/css-lists-3/#auto-numbering">спеки</a> и <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Counter_styles/Using_counters">обзор </a>в MDN. Если конкретнее, то мы изучим принципы наследования счётчиков и их значений, а также разберём парочку примеров. А бонусом мы посмотрим на небольшое расхождение в том, как ведут себя кастомные счётчики в разных браузерах.</p><p>Ну что, поехали!</p><h2>Базово про вложенность</h2><h3>Наивный путь</h3><p>Думаю, вы хотя бы раз в жизни сталкивались с ситуациями, когда вам приходилось верстать многоуровневые списки. CSS counters позволяют создавать такие списки – давайте научимся этому.</p><p>На базовом уровне для этого можно создать новый счётчик с новым именем внутри элемента, где уже задан “родительский счётчик”. Например, если на родительском &lt;ol&gt; мы зададим счётчик parent-counter, то на дочернем `&lt;ol&gt;` можем задать счётчик `child-counter`. Выглядеть это будет так:</p><p>А вот такие стили сгенерирует mlut:</p><p>А так будет выглядеть результат – в принципе, как мы и ожидали:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-21/3a5fc372-d4b7-4b9d-91e9-6329989a07cd.png" alt="" /><figcaption>Простейший вложенный список</figcaption></figure><h3>Продвинутый путь</h3><p>Но возможности кастомных счётчиков позволяют уменьшить количество утилит почти вдвое.</p><p>Существует такое правило:</p><p>Если мы создаём счётчик с каким-то именем (далее – дочерний счётчик или вложенный) на данном элементе, а он наследует счётчик с точно таким же именем от родителя (далее – родительский счётчик), то новый счётчик будет вложен в родительский. Тогда функция counter() будет возвращать значение последнего вложенного счётчика с данным именем, а counters() значения всех вложенных счётчиков с таким именем в области видимости элемента.</p><p>Про область видимости и правила наследования счётчиков поговорим чуть попозже, а пока давайте проиллюстрируем данное выше правило следующей разметкой:</p><p>А результат мы получим абсолютно такой же! Благодаря тому, что мы возпользовались возможностью создавать вложенные счётчики, мы значительно сократили количество атомарных классов. Кроме того, мы уменьшили количество сущностей (счётчиков), которые нам нужно держать в голове при разработке.</p><p>Кроме того, мы можем обратить внимание на несколько тонкостей:</p><p>– функция counters() действительно отображает значения всех уровней счётчика nested с указанным разделителем;</p><p>– свойство `counter-increment` инкрементирует значение наиболее глубоко вложенного счётчика с данным именем, который может видеть наш элемент.</p><h2>Вложенность и наследование</h2><p>В этом разделе мы подробно разберём процесс наследования кастомных счётчиков и посмотрим на примерах, как это работает.</p><h3>Область видимости</h3><p>Когда мы инициализируем счётчик на каком-то из элементов нашей страницы, он становится видимым сразу для некоторого числа других элементов. Это множество элементов называется областью видимости счётчика. В него входят:</p><p>– все потомки того элемента, в котором этот счётчик был создан;</p><p>– все последующие соседи того элемента, в котором счётчик был создан, а также все потомки этих соседей;</p><p>– наследование счётчика прерывается на первом элементе-соседе, на котором создаётся счётчик с таким же именем с помощью counter-reset.</p><p>Давайте проиллюстрируем эти правила следующим примером:</p><p>CSS:</p><p>А результат получится такой:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-21/6ca18933-fb37-404b-8bc9-68db60cb7852.png" alt="" /><figcaption>Наследование счётчика</figcaption></figure><p>Мы видим, что счётчик inherited был создан на первом элементе &lt;div&gt;, а его дочерние элементы &lt;p&gt; унаследовали его. Также его унаследовали следующие два соседа нашего &lt;div&gt;, но на последнем из них счётчик inherited был переопределён на новый, так что последний &lt;div&gt; из области видимости первого счётчика выпал. Итого, в область видимости счётчика, созданного на первом &lt;div&gt; входят:</p><p>– первый и второй элементы &lt;div&gt;;</p><p>– дочерние параграфы &lt;p&gt; первого элемента &lt;div&gt;;</p><p>– дочерние параграфы второго элемента &lt;div&gt;.</p><h3>Правила наследования счётчиков</h3><p>В прошлом пункте мы с вами узнали, что у каждого счётчика есть область видимости  – набор элементов, которые видят наш счётчик и могут обращаться к его значению. Оказывается, и у каждого HTML-элемента есть множество счётчиков, к которым этот он может обращаться.</p><p>Счётчики могут попасть в это множество двумя путями:</p><p>– через механизм наследования;</p><p>– посредством создания прямо в этом элементе.</p><p>Второй путь мы изучили уже вдоль и поперёк, поэтому сейчас сосредоточимся на первом – наследовании. Как мы уже знаем, счётчик может передаваться дочерним элементам и последующим соседям. Сформулируем ниже более строгие правила, которые в принципе покрывают все возможные случаи наследования счётчиков.</p><ol><li>Текущий элемент наследует любой счётчик, который определён ранее на любом родительском элементе.</li><li>Предположим, что на предыдущем элементе-соседе есть счётчик. Прежде, чем текущий элемент унаследует этот счётчик от соседа, произойдёт проверка: нет ли уже в текущем элементе счётчика с таким именем? Если такого нет, то копия счётчика из предыдущего элемента унаследуется текущим. Если же есть такой, то этого не произойдёт.</li></ol><p>А как же наследуется значение? Здесь немного всё интереснее. Значение счётчика наследуется от самого ближайшего предшествующего элемента в DOM-дереве. А именно, если сами счётчики наследуются только от родителя или соседа, то их значения могут передаваться ещё и от самого последнего дочернего элемента, находящегося внутри предыдущего соседа.</p><p>Всё это мы видим на приведённом выше примере. Давайте я ещё раз покажу его:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-21/b86868e0-8193-4c31-af8f-ffa4a4e53d8f.png" alt="" /><figcaption>Наследование значения счётчика</figcaption></figure><p>Здесь:</p><ol><li>Div 1 не наследует никакие счётчики.</li><li>Все &lt;p&gt; внутри Div 1 получили в наследство от своего родителя счётчик, который затем на них инкрементируется и отображается;</li><li>Div 2 унаследовал счётчик как сосед Div 1, а параграфы &lt;p&gt; внутри Div 2 – как дочерние элементы Div 2;</li><li>Мы также видим, как наследуется значение счётчика на всех этапах. В частности, из интересного стоит отметить, как Div 1 передаёт значение первому вложенному параграфу &lt;p&gt;, тот передаёт следующему, а вот последний параграф &lt;p&gt; внутри Div 1 передаёт значение уже Div 2. И это всё идеально соответствует правилу, которое гласит, что значение счётчика передаётся от последнего предшествующего соседа в DOM-дереве.</li></ol><p>Вот и всё, казалось бы: мы разобрали правила наследования и вложения счётчиков, изучили примеры – что же ещё можно здесь рассказать? Но, оказывается, у описанного поведения есть тонкости, которые мы рассмотрим выше.</p><h2>Тонкости поведения браузеров</h2><p>Давайте попробуем создать вложенный список несколько более простым способом, чем мы это делали раньше. Мы попробуем сэкономить целых два уровня вложенности.</p><p>CSS:</p><p>Я этот пример придумал, когда хотел сделать вложенный список проще, чем тот, что описан выше и в спецификациях. И вот моя задумка:</p><ol><li>создаём в первом элементе &lt;div&gt; счётчик curious с начальным значением 1 и с помощью counters() отображаем значения всех счётчиков c этим именем, которые присутствуют в этом элементе (он только один в данном случае);</li><li>этот же счётчик наследуется дочерними &lt;p&gt; и следующим соседом &lt;div&gt;.</li><li>на первом вложенном &lt;p&gt; в каждой из &lt;div&gt; создаётся вложенный счётчик с тем же именем curious.</li></ol><p>Теперь вопрос, что здесь будет?</p><p><b>Вариант А:</b> получится правильный вложенный список, где нумерация будет идти следующим образом (1 1.1 1.2 2 2.1 2.2). То есть созданный на первом &lt;p&gt; вложенный счётчик будет наследоваться следующим его соседом, как на картинке ниже:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-21/8825e951-9f45-4119-bb76-aefe77a6037d.png" alt="" /><figcaption>Вариант А</figcaption></figure><p><b>Вариант Б</b>: получится некорректный вложенный список, где нумерация будет такой (1 1.1 2 3 3.1 4). То есть созданный в первом &lt;p&gt; вложенный счётчик не наследуется его соседями. Здесь можно сослаться на то, что счётчик наследуется от предыдущего соседа только тогда, когда на текущем элементе счётчика с таким именем нет. А на втором &lt;p&gt; уже может быть унаследованный от родителя счётчик curious. Тогда результат должен быть таким:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-21/994570e3-2a11-445b-af76-284e8d09397b.png" alt="" /><figcaption>Вариант Б</figcaption></figure><p><b>Вариант В</b>: получится вообще не понятно, что. Ну, например такая нумерация (1 1.1 2 3 3.1 3.2). То есть в первой `` вложенный счётчик из первого `` не унаследуется его соседом, а во второй `` – унаследуется. Совершенно маловероятный вариант, но пусть будет.</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-21/1a3401c2-dc07-4e65-af0e-2d06bea523de.png" alt="" /><figcaption>Вариант В</figcaption></figure><p>Ну что, каков ваш ответ?</p><p>А ответ таков: вариант А будет работать в браузерах Firefox и Safari, а вариант Б ни в каких браузерах не реализуется! И что же получается, что для Chromium браузеров остаётся самый удивительный вариант В? Да, так и есть, по крайней мере в версии 143 (в версии 144 это уже исправлено). Можете проверить аналогичную <a href="https://jsfiddle.net/46yns3vh/">иллюстрацию</a>.</p><p>Вот такая вот тонкость имеется в поведении CSS Counters в разных браузерах.</p><h3>Как это можно объяснить?</h3><p>Safari и Firefox в данном случае идут вразрез со спецификациями, хотя их поведение более интуитивно понятно для пользователей. На самом деле реализоваться должен вариант Б. Дело в том, что от родительского элемента счётчик наследуют все дочерние, а счётчик, созданный на первом дочернем элементе, наследуется соседями только тогда, когда у них нет счётчика с таким именем.</p><p>А вот команда Chromium стремилась реализовать вариант Б, но допустила небольшой <a href="https://issues.chromium.org/issues/458409068">баг</a>, который уже исправлен в версии 144.</p><h2>Заключение</h2><p>Ну вот мы и разобрались в основных концепциях кастомных CSS счётчиков. Надеюсь, эта статья была для вас познавательной и интересной. К счастью, веб-технологии активно развиваются и нам всегда будет, чему учиться. А я постараюсь делать это вместе с вами в будущих статьях!</p><p>Успехов вам в увлекательном пути Frontend-разработки!</p>]]></content:encoded>
    </item>
    <item>
      <title>CSS counters в подходе Atomic CSS - часть 1</title>
      <link>https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-1</link>
      <comments>https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рамазан Максютов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-1</guid>
      <description><![CDATA[<p>CSS Counters - отличный инструмент для работы с кастомными счётчиками. Но применение его не ограничивается только рукописным CSS - его легко и эффективно можно (и нужно!) использовать в рамках Atomic CSS подхода! 

Давайте же посмотрим, как это сделать!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/css-counters-v-podhode-atomic-css---chast-1">CSS counters в подходе Atomic CSS - часть 1</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 10 Jan 2026 12:10:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всем привет, друзья!</p><p>Меня зовут Рамазан, и в этой статье мы поговорим о применении CSS counters в подходе Atomic CSS. Статей про сами CSS счётчики довольно много в сети, и на MDN есть очень хороший <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters#using_counters">обзор</a> этого функционала, а также существуют <a href="https://www.w3.org/TR/css-lists-3/">спецификации</a>, на которые я буду опираться. Но мало кто рассказывал про использование кастомных счётчиков в Atomic CSS подходе, поэтому в данной серии статей мы поговорим именно об этом. Работать мы будем на фреймворке <a href="https://mlut.style/">mlut</a> - одном из немногих, поддерживающих CSS counters и многие другие возможности прямо из коробки.</p><p>В первой статье я расскажу вам про основные вещи: как устроены кастомные счётчики, как их инициализировать, менять и отображать их значения. Кроме того, мы рассмотрим пару несложных примеров для закрепления.<br /><br />К слову, этот пост является переводом моей оригинальной <a href="https://medium.com/stackademic/css-counters-in-atomic-css-part-1-51c4127c5aab">статьи </a>на Medium — вы можете почитать и её.</p><h2>Основы</h2><p>Зачем вообще нужны кастомные CSS счётчики, если у нас есть &lt;ol&gt;? Именно этот вопрос возник у меня, когда я впервые узнал об этом функционале. А применений у него много: вложенные списки, гибкость без потери индексации сайта и даже игры на CSS! Поэтому нам определённо стоит присмотреться к кастомным счётчикам внимательнее.</p><p>Работать с кастомными счётчиками мы можем посредством:</p><p>- CSS свойств counter-*;</p><p>- функций counter() и counters();</p><p>- at-правила counter-style.</p><h3>Жизненный цикл счётчика</h3><p>Давайте начнём с самой основы. Через что приходится проходить счётчикам прежде, чем их значения украсят элементы нашего интерфейса? В каком порядке применяются упомянутые выше свойства под капотом? Знать это довольно важно - это поможет избежать многих ошибок в будущем.</p><p>Так вот:</p><p>1) Сначала элемент наследует счётчики от элементов предшественников (это может быть родитель или предшествующий сосед элемента);</p><p>2) Потом срабатывает counter-reset и создаётся новый либо вложенный счётчик;</p><p>3) Затем работает counter-increment, позволяющий менять значения счётчиков элемента;</p><p>4) Потом наступает очередь counter-set, который позволяет вручную задать значение счётчиков элемента;</p><p>5) А затем уже вызываются функции counter() и counters().</p><p>Далее подробнее поговорим про то, как работают все эти свойства и функции.</p><h3>counter-reset</h3><p>Это свойство позволяет создать новый счётчик с указанным именем и начальным значением. А если во множестве счётчиков нашего элемента уже будет счётчик с тем же именем, то будет создан вложенный счётчик. Такое может быть при наследовании счётчиков, но об этом мы поговорим подробно в следующей статье.</p><p>Когда браузер встречает это свойство среди стилей элемента, он создаёт счётчик и привязывает к нему три параметра:</p><p>- элемент, в котором был создан этот счётчик;</p><p>- строку с именем счётчика;</p><p>- целое число.</p><p>Именно с этим набором свойств счётчик затем передаётся потомкам и последующим соседям в процессе наследования.</p><p>Давайте инициализируем новый счётчик с помощью утилиты Сor, которой mlut сопоставляет свойство counter-reset:</p><p>CSS, сгенерированный движком mlut, будет таким:</p><p>Здесь мы задали счётчик с указанием имени paragraphs и начального значения 5. Вообще говоря, мы можем инициализировать сразу несколько счётчиков. Для этого свойство counter-reset может принимать множество аргументов: строки  и целые числа. Числа указывать не обязательно - тогда для соответствующего счётчика будет установлено значение по умолчанию 0. А вот так это делается:</p><p>Тут будет создано два счётчика: first с начальным значением 0 и second со значением 2. А вот указывать утилиту Cor несколько раз подряд (или в CSS несколько раз использовать counter-reset в одном элементе) для создания нескольких счётчиков нельзя. Тогда сработают каскады CSS и из всех счётчиков выживет только последний указанный.</p><h3>Функции counter() и counters()</h3><p>Отлично, мы создали наш первый кастомный счётчик, а его значение теперь можно использовать в дочерних &lt;p&gt;. Но как нам его отобразить в разметке? Как раз для этого и нужны функции counter() и counters(). Чтобы отобразить значения имеющихся у элемента счётчиков, нам достаточно создать псевдо-элемент ::before и передать в его содержимое данную функцию.</p><p>У counter() и counters() разное количество возможных аргументов. У первого их всего два: имя счётчика и стиль, который можно взять из значений list-style-type или задать самостоятельно с помощью @counter-style.  У counters() их три: имя счётчика, разделитель между вложенными счётчиками (о них в следующей статье) и стиль.</p><p>Попробуем применить первую функцию в простейшем примере:</p><p>CSS:</p><p>Выглядеть это будет примерно вот так:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-08/3944dcec-e8a2-403f-abff-145e3422df81.png" alt="Шаг 1. Создание счётчика и отобразили значения" /><figcaption>Шаг 1. Создание счётчика и отобразили значения</figcaption></figure><p>Здесь мы использовали утилиту Ct-counter(paragraphs,lower-roman);'.';';'_b, чтобы задать содержимое псевдо-элемента. Часть утилиты ;';' здесь нужна для отображения пробела после точки - тут дело в том, как работает движок mlut. Поставить пробел ' ' прямо в утилиту мы не можем, так как пробелами в CSS разделяются классы, и движок воспримет этот символ как конец текущей утилиты. Поэтому для обозначения пробела в этом случае используется символ ;.</p><p>В качестве альтернативы мы можем воспользоваться атрибутом data-ml-ct вот так:</p><p>CSS:</p><p>Тогда mlut возьмёт значение, указанное в атрибуте data-ml-ct и вставит на место mAtt в утилите. Это тоже хорошее решение, но оно лучше подойдёт для более сложных ситуаций. В данном же случае оно будет избыточным, поэтому в дальнейшем мы будем пользоваться первым способом.</p><h3>counter-increment</h3><p>Теперь настало время пронумеровать параграфы разными числами! И для этого нам нужно воспользоваться свойством `counter-increment` посредством утилиты `Coi`. Если же счётчика с указанным в аргументе именем нет, то он будет создан автоматически. Конечно, это кажется удобным, но лучше явно задавать создаваемые счётчики.</p><p>Синтаксис у этого свойства точно такой же, как у свойства counter-reset. В простейшем случае оно принимает два аргумента: имя счётчика и целое число (и отрицательное тоже), на которое следует изменить значение счётчика. А множественные аргументы могут включать чередующиеся имена счётчиков и числа, на которые эти счётчики нужно изменить. Причём указывать числа необязательно - если число после имени счётчика отсутствует, то его значение изменится на единицу по умолчанию. Применим это к нашему списку:</p><p>CSS:</p><p>Результат будет выглядеть вот так:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-08/810c7fbf-5d28-4276-91d9-1c4108a72f4d.png" alt="Шаг 2. Включаем инкрементацию" /><figcaption>Шаг 2. Включаем инкрементацию</figcaption></figure><p>Кстати, если вы укажете одно и то же имя счётчика несколько раз в аргументе утилиты Coi, то этот счётчик соответствующее количество раз проинкрементируется. Если же есть вложенные счётчики с таким именем, несколько раз изменится счётчик на самом глубоком уровне вложенности из видимых данным элементом. А вот так можно проинкрементировать счётчик несколько раз:</p><p>CSS:</p><p>В итоге на таком элементе наш счётчик увеличится сначала на 2, а затем на единицу прежде, чем значение отобразится на экране.</p><h3>counter-set</h3><p>Далее рассмотрим свойство counter-set - для него в mlut есть утилита Cos. Это свойство позволяет нам самим задать, какое будет значение у уже существующих счётчиков в обход нормального хода их инкрементирования. Это CSS свойство умеет вызывать создание нового счётчика, если счётчика с нужным именем нет. Но всегда лучше явно задавать новый счётчик, чтобы избежать неожиданных сайд-эффектов.</p><p>Данное свойство может также поддерживать и множественные аргументы: имена счётчиков и значения, которые мы для них устанавливаем. Если же мы не укажем число после имени счётчика, то его значение автоматически установится равным нулю.</p><p>Давайте применим эту утилиту к последнему параграфу:</p><p>CSS:</p><p>И вот такой вот кастомный список у нас получится в итоге:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2026-01-08/119e74e1-53d7-4316-9dc9-a9aa5a12194a.png" alt="Шаг 3. Применяем задание значения счётчика вручную" /><figcaption>Шаг 3. Применяем задание значения счётчика вручную</figcaption></figure><h2>Итоги</h2><p>Спасибо, что дочитали эту статью до конца! В ней мы разобрали основные и наиболее важные моменты в работе с CSS counters в подходе Atomic CSS.  Мы проиллюстрировали работу кастомных счётчиков на простом примере и теперь можем пользоваться ими в своих проектах!</p><p>В дальнейшем я планирую написать ещё пару статей, глубже раскрывающих принципы работы CSS counters. В частности, я подробнее опишу механизм наследования счётчиков и попробую раскрыть одну особенность их поведения в разных браузерах. Так что оставайтесь на связи!</p><p>Успехов вам в увлекательном пути Frontend-разработки!</p>]]></content:encoded>
    </item>
    <item>
      <title>Man or Boy test в CSS: три способа сверстать бургер-меню</title>
      <link>https://tproger.ru/articles/man-or-boy-test-v-css</link>
      <comments>https://tproger.ru/articles/man-or-boy-test-v-css?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рамазан Максютов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/man-or-boy-test-v-css</guid>
      <description><![CDATA[<p>Статья посвящена анализу трёх способов создания бургерного меню: от самого простого к самому сложному с применением Atomic CSS фреймворка mlut! Прочитав её, вы поймёте, какого уровня навыками вы обладаете в Frontend-разработке.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/man-or-boy-test-v-css">Man or Boy test в CSS: три способа сверстать бургер-меню</a>»</p>]]></description>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Unicode]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 08 Dec 2025 14:23:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всем привет!</p><p>Меня зовут Рамазан, и я люблю создавать всякие интересности в вебе.</p><p>В этой статье мы посмотрим на тест "Man or boy", который покажет уровень скилла Frontend-разработчика в вёрстке. К слову, название этого теста - отсылка к <a href="https://en.wikipedia.org/wiki/Man_or_boy_test">"Man or boy test"</a>, который однажды предложил Дональд Кнут в сфере разработки компиляторов.</p><p>В нашей же статье мы покажем три уровня скилла в вёрстке: Man, Boy и промежуточный Teen на всем известном примере. И сейчас это будет вёрстка бургерного меню. Да, то, как сделан этот популярный элемент в интерфейсе, может многое сказать об уровне разработчика!</p><p>Думаю, вы много раз уже видели вёрстку бургерного меню в рукописном CSS. Поэтому для разнообразия здесь мы будем пользоваться подходом Atomic CSS, который мне самому очень нравится. А работать мы в нём будем, используя фреймворк <a href="https://mlut.style/">mlut</a>. На мой взгляд, это один из самых недооценённых CSS-фреймворков.</p><p>Ну что, поехали!</p><h2>Начальные настройки</h2><p>Представим, что мы создаём мобильное меню и хотим сделать классическую кнопку для его открытия и закрытия. Обычно роль такой кнопки играет "бургерное меню" (далее также - бургер, меню), состоящее из трёх горизонтальных толстых линий. Примерно вот такого результата мы хотим в итоге добиться:</p><figure><img src="https://media.tproger.ru/user-uploads/134620/2025-11-26/19df7242-6f8c-4558-98d8-16fc8b97ef14.png" alt="Ожидаемый результат" /><figcaption>Ожидаемый результат</figcaption></figure><p>Но давайте сначала оформим холст, на котором будем создавать наше бургерное меню. Я сделал так, что оно будет находиться в самом центре, чтобы всё было наглядно и красиво. А вы можете настроить всё так, как удобнее вам.</p><p>Вот CSS, который будет сгенерирован из этой разметки:</p><p>Дальше добавим саму кнопку, в которой и будет находиться наш бургер.</p><p>CSS, который добавится:</p><p>В принципе на этом базовые настройки можем закончить - этого будет вполне достаточно для дальшейшей работы. Ну а следующие шаги уже определяют, каков уровень скиллов разработчика: Man, Teen или Boy в мире CSS!</p><h2>Boy</h2><p>Если разработчик только начинает свой увлекательный путь в мире CSS, то он наверняка не захочет сильно напрягаться над каким-то бургерным меню. Поэтому, чтобы сэкономить время, он просто найдёт Unicode-символ бургерного меню и вставит его прямо в кнопку. Может быть он ещё добавит какие-нибудь стили, чтобы всё выглядело хорошо (по возможности):</p><p>CSS:</p><p>Простейшее бургерное меню готово! Но этот путь не самый лучший: у нас нет большой свободы в выборе пропорций линий, а также в выборе расстояний между ними. Кроме того, мы и анимировать эти линии не сможем, поэтому вряд ли требовательный заказчик будет удовлетворён этим решением полностью.</p><h2>Teen</h2><p>Но если перед нами разработчик, который уже набил кое-какие шишки в вёрстке, ему не захочется иметь дело с неудобствами Unicode-символа. Он поймёт, что в бургерном меню по сути нет ничего сложного. Ведь можно просто сделать три прямоугольника с помощью `div`-ов, нужным образом их расположить, и вуаля - в его руках уже кастомный бургер! К тому же мы можем настроить всё, как только заказчик этого пожелает. Вот, как это делается:</p><p>CSS:</p><p>То есть мы просто делаем нашу кнопку `flex`-контейнером, а `div`-ы внутри неё равномерно распределяем по пространству. Вот, в принципе, и всё основное об этом способе. Стоит ещё раз подчеркнуть, что он уже позволяет сделать наше меню анимированным - в этом у нас полная свобода.</p><h2>Man</h2><p>Но, если перед нами настоящий профессионал, познавший многие тонкости вёрстки, его уже могут не устроить три одинаковых `div`-а в разметке. Они занимают место, а большого смысла не несут. И тогда он может вспомнить, что существуют такие элементы, которые задаются исключительно CSS-стилями - псевдоэлементы `::after` и `::before`. А ему здесь хватит даже одного!</p><p>Здесь мы изменили значение `justify-content` для кнопки, а также добавили стили для псевдоэлемента `::after`. Такими будут сгенерированные CSS-стили:</p><p>Это работает примерно так:</p><p>- мы задаём один псевдоэлемент у нашей кнопки, располагаем его нужным образом;</p><p>- у этого псевдоэлемента создаём две тени, расположенные с необходимым интервалом;</p><p>- мы задали скрытую подпись у кнопки, потому что настоящий профессионал должен заботиться и о доступности контента.</p><p>Вот и всё - не так уж сложно было, не правда ли? Но зато как элегантно! При желании здесь можно делать и хорошие анимации, по-разному двигая тени и окрашивая их.</p><h2>Итоги</h2><p>Я рад, что ты дочитал мою небольшую статью до конца. Надеюсь, что она была для тебя полезна и помогла прокачать твои навыки! В будущем я планирую выпустить ещё несколько статей на тему вёрстки. Буду рад, если ты вернёшься и почитаешь их :)</p><p>Успехов в этом увлекательном пути разработки!</p>]]></content:encoded>
    </item>
    <item>
      <title>Лучшие практики для ускорения фронтенда: чек-лист 2025 года</title>
      <link>https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda</link>
      <comments>https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda</guid>
      <description><![CDATA[<p>Ускорьте свой сайт с помощью чек-листа по оптимизации фронтенда: от HTML и CSS до изображений и серверов. Практические советы для повышения скорости, SEO и конверсий в 2025 году.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/luchwie-praktiki-dlya-uskoreniya-frontenda--chek-list-2025-goda">Лучшие практики для ускорения фронтенда: чек-лист 2025 года</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 03 Oct 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это перевод <a href="https://crystallize.com/blog/frontend-performance-checklist">статьи</a> с сайта компании Crystallize. Можете поделиться своим мнением в комментариях!</p><h2>Почему скорость сайта так важна</h2><p>В мире, где внимание пользователей <a href="https://time.com/3858309/attention-spans-goldfish/">рассеивается</a> за восемь секунд, быстрая загрузка сайта становится критически важной. Статистика подтверждает: <a href="https://www.thinkwithgoogle.com/consumer-insights/consumer-trends/mobile-site-load-time-statistics/#:~:text=Google%20www.thinkwithgoogle.com%20%2053,statistics%20on%20Think%20with%20Google">53% мобильных пользователей покидают сайт</a>, если он грузится дольше 3 секунд, а 70% потребителей <a href="https://unbounce.com/page-speed-report/#:~:text=Nearly%2070%25%20of%20consumers%20admit%20that%20page%20speed%20influences%20their,time%20is%20slower%20than%20expected.">отмечают</a>, что скорость влияет на их решение о покупке. Walmart, например, <a href="https://wpostats.com/2015/11/04/walmart-revenue/#:~:text=Walmart%20saw%20up%20to%20a,increase%20in">зафиксировал</a> рост конверсий на 2% за каждую секунду сокращения времени загрузки.</p><p>Быстрые сайты обеспечивают:</p><ul><li>Долгое пребывание пользователей на сайте;</li><li>Больше просмотров страниц благодаря быстрой навигации;</li><li>Меньше отказов из-за медленных загрузок;</li><li>Выше конверсии и доходов, так как скорость напрямую влияет на покупки;</li><li>Лучшую удовлетворенность и удержание пользователей;</li><li>Рост органического трафика, так как Google учитывает Core Web Vitals в SEO-ранжировании;</li><li>Экономию на CDN и трафике, ведь оптимизированные сайты потребляют меньше данных;</li><li>Повышение качества рекламы в Google Ads, так как быстрые страницы снижают стоимость кликов.</li></ul><p>Оптимизация фронтенда — это не просто техническая задача, а способ повысить лояльность пользователей и бизнес-показатели.</p><h2>Как измерить производительность сайта</h2><p>Прежде чем оптимизировать, <a href="https://crystallize.com/blog/frontend-performance-measuring-and-kpis">измерьте</a> текущую производительность сайта, чтобы выявить узкие места. Используйте комбинацию лабораторных и полевых инструментов:</p><ul><li><a href="https://pagespeed.web.dev/">Google PageSpeed Insights</a>: быстрый аудит Core Web Vitals с рекомендациями.</li><li><a href="https://developers.google.com/web/tools/lighthouse">Chrome Lighthouse</a>: встроенный в DevTools инструмент для анализа производительности, SEO и лучших практик.</li><li><a href="https://www.webpagetest.org/">WebPageTest</a>: детализированные метрики, визуализация загрузки и советы по оптимизации.</li><li><a href="https://gtmetrix.com/">GTmetrix</a>: анализ скорости загрузки с рекомендациями.</li><li><a href="https://developer.chrome.com/docs/crux/methodology/tools">CrUX в Google Search Console</a>: реальные данные пользовательского опыта (Core Web Vitals) для SEO.</li></ul><p>Лабораторные инструменты дают контролируемые метрики, а мониторинг реальных пользователей (через <a href="https://github.com/GoogleChrome/web-vitals">Web Vitals JS</a>, <a href="https://www.speedcurve.com/">SpeedCurve</a> или <a href="https://calibreapp.com/">Calibre</a>) показывает, как сайт работает в реальных условиях. Это поможет определить приоритеты для оптимизации.</p><h2>Чек-лист оптимизации фронтенда 2025</h2><p>Производительность — это командная работа. Бэкенд должен быть масштабируемым, UX-дизайнеры — балансировать визуал и скорость, а фронтенд-разработчики — реализовывать оптимизированный код. Этот чек-лист подходит для любой платформы: от Next.js и Astro до WordPress и PHP. Адаптируйте его под ваш проект, уделяя внимание ключевым метрикам, таким как LCP, CLS и INP (новый показатель, заменивший FID в 2024 году).</p><h3>HTML</h3><p>HTML — основа страницы, и его оптимизация ускоряет загрузку и улучшает пользовательский опыт.</p><ul><li>Приоритизируйте критический HTML: доставляйте HTML для верхней части страницы первым, чтобы браузер начал рендеринг. Фреймворки вроде Next.js или Astro с SSR/SSG рендерят HTML на сервере, улучшая First Contentful Paint.</li><li>Удаляйте лишний код: уберите ненужные теги, комментарии и пробелы. Компактный HTML загружается быстрее, особенно в мобильных сетях.</li><li>Включите сжатие: используйте GZIP или Brotli, чтобы уменьшить размер HTML. Большинство серверов и CDN это поддерживают.</li><li>Оптимизируйте загрузку ресурсов: размещайте CSS в &lt;head&gt; для быстрого рендера, а скрипты — перед &lt;/body&gt; или с атрибутами async/defer, чтобы не блокировать разбор HTML.</li><li>Минимизируйте iframe: они загружают дополнительные страницы, замедляя сайт. Используйте loading="lazy" для iframe ниже линии сгиба или загружайте их по клику.</li></ul><p><b>Совет:</b> держите DOM компактным. Например, Astro разбивает страницы на «островки», минимизируя гидратацию JavaScript, что ускоряет рендеринг.</p><h3>CSS</h3><p>CSS может блокировать рендеринг, если не оптимизирован. Вот как сделать стили быстрее:</p><ul><li>Удаляйте неиспользуемый CSS: используйте PurgeCSS или Chrome DevTools, чтобы убрать мертвый код, особенно в проектах с Tailwind.</li><li>Модуляризуйте стили: разделяйте CSS по страницам или функциям, загружая только необходимое. Критические стили встраивайте в &lt;head&gt;, остальное загружайте асинхронно.</li><li>Избегайте @import: он создает дополнительные запросы и блокирует рендеринг. Используйте &lt;link rel="stylesheet"&gt; или объединяйте CSS при сборке.</li><li>Используйте критический CSS: встраивайте стили для верхней части страницы в HTML, а остальное загружайте позже (например, через media="print"). Инструменты вроде Critical помогут это автоматизировать.</li><li>Минимизируйте CSS: убирайте пробелы и комментарии с помощью Clean-CSS или cssnano.</li><li>Предварительно загружайте ключевые стили: используйте &lt;link rel="preload" as="style"&gt; для важных CSS-файлов.</li><li>Упрощайте селекторы: избегайте сложных вложенных цепочек, чтобы ускорить вычисления стилей. Например, .headline лучше, чем body div#main article h1.</li><li>Применяйте современный CSS: используйте content-visibility: auto для отложенного рендера контента за пределами экрана. Это ускоряет начальную загрузку и снижает потребление памяти.</li></ul><h2>JavaScript</h2><p>JavaScript часто замедляет страницы из-за объема и времени выполнения. Оптимизируйте его так:</p><ul><li>Заменяйте JS на HTML/CSS: используйте CSS-анимации, &lt;details&gt; или валидацию форм вместо JS, где возможно.</li></ul><ul><li>Минимизируйте фреймворки: избегайте тяжелых библиотек для простых задач. Проверяйте сторонние скрипты (аналитика, реклама) и удаляйте ненужные.</li><li>Разделяйте код: используйте динамический import() или возможности фреймворков для загрузки JS по необходимости.</li><li>Предварительно загружайте важные скрипты: используйте &lt;link rel="preload" as="script"&gt; для ключевых JS-файлов.</li><li>Применяйте async/defer: добавляйте эти атрибуты к &lt;script&gt;, чтобы не блокировать рендеринг. Defer сохраняет порядок выполнения, async подходит для независимых скриптов.</li><li>Минимизируйте JS: используйте UglifyJS или tree shaking для удаления неиспользуемого кода. Настраивайте сборку для ES-модулей.</li><li>Обновляйте зависимости: новые версии фреймворков (esbuild, SWC) часто быстрее. Используйте Renovate или Dependabot для автоматизации.</li><li>Выбирайте подходящий фреймворк: Next.js с React Server Components или Astro с «островковой» архитектурой сокращают объем JS на клиенте, ускоряя загрузку.</li></ul><h2>Изображения</h2><p>Изображения — один из главных факторов загрузки страниц. Оптимизируйте их так:</p><ul><li>Используйте правильный размер: не загружайте изображения больше, чем нужно для отображения. Инструменты вроде ImageMagick или Sharp помогут автоматизировать ресайз.</li><li>Применяйте адаптивные изображения: используйте &lt;img srcset&gt; или &lt;picture&gt; для доставки изображений в зависимости от устройства.</li><li>Сжимайте изображения: используйте ImageOptim, mozJPEG для JPEG, PNGQuant для PNG или SVGO для SVG.</li><li>Предварительно загружайте ключевые изображения: используйте &lt;link rel="preload" as="image"&gt; или fetchpriority="high" для баннеров, влияющих на LCP.</li><li>Откладывайте загрузку: добавляйте loading="lazy" для изображений ниже линии сгиба.</li><li>Используйте WebP/AVIF: эти форматы обеспечивают лучшее сжатие, чем JPEG/PNG. CDN и фреймворки вроде Next.js автоматизируют конвертацию.</li><li>Указывайте размеры: добавляйте width и height или CSS aspect-ratio, чтобы избежать сдвигов макета (CLS).</li><li>Автоматизируйте оптимизацию: используйте Next.js &lt;Image&gt;, Astro или CDN (Cloudinary, Imgix) для автоматической обработки изображений.</li></ul><h2>Видео</h2><p>Видео могут быть тяжелее изображений, поэтому требуют особого внимания:</p><ul><li>Сжимайте видео: используйте Handbrake для MP4/WebM, снижая битрейт или разрешение (например, 720p вместо 1080p).</li><li>Используйте современные кодеки: WebM (VP9) или AV1 обеспечивают лучшее сжатие, чем MP4 (H.264).</li><li>Настройте предварительную загрузку: используйте preload="metadata" или none для видео, чтобы не загружать лишние данные.</li><li>Откладывайте загрузку: применяйте loading="lazy" для iframe или загружайте видео по клику/прокрутке.</li><li>Удаляйте ненужное аудио: уберите звуковую дорожку из фоновых видео с помощью FFmpeg.</li><li>Используйте потоковую передачу: для длинных видео применяйте HLS или DASH для адаптивной загрузки.</li><li>Оптимизируйте сторонние видео: используйте облегченные встраивания (например, lite-youtube-embed) для YouTube/Vimeo.</li></ul><h2>Шрифты</h2><p>Пользовательские шрифты улучшают брендинг, но могут замедлить рендеринг. Оптимизируйте их так:</p><ul><li>Ограничьте количество шрифтов: используйте минимум семейств и начертаний, чтобы сократить запросы.</li><li>Применяйте WOFF2: этот формат компактнее TTF или WOFF и поддерживается всеми браузерами.</li><li>Предварительно подключайтесь к источникам: используйте &lt;link rel="preconnect"&gt; для Google Fonts или других хостов.</li><li>Используйте font-display: swap: это предотвращает FOIT (невидимый текст) и улучшает пользовательский опыт.</li><li>Избегайте сдвигов макета: подбирайте резервные шрифты с похожими метриками или используйте font-size-adjust.</li><li>Рассмотрите переменные шрифты: один файл заменяет несколько начертаний, снижая объем данных.</li><li>Используйте системные шрифты: они не требуют загрузки и работают мгновенно.</li></ul><h2>Хостинг и сервер</h2><p>Конфигурация сервера напрямую влияет на скорость загрузки:</p><ul><li>Используйте HTTPS: это не только безопасно, но и быстрее, благодаря HTTP/2+. Google учитывает HTTPS для SEO.</li><li>Сократите HTTP-запросы: удаляйте ненужные ресурсы и минимизируйте сторонние скрипты.</li><li>Перейдите на HTTP/2 или HTTP/3: HTTP/2 поддерживает мультиплексирование, HTTP/3 (QUIC) ускоряет соединение, особенно на мобильных сетях.</li><li>Используйте CDN: кэшируйте ресурсы на серверах по всему миру для снижения задержек.</li><li>Настройте кэширование: используйте Cache-Control для статических ресурсов и кэширование на уровне приложения.</li><li>Оптимизируйте сервер: держите TTFB ниже 200 мс, оптимизируя запросы к базе данных и вычисления.</li><li>Применяйте статическую генерацию: используйте SSG или ISR (Next.js) для доставки готовых HTML-страниц через CDN.</li></ul><h2>Быстрые улучшения</h2><p>Эти небольшие оптимизации дают заметный эффект:</p><ul><li>Избегайте сдвигов макета: резервируйте место для изображений, iframe и динамического контента, чтобы минимизировать CLS.</li><li>Используйте приоритеты: применяйте fetchpriority="high" для ключевых ресурсов и low для некритических.</li><li>Сократите сторонние запросы: откладывайте загрузку аналитики или рекламы до взаимодействия пользователя.</li><li>Используйте один протокол: избегайте смешанного контента (HTTP/HTTPS).</li><li>Настройте кэширование: используйте длительный max-age для статических ресурсов с хэшами в именах файлов.</li><li>Предварительно загружайте страницы: используйте &lt;link rel="prefetch"&gt; для вероятных переходов.</li><li>Применяйте Service Workers: кэшируйте ресурсы для мгновенной загрузки и оффлайн-доступа.</li></ul><p>Оптимизация фронтенда — это непрерывный процесс, который требует внимания всей команды. Скорость сайта напрямую влияет на пользовательский опыт, SEO и бизнес-показатели. Используйте этот чек-лист, чтобы выявить слабые места и сократить миллисекунды загрузки. Комбинируйте лабораторные тесты и мониторинг реальных пользователей, чтобы отслеживать прогресс. Сделайте скорость приоритетом — ваши пользователи и бизнес скажут спасибо!</p>]]></content:encoded>
    </item>
    <item>
      <title>10 VSCode расширений, которые реально повышают продуктивность</title>
      <link>https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost</link>
      <comments>https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost</guid>
      <description><![CDATA[<p>Топ-10 расширений VSCode для повышения продуктивности: форматирование, тестирование API, управление проектами и многое другое. Ускорьте свою разработку с лучшими инструментами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost">10 VSCode расширений, которые реально повышают продуктивность</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Visual Studio Code — мощный редактор, который становится ещё лучше с правильными расширениями. В этой подборке мы собрали 10 инструментов, реально ускоряющих разработку: они избавляют от рутины и помогают сосредоточиться на главном — качественном коде.</p><h2>1. TabNine</h2><p>Если вам важна скорость — <a href="https://www.tabnine.com/">TabNine</a> стоит попробовать хотя бы ради этого. Расширение —  лёгкий AI-ассистент, который работает как умный автодополнитель кода, непохожий на аналоги вроде Codeium или Copilot.</p><p>TabNine обучен на миллионах строк открытого кода и умеет предсказывать, что вы напишете дальше, с учётом контекста проекта и языка. Отлично справляется с рутинными вещами: автозавершает функции, переменные, конструкции — всё быстро и чаще всего в тему.</p><p><b>Кому подойдёт</b>: тем, кто хочет ускорить набор кода, но не готов передавать весь проект в облако или открывать чат с Copilot. Поддерживает офлайн-режим и локальное обучение модели.</p><p>Плюсы:</p><ul><li>Работает из коробки, не требует тонкой настройки;</li><li>Есть локальная версия — удобно для закрытых проектов;</li><li>Поддерживает большинство языков и фреймворков.</li></ul><p><b>Чем полезен:</b> экономит время на повседневной разработке — особенно когда вы не хотите отвлекаться на документацию или поиск нужной переменной в другом файле.</p><h2>2. GitLens</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens">GitLens</a> встраивает историю изменений прямо в VSCode — и делает это максимально удобно. Показывает, кто и когда изменил строку, коммит-месседж, хэш, ветку и другие детали. Можно не уходить в консоль или отдельный Git-клиент для поиска информации.</p><p>Особенно полезен, когда работаете с чужим кодом или хотите быстро вспомнить, зачем вы сами что-то написали месяц назад.</p><p><b>Кому подойдёт</b>: тем, кто работает в команде, часто читает историю изменений или ревьюит чужие коммиты. Также пригодится в проектах с долгой историей или нестабильным кодом.</p><p>Плюсы:</p><ul><li>Информация о коммитах отображается прямо в редакторе под строкой;</li><li>Есть таймлайн изменений файла;</li><li>Удобный diff по коммитам, авторам, веткам и даже фрагментам кода.</li></ul><p><b>Чем полезен:</b> помогает быстрее разбираться в чужом коде, искать причины бага или откатывать ошибки. Особенно ценится за то, что делает Git прозрачным и доступным прямо в процессе разработки.</p><h2>3. Error Lens</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens">Error Lens</a> выводит диагностику ошибок и предупреждений прямо в строке кода. Это расширение превращает сообщения линтеров и компиляторов в наглядные подсказки, позволяя сразу видеть, что пошло не так.</p><p>Можно настроить отображение: выделять ошибки цветом, добавлять иконки или даже показывать краткие подсказки с предложениями по исправлению. Поддерживает большинство языков и линтеров, включая ESLint, TypeScript и других.</p><p><b>Кому подойдёт:</b> разработчикам, которые хотят моментально видеть ошибки в коде, и тем, кто ценит визуальную чистоту и скорость отладки.</p><p>Плюсы:</p><ul><li>Ошибки и предупреждения отображаются прямо в редакторе, рядом со строкой кода;</li><li>Гибкая настройка стилей и уровня детализации сообщений;</li><li>Ускоряет процесс отладки, особенно при работе с большими файлами.</li></ul><p><b>Чем полезен:</b> минимизирует время на поиск и анализ ошибок, позволяя сразу фокусироваться на их исправлении. Это особенно ценно, когда вы пишете код в реальном времени или работаете с новыми библиотеками, где легко допустить мелкие недочёты.</p><h2>4. Path Intellisense</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense">Path Intellisense</a> — одно из тех расширений, которое просто работает и экономит кучу времени. Оно автоматически подсказывает пути к файлам, папкам и модулям в вашем проекте, как только вы начинаете их набирать. Поддерживает абсолютные и относительные пути, учитывает структуру проекта и форматирует предложения так, как это принято в выбранном языке.</p><p>Работает особенно хорошо в проектах с вложенной структурой, когда нужно быстро сослаться на компоненты, конфиги или ассеты.</p><p><b>Кому подойдёт</b>: всем, кто устал вручную прописывать длинные relative-пути или путаться в структуре проекта. Особенно выручает на фронтенде, где модулей десятки и легко ошибиться в названии.</p><p>Плюсы:</p><ul><li>Подсказки появляются автоматически при наборе пути;</li><li>Поддерживает большинство языков и фреймворков;</li><li>Учитывает jsconfig.json и tsconfig.json при работе с alias-ами.</li></ul><p><b>Чем полезен</b>: снижает количество опечаток и неверных импортов, ускоряет переход между файлами и помогает писать код чуть быстрее.</p><h2>5. TODO Highlight</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight">TODO Highlight</a> подсвечивает комментарии с задачами (например, TODO, FIXME, NOTE) прямо в коде, делая их заметными и удобными для отслеживания. Расширение помогает не терять важные заметки, которые вы оставляете в коде, и быстро находить места, требующие доработки.</p><p>Можно настроить ключевые слова, цвета подсветки и даже добавить свои собственные метки. Работает с любыми языками программирования и интегрируется с панелью задач VSCode для удобного обзора всех TODO в проекте.</p><p><b>Кому подойдёт</b>: разработчикам, которые оставляют заметки в коде, и командам, которым нужно быстро находить задачи или недочёты в проекте.</p><p>Плюсы:</p><ul><li>Яркая подсветка TODO-комментариев прямо в редакторе;</li><li>Гибкая настройка ключевых слов и стилей;</li><li>Интеграция с панелью задач для быстрого обзора.</li></ul><p><b>Чем полезен</b>: экономит время на поиск и управление задачами в коде, помогая не упустить важные доработки или напоминания. Особенно удобно в больших проектах, где комментарии могут затеряться среди строк.</p><h2>6. Prettier – Code formatter</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode">Prettier</a> — расширение, которое автоматически приводит ваш код к единому стилю, избавляет от ручной правки отступов, кавычек и переносов. Оно поддерживает множество языков (JavaScript, TypeScript, CSS, HTML и другие) и интегрируется с линтерами, чтобы ваш код был не только красивым, но и консистентным.</p><p>Можно настроить правила форматирования под ваш проект или использовать готовые пресеты. Prettier форматирует код при сохранении файла или по команде, а также работает с выделенными фрагментами.</p><p><b>Кому подойдёт</b>: разработчикам, которые хотят экономить время на форматировании, и командам, стремящимся к единообразию кода.</p><p>Плюсы:</p><ul><li>Автоматическое форматирование при сохранении или по хоткеям;</li><li>Поддержка множества языков и кастомных настроек;</li><li>Интеграция с ESLint и другими инструментами для проверки кода.</li></ul><p><b>Чем полезен:</b> убирает рутину ручного форматирования, снижает количество ошибок в стиле кода и помогает сосредоточиться на логике, а не на внешнем виде. Идеально, чтобы ускорить работу и поддерживать чистоту в больших проектах.</p><h2>7. Live Server</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer">Live Server </a>запускает локальный сервер прямо из VSCode, позволяя просматривать изменения в HTML, CSS и JavaScript в браузере в реальном времени. После сохранения файла страница автоматически обновляется, что исключает необходимость ручного перезапуска или обновления браузера.</p><p>Поддерживает кастомные порты, HTTPS, и работает с любыми фронтенд-проектами, от простых HTML-страниц до сложных приложений на React или Vue. Можно настроить, чтобы сервер открывался автоматически при запуске проекта.</p><p><b>Кому подойдёт</b>: фронтенд-разработчикам, которые работают над веб-интерфейсами и хотят мгновенно видеть результат изменений без лишних действий.</p><p>Плюсы:</p><ul><li>Автоматическое обновление страницы при изменении кода;</li><li>Простая настройка и поддержка HTTPS для безопасного тестирования;</li><li>Лёгкий запуск сервера прямо из редактора.</li></ul><p><b>Чем полезен</b>: ускоряет цикл разработки и тестирования веб-приложений, избавляет от ручного обновления страниц. Это особенно экономит время при частых правках в стилях или скриптах, так как можно сразу видеть результат в браузере.</p><h2>8. Project Manager</h2><p>Если работаете над несколькими проектами одновременно — это расширение сэкономит вам часы. <a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager">Project Manager</a> позволяет создавать список избранных проектов и открывать их в один клик, без ручного поиска папок и недавних вкладок.</p><p>Можно задать свои алиасы, группировать по папкам, запускать с хоткеев — особенно удобно, если у вас десятки репозиториев на локалке или вы фрилансите на несколько команд.</p><p><b>Кому подойдёт</b>: разработчикам, которые ведут сразу несколько проектов, часто переключаются между ними и устали искать нужный путь через File &gt; Open Folder.</p><p>Плюсы:</p><ul><li>Быстрое переключение между проектами через интерфейс или хоткеи;</li><li>Поддержка избранного и тэгов;</li><li>Можно автоматически подтягивать все папки из заданной директории.</li></ul><p><b>Чем полезен:</b> избавляет от рутинных действий при переходе между проектами — особенно когда важно не терять фокус и не сбиваться с рабочего темпа.</p><h2>9. Code Spell Checker</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker">Code Spell Checker </a>выявляет орфографические ошибки в комментариях, строках и именах переменных прямо в редакторе VSCode. Расширение подчёркивает опечатки волнистой линией и предлагает варианты исправления через Ctrl+. или Cmd+., что позволяет быстро исправить ошибки.</p><p>Поддерживает множество ЯП и словари для разных языков (английский, русский, немецкий — с дополнительными расширениями). Можно добавлять свои слова в пользовательский словарь или игнорировать определённые термины, чтобы адаптировать проверку под проект. Работает с camelCase и snake_case, не помечая их как ошибки.</p><p><b>Кому подойдёт</b>: разработчикам, которые пишут много комментариев или документации в коде, и тем, кто хочет избежать опечаток в строках, API или логах, чтобы повысить читаемость.</p><p>Плюсы:</p><ul><li>Мгновенное обнаружение ошибок с подсказками для исправления;</li><li>Гибкая настройка словарей и игнорируемых слов;</li><li>Поддержка технических терминов и различных стилей написания кода.</li></ul><p><b>Чем полезен:</b> экономит время на поиск и исправление опечаток, особенно в документации или пользовательских сообщениях, которые могут повлиять на восприятие проекта.</p><h2>10. REST Client</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client">REST Client </a>позволяет отправлять HTTP-запросы и просматривать ответы непосредственно в VSCode. Достаточно создать файл с расширением .http или .rest, написать запрос в простом текстовом формате, и вы увидите кнопку Send Request для моментального выполнения.</p><p>Поддерживает все типы запросов (GET, POST, PUT, DELETE и другие), авторизацию (Basic, OAuth, JWT), переменные окружения и даже генерацию кода на разных языках. Запросы можно сохранять в репозиторий, что удобно для командной работы. Расширение также позволяет использовать динамические переменные по типу {{$timestamp}} или {{$guid}}, всё для гибкой настройки запросов.</p><p><b>Кому подойдёт</b>: тем, кто работает с REST API и хочет тестировать эндпоинты прямо в VSCode, сохранять запросы в проекте и почти не переключаться между инструментами.</p><p>Плюсы:</p><ul><li>Простая отправка запросов через .http или .rest файлы с кнопкой Send Request;</li><li>Поддержка переменных окружения и авторизации для сложных API;</li><li>Возможность сохранять запросы в репозитории для совместной работы.</li></ul><p><b>Чем полезен:</b> ускоряет тестирование API, устраняет необходимость в сторонних приложениях. Запросы хранятся рядом с кодом, что упрощает документирование и повторное использование, особенно в проектах, где API-вызовы нужно часто проверять или делиться ими с командой.</p><p><i>А какими расширениями пользуетесь вы? Пишите в комментариях!</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Будущее фронтенда: куда движется React, Vue и Angular</title>
      <link>https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular</link>
      <comments>https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular</guid>
      <description><![CDATA[<p>Как изменились React, Vue и Angular за последние 5-10 лет? Эксперты ответили, что будет с фронтенд-разработкой в 2026 году и стоит ли переходить на фреймворки без VDOM и гидратации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/budushhee-frontenda--kuda-dvizhetsya-react--vue-i-angular">Будущее фронтенда: куда движется React, Vue и Angular</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Паттерны проектирования]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние пять лет IT-сфера изменилась так сильно, что джун из 2020 года сегодня бы не прошёл собеседование на ту же позицию.</p><p>Если вы фронтенд-разработчик или только планируете им стать, эта публикация поможет вам сориентироваться в текущей ситуации:</p><ul><li>Узнаете, какие крупные изменения произошли в React, Vue и Angular за последние 5-10 лет.</li><li>Поймёте, стоит ли учить новые фреймворки без виртуального DOM или лучше углубиться в проверенные решения.</li><li>Разберётесь, почему компании продолжают требовать знание React, хотя Solid.js работает быстрее.</li></ul><p>Тимлид и разработчики рассказали, как они видят будущее профессии. Объяснили, почему джуну недостаточно знать только JS, какие навыки помогут вам зарабатывать больше и оставаться востребованным специалистом.</p><p>ℹ️ <i>После прочтения вы сможете принять взвешенное решение: продолжать углубляться в текущий стек, осваивать новые инструменты или развивать смежные навыки.</i></p><h2>Как изменились React, Vue и Angular за последние 5-10 лет?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/f488b013-32ed-47d0-ada9-3a1c3a84b59f.jpg" alt="" /></figure><h3>React</h3><p>До 2019 года разработчики писали объёмные классы с методами жизненного цикла. Они управляли состоянием через setState и передавали данные через пропсы. Потом появились <b>хуки </b>— с тех пор логику помещают в функции, состоянием управляют через useState и useReducer, побочные эффекты контролируют через useEffect.</p><p>Серверные компоненты решили проблему первой загрузки. Тяжёлые части приложения обрабатывает сервер и отправляет клиенту уже готовыми. Конкурентный режим разбивает отрисовку на части и расставляет приоритеты для обновлений — интерфейс не виснет, когда нагрузка возрастает.</p><h3>Vue</h3><p>Composition API сделал организацию кода более гибкой. Логику теперь группируют по функциональности, а не по типам опций. Ещё реактивность переписали с нуля на прокси-объектах, что ускорило отслеживание изменений.</p><p>Компилятор научился оптимизировать шаблоны на этапе сборки. Телепорты решили проблему с модальными окнами и всплывающими подсказками — компоненты отрисовываются в нужном месте DOM-дерева независимо от родителя.</p><p><a href="https://tproger.ru/articles/v-kakuyu-storonu-razvivaetsya-vue-i-est-li-emu-sovremennye-alternativy">В какую сторону развивается Vue и есть ли ему современные альтернативы</a></p><h3>Angular</h3><p>Каждый компонент сам определяет свои зависимости, поэтому пропала необходимость в модулях. <b>Сигналы</b> заменили зонную детекцию изменений. Теперь Angular точно знает, какие части интерфейса нужно обновлять.</p><p>Строгая типизация и декораторы сделали код более предсказуемым. Встроенные инструменты покрывают все потребности крупных проектов: формы с валидацией, маршрутизация с ленивой загрузкой, HTTP-клиент с перехватчиками.</p><p>Фреймворки уходят от сложных решений к более простым. Тренд последних лет — делать приложения быстрее для пользователей и удобнее для разработчиков.</p><p>Пока большая троица занималась «работой над ошибками», появился запрос на <a href="https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya">что-то</a> более лёгкое и быстрое.</p><h2>Фронтенд-фреймворки кажутся избыточными — возвращаемся к ванильному JS?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/1af1ebd0-69e3-4f07-8d6d-053e8c3e70bb.jpg" alt="" /></figure><blockquote>Тот, кто попробовал фреймворки, никогда не вернется к чистому ванильному JS 🙂 Меняются и развиваются сами фреймворки, но тренда на отказ от них точно нет.</blockquote><p>Несмотря на тенденцию упрощения, разработчики сходятся во мнении, что полного отказа от фреймворков не произойдёт.</p><blockquote>В моде решения на основе концепции «исчезающих фреймворков», которые на выходе выдают почти чистый императивный JS-код. Дело в том, что это общий тренд в IT, где вся сложность и расчёты уходят в инфраструктуру, собирая минимальный бандл, где нет ничего лишнего для клиентов.</blockquote><p>Фреймворки — это ещё и способ стандартизации разработки в командах.</p><blockquote>Фреймворки никогда не будут избыточными. Один из первых вопросов на собеседовании —  инструмент, с которым ты умеешь работать. Больший пласт знаний сегодня — это фреймворк. Остальное, чаще всего, бизнес-логика того или иного проекта.</blockquote><p>Из-за критики традиционных фреймворков появился новый класс решений. Больше всего ругают VDOM и гидратацию, хотя они считались неотъемлемой частью современных SPA.</p><h2>Стоит ли переходить на фреймворки без VDOM и гидратации?</h2><p>Solid.js и Svelte уже несколько лет развивают концепцию тонкой реактивности. В 2021 году появился Qwik, который вообще отказался от гидратации.</p><blockquote>SolidJS хорош для аналогов десктопных приложений в браузере — Figma, Miro. Здесь приложение загружается один раз, а потом работает долго и должно быть максимально отзывчивым. Qwik отлично подойдёт, если вы создаёте сайт, куда пользователь приходит за контентом, и важно показать ему этот контент мгновенно.</blockquote><p>При этом массового перехода на новые фреймворки пока не происходит. Компании продолжают искать React и Vue разработчиков — проекты на Solid.js и Qwik остаются экспериментальными.</p><blockquote>Сами по себе фреймворки мало значат для коммерческой разработки без сторонних библиотек вокруг них. Вот когда критическая масса разработчиков популярных библиотек мигрирует на Qwik, а вместе с ними и сообщество, что-то сдвигается.</blockquote><p>Проблема новых фреймворков — это отсутствие экосистемы. React и Vue окружены тысячами готовых библиотек для любых задач. На Solid.js и Qwik большинство решений придётся писать самостоятельно.</p><blockquote>Без поддержки сообщества пользователей ни один инструмент не сможет стать массовым. Даже если работаешь в заказной разработке и есть возможность расширить кругозор команды, сомнительно брать на тест инструмент, под который придётся писать до 30% базового функционала.</blockquote><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/74e9b111-b93b-4fdf-a8b5-9db67bf7e95e.jpg" alt="" /></figure><p>Команды, которые захотят перейти на новые фреймворки, столкнутся с дополнительными сложностями. Разработчикам придётся учить новые концепции и подходы, а компаниям — тратить время и деньги на переобучение.</p><blockquote>У новых фреймворков высокий порог входа: вас ждёт переобучение команды и сложности ручной оптимизации.</blockquote><p>Технологии развиваются циклично. То, что сейчас кажется инновацией, переосмысливает старые подходы.</p><blockquote>Во времена DDR/DDR2 было сложно выполнять клиентский рендеринг, а вот серверам ресурсов хватало. Разработчики как могли воплощали подход, который сейчас называется SSR, и возвращали на клиент готовую разметку для компонентов. И никакого тебе VDOM.</blockquote><p>Пока новые фреймворки остаются нишевыми инструментами. React, Vue, Angular продолжат доминировать в коммерческой разработке за счёт экосистемы и сообщества.</p><h2>Как изменится роль фронтенд-разработчика в 2026 году?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/6027e94f-65a4-4ab2-9364-6f5e322267f1.jpg" alt="" /></figure><p>В 2020 году джуниор находил работу, если знал HTML, CSS и основы JS. Сегодня работодатели требуют от новичков React или Vue, TypeScript, системы сборки — и это не конец списка. Ещё и вакансий на всех начинающих не хватает, компании сразу ищут мидлов.</p><p>Инструменты с искусственным интеллектом — Copilot, ChatGPT, Cursor — ускоряют работу. Они же повышают планку: если джун с помощью ИИ работает как мидл, то мидл должен демонстрировать более глубокие знания. Работодатели стали больше ценить тех, кто понимает принципы работы кода, а не просто копирует готовые решения.</p><blockquote>Зная JavaScript и любой инструмент даже не из большой тройки, с использованием AI можно быстро погрузиться в другой нужный инструмент.</blockquote><p>Чёткой границы между фронтендом и бэкендом больше нет. От фронтенд-разработчика ждут, что тот разбирается в серверной части, умеет настраивать процессы непрерывной интеграции и доставки, работает с базами данных.</p><h2>Какие навыки развивать разработчику, чтобы оставаться востребованным?</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-09-18/d62a3715-b713-4af3-8658-3ff4a6df7d85.jpg" alt="" /></figure><p>Технические навыки — это основа. Когда понимаете алгоритмы и структуры данных, вы пишете быстрый код. Когда знаете паттерны проектирования, ваши приложения легко поддерживать.</p><p><b>Учитесь быстро разбираться в новых инструментах вместо того, чтобы зацикливаться на одном фреймворке</b>.</p><blockquote>По мне так лучше быть фреймворк-агностиком, нежели фанатом одного, которого легко чем-то обидеть.</blockquote><p>Архитектурное мышление отличает <b>«</b>сильного<b>»</b> разработчика:</p><ul><li>Как организовать код, чтобы его легко поддерживать?</li><li>Как спроектировать API, чтобы оно не ломалось при изменениях?</li><li>Как построить систему, которая выдержит рост нагрузки?</li></ul><p>Те, кто решают эти вопросы, получают офферы с космическими зарплатами.</p><p><b>Софт-скиллы</b> тоже влияют на карьерный рост:</p><ul><li>Объясните техническую проблему менеджеру простыми словами.</li><li>Проводите код-ревью так, чтобы не обидеть коллегу, но улучшить код.</li><li>Оценивайте сроки и управляйте ожиданиями.</li><li>Аргументируйте выбор технологии.</li></ul><p>Когда вы понимаете бизнес, вы становитесь партнёром. Почему мы делаем эту фичу? Как она повлияет на метрики? Какие есть альтернативы? Разработчик, который мыслит категориями бизнеса, становится незаменимым.</p><p>Рынок вынуждает постоянно учиться, потому что индустрия меняется каждый год. Кто застревает в зоне комфорта — отстаёт.</p><p><i>Как ChatGPT повлиял на ценность вашего труда? Успеваете подстраиваться под требования рынка, параллельно работать и пробовать новые технологии? Делитесь в комментариях.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>SolidJS и Qwik: фронтенд нового поколения</title>
      <link>https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya</link>
      <comments>https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya</guid>
      <description><![CDATA[<p>Обзор SolidJS и Qwik — плюсы и минусы фреймворков. Сравнение SolidJS и Qwik, практические рекомендации по переходу и тенденция отказа от React/Vue.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/solidjs-i-qwik--frontend-novogo-pokoleniya">SolidJS и Qwik: фронтенд нового поколения</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Помните, когда впервые попробовали React/Vue после JS и jQuery?</b> Тот момент, когда всё встало на свои места, и вы поняли — вот оно, будущее фронтенда. В 2025 году разработчики <a href="https://www.reddit.com/r/solidjs/comments/1m4hlzj/im_really_impressed_with_solid/">испытывают</a> похожие чувства с SolidJS и Qwik.</p><h2>Последний рубеж React и Vue</h2><p><b>Согласны, что VDOM превратился в бюрократическую прослойку?</b> Изменили состояние в одном месте — получите полный пересчёт дерева компонентов. Фреймворки заставляют загружать всё сразу, тащат багаж служебного кода. И пока этот код не загрузится, пользователь смотрит на белый экран.</p><p>SSR <a href="https://tproger.ru/translations/rendering-on-the-web">ускоряет</a> загрузку страницы: сервер рендерит HTML, пользователь видит контент и пытается с ним взаимодействовать. Но пока JavaScript не загрузится, ничего не заработает.</p><p>Потом JS наконец подгружается и начинает гидратацию. По сути, он заново создаёт в памяти то же дерево компонентов, которое сервер уже отрендерил в HTML. Выполняется двойная работа. Кстати, в это время пользователь тыкает неработающие кнопки — дотерпит ли он до полной загрузки?</p><p>Системные проблемы не исправить очередным хуком или новой версией фреймворка, поэтому появление SolidJS и Qwik — было вопросом времени.</p><blockquote>Поиск новых решений — здоровый признак развития фронтенда. В конце концов, и Vue был создан потому, что Эвану Ю не хватало облегченной альтернативы AngularJS. Большая тройка фреймворков решает огромный спектр задач, имеет колоссальную поддержку сообщества, но их нельзя назвать идеальным инструментом на все случаи жизни.</blockquote><h2>Обзор SolidJS</h2><p>SolidJS во многом похож на React. Самое интересное — его подход к обновлению интерфейса:</p><ul><li><b>Отсутствие виртуального DOM</b> — Solid напрямую обновляет только те DOM-узлы, которые действительно изменились.</li><li><b>Компоненты как функции инициализации</b> — каждый компонент вызывается только один раз для настройки реактивности.</li><li><b>Сигналы вместо хуков</b> — состояние управляется через createSignal(), который возвращает геттер/сеттер пару.</li></ul><p>Например, когда срабатывает счётчик, Solid не перерисовывает весь компонент. Он точечно обновляет только текст внутри &lt;p&gt;, где используется count():</p><h3>Преимущества SolidJS</h3><p>👍 <b>Производительность и размер бандла</b></p><p>Благодаря отсутствию виртуального DOM и мелкозернистым обновлениям, приложения <a href="https://www.reddit.com/r/reactjs/comments/tsx8hw/solidjs_devex_compared_to_react/?tl=ru">работают</a> быстрее аналогов на React.</p><p>👍 <b>Простота освоения</b></p><p>Синтаксис SolidJS похож на React. Функциональные компоненты, JSX, концепции вроде Suspense и Error Boundaries — всё это есть в Solid. Изучение основ <a href="https://www.reddit.com/r/solidjs/comments/1len1pf/comment/myi8qci/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">займёт</a> 1-2 дня, если есть опыт с MobX/effector/RxJS.</p><p>👍 <b>Стабильность</b></p><p>Фреймворк находится на стабильной версии 1.x. Это означает отсутствие кардинальных изменений API, в отличие, например, от ситуации со Svelte, где сосуществуют версии 4 и 5 с разными подходами.</p><p>👍 <b>Совместимость с React</b></p><p>SolidJS совместим с экосистемой React. Можно переиспользовать дизайн-системы и компоненты в legacy-приложениях.</p><p>👍 <b>Удобное управление состоянием</b></p><p>Функционал сигналов и сторов покрывают 90% потребностей в управлении состоянием без необходимости подключать внешние библиотеки.</p><h3>Минусы SolidJS</h3><p>👎 <b>Ограниченная экосистема</b></p><p>Выбор готовых компонентов и библиотек значительно меньше, чем у React. Команды тратят больше времени на создание компонентов с нуля: тяжко при работе с таблицами, гридами, формами, валидацией.</p><p>👎 <b>Кривая обучения</b></p><p>Несмотря на знакомый синтаксис, модель реактивности SolidJS отличается от React. Разработчики должны усвоить следующие принципы:</p><ul><li>Избегать условных конструкций непосредственно в компонентах.</li><li>Не деструктурировать пропсы и сторы, чтобы сохранить реактивность.</li><li>Не использовать асинхронный код внутри createEffect.</li></ul><p>👎 <b>Проблемы с инструментарием</b></p><p>Возникают сложности с настройкой компилятора в нестандартных окружениях — монорепозиториях, при запуске тестов или интеграции с другими инструментами. DevTools не дотягивает до аналога у React.</p><p>👎 <b>SolidStart всё ещё развивается</b></p><p>SSR-решение SolidStart пока не достигло зрелости Next.js или Nuxt. Разработчики <a href="https://www.reddit.com/r/solidjs/comments/1len1pf/comment/myml5tt/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">сообщают</a> о проблемах с гидратацией и других сложностях при работе с серверным рендерингом.</p><h2>Обзор Qwik</h2><p>Qwik — это проект Мишко Хевери (создателя Angular). Идея фреймворка заключается в возможности возобновить работу приложения на клиенте без повторного выполнения кода, который уже был выполнен на сервере.</p><p>В Qwik радикально решили проблему гидратации — полностью отказались от неё. Время до интерактивности (TTI) падает в разы. Пользователь может кликать на кнопки сразу после загрузки HTML, без ожидания разогрева всего приложения.</p><p>Qwik автоматически разбивает код на мелкие чанки и загружает их только при необходимости. Символ $ в коде указывает на границы ленивой загрузки.</p><h3>Плюсы Qwik</h3><p>👍 <b>Мгновенная загрузка</b></p><p>Практически нулевой JavaScript при первоначальной загрузке, следовательно отличные показатели Core Web Vitals.</p><p>👍 <b>Автоматическая оптимизация</b></p><p>Оптимизация на уровне компилятора, умная предзагрузка критических ресурсов. Не нужно думать о разделении кода — Qwik делает это автоматически.</p><p>👍 <b>Знакомый синтаксис</b></p><p>👍 <b>Спасибо за SEO</b></p><p>Быстрая загрузка улучшает ранжирование за счёт полноценного SSR из коробки.</p><h3>Минусы Qwik</h3><p>👎 <b>Молодая экосистема</b></p><p>Ограниченное количество библиотек, мало готовых решений и компонентов. Небольшое сообщество разработчиков (если сравнивать с React/Vue).</p><p>👎 <b>Кривая обучения</b></p><p>Придётся изучать новые концепции. Из-за ленивой загрузки усложняется отладка.</p><blockquote>Qwik — это радикально новая ментальная модель. У фреймворка высокий порог входа: вас ждёт переобучение команды и сложности ручной оптимизации. Чтобы Qwik работал идеально, разработчик должен вручную указывать, что можно лениво загружать, а что нет.</blockquote><p>👎 <b>Сложность интеграции</b></p><p>Трудно интегрировать существующие React/Vue компоненты и ограниченная поддержка сторонних библиотек. Скорее всего, придётся с нуля переписывать код существующего проекта.</p><h2>Экосистема и готовность к продакшену</h2><p>Если сравнивать с React, то экосистема — самое слабое место обоих фреймворков.</p><p>SolidJS имеет SolidStart — метафреймворк с роутингом, SSR и серверными функциями. <a href="https://docs.solidjs.com/quick-start">Документация</a> качественная, сообщество активное. Большинство React-библиотек можно адаптировать без особых проблем, для популярных UI-китов есть готовые порты.</p><p>Qwik развивается в связке с <a href="https://qwik.dev/docs/qwikcity/">Qwik City</a>, который покрывает типовые задачи веб-разработки. <a href="https://www.builder.io/m/qwik">Builder.io</a> активно инвестирует в экосистему, регулярно выходят обновления и новые интеграции.</p><p>Риски есть, но они управляемые. Меньший размер сообщества означает меньше готовых решений и ответов на Stack Overflow. Если не боитесь изучать новое, то выигрыш в производительности перевесит неудобства.</p><h2>Сравнение SolidJS и Qwik</h2><p>SolidJS повышает производительность обновлений. Если данные меняются часто и непредсказуемо — графики, мониторинги, редакторы — Solid даст максимальную отзывчивость.</p><p>Qwik повышает производительность загрузки. Если бизнес зависит от первого впечатления, Qwik обеспечит мгновенный старт.</p><p><b>Медиа</b>, <b>блоги</b> с жёсткими требованиями к TTFB/TTI/INP будут лучше работать на Qwik. Пользователи смогут читать и скроллить без задержки. Интерактив добавляется дозированно — это лучшая стартовая стоимость.</p><p><b>E-commerce</b>, <b>каталоги </b>с SEO и карточками рекомендуется разрабатывать на Qwik. Особенно если на главной тяжёлые модули, а клиенты приходят с поисковиков. Вы выигрываете у конкурентов буквально на первом взаимодействии.</p><p><b>Сложный SPA</b> или <b>дашборд </b>с живыми виджетами и апдейтами будет лучше работать на SolidJS. Точечная реактивность упростит жизнь и снизит цену апдейтов. Solid сияет в проектах, где происходят сотни мелких изменений в секунду.</p><blockquote>Solid хорош для аналогов десктопных приложений в браузере — Figma, Miro. Здесь приложение загружается один раз, а потом работает долго и должно быть максимально отзывчивым. Также Solid будет хорош там, где важна плавность анимаций.</blockquote><p><b>Лэндинги</b>, <b>мобильные приложения</b>, <b>визитки</b> — здесь Solid даст сверхбыструю реактивность и облегчит сборку.</p><p>Оба фреймворка умеют SSR/SSG и стриминг. Solid снижает стоимость обновлений, Qwik — стоимость старта. Для LCP/TTI/INP в контентных сценариях выигрывает Qwik. Для интенсивных интерактивных сценариев Solid удерживает FPS и снижает CPU.</p><p>Оба дружат с серверными платформами. SolidStart имеет адаптеры для Vercel/Netlify, Qwik City — тоже.</p><blockquote>Выбирайте Solid.js, если вы создаете сервис, куда пользователь заходит надолго, и ему важна отзывчивость после загрузки. Выбирайте Qwik, если вы создаете сайт, куда пользователь приходит за контентом, и важно показать ему этот контент мгновенно.</blockquote><p>Немного выводов:</p><ul><li>Solidjs быстрее Qwik при рендеринге. Qwik быстрее Solidjs при загрузке страниц.</li><li>У Solidjs документация лучше, чем у Qwik.</li><li>С нуля код на Qwik писать проще и быстрее, чем на SolidJS.</li><li>Typescript в SolidJS может быть головной болью, в Qwik об этом можно не беспокоиться.</li></ul><h2>Практические рекомендации по переходу на SolidJS и Qwik</h2><ol><li><b>Начните с аудита текущих проблем</b>. Посмотрите метрики сайта: сколько времени занимает гидратация? Тормозят ли обновления интерфейса? Где именно проблема — на старте или в процессе работы?</li><li><b>Выберите изолированную часть проекта</b>. Возьмите один виджет, одну страницу, один компонент и реализуйте его на новом фреймворке. Измерьте разницу в производительности и удобстве разработки.</li><li><b>Если проблема в медленной загрузке</b> — попробуйте Qwik. Соберите прототип лендинга или каталога, включите SSG с resumability и протестируйте на медленном соединении.</li><li><b>Если проблема в тормозах интерфейса</b> — попробуйте Solid. Перепишите самый страдальный компонент с частыми обновлениями, уберите мемоизации и посмотрите на результат.</li></ol><p>Оба фреймворка собираются через Vite, имеют TypeScript из коробки и хорошую интеграцию с популярными инструментами. Стоимость эксперимента низкая, а потенциальная выгода высокая.</p><h2>Тенденция отказа от React/Vue</h2><blockquote>Компании и разработчики не столько отказываются от популярных решений, сколько перестают использовать их для всех задач подряд. Раньше выбора практически не было, и эти фреймворки были молотком, для которого любая задача — гвоздь.</blockquote><p><i>А вы что думаете? Готовы попробовать модные фреймворки SolidJS и Qwik в следующем проекте?</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Фичи будущего в интерфейсе, которые можно и нельзя использовать в 2025 году: разбираем Baseline 2025</title>
      <link>https://tproger.ru/articles/fichi-budushhego-v-interfejse--kotorye-mozhno-i-nelzya-ispolzovat-v-2025-godu--razbiraem-baseline-2025</link>
      <comments>https://tproger.ru/articles/fichi-budushhego-v-interfejse--kotorye-mozhno-i-nelzya-ispolzovat-v-2025-godu--razbiraem-baseline-2025?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/fichi-budushhego-v-interfejse--kotorye-mozhno-i-nelzya-ispolzovat-v-2025-godu--razbiraem-baseline-2025</guid>
      <description><![CDATA[<p>Какие CSS- и HTML-фичи войдут в вёрстку к 2025 году? Разбираем доклад Михаила Балицкого (Яндекс) о Baseline 2025: сабгриды, попапы без JS, анимации скролла и почему SASS ещё рано списывать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/fichi-budushhego-v-interfejse--kotorye-mozhno-i-nelzya-ispolzovat-v-2025-godu--razbiraem-baseline-2025">Фичи будущего в интерфейсе, которые можно и нельзя использовать в 2025 году: разбираем Baseline 2025</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Новости]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Яндекс]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 01 Aug 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>О чём говорили на <a href="https://www.youtube.com/live/qQmEGSFKB-8">Яндекс-субботнике</a> для разработчиков интерфейсов в Минске.</p><p>Михаил Балицкий, старший разработчик интерфейсов главной страницы Поиска Яндекс, рассказал об основных фичах ближайшего будущего. Какие-то уже можно пробовать применить в интерфейсах вашего приложения, а с какими-то придётся подождать.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/f4b90e42-47c4-4ea8-8f79-c2d1886f5e32.png" alt="" /></figure><p>Михаил сделал клон страницы Яндекс Поиска,
чтобы испробовать все нововведения (Baseline), поддерживаемые в браузерах на
2025 год. У каждой фичи есть веб-платформенные тесты от сообщества — набор
кейсов, который проверяет функциональность. Многие из фичей, несмотря на то, что
находятся в Baseline 2025 года, не имеют 100% покрытия тестов.</p><h2>Гриды и сабгриды</h2><p>За основу Layout страницы взяли гриды, которые
находятся в продакшене уже более 8 лет.</p><p>API первого уровня позволяет вам создавать
layout страницы как крупными мазками, то есть верхнеуровнево, так и
распределять элементы маленьких блоков.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/edc5e27d-a660-45f9-aebd-8713a0773d89.png" alt="" /></figure><p>Но гриды не стоят на месте, а двигаются вперёд. Недавно появилась спецификация второго уровня. Например, если
у нас есть блок сервисов, то мы его можем задать как грид. А каждый элемент
этого списка — в виде сабгрида. По сути, говоря ему, что он наследует
сетку родителя.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/7186b397-d620-4b3d-ae95-2594643235a9.png" alt="" /></figure><p>Это позволяет за счёт изменения одного
свойства родителя полностью изменить внешний вид элемента — например, сделать
иконки разного размера.</p><p>Но это ещё не всё. Если мы сверстали карточку
в ленте фида, она получилась классной, но тестирование указало нам на проблемы
с доступностью. У нас не оказалось тега &lt;article&gt; и тега
anchor element &lt;a&gt; для ссылки. Но при добавлении этих тегов вёрстка может
поплыть.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/142cce85-093c-4b70-bec0-d2924d9039b4.png" alt="" /></figure><p>Если вы используете сабгриды, всё нормально — будет унаследована сетка родителя, и элемент останется красивым. Это позволяет
верстать блок без использования position легко и удобно.</p><p>CSS сабгриды появились в 2023 году, но пока их
рано использовать, так как в случае, если бразуер пользователя их не
поддерживает, у вас может сломаться вся вёрстка. Но пройдёт несколько лет и их
можно будет использовать.</p><h2>Масштабирование</h2><p>Если у нас страница обладает свойством
резиновости: на больших экранах элементы увеличиваются, на маленьких —
уменьшаются.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/6e33385a-841d-4a46-abeb-f636144c5de9.png" alt="" /></figure><p>Достигается это за счёт того, что страница
свёрстана в em — это величина, которая меняет размер шрифта. А меняя его, мы
меняем размер элементов. Раньше это писалось с помощью медиа-выражений, который
зависит от min-width, то сейчас есть возможность упростить визуальный
синтаксис, добавив интервальный. Он позволяет дописать больше или
равно/ меньше или равно — то, что человеку понятнее. Есть post css плагин,
который позволяет завезти это поведение для старых браузеров, чтобы всё
работало хорошо.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/9516ac0e-8f9a-42fa-9ec0-9bbc0c1b3a50.png" alt="" /></figure><p>А можно ещё сильнее упростить код, за счёт
использования css Nesting из baseline 2023. Поэтому в браузерах новее 2023
года это работает из коробки, а в более старых можно с помощью post css плагина
затрансперировать поведение, чтобы всё корректно работало. Тем самым, мы
сэкономим немного строк кода.</p><p>Но можно пойти ещё дальше в будущее к
@function, и в 139 Chrome уже пообещали запустить эту функциональность, но пока
доступна только в Chrome Canary браузере (для опытных разработчиков). Позволяет
заменить mix in в CSS, SASS для препроцессинга.</p><p>Но можно пойти в @property.
Поддерживается почти во всех браузерах и позволяет задать кастомное
свойство, задать значение по умолчанию и узнать, наследуется ли оно. Здесь мы задаём
стандартное значение размера шрифта в em, потому что оно зависит от контекста.
По спецификации initial value должно быть постоянным значением, которое не
изменяется нигде.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/4c20575a-8f12-4be2-a928-9107c7f5f1dd.png" alt="" /></figure><h2>Отказ от SASS — не всё так просто</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/a6a66ec6-38dd-4334-8b3c-73363f48a53b.png" alt="" /></figure><p>Если у нас есть полоска сервисов, которые в
зависимости от размеров экрана меняют свой размер, то за счёт селектора
nth-child мы можем указать: возьми все элементы, начиная с n, кроме all, и
примени к нему display: none. А внутри медиа-выражение в зависимости от размера
экрана срабатывает по-разному. У медиа-выражений есть явная проблема: если у
нас меняется продуктовое поведение, например, размер блока или расположение
компонента, то все стили устаревают и медиа-выражения приходится заново
переписывать.</p><p>Но у нас появились container queries, которые
позволяют мэтчиться не на размер страницы, а на размер конкретного элемента
— ширину или высоту. Работает с 2023 года, но в продакшен тащить рано
— в старых браузерах вёрстка поедет.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/6926118c-5d20-468a-9abf-f90458eda798.png" alt="" /></figure><p>Код в примере очень репетативен — мы повторяем
одно и тоже много раз.</p><p>Можно ли написать вот так?</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/e7c92318-fb7b-4334-bd63-ce20c02e8827.png" alt="" /></figure><p>Но в таком коде есть много проблем, он не
работает и никогда не будет работать.</p><p>В container queries у нас есть константы,
можно использовать calc, чтобы сложить em и пиксели. Но мы не можем там
использовать CSS-переменные, браузер их просто проигнорирует. А в nth-child всё
ещё хуже: можно использовать только целочисленные значения.</p><h2>Postcss-Preset-Env</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/c8a14e8e-9b3d-4150-848b-52ee937a156c.png" alt="" /></figure><p>Плагин для postcss, который базируется на
возможностях веб-платформы и спецификации, позволяет контролировать, какие
спецификации вы затаскиваете в браузер. Можно контролировать набор возможностей
по списку браузеров и управлять явным списком фичей, включать и отключать
нестинг.</p><h2>Попап сервисов (dialog)</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/f7e3c510-cc35-44cd-8064-63f93bdef40a.png" alt="" /></figure><p>Позволяет сделать доступное модальное окно без
JS. Есть два режима показа: обычный и модальный. В модальном режиме есть
ловушка фокуса, которая позволяет осуществлять навигацию через табы. Также при
использовании скринридера вы не уходите за пределы данного элемента. Раньше это достигалось с помощью JS, а теперь работает из коробки.</p><p>В будущем это должно будет работать так:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/6f777cd8-a74d-4234-adca-4e9f28291467.png" alt="" /></figure><p>Но спецификация до сих пор не стабилизирована.
Всё, кроме закрытия по парандже работает без JS. Есть полифил (polyfill), но
для его работы нужно писать дополнительные селекторы и он не работает без
JavaScript, нет понятия Top Layer.</p><h2>Меню в фиде</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/ea9f7945-49cb-4f11-b342-bc22135d6601.png" alt="" /></figure><p>В любой элемент страницы, будь то div, span или
dialog, нужно добавить интерактивности, чтобы он открывался по клику. В сочетании с
micro position меню позиционируется рядом с кодом без единой строчки JS и
работает с 2025 года, то есть через пять лет можно будет затащить решение в
продакшене.</p><h2>Прогрессивные улучшения</h2><p>Пользователи старых браузеров эти улучшения не
получают, но их опыт не ухудшается, а это важно.</p><p>Сюда входят дискретные анимации для бинарных
свойств с помощью allow-discrete. Так значение свойств изменится только к концу
анимации.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/977ea182-e64f-4984-b6f8-91dbc94b0410.png" alt="" /></figure><p>В сочетании с элементом @starting-style легко
добиться красивых анимаций — например, показ и скрытие попапа.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/e36097c7-2f7d-4654-b5d9-1634829414ca.png" alt="" /></figure><p>Но оказалось, что прогрессивные улучшения
могут навредить пользователям. В 120 и 121 Chrome есть баг, который крашит
браузер. Совет — экспериментировать, проверять и
замерять.</p><h2>Scrollbars</h2><p>Из коробки они могут вылезать за пределы или
оказаться неправильного цвета. Но с помощью color-scheme можно задать
конкретный цвет блока. Станет лучше, но Scrollbar всё равно может вылезать за
пределы элемента.</p><p>Появился Scrollbar Styling первого уровня,
который позволяет делать красивые скроллбары. Есть набор констант от none до
thin, и можно задавать цвет как самого трекера, так и подложки.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/739f6b9a-e925-4dc1-9744-96990e95cc3a.png" alt="" /></figure><p>Но Scrollbar может всё равно вылезать за
пределы страницы, а ещё сложно управлять цветом и расположением элемента.</p><p>Чтобы это исправить, можно использовать другое свойство без стабильной спецификации, поддерживаемое во всех браузерах — это
webkit-scrollbar.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/1f3a31dc-6c55-46a0-ab66-806a1312175f.png" alt="" /></figure><p>Правда с его помощью не получится добиться
красивого скругления. Но сочетать webkit-scrollbar и scrollbar-styling не выйдет. Либо одно, либо другое.</p><p>Можно использовать scrollbar-gutter, чтоб
зарезервировать пространство с двух сторон скролла. Но если есть элемент с
динамичной высотой, когда элементов может быть то меньше, то больше, то можно
избежать прыжка контента.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/3f103c28-1d11-4e11-b4e6-095587dce308.png" alt="" /></figure><p>Рекомендация — всегда добавлять на
html-тег это свойство, чтоб проблем не было и интерфейс не оказался сдвинут.</p><h2>Анимации</h2><p>Также сейчас можно сдвигать элемент на чистом
CSS без использования JS — с помощью animation timeline scroll или animation
timeline view.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/f420ed73-5f1b-4a97-826c-6a70d423c7bc.png" alt="" /></figure><p>Вы можете управлять положением скролла и тем,
какую часть анимация занимает, а также связываать две анимации.</p><p>Но нужно всегда задаваться вопросом: что
будет, если свойство не поддерживается в старых браузерах.</p><p>Например, в этом случае два элемента будут
наплывать друг на друга или произойдёт мерцание.</p><h2>View Transition API</h2><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-01/adb3207e-c79a-426d-bceb-61c6fb326f26.png" alt="" /></figure><p>API крайне мощный, но пока не очень
поддерживается.</p><h2>Итоги</h2><ul><li>Переменные уже заменены и их можно использовать $name-&gt;var(-name).</li><li>Миксины через 5 лет можно будет заменить mixin-&gt;@function.</li><li>Нативный нестинг — хорош!</li><li>Даже функция if() уже доступна в Chrome136.</li><li>Не скоро ещё можно будет отказаться от языков препроцессинга, например, от SASS.</li><li>Область использования var() и env() ограничена.</li><li>CSS не умеет в циклы.</li><li>@function пока слишком рано использовать.</li><li>Но мы можем перейти на CSS + Post CSS. И в Яндекс Поиске пошли по этому пути. При этом во всей кодовой базе mix in использовались всего несколько раз. Поэтому оказалось что функции препроцессора особо не используется. От нестига пришлось мигрировать — но это было не сложно.</li><li>Popover и полифилл есть в baseline 2025, но не все wpt проходят.</li><li>Полифилл имеет ограниченную поддержку.</li><li>Полифилл не работает в браузерах с частичной поддержкой popover.</li><li>Anchor-positioning есть в Inerop 2025 и у него есть полифилл, но спецификация ещё меняется.</li><li>Полифилл не поддерживает множество кейсов — практически никакие, кроме базовых.</li><li>Даже прогрессивные улучшения могут навредить.</li></ul><p>Давно пора исползовать:</p><ul><li>Dialog — упрощает написание кода и работает даже в старых браузерах с полифоллом.</li><li>CSS Nesting и CSS — Variables упрощают написание стилей и хорошо работает в связке с PostCSS.</li><li>Grid Layout — упрощает вёрстку сложных сайтов и работает в браузерах 8-летней давности.</li></ul><p><b>Через пять лет вёрстка сильно изменится за счёт новых фичей, которые появляются уже сейчас! А какую из фичей вы желаете больше всего затащить в продакшен? </b></p>]]></content:encoded>
    </item>
    <item>
      <title>Адаптивные изображения и подписи на CSS: как работают container queries и :has()</title>
      <link>https://tproger.ru/articles/adaptivnye-izobrazheniya-i-podpisi-na-css--kak-rabotayut-container-queries-i--has--</link>
      <comments>https://tproger.ru/articles/adaptivnye-izobrazheniya-i-podpisi-na-css--kak-rabotayut-container-queries-i--has--?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/adaptivnye-izobrazheniya-i-podpisi-na-css--kak-rabotayut-container-queries-i--has--</guid>
      <description><![CDATA[<p>Как создать адаптивный feature image с подписью без JavaScript? Разбираем, как работают container queries и селектор :has() в CSS, чтобы строить гибкие и живые компоненты под любой экран и контейнер.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/adaptivnye-izobrazheniya-i-podpisi-na-css--kak-rabotayut-container-queries-i--has--">Адаптивные изображения и подписи на CSS: как работают container queries и :has()</a>»</p>]]></description>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 08 Jul 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Container queries и селектор :has() делают адаптивность вёрстки проще и чище. Разбираем, как с их помощью построить компонент с feature image, который подстраивается под контейнеры, меняет расположение и стиль подписи, оставаясь стабильным при любой ширине.</p><p><i>P.s. Это перевод англоязычного </i><a href="https://ishadeed.com/article/modern-css-feature-image/">материала</a><i>, но примеры и принципы легко применимы в ваших проектах.</i></p><h2>Введем в курс дела</h2><p>Когда автор оригинала переделывал сайт, ему понадобилось, чтобы<b> feature image</b> (картинка + подпись) адекватно вела себя в разных контейнерах и при разных размерах экрана.</p><p>Что было нужно:</p><ul><li>На маленьких размерах показывать подпись в классическом виде;</li><li>Если контейнер достаточно большой, поворачивать изображение и показывать подпись по кругу в правом нижнем углу.</li></ul><p>В демо без container queries это выглядело так:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/1966edff-da3b-4d1e-a180-b7ac36201759.png" alt="" /></figure><p>В реальности, даже если контент уже вмещался в одну строку, фигура оставалась в классическом виде. Можно ли сделать лучше? Спойлер — да!</p><h2>Сила container queries</h2><p><b>Container queries</b> позволяют переключать стили не в зависимости от вьюпорта, а от размера контейнера, в котором находится компонент.</p><p>В демо автор выделил четыре разных состояния размеров, чтобы показать, как с помощью container queries плавно поменять вид с «stacked» (вертикальная компоновка) на «circular» (круговая подпись) и обратно.</p><p>С <b>media queries</b> это превратилось бы в лес условий:</p><p>И всё это легко ломается, если вдруг меняется контент или макет.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/80c3a843-4f7b-4e88-8a09-992c96b757cb.png" alt="" /></figure><p>Container queries же дают возможность адаптировать вид компонента в зависимости от реальной доступной ширины, без лишних хаков и постоянных правок брейкпоинтов при каждом изменении дизайна.</p><h2>Как это собрать на практике</h2><h3>1. Оборачиваем компонент в контейнер</h3><p>Чтобы container queries работали корректно, компонент нужно обернуть в отдельный контейнер и уже относительно него делать запросы. Иначе CSS будет «зацикливаться» и ломаться.</p><p>Определяем figure-wrapper как контейнер:</p><p>Простой тест: если ширина контейнера больше 240px, добавляем outline к figure.</p><p>Ресайзим окно браузера — и видим, как рамка появляется при ширине 240px+:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/9c15b723-a062-41c7-82b9-ede49a251547.png" alt="" /></figure><h4>Условные стили — :has()</h4><p>По умолчанию компонент в stacked-версии. Если ширины достаточно, переключаемся на circular.</p><p>Важно проверить, есть ли у figure — figcaption. Если есть — поворачиваем изображение. Для этого используем селектор :has().</p><p>Базовая структура готова, переходим к верстке.</p><h3>2. Собираем лейаут</h3><p>Хотя задача простая, есть несколько рабочих подходов.</p><h4>Опция 1: Полный position:absolute</h4><p>Здесь и изображение, и подпись выносятся из потока:</p><p>Но у такого решения контейнер почти не имеет высоты, так как внутри нет элементов в потоке.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/50283f09-7700-4d37-aaec-4fe204d23de6.png" alt="" /></figure><p>Исправляем, задавая aspect-ratio и ширину контейнеру:</p><p>Работает, но автор оригинала не в восторге:</p><ul><li>много position: absolute;</li><li>приходится задавать размеры картинкам через проценты, это ломает масштабирование.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/78ceabef-a412-4200-ba3c-aae9dcc67d48.png" alt="" /></figure><h4>Опция 2: CSS Grid с наложением</h4><p>Здесь используем CSS Grid, чтобы накладывать изображение и подпись, размещая их в одной ячейке:</p><p>Результат:</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/6502a84e-7ed8-4fd2-8f5d-e728973030d8.png" alt="" /></figure><p>Далее подгоняем размер изображения, уменьшая его на часть размера подписи:</p><p>Перед нами — аккуратный и гибкий лейаут, который хорошо работает и не требует хакинга.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/3f91f634-5be1-4bea-adcb-c98ce584ed43.png" alt="" /></figure><h4>Опция 3: Паддинги вместо абсолютов</h4><p>В этом варианте position: absolute используется только для подписи, а для картинки задаются паддинги, чтобы она не накладывалась на подпись:</p><p>Автор оригинала выбрал этот вариант для своего блога, но отмечает, что и Grid ничуть не хуже — обе опции удобны и управляемы.</p><h3>Шаг 3. Делаем компонент «жидким»</h3><p>Чтобы компонент уверенно работал при любой ширине контейнера и экрана, можно добавить fluid CSS. Настраиваем «жидкость» у следующих параметров:</p><ul><li>скругления углов;</li><li>размер шрифта;</li><li>размер подписи;</li><li>паддинги.</li></ul><p>Благодаря единицам container query, можно адаптировать размеры под ширину контейнера. В данном случае используется cqw (container query width).</p><p>При изменении ширины контейнера меняются скругления, шрифт, паддинги и размер подписи. Так компонент становится адаптивным</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/4b06147c-afa1-4b43-a35e-34b7a4ad446d.png" alt="" /></figure><h3>Шаг 4. Тестируем в разных контекстах</h3><p>Автор оригинала тестировал компонент в разных контекстах, чтобы убедиться в его стабильной работе. Параметры следующие:</p><ul><li>секция с двумя колонками;</li><li>компонент на всю ширину;</li><li>сетка с тремя колонками;</li><li>сетка с двумя колонками, где первый элемент занимает 66% пространства;</li><li>мобильный размер.</li></ul><p>При изменении сеток и ширины компонент продолжает уверенно адаптироваться, не ломая макет.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-04/931b1555-bd2c-4a76-b6ad-036745b0c92f.png" alt="" /></figure><h2>Вывод</h2><p>На первый взгляд компонент может показаться простым, но при использовании в разных контекстах появляются дополнительные вызовы. Современный CSS (container queries, :has(), cqw) позволяет элегантно решать такие задачи, избавляясь от хакинга и лишнего JS.</p>]]></content:encoded>
    </item>
    <item>
      <title>Нас превращают в киборгов? Как нейроимпланты, протезы и ИИ становятся частью нашего тела уже сегодня</title>
      <link>https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya</link>
      <comments>https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya</guid>
      <description><![CDATA[<p>Рассмотрим, сколько людей в мире с нейроимплантами, что уже умеют современные нейроинтерфейсы с ИИ и какие новые проблемы это порождает.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/nas-prevrashhayut-v-kiborgov--kak-nejroimplanty--protezy-i-ii-stanovyatsya-chastyu-nawego-tela-uzhe-segodnya">Нас превращают в киборгов? Как нейроимпланты, протезы и ИИ становятся частью нашего тела уже сегодня</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Opera]]></category>
      <category><![CDATA[Tesla]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Илон Маск]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Нейрочип]]></category>
      <category><![CDATA[Neuralink]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 1960 году учёные Манфред Клайнс и Натаниэл С. Клайн <a href="http://www.medientheorie.com/doc/clynes_cyborgs.pdf">ввели </a>в обиход слово «киборг». Изначально термин описывал людей, которые могут выживать в космосе с помощью техники, встроенной прямо в тело. Со временем это понятие быстро расширилось: киборгом стали называть любого, кто использует технологии не только для экстремальных условий, но и для обычной жизни.</p><p>Сегодня к киборгам относят всех, у кого есть что-то технологичное внутри или на себе: кардиостимулятор, слуховой аппарат, нейроимплант или бионический протез. Даже смарт-часы и фитнес-браслет — простейшие примеры кибернетического дополнения.</p><h2>Сколько в мире людей с имплантами?</h2><p>Импланты и протезы становятся всё более привычной частью жизни во всём мире.</p><p><b>Протезы конечностей.</b> По оценке <a href="https://www.who.int/news-room/fact-sheets/detail/assistive-technology">ВОЗ</a>, в протезах и ортезах нуждаются от 35 до 40 миллионов человек по всему миру, но только один из десяти реально получает нужное устройство. В России, по <a href="https://www.rbc.ru/industries/news/65377d919a7947c1f7a2dd21">данным </a>Минтруда, протезы конечностей стоят у 200 тысяч человек. Мировой рынок биопротезов уже <a href="https://trends.rbc.ru/trends/industry/660ef9569a7947a72761db51">перевалил</a> за $1,5 млрд и, по прогнозам, вырастет почти вдвое к 2030 году.</p><p><b>Кардиостимуляторы.</b> Более <a href="https://www.ahajournals.org/doi/10.1161/01.cir.0000016183.07898.90">3 миллионов</a> людей в мире живут с кардиостимуляторами. Каждый год медики устанавливают ещё от 600 тыс. до миллиона новых устройств, и эта цифра стабильно растёт.</p><p><b>Кохлеарные импланты.</b> Более 1 млн человек по всему миру <a href="https://pubs.aip.org/asa/jel/article/2/7/077201/2844572/Celebrating-the-one-millionth-cochlear-implanta">получили </a>кохлеарные импланты — устройства, которые возвращают слух даже тем, кто не слышал с рождения.</p><p><b>Нейроинтерфейсы.</b> Это пока самая «экспериментальная» ниша: в мире насчитывается менее сотни человек с вживленными в мозг чипами, которые считывают сигналы и возвращают некоторые утраченные способности. Среди них — пациенты Neuralink, Synchron, Precision Neuroscience и других лабораторий.</p><p><b>Добровольно чипированные.</b> По оценкам <a href="https://www.govtech.com/blogs/lohrmann-on-cybersecurity/should-states-ban-mandatory-human-microchip-implants">Government Technology</a>, от 50 000 человек на планете добровольно вживили себе микрочипы — чаще всего для замены пропуска, банковской карты или электронного ключа. К примеру, американская компания Three Square Market (32M) в 2017 году <a href="https://www.computerra.ru/292329/chatgpt-podskazal-rossiyaninu-implantirovat-sebe-chip-v-ruku-eksperiment-auruma-kettunena/">вживила </a>50 сотрудникам NFC-чипы для замены пропуска и кредитки. Аналогично поступила шведская компания BioHax International в отношении 150 сотрудников.</p><p>В 2015 году менеджер российской компании Ericsson тоже <a href="https://vc.ru/flood/11234-kino-cut">вживил </a>себе NFC-чип и использует его как визитную карточку. Энтузиаст отмечает, что более современные чипы можно использовать для оплаты в магазине.</p><p>Как мы видим, импланты и протезы постепенно перестают быть диковинкой, набирают число носителей и выходят в массы, причем не только в сфере здравохранения, но и для бытовых задач.</p><h2>Что уже умеют современные импланты?</h2><p>Современные импланты умеют многое. Нейроинтерфейсы, благодаря связке с внешними устройствами, могут вернуть человеку возможность говорить, писать текст, сёрфить в интернете. Бионические протезы по функциональности становятся всё ближе к полноценным конечностям. Вот несколько историй пациентов, которым технологии дали новые возможности:</p><h3>Нолан Арбо: парализованный, который играет в Civilization VI</h3><p>В 2016 году Нолан Арбо получил тяжёлую травму позвоночника, он оказался парализован.</p><p>В январе 2024 года Нолану <a href="https://www.forbes.ru/tekhnologii/513387-pervyj-pacient-s-cipom-neuralink-rasskazal-o-zizni-posle-operacii">вживили </a>чип Neuralink, компании Илона Маска. Специальный робот-хирург вскрыл небольшой участок черепа и установил там нейроимплант. Сам чип — это миниатюрный диск чуть меньше монеты, к нему подходят полторы тысячи тонких электродов, которые вводятся прямо в кору мозга. Такой подход даёт максимальную пропускную способность: электроды фиксируют мельчайшие импульсы нейронов и более точно конвертируют их в команды.</p><p>Всего через неделю после операции Нолан смог снова общаться с миром. Он управляет курсором силой мысли, сёрфит в интернете, переписывается с друзьями, играет в Civilization VI. Всё это — без движения рук.</p><p>Чип Neuralink <a href="https://blog.skillfactory.ru/chip-ilona-maska/">связывает мозг и внешние устройства</a>. Электроды фиксируют сигналы мозга, чип распознаёт их, отправляет по Bluetooth на внешний модуль. Далее алгоритм интерпретирует эти сигналы для каждой команды и выполняет действие: сдвинуть курсор, выбрать приложение, напечатать текст.</p><p>Из недостатков: чип нужно заряжать каждый день, зарядка происходит беспроводным способом.</p><h3>Филип О’Киф: пациент с БАС, который снова в сети</h3><p>Филип О’Киф — бывший банковский работник, отец семейства. В 2015 году он начал замечать слабость в руках и ногах, ему стало сложно выполнять привычные действия — писать, одеваться, работать за компьютером. Постепенно болезнь прогрессировала: Филип стал терять подвижность, речь — менее чёткая. Врачи поставили диагноз — боковой амиотрофический склероз (БАС), при котором постепенно отмирают моторные нейроны, и человек теряет возможность двигаться и говорить. Через несколько лет Филип оказался почти полностью парализованным.</p><p>Вместо сложной нейрохирургии врачи <a href="https://translated.turbopages.org/proxy_u/en-ru.ru.b4bb4b7d-684bd845-43c64ae1-74722d776562/https/www.dailymail.co.uk/news/article-10348257/Paralysed-man-person-tweet-message-using-MIND-thanks-tiny-brain-implant.html">использовали </a>чип Stentrode от американской компании Synchron. Его ввели через вену на шее: чип сам «дошёл» до нужной зоны мозга и раскрылся там в виде сеточки с 16 контактами. Второй модуль вживили под кожу на груди — он передаёт сигналы наружу. Оба устройства связали тонким проводом.</p><p>Через несколько дней пациент <a href="https://www.indiatimes.com/technology/news/brain-chip-paralysed-man-tweet-thoughts-557863.html">начал</a> заново писать сообщения, сидеть в соцсетях, отвечать на письма. Недавно другой пользователь с тем же чипом <a href="https://hightech.fm/2024/08/01/bci-vision-pro">смог работать</a> с гарнитурой Apple Vision Pro. Это стало возможно благодаря интеграции в чип системы управления зрением.</p><p>Stentrode <a href="https://synchron.com/technology">фиксирует </a>электрическую активность моторной коры — зону мозга, отвечающую за движения. <a href="https://reports.mountsinai.org/article/neuro2022-10-stentrode-research">Сигналы идут</a> по проводам к подгрудному модулю, а дальше — по беспроводу к компьютеру. Алгоритмы ИИ учатся на примерах пользователя, отличают команду «нажать» от «двинуть» и со временем становятся точнее. Для операции не требуются сложные хирургические вмешательства — человек возвращается домой через пару дней.</p><h3>Андрей Марсаков — программист с механическим протезом руки</h3><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/6f8f9e75-cf84-4ee2-a0bc-cfa310b0a9ba.jpg" alt="" /><figcaption>Андрей Марсаков. Источник — Комсомольская Правда</figcaption></figure><p><a href="https://www.ural.kp.ru/daily/27652/5003518/">Андрей Марсаков</a> — 26-летний программист из Екатеринбурга. Он родился без правой кисти (врождённая аплазия) и с детства привык делать всё одной рукой. Однажды решил попробовать «другую жизнь» с протезом — чтобы упростить повседневные задачи и получить новый опыт.</p><p>В конце 2023 года Андрей получил активный механический протез кисти от компании «Моторика». Ожидание устройства заняло почти полгода, стоимость составила примерно 200 тыс. рублей. Кстати, есть <a href="https://rg.ru/2024/11/18/nadezhnaia-podderzhka.html?utm_source=chatgpt.com">госпрограмма</a>, которая позволяет получить такие протезы.</p><p>Протез управляется системой тросов: при движении мышц культи энергия передаётся на ладонь, и та выполняет простые движения. Нет электроники, батарей, сенсоров или обратной связи — это чистая механика.</p><p>Сначала было сложно разобраться, как с ним работать, но через какое-то время Андрей смог пользоваться протезом. К примеру, он использует шейкер и разливает по бокалам коктейли. Писать код второй рукой тоже можно, но слишком медленно, поэтому работает он по-прежнему одной.</p><h3>Устройство от Cortical Labs: компьютер из схем и клеток человеческого мозга</h3><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/6b5a8942-06e0-415b-acaf-09ead744b4c0.jpg" alt="" /><figcaption>Скриншот изображения компьютера с corticallabs.com</figcaption></figure><p>В 2025 году австралийский стартап Cortical Labs <a href="https://spectrum.ieee.org/biological-computer-for-sale">представил </a>первый коммерческий биокомпьютер CL1. Учёные вырастили в лаборатории 800 тысяч человеческих нейронов и соединили их с обычной микросхемой. Получился гибрид: нейроны могут учиться и адаптироваться как живой мозг, а микросхема передаёт сигналы в цифровом виде.</p><p>CL1 используют для тестирования лекарств, исследований искусственного интеллекта и даже создания новых типов нейроинтерфейсов. Живые нейроны быстрее обучаются, а сама система потребляет в десятки раз меньше энергии, чем классический ИИ на кремнии.</p><p>Нейроны располагаются на специальном субстрате, к ним подключены сенсоры, которые фиксируют активность и передают в компьютер. Учёные могут отправлять сигналы напрямую в нейронную сеть, а биокомпьютер — отвечать в реальном времени. CL1 уже продаётся лабораториям по всему миру, а доступ к устройству можно получить даже удалённо, через облако.</p><p>Авторы проекта открыто заявляют: в будущем такие биокомпьютеры станут основой для продвинутых нейроинтерфейсов и гибридных ИИ — на стыке биологии и математики.</p><h2>Животные киборги: чипированные свиньи, обезьяна-телепат и мыши на радиоуправлении</h2><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/b6641801-e4a9-4dac-abbb-e62f47a3ce0c.jpg" alt="" /><figcaption>Скриншот новости про эксперимент Маска с Lenta.ru</figcaption></figure><p>Не только людям устанавливают импланты. Часто обладателями новых технологий становятся и животные. С одной стороны, это целесообразно с точки зрения клинических испытаний, с другой стороны, позволяет минимизировать присутствие человека в некоторых опасных сценариях, например, при поиске пострадавших под завалами. Вот несколько историй с чипированными животными:</p><p><b>Свиньи Neuralink.</b> В 2020 году Илон Маск <a href="https://www.teslarati.com/elon-musk-neuralink-smartwatch-features-implant-robot-live-demo-video/">показал </a>миру свиней с нейрочипами Neuralink. После операции животные быстро восстановились и вернулись к обычной жизни. Один из чипов даже успешно извлекли — и никаких побочных эффектов не было. Эти эксперименты доказали, что мозговой имплант можно не только внедрить, но и безопасно достать. Это важно с точки зрения обслуживания и возможных обновлений.</p><p><b>Обезьяна, играющая в Pong.</b> В 2021 году Neuralink <a href="https://www.theverge.com/2021/4/8/22374749/elon-musk-neuralink-monkey-pong-brain-interface">внедрили </a>свой чип обезьяне по кличке Pager. После короткого курса обучения она смогла сыграть в аркадную видеоигру Pong: не джойстиком, а мысленным управлением. Чип фиксировал всплески нейронной активности, ИИ-алгоритмы расшифровывали их и передавали команды на экран.</p><p><b>Мыши и крысы в BCI-лабораториях.</b> Одна из самых известных работ — <a href="https://www.sciencedaily.com/releases/2002/05/020503080514.htm">эксперименты исследователей</a> из медицинского центра Downstate в Нью-Йорке. Учёные в начале 2000-х вживили крысам три электрода: один стимулировал «лево», другой «право», а третий — зону удовольствия. Управляя этими сигналами с компьютера по радиоканалу, исследователи заставляли крыс проходить по сложному лабиринту строго по заданной траектории — получились радиоуправляемые животные.</p><h2>Как ИИ помогает людям с имплантами и протезами?</h2><h3>Узкоспециализированные ИИ</h3><p><b>ИИ для протезов ноги</b></p><p>ИИ — отличное дополнение для протезов. У разных компаний есть свои узкоспециализированные разработки в этой области. К примеру, в системах <a href="https://spa-prod-commerce.cep.ottobock.com/medias/5040276.pdf?attachment=true&amp;context=bWFzdGVyfHJvb3R8MTgwNjA5NXxhcHBsaWNhdGlvbi9wZGZ8aDA4L2hiMS85NDE1MDExNTk4MzY2LnBkZnxlNzg4YWUzNWZhZDFkZTY5OTViOGU1ZTQ5M2YwNzFlNzAxYmIyOTYxNDQ4NWJkNTQyZDE0MDJmYTkzNGJlZTI2">Ottobock </a>и <a href="https://accessprosthetics.com/wp-content/uploads/2017/06/rheo-instructions-for-use.pdf">Össur</a> есть ИИ, который до 100 раз в секунду сравнивает движения, оценивает положение тела и заранее регулирует сопротивление в коленном суставе. Как итог, человеку комфортнее ходить даже по неровным поверхностям.</p><p><b>ИИ для улучшения моторики рук</b></p><p>С руками — та же история. Российская «Моторика» <a href="https://ai-russia.ru/library/motorika?utm_source=chatgpt.com">внедряет </a>нейросети, которые ловят электрический шум мышц и «видят» реальные сокращения в тканях. ИИ <a href="https://www.stimul.online/articles/kompaniya/protez-na-osnove-ii/">понимает</a>, какой палец должен двигаться, какой — оставаться на месте, а какой — мягко удерживать хрупкий предмет. Пока что эта технология находится в разработке в виде прототипа. С её помощью в будущем пользователи смогут выполнять сложные движения — наливать чай или нарезать овощи.</p><h3>LLM в теле человека</h3><p>Neuralink от Илона Маска <a href="https://futurism.com/nonverbal-neuralink-patient-grok-answers">использует</a> Grok для работы чипа. С помощью нейроинтерфейса человек мысленно набирает текст, а модель Grok в связке с ElevenLabs воспроизводит речь. Причем ИИ обучен на старых записях разговоров пациента. Человек «думает» фразу, а Grok озвучивает.</p><p>Компания Synchron, конкурент Neuralink, <a href="https://www.businesswire.com/news/home/20240711493318/en/Synchron-Announces-Brain-Computer-Interface-Chat-Feature-Powered-by-OpenAI">встроила</a> в свой нейроинтерфейс чат-бота на базе ChatGPT. Система предлагает парализованному пользователю варианты фраз и слов, позволяя силой мысли быстро создавать осмысленные предложения для общения.</p><h2>Основные проблемы нейроинтерфейсов, протезов и имплантов</h2><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-06-16/f6a257cd-ffba-4306-aa20-706f9a99523a.jpg" alt="" /></figure><h3>Стоимость и поддержка</h3><p>Самая очевидная проблема индустрии — сложные и дорогие операции. Здесь нужны хирурги, а любые сбои устройств могут навредить здоровью. Не все чипы работают стабильно: были случаи, когда пациенты теряли связь с имплантом или не могли его обслужить из-за банкротства производителя.</p><p>Например, в 2019 году компания Second Sight заявила о поэтапном прекращении работы и в итоге <a href="https://rusbankrot.ru/bankruptcy-and-liquidation/proizvoditel-bionicheskikh-glaz-obankrotilsya-ostaviv-patsientov-bez-tekhpodderzhki/">обанкротилась</a>. Компания предлагала свою продукцию слепым и слабовидящим. Стоимость одного импланта составляла $150 тыс. Пациенты после операции начинали лучше видеть, самостоятельно ходили в магазин, катались на лыжах. Однако, оказалось, что компания неправильно оценила затраты и работала в убыток, даже при таком высоком чеке. В результате она закрылась, а 350 пациентов с имплантами остались без поддержки.</p><h3>Риск утечки конфиденциальных данных из «мозга»</h3><p>Другая проблема — безопасность данных. Нейроинтерфейс может теоретически стать «точкой входа» для утечки личной информации.</p><p>В 2012 году группа ученых из Оксфордского и Калифорнийского университетов в Беркли провела <a href="https://www.wired.com/2012/08/brainwave-hacking">эксперимент</a>, продемонстрировавший уязвимость коммерческих нейроинтерфейсов. Добровольцам, на головы которых были надеты простые ЭЭГ-гарнитуры, показывали на экране ряд изображений: цифры, логотипы банков, карты местности. Сами участники не совершали никаких действий, просто смотрели.</p><p>Ученые анализировали P300-волны, которые возникают, когда человек видит что-то значимое или узнаваемое. Исследователи смогли определить личную информацию испытуемых. Точность угадывания первого знака в PIN-коде составила 20%; до 30% увеличилась точность определения банка и города испытуемого. Это, конечно, не 50% и даже не 100%, но всё равно высокий показатель.</p><p>Пока что это только эксперимент и реальных случаев таких взломов не было, но теоретически — возможно. Что, если злоумышленник сможет перехватывать сигналы от нейрочипа к внешнему компьютеру или подменить их?</p><h3>Медицинские риски</h3><p>Операции по установке имплантов и нейроинтерфейсов часто связаны с серьёзными рисками: инфекциями, кровоизлияниями, повреждением тканей мозга, формированием рубцов, которые мешают работе электродов. Даже спустя месяцы после операции может возникнуть воспаление или отторжение устройства. В случае поломки или износа потребуется новая операция, и никто не даст гарантий, что всё пройдет без осложнений.</p><p>К примеру, DBS-импланты используют для борьбы с болезнью Паркинсона. Операции по их внедрению могут длиться несколько часов. Это сложная и болезненная процедура, которую, в случае неудачи, придётся повторять.</p><p>Технологии вживления нейроинтерфейсов ещё недостаточно хорошо обкатана, это одна из причин, почему ей сложно вырваться в массы. Однако она становится всё более популярной и прогресс не стоит на месте. Люди с чипами или умными имплантами уже реальность, с которой мы будем сталкиваться чаще.</p><p>ИИ уже среди нас, и надо быть в курсе событий. Поэтому скорее подписывайтесь на наш <a href="https://t.me/+49dMRkhiJeRlZTNi">Нейроканал</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Как сделать свой первый сайт на HTML и CSS: пошаговая инструкция</title>
      <link>https://tproger.ru/articles/kak-sdelat-svoj-pervyj-sajt-na-html-i-css--powagovaya-instrukciya</link>
      <comments>https://tproger.ru/articles/kak-sdelat-svoj-pervyj-sajt-na-html-i-css--powagovaya-instrukciya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-sdelat-svoj-pervyj-sajt-na-html-i-css--powagovaya-instrukciya</guid>
      <description><![CDATA[<p>Как сделать на HTML и CSS. Показываем, какими навыками нужно обладать для создания сайтов. Рассматриваем пошаговую инструкцию и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-sdelat-svoj-pervyj-sajt-na-html-i-css--powagovaya-instrukciya">Как сделать свой первый сайт на HTML и CSS: пошаговая инструкция</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[WordPress]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 23 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Tilda, Wix, WordPress — конструкторы сайтов кажутся простым решением. Согласны, на готовых блоках можно сделать интернет-магазин за 1 час. Но учтите, что в конструкторе непонятно, как всё работает изнутри. Вы не поймёте, почему сайт долго грузится, как увеличить кнопку для смартфонов и т. д.</p><p><b>Выбрали путь программиста</b>? Значит навсегда запомните, когда опубликовали первый самописный сайт. Откосить не получится: мы сразу перейдём к практике — к концу статьи у вас будет ссылка на сайт-визитку.</p><p><b>Мало времени</b>? Выделите 10 минут — мы используем только HTML и CSS.</p><p>Вы узнаете:</p><ul><li>как подключать стили,</li><li>как верстать блоки,</li><li>как опубликовать сайт.</li></ul><p>Возможно сейчас вы убедитесь, что веб-разработка — это ваше призвание, и захотите продолжить обучение профессии.</p><h2>Шаг 1. Подготовим инструменты и папку проекта</h2><p>Сайт можно писать и в блокноте. Это как забивать гвозди камнем – работает, но зачем мучиться? <b>Редактор кода подсвечивает синтаксис, подсказывает команды и сразу указывает на ошибки</b>.</p><p>Новичкам рекомендуем ставить <b>Visual Studio Code (VS Code)</b>. Он бесплатный, не тормозит и понимает любой код. Плюс у него огромное сообщество — если нужно установить плагин или увеличить шрифт, ответ на вопрос уже есть в интернете.</p><p><a href="https://code.visualstudio.com/download">Скачайте VS Code с официального сайта</a>.</p><h2>Как устроен веб-проект</h2><p><b>Сайт</b> — это папка с файлами для браузера.</p><p>HTML-файл содержит текст и разметку страницы, CSS-файл — правила оформления. Браузер берёт эти два файла и показывает веб-страницу.</p><p>Основной файл сайта обычно называют <i>index.html</i>. Стили хранятся в <i>style.css</i>.</p><p>Кроме файлов HTML и CSS, в нашем проекте будут папки:</p><ul><li><i>img </i>— для картинок.</li><li><i>fonts </i>— для шрифтов.</li></ul><p><b>Создайте на рабочем столе папку с названием сайта</b>, например <i>first-site</i>, и соберите начальную структуру — это займёт 1 минуту.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/5ba1fa76-6d96-4b7b-aac4-633a4d251a7e.jpg" alt="" /><figcaption>Типичная структура веб-проекта</figcaption></figure><h2>Шаг 2. Создадим базовую HTML-страницу</h2><p>В VS Code есть удобная фишка: наберите символ «!» и нажмите Tab. Редактор <b>автоматически </b>создаст базовую структуру HTML-документа.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/3fbcd34e-cf7c-473c-b0cf-84260e9aa42c.jpg" alt="" /><figcaption>Структура HTML-документа в VS Code</figcaption></figure><p>Как читать структуру:</p><ul><li><i></i><b>&lt;!DOCTYPE html&gt; </b>—<b> </b>сообщает браузеру, что это HTML-документ.</li><li><i></i><b>&lt;html&gt; </b>—<b> </b>корневой элемент, внутри которого живёт страница.</li><li><i></i><b>&lt;head&gt; </b>—<b> </b>служебная информация, которую не видно на странице.</li><li><i></i><b>&lt;body&gt; </b>—<b> </b>то, что увидят пользователи на странице.</li></ul><p><b>Измените Document на название вашего сайта</b> — это текст, который появится во вкладке браузера.</p><p>Добавим контент в &lt;body&gt;:</p><p>Мы не комментируем каждый тег и атрибут, потому что это тема для отдельной статьи. Наша задача — показать, как быстро собрать сайт и выложить его в интернет.</p><p><b>Сохраните HTML-файл и откройте его в браузере</b>. Поздравляем, ваша первая веб-страница готова! Она недоступна другим пользователям, но мы это исправим.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/c3588fae-fe59-447a-9045-d7f7ada0161c.jpg" alt="" /><figcaption>HTML-страница без стилей</figcaption></figure><h2>Шаг 3. Подключим стили CSS</h2><p>Сейчас сайт выглядит странно — чёрный текст на белом фоне. Так не пойдёт, добавим стилей в файле <i>style.css</i>.</p><p>CSS можно писать внутри HTML или в отдельном файле. Мы выберем второй вариант, потому что это удобнее.</p><p>Подключим CSS к HTML. В секции <i></i> вашего <i>index.html</i> добавьте строчку:</p><p>Тег <i> </i>говорит браузеру: «Возьми файл <i>style.css</i> из той же папки и примени все стили к этой странице».</p><p>Добавьте в <i>style.css </i>первое правило:</p><p><b>Сохраните оба файла </b>—<b> HTML и CSS</b>. Обновите страницу в браузере.</p><p>Фон поменял цвет? Значит, CSS подключён правильно. Можете вернуть белый фон или оставить голубой — далее мы добавим более интересные стили.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/95a0bd53-c4a5-4139-92c5-1c1fdda3916b.jpg" alt="" /><figcaption>Применили стиль к фону страницы</figcaption></figure><h2>Шаг 4. Подключим шрифты</h2><p>Есть три способа избавиться от дефолтного Times New Roman:</p><ul><li>Google Fonts — бесплатная библиотека шрифтов от Google.</li><li>Локальные файлы — загружаете шрифт на свой сервер.</li><li>Системные шрифты — используете то, что уже есть на компьютере пользователя.</li></ul><p><b>Для первого сайта на HTML и CSS рекомендуем Google Fonts</b> — это просто, быстро и надёжно.</p><p>Перейдите на <a href="http://fonts.google.com">fonts.google.com</a> и выберите шрифт. Популярные варианты: Roboto, Open Sans, Lato, Montserrat. Нажмите на понравившийся шрифт, выберите начертания (тонкий, обычный или жирный), скопируйте код подключения и вставьте в <i>head</i>.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/19c3409f-ea46-42fb-a56d-2680820d1fb3.jpg" alt="" /><figcaption>Подключение всех начертаний Montserrat в Google Fonts</figcaption></figure><p>На Google Font собраны популярные шрифты. Если этого мало, нужно скачать шрифт (.woff, .woff2, .ttf) и поместить в папку fonts.</p><p>Путь к файлу указывается относительно CSS-файла. Подключаем начертания через <i>@font-face:</i></p><p>Теперь используйте шрифт в CSS:</p><p>Для каждого начертания (обычный, жирный, курсив) нужно отдельное правило <i>@font-face</i>.</p><h2>Шаг 5. Сверстаем блоки</h2><p>Замените содержимое вашего <i>style.css</i> на этот код:</p><p>Что мы делаем:</p><ul><li>Убираем стандартные отступы браузера и задаём голубой фон.</li><li>Центрируем карточку по всей странице с помощью flexbox.</li><li>Создаём белую карточку с тенью и скруглёнными углами.</li><li>Делаем круглый аватар с рамкой.</li><li>Стилизуем текст и кнопку.</li><li>Добавляем эффект при наведении на кнопку.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/d89d9cf8-b178-4794-bd56-00997cf45750.jpg" alt="" /><figcaption>Простая визитка на HTML и CSS с анимированной кнопкой и ссылкой на Телеграм</figcaption></figure><h2>Шаг 6. Загрузим сайт на хостинг</h2><p>Чтобы визиткой можно было поделиться, нужно загрузить файлы на <b>хостинг</b>. Это сервер, который работает круглосуточно и показывает ваш сайт всем желающим. Посмотреть, как это работает, можно на бесплатном тарифе.</p><p>Заходим на сайт хостинга (Beget, Hostiman, InfinityFree) и регистрируемся. После подтверждения email вы попадёте в панель управления. Система предложит выбрать домен — берите бесплатный типа название.<b>fwh.is</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/26a6c762-28f6-4c16-9db2-9963b1468a14.jpg" alt="" /><figcaption>Выбор бесплатного поддомена на InfinityFree</figcaption></figure><h2>Загружаем файлы на сервер</h2><p>После создания аккаунта появится доступ к файловому менеджеру. Через веб-интерфейс можно управлять файлами на сервере прямо из браузера. Перейдите в папку <i>htdocs </i>— это корневая директория вашего сайта, куда нужно загружать структуру.</p><p>Удалите лишние файлы по типу <i>default.php</i> и загрузите ваши файлы: <i>index.html</i>, <i>style.css</i>,  <i>папки img и fonts</i>. Основной <i>index.html </i>должен лежать прямо в <i>htdocs</i>, а не во вложенной папке — иначе сайт не откроется.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/142fed8d-33ff-4d1a-bc2c-0bb97effdbb8.jpg" alt="" /><figcaption>Менеджер файлов InfinityFree</figcaption></figure><p>Более продвинутый способ — использовать FTP-клиент <a href="https://filezilla-project.org/">FileZilla</a>. В панели хостинга найдите FTP-данные и подключитесь через программу. Это удобнее для больших проектов, но для первого сайта веб-менеджера будет достаточно.</p><h2>Проверяем результат</h2><p>Через несколько минут после загрузки ваш сайт будет доступен по адресу. Откройте его в браузере — если всё сделано правильно, увидите свою страницу. Если что-то не работает, проверьте, что <i>index.html</i> лежит в корне <i>htdocs</i>, а <i>style.css</i> загружен в ту же папку.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-06-06/28368cd4-887b-41fe-8930-37b51e3875e2.jpg" alt="" /><figcaption>Опубликованная визитка на HTML и CSS</figcaption></figure><h2>Реальность бесплатного хостинга</h2><p>Для изучения основ и создания первых проектов на HTML и CSS это отличный вариант. Регистрация занимает 1 минуту, никаких настроек, можно сразу экспериментировать и видеть результат.</p><p><b>Помните про обратную сторону медали</b>. Бесплатные хостинги жёстко ограничивают ресурсы — трафик, место на диске, нагрузку на сервер. Иногда вставляют рекламу на ваш сайт. Серверы часто «падают» — страница может быть недоступна по несколько часов.</p><p>Самая большая проблема — нестабильность бизнеса. Бесплатные хостинги закрываются без предупреждения. Сегодня ваш сайт работает, а завтра компания решила, что бесплатные услуги больше не окупаются.</p><p>Скрытые ограничения:</p><ul><li>В рекламе бесплатные хостинги обещают безлимитный трафик и неограниченное место, но вынуждают переходить на платный тариф после 100 посетителей в день.</li><li>Про индексацию можно забыть — поисковые системы не пропустят бесплатные поддомены на первые страницы выдачи.</li><li>На бесплатных хостингах слабая защита. Ваш сайт могут использовать для размещения вредоносного кода, а вы об этом даже не узнаете.</li></ul><h2>Когда стоит переходить на платный хостинг</h2><p>Бесплатный хостинг — это тренировочная площадка, а не постоянное решение. Если планируете заниматься веб-разработкой, создавать портфолио или коммерческие проекты, лучше сразу инвестировать в качественный хостинг и собственный домен.</p><p>Самый простой домен стоит 200-1000 рублей/год, а базовый хостинг — 100-300 рублей/месяц. Плюс получите доступ к технологиям (PHP, MySQL), более стабильную работу и нормальную техподдержку. <b>Начните с минимального тарифа </b>— <b>его хватит на тренировочные проекты, а потом можно масштабироваться</b>.</p><h2>Куда двигаться дальше?</h2><p>Мы создали первый сайт и опубликовали его в интернете. Если повторяли за нами то поздравляем — многие останавливаются на теории, а вы дошли до результата. Теперь у вас есть понимание основ:</p><ul><li>как работает HTML,</li><li>зачем нужен CSS,</li><li>что такое хостинг и домен.</li></ul><p><b>Следующий шаг</b> — подробнее изучить CSS. Сайт-визитка из примера нормально отображается только на больших экранах. Однако 60% пользователей <a href="https://gs.statcounter.com/platform-market-share/desktop-mobile-tablet">заходит</a> с телефонов. Изучите медиазапросы, они применяются только на определённых размерах дисплея.</p><p>Подробнее про адаптив рассказал старший фронтенд-разработчик Никита Кушнарёв: <a href="https://tproger.ru/articles/esli-vy-umeete-pokrasit-knopochku-no-hotite-uznat-bolshe-o-vjorstke-veb-prilozhenij">Если вы умеете покрасить кнопочку, но хотите узнать больше о вёрстке веб-приложений</a>.</p><p>Попробуйте переделать карточку так, чтобы она нормально выглядела на телефоне. Уменьшите размеры, измените отступы, сделайте кнопку на всю ширину. Потом изучите <a href="https://tproger.ru/articles/css-grid-i-flexbox--evolyuciya-maketov-v-veb-dizajne">Flexbox и CSS Grid</a> — современные способы вёрстки макетов.</p><p>Когда почувствуете уверенность в CSS, пора знакомиться с <b>JavaScript</b>. Это язык программирования, который делает сайты интерактивными. Сложные анимации, всплывающие окна, динамическое изменение контента — это JS. Предупреждаем, он сложнее HTML и CSS. В нём есть функции, условия, циклы — всё то, что пугает новичков.</p><p>Подробнее про JavaScript: <a href="https://tproger.ru/articles/javascript-s-nulja-dorozhnaja-karta">Разработка на JavaScript с нуля: дорожная карта</a>.</p><p><b>Изучайте инструменты разработчика</b> в браузере. Нажмите F12 на любом сайте — откроется интерфейс для просмотра структуры сайта, отладки JS, тестирования адаптива. Смотрите, как устроены другие сайты, изучайте чужой код.</p><p>Самое время узнать о большем количестве инструментов программиста. Читайте в нашем <a href="https://t.me/+N9AAs1a82VA1MDMy">тг-канале!</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как переносить «висячие» слова с помощью JavaScript</title>
      <link>https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript</link>
      <comments>https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Тимшин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript</guid>
      <description><![CDATA[<p>Для автоматического предотвращения переносов после коротких слов можно использовать JavaScript, который заменяет обычные пробелы на неразрывные пробелы ( ) после определённых слов. Рассмотрим, как упростить себе жизнь с помощью JS.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-perenosit--visyachie--slova-s-pomoshhyu-javascript">Как переносить «висячие» слова с помощью JavaScript</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 21 Jun 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В типографике существует понятие «висячих слов» — это короткие слова (предлоги, союзы, местоимения), которые остаются в конце строки при переносе текста. Такие переносы нарушают удобочитаемость и эстетику текста. В русской типографике принято избегать переносов после коротких слов длиной 1-2 символа.</p><h2>Решение проблемы с помощью JavaScript</h2><p>Для автоматического предотвращения переносов после коротких слов можно использовать JavaScript, который заменяет обычные пробелы на неразрывные пробелы ( ) после определённых слов.</p><h2>Разбор кода по частям</h2><h3>1. Инициализация скрипта</h3><p>Код выполняется после полной загрузки DOM-дерева страницы. Это гарантирует, что все элементы будут доступны для обработки.</p><h3>2. Поиск текстовых элементов</h3><p>Скрипт находит все основные текстовые элементы на странице: параграфы, заголовки, элементы списков и другие. Вы можете расширить этот список, добавив другие селекторы.</p><h3>3. Список коротких слов</h3><p>Массив содержит наиболее распространённые предлоги, союзы и другие служебные слова русского языка, после которых нежелательны переносы.</p><h3>4. Обход текстовых узлов</h3><p>TreeWalker позволяет пройти по всем текстовым узлам внутри элемента, включая вложенные теги. Это важно, так как текст может содержать форматирование («,»  и т.д.).</p><h3>5. Регулярное выражение для замены</h3><p>Регулярное выражение ищет:</p><p>· (^|\s) — начало строки или пробел (группа 1);<br />· ([а-яё]{1,2}) — слово из 1-2 русских букв (группа 2);<br />· \s — пробел после слова;<br />· Флаги gi означают глобальный поиск без учёта регистра.</p><h3>6. Условная замена</h3><p>Если найденное короткое слово есть в списке предлогов, обычный пробел заменяется на неразрывный пробел (\u00A0). Это предотвращает разрыв строки между предлогом и следующим словом.</p><h3>Результат работы</h3><p>После выполнения скрипта текст «Я иду в магазин» не будет разорван на строки как «Я иду в» и «магазин». Предлог «в» всегда останется на одной строке со следующим словом благодаря неразрывному пробелу.</p><h3>Настройка скрипта</h3><p>Вы можете легко адаптировать скрипт под свои нужды:<br />· Добавить новые селекторы в querySelectorAll() для обработки других элементов;<br />· Расширить список слов в массиве prepositions;<br />· Изменить длину слов в регулярном выражении с {1,2} на другое значение;<br />· Добавить обработку других языков, изменив диапазон символов в регулярном; выражении.</p><p>Этот простой скрипт значительно улучшает типографику русскоязычных веб-страниц, делая текст более читаемым и профессионально оформленным.</p><p><i>P.S.: это JS решение иногда не во всех случаях срабатывает + бывают сложности с адаптивностью: на смартфонах может переносить совсем не так, как хотелось бы, текст может «уехать» за пределы контейнера, нужно будет «фиксить» эти моменты в CSS.</i></p><p>Подписывайся на мой <a href="https://t.me/maxtimshin">телеграм-канал</a>, чтобы узнать ещё больше полезных фишек верстки и дизайна</p>]]></content:encoded>
    </item>
    <item>
      <title>Как встроить распознавание документов в Android: пошаговое руководство</title>
      <link>https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo</link>
      <comments>https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Smart Engines]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo</guid>
      <description><![CDATA[<p>Разбираемся, как быстро добавить возможность распознавания документов в Android. Пошаговое руководство по встраиванию Smart Document Engine.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo">Как встроить распознавание документов в Android: пошаговое руководство</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет, Tproger!</p><p>Мы в <a href="https://smartengines.ru/">Smart Engines</a> занимаемся разработкой софта для распознавания самых разных документов — начиная от паспорта РФ, свидетельства о рождении и заканчивая первичкой вроде УПД или ТОРГ-12, а также банковских карт, номеров телефона и баркодов. Наши библиотеки написаны полностью с нуля (на плюсах), мы уделяем огромное внимание скорости алгоритмов, нейросетям (новым архитектурам, размеру и правильному применению) и оптимизации, за счет чего наш софт портируется на любые архитектуры и может быть использован на любой платформе.</p><p>Сегодня продолжим знакомиться через рассказ о нашем софте, на очереди вторая библиотека — Smart Document Engine и ее возможности работы с жесткими и гибкими формами.</p><h2>Гибкие и жесткие формы</h2><p>Вначале про сами формы: они могут быть «жесткими» и «гибкими». Жёсткие формы подразумевают, что положение всех объектов на форме может быть задано прямо в виде координат на шаблоне. Самое простое определение для жестких форм — они совпадают «на просвет». Возьмите пару листов А4 с распечатанной жёсткой формой, наложите друг на друга, и места расположения полей точно совпадут. Гибкие формы устроены гораздо сложнее, но все равно имеют свою характерную структуру и топологию.</p><p>Распознавание жестких форм можно свести к детекции формы на изображении и распознавании определенных областей, где должны быть искомые поля. Гибкие формы требуют гораздо более сложных систем поиска (к тому же, завязанных на результате предыдущих действий, например, OCR, что только увеличивает возможность ошибки).</p><p>Кстати, иногда вместо распознавания текста целиком достаточно просто ответить на вопрос «есть ли текст в выбранной области, и, если есть, то где»</p><p>Но не надо думать, что жёсткие формы совсем просты — большие белые поля без каких-либо символов (или одинаковый узор по краям, как это бывает с бланками гособразца), малый объём статического текста и некоторая вариативность бланков тоже заставляют потрудиться над детекцией и классификацией шаблонов.</p><p>Также существуют общие для подобных форм проблемы. Правильно интерпретировать галочки в чекбоксах, найти штрихкоды, правильно разметить табличные данные — есть куча проблем, каждая из которых имеет своё state-of-the-art решение и набор алгоритмов, над которыми нужно ломать голову.</p><h2>Почему не LLM, хотя казалось бы</h2><p>Сейчас мы переживаем бум развития нейросетей — генеративные и классифицирующие сети появляются как грибы после дождя. Количество задач, которые они могут решить, тоже кажется неисчислимым: казалось бы — дайте обучающую выборку побольше, и всё получится! Тем более, что примеры использования нейросетей для автоматизации рутины уже можно встретить на каждом шагу: об этом пишут заметки и обзорные статьи на научно-популярных ресурсах, а интеграторы и стартапы предлагают решения по созданию чат-ботов и помощников на основе ИИ, обученного на внутренней документации больших компаний.</p><p>Однако чем сложнее нейросеть, чем глубже степень обучения — тем выше шанс, что она начнёт бредить. Мы все какое-то время назад <a href="https://shedevrum.ai/post/bc5bf060107711eeb9ea06d64eab8f23/">смеялись</a> над шести-семипалыми героями очередных сгенерированных изображений, сейчас посмеиваемся над сгенерированными сетями текстами с описанием несуществующих фильмов и книг, но смешно ли будет нам (а особенно бухгалтерии), если нейросеть начнет галлюцинировать при распознавании платёжных реквизитов или суммы НДС? И чем выше степень развития сетей — тем менее заметными будут становиться такие ошибки.</p><p>В прошлом году на одной из ключевых конференций в области анализа и распознавания документов — ICDAR — учёные традиционно задались вопросом о будущем OCR. И сошлись во мнении, что OCR нисколько не устарела, благополучно развивается и остается наиболее надежным инструментом распознавания. Обеспечить требования консистентности (и ещё всякого такого) информации, извлекаемой из изображения, все равно сможет только старый добрый OCR и прочие детерминированные алгоритмы. И именно их разработкой (и доведением до совершенства) мы и занимаемся.</p><p>Вернёмся к библиотеке <a href="https://smartengines.ru/intelligent-document-recognition/">Smart Document Engine</a>. Как уже говорилось выше, гибкие формы на то и гибкие, что исключительно геометрией на них не обойдёшься — вопрос местонахождения полей решается «на лету». На процесс взаимодействия с библиотекой это влияет в самом конце, на моменте работы с результатом. Перейдем к знакомству с интерфейсом на примере всё того же встраивания в андроид.</p><h2>Встраивание</h2><p>В целом, сценарий работы с библиотекой распознавания документов такой же, как и в <a href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-rf-v-android--powagovoe-rukovodstvo">прошлой статье</a> про распознавание паспорта: создаём движок, формируем настройки сессии, заводим саму сессию и кормим её картинками, после чего работаем с результатом распознавания. В отличие от документов, удостоверяющих личность, гибкие и жесткие формы могут быть многостраничными, с одинаковыми «по смыслу» полями на каждой странице. Помимо этого, часто документы загружают «пакетом», и в этом случае на одном изображении могут быть несколько разных документов. Поэтому результат распознавания устроен сложнее, чем в прошлом примере. Есть «результат распознавания», внутри него лежит набор найденных документов, каждый документ разбивается на «логический» и «физический» набор полей:</p><p>Логическая и физическая части документа разбираются отдельно, так как в некоторых случаях геометрия вообще не нужна (если результат распознавания документа дальше идёт в базу данных):</p><p>Как правило, результат распознавания представляют в виде json-объекта, но для наглядности лучше всего пользоваться html — особенно в случае, когда логические и физические поля имеют больше одного соответствия. Вот простенький генератор html на основе документа:</p><p>В результате получается удобная для взаимодействия html-страничка. Если добавить немного фантазии, то можно сразу сделать форму, в которой можно будет проверять и дополнять неуверенно распознанные поля — очень удобно в случае, если качество изображения плохое или документ плохо пропечатан.</p><p>Конечно, помимо андроида встроить распознавание и организовать удобные представление документа (при необходимости) можно и на любой другой платформе, однако с трендом на создание банковских офисов нового поколения и развития курьерской сети автоматизация ввода документов с помощью средненьких мобильных устройств на Андроиде становятся актуальной задачей.</p><p>На этом мы не заканчиваем, ждите новых статей!</p>]]></content:encoded>
    </item>
    <item>
      <title>Сломал ногу — выучил Python: как ИИ помог экс-консультанту стать программистом за 100 дней</title>
      <link>https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej</link>
      <comments>https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej</guid>
      <description><![CDATA[<p>Экс-консультант стал программистом за 100 дней с помощью ChatGPT и Python — собрал портфолио, прошел собеседование и получил работу без курсов и Leetcode</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/slomal-nogu---vyuchil-python--kak-ii-pomog-eks-konsultantu-stat-programmistom-za-100-dnej">Сломал ногу — выучил Python: как ИИ помог экс-консультанту стать программистом за 100 дней</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 02 Jun 2025 18:09:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Эрик Леннрот, бывший консультант в Big Four, <a href="https://eriklonnroth.com/100-days/">стал программистом</a> всего за 100 дней — благодаря больничному, упорству и ChatGPT.</p><p>Все началось, когда 38-летний Эрик сломал лодыжку во время пробежки. Лежа дома, он увидел в соцсетях истории о том, как люди запускали SaaS-проекты за выходные с помощью ИИ. Это вдохновило его на третью попытку освоить программирование.</p><h2>Учеба без бюджета — только ИИ и бесплатные курсы</h2><p>Эрик решил не тратить ни копейки на курсы. Он выбрал Python как основной язык и прошел CS50 от Гарварда — сначала курс по Python, потом по веб-разработке.</p><p>С ИИ он работал как с личным наставником: писал псевдокод, просил ChatGPT раскритиковать его, затем вручную набирал код. Синтаксис — по запросу. Такой подход позволил быстрее понять концепции, а не просто запомнить команды.</p><p>Свой первый проект он сделал по мотивам Wordle — игру на угадывание слов он реализовал на Python под названием PyWordle.</p><p>Затем собрал полноценное веб-приложение Make My Meal Plan: генерация рецептов, списки покупок, TailwindCSS, Django, PostgreSQL, CI/CD и даже тестирование через Playwright — все своими руками за 150 часов. Проект включал 25 000 строк кода.</p><h2>Работа после 100 дней</h2><p>Через 3 месяца обучения он получил оффер. Без Leetcode, без алгоритмических задач — только благодаря портфолио. Его взяли на испытательный срок в консалтинговую компанию в Лондоне, чтобы он заменил Excel и устаревшие тулзы на автоматизированные пайплайны.</p><p>Эрик честно рассказал, что научился программировать за пару месяцев и активно использовал ИИ — и все равно его приняли.</p><p>По его словам, весь путь стоил $120 — подписки на Claude Pro и Cursor. Все остальное — бесплатные курсы и открытые материалы. Недавно он прошел испытательный срок, получил повышение и теперь работает с геоданными и статистикой, используя pandas и ArcGIS. Параллельно пишет Django-приложение для анализа населения и доходов в Великобритании.</p><h2>«Точно вовремя» вместо «на всякий случай»</h2><p>Эрик считает, что его история — отражение новой реальности: вместо долгих программ и формального образования — самостоятельное обучение под задачи, с фокусом на инициативу и реальные результаты. ИИ в этом — не костыль, а катализатор.</p>]]></content:encoded>
    </item>
    <item>
      <title>AI для frontend: модели для генерации интерфейса</title>
      <link>https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa</link>
      <comments>https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa</guid>
      <description><![CDATA[<p>AI для frontend. Показываем варианты использования ИИ для интерфейса. Рассматриваем преимущества и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ai-dlya-frontend--modeli-dlya-generacii-interfejsa">AI для frontend: модели для генерации интерфейса</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Figma]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Скоро фронтендеры будут говорить: <i>«Сделай интерфейс как у Яндекса, но с нашим брендингом и функционалом из ТЗ»</i> — и получать готовый продукт. Возможно, уже через 11 минут — столько занимает прочтение статьи.</p><p>Если научиться работать с ИИ-моделями, даже начинающий разработчик сможет перепрыгнуть с уровня «кодер кнопок» до «архитектор интерфейсов».</p><p>AI — не замена разработчику, а новый хард-скилл. Те, кто осваивает нейросети, в 10 раз продуктивнее коллег, все еще верстающих каждый элемент вручную.</p><h2>Pixel perfect по запросу: как фронтендеры генерируют интерфейс в 2025 году</h2><p><i>*Дизайнер прислал макет в 23:45. Дедлайн — завтра в 10:00*</i></p><p>Знакомо? Раньше это означало ночь без сна. Но что делают ваши коллеги — просто скармливают макет нейронке и идут спать. Утром правят готовый код и укладываются даже в безумный дедлайн без вреда для здоровья.</p><h3>Что изменилось?</h3><p>AI-генерация интерфейсов становится рабочим инструментом. Можно конвертировать текст и даже рисунок от руки в готовый HTML/CSS/JS код. Без выравнивания пикселей и утомительной верстки однотипных элементов.</p><p>Вы вводите «<i>Создай карточку товара с изображением, названием, ценой и кнопкой “В корзину”</i>» — и получаете код компонента. То, что раньше занимало до 30 минут, теперь можно делать за секунды.</p><h2>3 причины делегировать рутинную работу на ИИ</h2><h3>AI-генерация компонентов</h3><p>Помните, как в 100-й раз писали карусель или модалку? Есть инструменты, которым достаточно описания результата — нейросеть сгенерирует компонент с нуля.</p><p><a href="https://tproger.ru/articles/gajd-po-rabote-s-github-copilot">GitHub Copilot</a>, Anthropic Claude и <a href="https://tproger.ru/flurry/86">AI-плагины для VSCode</a> превращают текстовый запрос в рабочий интерфейс. Причем не просто работающий, а соблюдающий ваши стандарты оформления кода.</p><h3>Адаптив на автопилоте</h3><p>Дебаг мобильной верстки не доставляет удовольствие?</p><p>Можно обратиться к ИИ — нейросеть генерирует базовый интерфейс и сразу продумывает адаптив (если попросить об этом). Вместо десятков медиа-запросов — функция, которая преобразует ваш многоколоночный интерфейс в мобильную версию.</p><h3>Дизайнер с «Глазом Бога»</h3><p><i>«Кажется, кнопка должна быть правее»</i> — нет, ИИ выдает конкретные рекомендации.</p><p>Например:</p><p><i>«При ширине экрана 375px карточки товаров перекрывают друг друга на 12px. Причина: отрицательный margin в классе .product-card, который не учитывает падение грида на мобильных устройствах»</i>.</p><p>ИИ анализирует верстку и сравнивает ее с лучшими практиками UI/UX. Еще нейронка «видит» проблемы, которые не заметны до первых жалоб на баг.</p><h2>Популярные модели и технологии</h2><h3>GPT, Claude и Gemini</h3><p>Нейросети последних версий при четкой постановке задачи сразу пишут хороший код. В 2025 году это относится ко всем популярным моделям.</p><p>О том, как правильно составлять запросы для ИИ, рассказывали в статье «<a href="https://tproger.ru/articles/prodvinutyj-promting-v-chatgpt--20-luchwih-zaprosov-k-nejroseti-dlya-programmista">Продвинутый промтинг в ChatGPT</a>».</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/a79a63d8-acf3-4d6d-9598-81f15bbd327e.png" alt="" /><figcaption>Функция Artifacts в моделях Claude отображает результат выполнения кода</figcaption></figure><p>На качество кода влияет выбор между «тяжелыми» и «легкими» версиями.</p><p>Например, GPT-4o генерирует код лучше, чем Claude 3, но обходится значительно дороже.</p><p>Релизы свежих версий ИИ сопровождаются отчетами с бенчмарками. На 100% доверять этой информации не стоит — если в тестах нейросеть показала хороший результат, не факт, что она эффективна в реальных условиях.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/661b0cad-ac80-43be-8031-9868647298cc.jpg" alt="" /><figcaption>В апреле 2025 года лидирует Gemini 2.5 Pro, GPT o3 и GPT-4o</figcaption></figure><p>Если нужно сравнить несколько моделей, но времени на самостоятельные тесты нет, обратите внимание на <a href="https://huggingface.co/spaces/lmarena-ai/chatbot-arena-leaderboard">Arena Leaderboard</a>. Этот рейтинг имеет хорошую репутацию в профессиональных кругах. Люди делают одинаковые запросы двум нейросетям и сравнивают ответы. Рейтинг формируется на основе оценок от реальных пользователей.</p><h3>GPT-Engineer, Smol Developer</h3><p>Если ChatGPT действует как советчик, то GPT-Engineer и Smol Developer участвуют как полноценные члены команды.</p><p><a href="https://github.com/AntonOsika/gpt-engineer">GPT-Engineer</a> трансформирует текстовое описание в готовый проект. Разработчику достаточно сформулировать задачу — AI создаст структуру проекта с файлами, настроит окружение и сгенерирует код.</p><p><a href="https://github.com/smol-ai/developer">Smol Developer</a> предлагает иной подход — персонального AI-разработчика. С аудиторией более 10,000 пользователей на GitHub, этот инструмент отличается интуитивным интерфейсом и поддержкой E2B SDK.</p><h3>No-code/Low-code платформы</h3><p><a href="https://uizard.io/">Uizard</a> превращает идею в интерактивный прототип быстрее, чем команда дизайнеров набрасывает первые эскизы. За 7 лет инструмент эволюционировал в no-code платформу для создания UI/UX без дизайнерского бэкграунда.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/365d5c33-b4d3-40a5-b5ac-9085cdb10132.png" alt="" /><figcaption>Пример, как Uizard по эскизу создает интерфейс страницы входа</figcaption></figure><p>Ключевые функции:</p><ul><li><b>Автодизайнер 2.0</b> — генерирует многоэкранные интерфейсы по текстовому описанию.</li><li><b>Дизайн по эскизу</b> — сфотографируйте рисунок с салфетки, и Uizard трансформирует его в редактируемый прототип.</li><li><b>Клонирование интерфейсов</b> — загрузите скриншот существующего сайта, и AI превратит его в настраиваемый макет, сохранив структуру и компоновку.</li><li><b>Экспорт в PNG, PDF</b> и генерация AI базового React-кода (требует доработки).</li></ul><p><a href="https://www.locofy.ai/">Locofy</a> пригодится на следующем шаге после создания дизайна — превращении макетов в рабочий код.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/89612cd0-29a4-4737-879c-225cd1f4a7b2.jpg" alt="" /></figure><p>Преимущества:</p><ul><li>Генерация кода для React, Angular, Vue.js и других фреймворков.</li><li>Распознавание кнопки, поля ввода, слайдеры для создания динамического элемента.</li><li>Платформа анализирует дизайн и автоматически добавляет медиа-запросы.</li></ul><p>Связка Uizard + Locofy формирует конвейер от идеи до кода:</p><ol><li>Создание прототипа в Uizard по текстовому описанию или наброску.</li><li>Экспорт в Figma для детальной проработки.</li><li>Преобразование в код через Locofy.</li><li>Доработка и интеграция с бэкендом.</li></ol><p><b>Бесплатные тарифы позволяют оценить возможности платформ, но для полноценного использования в работе потребуется платная подписка — от 12$ в месяц.</b></p><h3>AI-плагины в Figma</h3><p>Фигма преобразилась с появлением AI-плагинов. В <a href="https://www.figma.com/community/development">коллекции</a> десятки дополнений на базе нейросетей.</p><p><a href="https://www.figma.com/ai/">AI Design by Figma</a> — официальный ИИ-помощник для генерации интерфейсов, встроенный прямо в редактор.</p><p>Функционал:</p><ul><li>Создание элементов по текстовому описанию.</li><li>Генерация нескольких вариаций компонентов.</li><li>Трансформация простых фигур в иллюстрации.</li><li>Предложение альтернативных цветовых решений.</li></ul><p>Достаточно выбрать элемент и ввести запрос: «Создай версию этой кнопки для темного режима» — плагин мгновенно предложит новый дизайн, сохраняя пропорции и структуру.</p><p>Режим <b>AutoLayout </b>автоматизирует верстку элементов. Функция анализирует расположение объектов и предлагает наиболее логичную систему компоновки.</p><p>Еще в Фигме есть интеллектуальное определение отступов между элементами, создание адаптивных сеток на основе расположения компонентов, оптимизация приложения для различных разрешений экрана и автоматическое выравнивание элементов интерфейса.</p><h2>Путь от запроса к интерфейсу: этапы работы с AI</h2><h3>Шаг 1: Формулировка промпта</h3><p>Качество сгенерированного интерфейса зависит от точности запроса. ИИ-модели считывают структурированные инструкции лучше, чем набор общих фраз.</p><p>Вместо размытого «Сделай хедер» лучше попросить «Создай адаптивный хедер с логотипом слева, навигационным меню по центру и кнопкой авторизации справа».</p><h3>Шаг 2: Генерация кода</h3><p>ИИ превращает текст в код, анализируя миллиарды строк из репозиториев и документации. Процесс включает:</p><ul><li>Разбор запроса на технические требования.</li><li>Определение структуры компонента/интерфейса.</li><li>Генерацию HTML/JSX элементов.</li><li>Формирование стилей и интерактивных элементов.</li><li>Оптимизацию согласно паттернам.</li></ul><p>Стандартный запрос для генерации компонента пользовательского интерфейса занимает 3-15 секунд.</p><h3>Шаг 3: Визуализация и проверка</h3><p>AI-инструменты позволяют мгновенно увидеть результат без настройки окружения. Ваш запрос трансформируется в код, который тут же визуализируется.</p><p>Варианты визуализации:</p><ul><li>Встроенные рендереры в IDE (VS Code + GitHub Copilot).</li><li>AI-платформы с предпросмотром (V0, Figma Dev Mode).</li><li>Локальные песочницы (CodeSandbox, StackBlitz).</li></ul><h3>Шаг 4: Человеческая доработка — финальный штрих</h3><p>Современный AI генерирует лишь скелет приложения. Оживлять его приходится разработчику.</p><p>Типичные улучшения:</p><ul><li>Добавление проверок на доступность (ARIA-атрибуты).</li><li>Оптимизация производительности (lazy loading).</li><li>Интеграция с реальными данными и API.</li></ul><p>Стоит отметить, что ИИ успешно генерирует компоненты для React-приложения, включая:</p><ul><li>Функциональные компоненты с хуками.</li><li>Context API для хранения состояния.</li><li>Мемоизацию через useMemo/useCallback.</li></ul><p>Генерация для Vue отлично работает с Composition API. ИИ автоматически применяет ref и reactive для состояния, computed для производных значений и методы для обработчиков.</p><p>В процессе создания UI с помощью ИИ не обойтись без проверки качества полученного результата. Тестировать сгенерированное веб-приложение приходится в несколько подходов:</p><ul><li>Визуальный просмотр — проверка соответствия дизайна требованиям и ожиданиям пользователя.</li><li>Кросс-браузерная совместимость — тестирование работы интерфейса в различных браузерах и устройствах.</li><li>Проверка доступности — оценка соответствия стандартам WCAG для обеспечения доступности для всех пользователей.</li><li>Валидация HTML/CSS/JS — использование линтеров и валидаторов для проверки качества кода.</li><li>Юзабилити-тестирование (E2E) — оценка удобства использования интерфейса реальными пользователями.</li></ul><h2>Плюсы и минусы AI для генерации пользовательского интерфейса</h2><h3>Подводные камни</h3><p>— <b>Непонимание бизнес-контекста</b>. ИИ не проводит интервью с пользователями и не знает специфику бизнеса. Результат: функционально корректный интерфейс приложения, но бесполезный для конкретного случая.</p><p>— <b>Шаблонность</b>. ИИ тяготеет к стандартным решениям. Бесполезно пытать нейросеть запросами по типу «нужен уникальный и креативный дизайн». В ответ вы получите очередной шаблон.</p><p>— <b>Усредненный UX вместо продуманного</b>. ИИ ориентируется на паттерны, которыми был обучен. Результат часто напоминает интерфейс из 2021 года без учета новейших трендов в UX.</p><p>— <b>Зависимость от контекста</b>. Чем сложнее и нестандартнее требование, тем выше шанс, что ИИ не справится с задачей.</p><p>— <b>Переоптимизм</b>. Когда люди обращаются к ИИ, то ожидают идеальный результат с первой попытки. К сожалению, так не бывает.</p><p>— <b>Слабая интерактивность</b>. ИИ отлично генерирует статические интерфейсы, но с созданием динамических структур справляется на троечку.</p><h3>Преимущества AI frontend</h3><p>— <b>Быстрое прототипирование</b>. ИИ выдает рабочий код за секунды. Полноценный скелет интерфейса появляется по первому запросу: «Создай страницу профиля пользователя с аватаром, статистикой активности и настройками».</p><p>— <b>Улучшения на ходу</b>. ИИ вносит изменения мгновенно. Разработчик лишь направляет процесс.</p><p>— <b>Поддержка компонентного подхода</b>. ИИ генерирует компоненты, соответствующие архитектурным паттернам.</p><p>— <b>Дизайн-варианты с A/B-тестированием</b>. Тестирование гипотез ускоряется в несколько раз. Запрашивайте несколько вариантов UI без дополнительных затрат.</p><h2>Кейсы и примеры: что реальные разработчики говорят про ИИ</h2><p>Согласно исследованию Cloud.ru, 62% российских IT-специалистов доверяют AI как коллеге. Российские разработчики активно интегрируют ИИ в рабочие процессы — 73% используют его для работы с кодом, а 39% применяют ежедневно.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-04-28/d25fb733-5dd5-4750-ac7f-62f9ad03c05d.jpg" alt="" /><figcaption>Популярность ИИ среди айтишников в зависимости от должности и профессии. Чаще всего к нейросетям обращаются мидлы и джуны</figcaption></figure><blockquote><b>Сегодня AI-сервисы окружают нас повсюду: помогают анализировать информацию, управлять бизнесом, разрабатывать новые программные продукты и просто решать повседневные задачи.</b></blockquote><p><i>Рассмотрим три популярных сценария применения ИИ во frontend-разработке.</i></p><h3>1. Создание панели администратора за 5 минут</h3><p>AI-ассистенты значительно ускоряют разработку типовых интерфейсов. Опишите требуемые функции админ-панели (управление пользователями, статистика, редактирование контента), и нейросеть сгенерирует базовую структуру, HTML-разметку и CSS-стили.</p><h3>2. Быстрое создание дизайна лендинга по описанию продукта</h3><p>ИИ трансформирует текстовое описание продукта в макеты лендингов. Разработчику нужно лишь загрузить информацию о продукте, целевой аудитории и желаемом стиле.</p><h3>3. Адаптация UI под разные разрешения и аудитории</h3><p>Нейросеть упрощает создание адаптивных интерфейсов и персонализацию UX для различных пользовательских сегментов.</p><p>Интересно, что 46% разработчиков отдают предпочтение именно российским AI-сервисам, что говорит о росте доверия к отечественным ИИ-решениям. Еще исследование Cloud.ru выявило, что в 70% вакансий работодатели упоминают навык владения AI-инструментами.</p><h2>Будущее AI во frontend-разработке</h2><p>AI-модели научатся распознавать не только элементы интерфейса, но и закономерности пользовательского поведения. Разработчик будет задавать направление: «Переработай эту форму для увеличения конверсии», а нейросеть проанализирует существующие данные и предложит несколько вариантов решения.</p><p>Финальная стадия эволюции — создание интерфейсов без интерфейса проектирования.</p><p>Вместо визуальных редакторов появятся системы, где разработчик описывает желаемый результат абстрактно, а ИИ выбирает оптимальную реализацию на основе данных о пользователе, устройстве и контексте.</p><p><b>Вопрос не в том, заменит ли ИИ фронтендеров, а в том, заменят ли фронтендеры с ИИ тех, кто продолжает работать по старинке.</b></p><p>Кстати, забрать все самые топовые нейронки для айтишников можно в нашем большом <a href="https://tprg.ru/LN8a">гайде с 70+ ИИ-инструментами</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Топ-5 простых приложений, которые сделали создателей миллионерами — разбираем реальные кейсы</title>
      <link>https://tproger.ru/articles/top-5-prostyh-prilozhenij--kotorye-sdelali-sozdatelej-millionerami---razbiraem-realnye-kejsy</link>
      <comments>https://tproger.ru/articles/top-5-prostyh-prilozhenij--kotorye-sdelali-sozdatelej-millionerami---razbiraem-realnye-kejsy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/top-5-prostyh-prilozhenij--kotorye-sdelali-sozdatelej-millionerami---razbiraem-realnye-kejsy</guid>
      <description><![CDATA[<p>Не обязательно делать Гугл, чтобы заработать миллион долларов. Рассказываем о максимально простых аппах, которые принесли своим разработчикам семизначную прибыль.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/top-5-prostyh-prilozhenij--kotorye-sdelali-sozdatelej-millionerami---razbiraem-realnye-kejsy">Топ-5 простых приложений, которые сделали создателей миллионерами — разбираем реальные кейсы</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Ретро]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[App Store]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Apr 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Такое приложение реально существовало в App Store и Google Play, а сейчас можно скачать аналоги. Идея максимально простая — разыгрывать друзей с помощью смешного звука. Сериал наверняка сделал игрушку популярной, и сейчас в Google Play на одной из игр более 100 000 скачиваний — считайте, реклама + встроенные покупки = миллионы долларов.</p><p>Это  лишь один из многих довольно общих примеров. Но есть уникальные кейсы, как разработчики с крайне простой идеей выпустили приложение и проснулись миллионерами — рассказываем о них в статье.</p><h2>Flappy Bird (олдскулы свело)</h2><p>Кто-то еще помнит эту безумную птичку? В 2013 году она появилась на iOS, а в 2014 — на Android. А разработал ее вьетнамский кодер Донг Нгуен всего за несколько дней. Сам программист заявлял, что всего его игры проходимы, и главное их отличие от сложных западных игрушек — простота, хард-левел и истинное веселье. В общем, те самые ретро-игры.</p><p>Суть, кажется, объяснять не стоит — все и так помнят, что есть пиксельная птичка, которой нельзя упасть или удариться об трубу. Самое же интересное — как в 2013 году к этой в какой-то степени дурацкой игре пришла такая популярность. На самом деле, до сих пор загадка: одни связывают это с роликом PewDiePie (на тот момент у него было уже более 20 млн подписчиков на YouTube, другие — с вирусным эффектом в соцсетях.</p><p>В январе 2014 птичка возглавила топ бесплатных приложений в американском и китайском App Store, а потом — в британском. Игрушку скачали более 50 млн раз, а разработчики <a href="https://www.theverge.com/2014/2/5/5383708/flappy-bird-revenue-50-k-per-day-dong-nguyen-interview">зарабатывали</a> с рекламы $50 000 долларов в сутки!</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-04-16/fee10295-8bfc-4792-b43f-acac0427dc99.png" alt="" /></figure><p>10 февраля 2014 года Нгуен неожиданно удалил Flappy Bird из App Store и Google Play. В интервью Forbes он объяснил это чувством вины: игра, задуманная как легкое развлечение на пару минут, стала для многих «наркотиком». Нгуен говорил, что не мог спать из-за давления популярности и хотел вернуть себе спокойствие. После удаления начался ажиотаж: телефоны с установленной игрой продавались на eBay за тысячи долларов, а рынок заполонили десятки клонов.</p><p>Однако в этом году должно было произойти чудо: в сентябре 2024 компания Gametech Holdings объявила, что готовит перезапуск игры в 2025 — она банально украла права у Нгуена, когда те истекли. Правда, твиттерские было <a href="https://wylsa.com/obnovlyonnuyu-flappy-bird-podozrevayut-v-svyazi-s-kriptoskamerami/">выяснили</a>, что это скам: Gametech связана с другой компанией — 1208 Productions, которая делает игры для Web 3 с NFT. А еще Gametech подписаны на кучу инфоцыганских аккаунтов в Твиттере. Вишня на торте — на <a href="https://flappybird.org/">официальном сайте</a> перезапуска птички лежала демка, один из юзеров ее скачал, и в конце его попросили завести криптокошелек. В общем, птичку не тапаем, на NFT-развод не попадаем.</p><p>Но в Flappy Bird все еще можно поиграть: <a href="https://flappybird.io/">здесь</a> лежит браузерная версия. Честно, феномен птички все еще для нас загадка, но зато это хороший пример, что можно создать абсолютно обычную игру и сделать так, чтобы она сильно завирусилась в сети.</p><h2>BeReal</h2><p>Та самая антисоциальная сеть, которая завирусилась в ТикТоке в 2022 году. Суть и реализация очень простая: приложение раз в день отправляет уведомление, и вы должны быстро сделать селфи — всего за две минуты. Неважно, где вы и что делаете — гуляете с собакой или поете в душе, главное — запостить фотографию в приложение. Никаких фильтров, масок и всего остального. Кстати, просто последить за друзьями нельзя: приложение не даст вам доступ к ленте, пока вы не выложите пост.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-04-16/68382bd8-526f-4adb-9d4d-dd843a7c58d2.png" alt="" /><figcaption>Ну, просто прелесть</figcaption></figure><p>Сейчас у приложения нет монетизации, поэтому все цифры основываются на оценках и капитализации. Последняя сделка по BeReal прошла в июне 2024 года — привлекли более $580 млн.</p><p>Как мы помним, красота и гениальность — в простых вещах. А простые вещи — те, которые происходят с нами каждый день. Считайте, что разработчики сделали миллионное состояние просто на том, что нас окружает.</p><h2>Wordle</h2><p>Это простая браузерная игра, в которой нужно угадать слово из пяти букв за шесть попыток. После каждой попытки игра подсказывает, какие буквы угаданы правильно: зеленым подсвечиваются те, которые стоят на своём месте, желтым — те, которые есть в слове, но стоят не там, и серым — те, которых в слове вообще нет.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-04-16/5fcc6a3c-e281-433e-8772-bee720dd6d6f.png" alt="" /></figure><p>Эту игру придумал программист Джош Уордл в 2021 году как подарок для своей девушки, которая любила словесные головоломки. Он выложил её в интернет просто «для друзей», но очень быстро Wordle стала вирусной. В январе 2022 года игрушку купила The New York Times за небольшую семизначную сумму, то есть где-то за $1-3 млн.</p><p>Технология тоже очень простая: обычная веб-страница, написанная на HTML, CSS и JavaScript. Загружается список слов, одно из них выбирается как «слово дня», и дальше работает простейшая логика — сравнение букв и подсветка.</p><p>Популярность тоже вполне объяснима. Во-первых, игра ужасно простая. Там нет рекламы, регистрации, внутриигровых покупок — просто заходишь и играешь. Во-вторых, можно сыграть только один раз в день, и это ограничение превратилось в фишку — у многих игроков это стало ритуалом. Кстати, в 2022 году wordle был самым частым запросом в Google среди американцев.</p><p>Автор этой статьи тоже обожает Вордл! Это еще и отличный шанс подтянуть свой английский. Если еще не пробовали — оцениваем <a href="https://www.nytimes.com/games/wordle/index.html">здесь</a>.</p><h2>Locket Widget</h2><p>Еще одна до жути простая идея: делаете фото в приложении, и оно появится у ваших друзей на главном экране в виде виджета.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-04-16/400181fc-f7f0-4485-94ad-9aba5c732f61.png" alt="" /></figure><p>Мэтт Мосс запустил Locket Widget в 2022 году — он разработал приложение всего за несколько недель для своей девушки, с которой у них были отношения на расстоянии (опять романтическая история). Сейчас им пользуются десятки миллионов людей по всему миру, а в 2022 году в него <a href="https://www.entrepreneur.com/business-news/what-is-locket-widget-the-new-photo-app-that-won-apple/440226">загрузили</a> более 2 млрд фотографий.</p><p>На пике популярности Мосс с командой привлекли $12,5 млрд инвестиций. Кстати, завирусилось приложение опять благодаря ТикТоку — видео в аккаунте Мосса набирали миллионы просмотров.</p><p>На самом деле подобные приложения, которые выводятся на экран в виде виджетов — настоящая золотая жила. Особенно популярными становятся различные карточки с мотивационными фразами, в общем, забирайте идею (в них можно сделать подписку за шрифты, тематики и визуал).</p><h2>Calm</h2><p>Calm — одно из самых известных приложений для медитации и сна. Его разработали два предпринимателя — Алекс Тью и Майкл Эктон Смит — в 2012 году. Идея была очень простой: помочь людям справляться со стрессом и тревогой с помощью коротких медитаций, приятной музыки. Интерфейс — тоже максимально минималистичный.</p><p>Когда Calm только появилось, никто особо не верил, что такое «спокойное» приложение может выстрелить. Но всё оказалось наоборот: люди устали от шума, соцсетей и перегрузки. Приложение стало настоящим островком тишины — его включали перед сном, в перерывах на работе или просто чтобы немного расслабиться.</p><p>В 2016 году Calm начал активно развиваться и добавлять новые функции, которые сделали его намного популярнее и полезнее для пользователей. Тогда появилась одна из главных фишек — Sleep Stories. Считайте, что это сказки на ночь, только для взрослых работящих людей. А сейчас самая популярная функция в приложении — 10-минутная медитация, которая доступна пользователям всего лишь 24 часа.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-04-16/60cba9e8-f1e4-42e8-9a72-3618c44ba98d.png" alt="" /><figcaption>Новый интерфейс приложения</figcaption></figure><p>Конечно, сейчас приложение разрослось и стало сложнее, но на старте это был очень простой интерфейс с небольшим количеством функций (хотя, наверное, в приложении для медитации именно так и должно быть).</p><p>Уже в 2019 году Calm стал первым «единорогом» в сфере ментального здоровья — его оценили в $1 млрд, а позже — и в $2 млрд. Плюс компания зарабатывает на ежемесячных и пожизненных подписках.</p><p>Как говорится, think different, а все гениальное — просто. Приложение на миллион долларов можно сделать даже за несколько дней, главное — немного удачи, крутая идея и промо.</p><p>Кстати! Забрать все самые топовые нейронки для айтишников можно в нашем <a href="https://tprg.ru/LN8a">большом гайде с 70+ ИИ-инструментами </a></p>]]></content:encoded>
    </item>
    <item>
      <title>Как перевести проект на Laravel: пошаговый план перехода</title>
      <link>https://tproger.ru/articles/kak-perevesti-proekt-na-laravel--powagovyj-plan-perehoda</link>
      <comments>https://tproger.ru/articles/kak-perevesti-proekt-na-laravel--powagovyj-plan-perehoda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-perevesti-proekt-na-laravel--powagovyj-plan-perehoda</guid>
      <description><![CDATA[<p>Как перевести проект на Laravel. Показываем основные преимущества использования Ларавел. Рассматриваем пошаговую инструкцию нюансы переноса ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-perevesti-proekt-na-laravel--powagovyj-plan-perehoda">Как перевести проект на Laravel: пошаговый план перехода</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Laravel]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[DPI]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 30 Mar 2025 09:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда код устаревает, его поддержка превращается в борьбу с хаосом. После пересмотра архитектуры приходит пугающее осознание: нужно переезжать на более современный стек. Однако непонятно, с чего начать.</p><p><i>В этой статье пошагово разберем перенос вашего проекта на Laravel. Вы узнаете, как мигрировать с минимальными рисками для разработки и пользователей.</i></p><h2>Шаг 1. Готовимся к миграции</h2><p>Посмотрите структуру проекта, чтобы выявить слабые места.</p><p>Архитектура далека от идеала, если проект вырос на хаотичных добавлениях новых функций.</p><p>Проанализируйте:</p><ul><li><b>Вид проекта</b>. Ваша разработка — это монолит, модульная система, API, микросервис?</li><li><b>Зависимости</b>. Определите, какие библиотеки использует проект. Совместимы ли они с Laravel?</li><li><b>Базу данных</b>. Если в БД встречаются дубли, отсутствуют ограничения, это нужно исправить заранее.</li></ul><p>В качестве теста на совместимость перепишите небольшую часть на Laravel. Возьмите один простой модуль и посмотрите, насколько это жизнеспособно.</p><h2>Стратегии перехода</h2><p>Выберем стратегию перехода:</p><ul><li>Big Bang,</li><li>Поэтапный перенос.</li></ul><p><b>Стратегия Big Bang</b> — это полная остановка текущего проекта и создание новой версии на Ларавел с нуля.</p><p>Подход идеален для устаревших и запутанных систем.</p><p>Из минусов — высокие риски. Во время разработки текущая версия может растерять пользователей. К тому же сроки реализации могут затянуться.</p><p><b>Стратегия с постепенным переходом</b> выглядит надежнее.</p><p>Система продолжает работать, а вы поэтапно меняете ее «под капотом».</p><p>Единственный нюанс — готовьтесь к сложностям поддержки, когда часть системы заработает в новой архитектуре, а часть останется в старой.</p><h4>Выбор подхода зависит от проекта</h4><p>Если систему легко поддерживать, то более безопасен постепенный переход.</p><p>Проект напоминает спагетти-код? Плохие новости — Big Bang неизбежен.</p><h2>Шаг 2. Разворачиваем новое окружение на Laravel</h2><p>Чтобы установить фреймворк, выполните команду:</p><p>Прежде чем работать с кодом, настроим окружение.</p><p>В корне проекта для этого есть файл конфигурации .env:</p><ul><li><b>APP_NAME</b>: имя приложения, чтобы оно отображалось в логах и заголовках.</li><li><b>APP_URL</b>: адрес, на котором приложение будет доступно (например, http://localhost).</li></ul><p>В будущем запланирована интеграция с существующей базой, поэтому лучше сразу настроить подключение.</p><h3>Подключение БД</h3><p>Laravel использует <b>Eloquent ORM</b> для взаимодействия с базой.</p><p>Настройка БД выполняется в том же разделе .env:</p><p>Для тестирования подключения запустите команду:</p><h2>Настройка маршрутов</h2><p>Маршруты изначально хранятся в файлах <i>routes/web.php</i> (для страниц) или <i>routes/api.php</i> (для <a href="https://tproger.ru/translations/luchshie-praktiki-razrabotki-rest-api-20-sovetov">REST API</a>).</p><p>В качестве примера добавим базовый маршрут приветствия:</p><p>Если у вас проект с десятками пользовательских маршрутов, интегрируйте их постепенно.</p><h2>Шаг 3. Переносим модели данных и бизнес-логики</h2><p>Eloquent ORM работает с классами, представляющими таблицы в базе данных.</p><p>Чтобы перенести существующую таблицу, нужно создать <b>модель</b>:</p><p>Этот класс автоматически подключается к таблице с именем products.</p><p>Когда название таблицы не соответствует модели, это можно указать явно:</p><p>Если в таблице есть нестандартные поля (например, столбцы с именами вроде created_time вместо created_at), их тоже можно легко обработать:</p><h2>Переносим схему БД</h2><p>Laravel использует механизм <b>миграций </b>для управления таблицами в базе и <b>сиды </b>для внесения данных.</p><p>Перенос структуры БД выполняется командой:</p><p>Миграция создается в папке <i>database/migrations</i>.</p><h3>Переносим данные</h3><p>Если текущая БД уже содержит данные, их можно перенести через <b>сиды</b>: файлы, которые заполняют таблицы данными.</p><p>Создаем сид:</p><p>Внутри метода run описываем данные:</p><h3>Переводим бизнес-логику в сервисы и фасады</h3><p>Старый проект состоит из функционала, размазанного по контроллерам? Улучшим структуру и сделаем код независимым. С этим помогут сервисы и фасады.</p><p><b>Сервисы </b>— это классы, которые объединяют бизнес-логику в одном месте.</p><p>Например, если проект выполняет расчеты цен и скидок, можно создать класс:</p><p>В этом классе описана бизнес-логика:</p><p>Теперь сервис можно вызывать в контроллерах и моделях.</p><p><b>Фасады </b>— это статический интерфейс к сервисам, который делает вызовы более читаемыми.</p><p>Например:</p><p>С фасадом вызов становится простым:</p><h2>Шаг 4. Перенос маршрутов и контроллеров</h2><p>Начнем с <b>маршрутов</b>. Они определяют, как пользователи будут взаимодействовать с приложением.</p><p>Если в старом проекте использовались API-запросы для работы с внешними сервисами или мобильными приложениями, перенесем их в <i>api.php</i> и добавим префикс api для маршрутов:</p><p>Теперь про <b>контроллеры</b>. Они отвечают за логику обработки запросов и взаимодействие с моделями. В Laravel контроллеры работают по правилам <b>MVC </b>(Model-View-Controller).</p><p>Пример обычного метода контроллера:</p><p>Laravel определяет маршруты групповыми методами — по префиксам, middleware или зонам авторизации.</p><p><b>Middleware </b>— это посредники, которые обрабатывают запросы до их поступления в приложение.</p><p>Навесим middleware на маршруты, требующие авторизации пользователя:</p><p><b>Политики </b>контролируют доступ к определенным ресурсам, например, правку или удаление записей.</p><p>Пример метода политики:</p><p>Политики можно подключать к маршрутам или напрямую вызывать в контроллерах.</p><h2>Шаг 5. Перенос фронтенда и представлений</h2><p>Если ваш старый проект использует обычные HTML-файлы, они легко преобразуются в Blade.</p><p><b>Blade </b>— это встроенный механизм шаблонов. С его помощью создают пользовательские интерфейсы.</p><p>Например, перенесем главную страницу сайта:</p><p>Blade-версия:</p><p>Теперь можно динамически передавать данные из контроллера:</p><p>Blade поддерживает механизм наследования, который упрощает работу с повторяющимися частями интерфейса.</p><h3>Интегрируем Vue.js или React</h3><p>Vue.js/React подключают, когда нужен динамичный и интерактивный интерфейс. Например, для <a href="https://tproger.ru/articles/ssr-ili-spa-veb-sajty-chto-vybrat-dlya-vas-i-vawego-biznesa">SPA</a>, реалтайм-функционала, сложных форм или фильтров.</p><p>Blade и JavaScript можно комбинировать: используйте Blade для рендеринга начального интерфейса и Vue.js/React для обработки интерактива.</p><h3>Динамический интерфейс без JS</h3><p><b>Livewire </b>— это инструмент для создания интерфейсов без необходимости обращаться к внешним библиотекам JavaScript. Преимущество в том, что весь код пишется на PHP.</p><p>Livewire пригодится для динамических форм, фильтрации таблиц, уведомлений. Он упрощает код, сохраняя гибкость.</p><h2>Шаг 6. Оптимизируем и тестируем проект</h2><p>Отправная точка улучшения производительности — работа с Blade-шаблонами. Laravel сам их оптимизирует, но есть практики по дополнительному ускорению:</p><ul><li><b>Минимизация логики в представлении</b>. Злоупотребление PHP внутри Blade замедляет рендеринг страниц. Вместо описания сложной логики в шаблонах ее лучше перенести в контроллер.</li><li><b>Кэширование шаблонов</b>. Работу приложения можно ускорить за счет запуска кэширования всех шаблонов, сокращая время компиляции — «<i>php artisan view:cache</i>».</li><li><b>Переиспользование</b>. Если фронтенд состоит из повторяющихся фрагментов, рекомендуется использовать Blade-компоненты.</li></ul><p>В приложениях SPA оптимизируем фрагменты JavaScript.</p><p><b>Laravel Mix</b> генерирует минифицированные CSS и JS. Проверьте размер этих файлов в папке <i>public/js</i>. Если их вес больше 1 МБ:</p><ul><li>Удалите лишние пакеты.</li><li>Используйте динамическую загрузку маршрутов или компонентов.</li></ul><p>Для Vue можно использовать динамическую загрузку, чтобы не грузить весь фронтенд сразу:</p><h3>Тестирование</h3><p>Убедимся, что приложение работает корректно.</p><p>Проверим, например, что страница приветствия открывается и показывает нужный текст:</p><p>Если используете Vue.js или React, для проверки компонентов применяйте <b>Jest </b>или <b>Mocha</b>.</p><p>Тест, который проверяет, что компонент отобразил нужный текст:</p><p>Если приложение работает с API:</p><p>Для проверки приложения под нагрузкой можно использовать <b>Artillery </b>или <b>JMeter</b>.</p><h2>Шаг 7. Разворачиваем и запускаем проект</h2><p>Перенесли данные, создали маршруты и контроллеры, внедрили представления, оптимизировали приложение и протестировали его. Остался последний шаг — развернуть проект на сервере и запустить его.</p><p>Выбор сервера зависит от предпочтений и нагрузок:</p><ul><li>Если важна скорость и масштабируемость, выбирайте <a href="https://tproger.ru/articles/video-osnovy-nginx-dlja-nachinajushhih-za-200-sekund">Nginx</a>. Он быстрее работает под высокой нагрузкой.</li><li>Если важен простой подход, используйте <a href="https://tproger.ru/video/video-osnovy-apache-kafka">Apache</a>. Он интегрируется с большинством систем.</li></ul><p>Фоновые задачи можно связать с <b>Supervisor</b>. Инструмент автоматически запускает воркеров при сбоях, обеспечивая бесперебойную обработку задач.</p><h3>Автоматизация развертывания</h3><p>Чтобы релиз прошел безболезненно, нужен рабочий процесс CI/CD. Например, в <a href="https://tproger.ru/articles/integraciya-ci-cd-processov-s-ispolzovaniem-github-actions">GitHub Actions</a> можно настроить сценарий, который:</p><ol><li>Проверит качество кода.</li><li>Установит зависимости.</li><li>Выполнит миграции.</li><li>Зальет проект на сервер.</li></ol><p>Предусмотрите откат, например, через <b>Spatie Laravel Backup</b>. Если что-то пойдет не так, у вас должна быть возможность вернуть предыдущую версию.</p><p>Инструмент <b>Sentry </b>поможет отслеживать ошибки, а <b>New Relic</b> — оценивать производительность.</p><h2>Заключение</h2><p>Устаревшие проекты уникальны, к каждому нужно искать индивидуальный подход. Надеемся, что пошаговое руководство станет основой для миграции вашего legacy-приложения на Laravel без переписывания кода с нуля.</p>]]></content:encoded>
    </item>
    <item>
      <title>15 вопросов с собеседований по фронтенду для мидлов</title>
      <link>https://tproger.ru/articles/15-voprosov-s-sobesedovanij-po-frontendu-dlya-midlov</link>
      <comments>https://tproger.ru/articles/15-voprosov-s-sobesedovanij-po-frontendu-dlya-midlov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/15-voprosov-s-sobesedovanij-po-frontendu-dlya-midlov</guid>
      <description><![CDATA[<p>Пов: вы пришли на собес на мидла. В статье — ищите вопросы и пытайтесь ответить сначала сами. Если не получается — ответы и решения тоже есть.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/15-voprosov-s-sobesedovanij-po-frontendu-dlya-midlov">15 вопросов с собеседований по фронтенду для мидлов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Safari]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 26 Mar 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Статей в духе «вопросы для фронтенд разработчика написано много». Опыт Альберта Халимова в прохождении и проведении собеседований показывает, что, задавая базовые вопросы, интервьюер хочет узнать, готовился ли человек и насколько он заинтересован в работе.</p><p>На типичные вопросы Junior-разработчик должен легко ответить. Вместе с <a href="https://h.careers/curators/albert-khalimov">Альбертом Халимовым</a>, TeamLead Frontend Developer в Группе М.Видео-Эльдорадо и ментором <a href="https://h.careers/skills?utm_source=site_tproger&amp;utm_medium=article">Эйч Навыки</a>, разбираемся в тех же вопросах, но смотрим на них под другим углом и узнаем самое главное — готовы ли быть мидлом.</p><h2>1. Что такое оператор typeof?</h2><p>Вызов typeof x возвращает строку с именем типа:</p><h2>2.     Что вернет typeof null, typeof new Date, typeof alert?</h2><p>Date — это встроенный объект, который содержит дату и время, а также предоставляет методы управления ими.</p><p>Результатом вызова typeof null является "object". Это официально признанная ошибка в typeof, берущая начало еще со времен создания JavaScript и сохраненная для совместимости. Конечно, null — не объект. Это специальное значение с отдельным типом.</p><p>Вызов typeof alert возвращает "function", потому что alert — функция. Функции относятся к объектному типу. Но typeof обрабатывает их особым образом, возвращая "function". Так тоже повелось с момента создания JavaScript. Формально это неверно, но может быть удобным на практике.</p><p>Интересный факт: информация об операторе typeof — это последний пункт главы «Типы данных» на <a href="https://learn.javascript.ru/">https://learn.javascript.ru/</a>.</p><h2>3. Что такое NaN? Какого типа это значение? Как можно узнать, равно ли значение переменной NaN?</h2><p>NaN расшифровывается как "Not A Number", это "false" (ложное) значение. Будьте аккуратны: выражение typeof NaN возвращает тип Number. Чтобы проверить значение переменной на соответствие NaN, нужно воспользоваться встроенным методом isNaN() или оператором тройного равенства ===.</p><h2>4. Какие есть способы объявления функций? В чем их отличия? Что такое стрелочная функция?</h2><p>Ниже рассмотрим ключевые отличия Function Declaration от Function Expression.</p><p>Во-первых, синтаксис: Function Declaration — функция объявляется отдельной конструкцией function… в основном потоке кода.</p><p>Function Expression — функция, созданная внутри другого выражения или синтаксической конструкции. В данном случае функция создается в правой части «выражения присваивания» =:</p><p>Более тонкое отличие появляется тогда, когда функция создаётся движком JavaScript. Так, Function Expression появляется в то время, как выполнение доходит до него, и затем уже может использоваться.</p><p>После того, как поток выполнения достигнет правой части выражения присваивания let sum = function…, функция считается созданной и может быть использована (присвоена переменной, вызвана и т.д. ).</p><p>С Function Declaration всё иначе. Она может быть вызвана раньше, чем объявлена. Другими словами, когда движок JavaScript готовится выполнять скрипт или блок кода, прежде всего, он ищет в нём Function Declaration и создаёт все такие функции. Можно считать этот процесс «стадией инициализации».</p><p>Только после того, как все объявления Function Declaration будут обработаны, продолжится выполнение. В результате функции, созданные как Function Declaration, могут быть вызваны раньше своих определений.</p><p>Например, будет работать так:</p><p>Функция sayHi была создана, когда движок JavaScript подготавливал скрипт к выполнению, и такая функция видна повсюду в этом скрипте.</p><p>Если бы это было Function Expression, то такой код вызвал бы ошибку:</p><p>Функции, объявленные при помощи Function Expression, создаются тогда, когда выполнение доходит до них. Это случится только на строке, помеченной звёздочкой (*). Слишком поздно.</p><p>Ещё одна важная особенность Function Declaration заключается в её блочной области видимости.</p><p>В строгом режиме, когда Function Declaration находится в блоке {...}, функция доступна везде внутри блока, но не снаружи.</p><p>Для примера давайте представим, что нам нужно объявить функцию welcome() в зависимости от значения переменной age, которое мы получим во время выполнения кода. И затем запланируем использовать её когда-нибудь в будущем.</p><p>Если мы попробуем использовать Function Declaration, это не заработает так, как задумывалось:</p><p>Это произошло, так как объявление Function Declaration видно только внутри блока кода, в котором располагается.</p><p>Вот ещё один пример:</p><p>Что можно сделать, чтобы welcome была видна снаружи if? Верным подходом будет воспользоваться функцией, объявленной при помощи Function Expression, и присвоить значение welcome переменной, объявленной снаружи if, что обеспечит нам нужную видимость.</p><p>Такой код заработает, как ожидалось:</p><p>Или мы могли бы упростить это ещё сильнее, используя условный оператор:</p><p>Так когда использовать Function Declaration, а когда Function Expression?</p><p>Как правило, если нам понадобилась функция, нужно рассматривать синтаксис Function Declaration, который мы использовали до этого. Он даёт больше свободы в том, как мы можем организовывать код. Функции, объявленные таким образом, можно вызывать до их объявления.</p><p>Также функции вида function f(…) {…} чуть более заметны в коде, чем let f = function(…) {…}. Function Declaration легче «ловятся глазами».</p><p>…Но если Function Declaration нам не подходит по какой-то причине или нам нужно условное объявление (мы рассмотрели это в примере выше), то следует использовать Function Expression.</p><h2>5. Что такое функции высшего порядка? Приведите примеры.</h2><p>Функции высшего порядка — это функции, которые могут:</p><ol><li>Принимать функции в качестве аргументов.</li><li>Возвращать функции как результат своей работы.</li></ol><p>Вот встроенные функции высшего порядка в JavaScript:</p><ul><li>map() — применяет функцию ко всем элементам массива.</li><li>filter() — фильтрует элементы массива на основе условия.</li><li>reduce() — сводит массив к одному значению, применяя функцию.</li></ul><h2>6. Что такое Promise и какие бывают состояния?</h2><p>Promise — объект в JavaScript, который представляет результат асинхронной операции. Промис позволяет обрабатывать результат операции, когда он станет доступным, вместо того, чтобы блокировать выполнение кода и ожидать завершения операции.</p><p>Промис может находиться в одном из трех состояний:</p><ul><li><b>Pending</b> — исходное состояние промиса. Он находится в ожидании выполнения или отклонения операции.</li><li><b>Fulfilled</b> — промис переходит в это состояние, когда операция успешно завершается.</li><li><b>Rejected</b> — промис переходит в это состояние, когда операция завершается с ошибкой. Здесь промис возвращает причину ошибки.</li></ul><p>Пример:</p><h2>7.     Как сравнивать в JS? Как сравнить два массива?</h2><p>Когда вы сравниваете примитивные типы (числа, строки, булевы значения и т.д.), используются операторы == (нестрогое сравнение) и === (строгое сравнение).</p><p>==  проверяет равенство значений после приведения типов.</p><p>=== проверяет как равенство значений, так и типов (без приведения типов).</p><p>При сравнении массивов в JavaScript важно помнить, что массивы — это объекты, и сравнение происходит по ссылке. То есть два массива будут равны только в том случае, если они указывают на одну и ту же ссылку в памяти.</p><p>Можно преобразовать массивы в строки JSON и сравнить их. Это удобный способ, но он имеет несколько ограничений (например, порядок элементов в массиве имеет значение).</p><p>Для более точного сравнения массивов (в том числе с вложенными структурами) можно пройтись по каждому элементу массива с помощью цикла for или методов every/some.</p><h2>8.     Чем отличаются any, unknown и never?</h2><p>Основные различия:</p><ul><li>any: можно присваивать любые значения, без проверки типа.</li><li>unknown: можно присваивать любые значения, но необходимо проверять тип перед использованием.</li><li>never: тип для значений, которые не могут существовать, например, функции, которые не возвращают ничего.</li></ul><h2>9.     Что такое CORS и как его можно решить на фронтенде?</h2><p>CORS — механизм безопасности, который предотвращает доступ к данным с других источников. Чтобы решить проблемы с CORS:</p><ul><li>На фронтенде можно использовать прокси-серверы для разработки.</li><li>В продакшн-окружении необходимо настроить CORS на сервере.</li><li>Если вы не контролируете сервер, то решением будет обращение к разработчикам API или использование серверного прокси для обхода ограничений.</li></ul><h2>10.  Что такое Progressive Web Apps (PWA)? Зачем нужно?</h2><p>Progressive Web Apps (PWA) — тип веб-приложений, который использует современные веб-технологии для предоставления пользователям опыта, схожего с нативными мобильными приложениями, но через обычный веб-браузер. PWA можно использовать в любом браузере, который поддерживает стандарты веба. Такие приложения могут работать оффлайн, присылать пуши, быстро загружаться и подстраиваться под любой браузер, который поддерживает эти фичи. Из примеров — банковские веб-приложения, которые можно установить на экран.</p><p>Вот главные особенности PWA:</p><ul><li><b>Работа в оффлайн-режиме (Offline-first). </b>PWA используют Service Workers, которые позволяют веб-приложению работать даже без интернета. Это значит, что приложение может кешировать данные и ресурсы, обеспечивая доступность контента в оффлайн-режиме или при плохом интернет-соединении.</li><li><b>Установка на устройство (Installable).</b> PWA можно устанавливать на устройства как нативные приложения. При этом скачивать их из магазина пользователю не нужно.</li><li><b>Push-уведомления.</b> PWA могут отправлять push-уведомления — так пользователь может получать информацию, даже если приложение закрыто.</li><li><b>Обновления.</b> Приложения могут автоматически обновляться в фоновом режиме.</li><li><b>Мгновенная загрузка.</b> PWA загружаются быстрее, так как они используют кэширование ресурсов и данных через Service Workers — это улучшает производительность даже при медленном интернете.</li><li><b>Универсальность.</b> PWA работают на всех платформах (мобильные устройства, десктопы, планшеты) и в любых браузерах, которые поддерживают современные веб-стандарты (например, Chrome, Firefox, Safari, Edge и т.д.).</li></ul><h2>11.  Lifecycle во Vue: когда использовать хуки жизненного цикла?</h2><p>В Vue 2 жизненный цикл выглядит следующим образом:</p><p>beforeCreate → created → beforeMount → mounted → beforeUpdate → updated → beforeDestroy → Destroyed</p><p>В Vue 3 жизненный цикл был немного изменен и улучшен. Некоторые хуки переименованы:</p><p>beforeDestroy → beforeUnmount</p><p>destroyed → unmounted</p><p>Кроме того, в Vue 3 появилась возможность использовать Composition API, который предоставляет более гибкий способ организации жизненного цикла компонентов. Теперь можно создавать компоненты с помощью функции setup().</p><p>Когда использовать хуки жизненного цикла?</p><ul><li>beforeCreate и created используются для настройки данных, свойств или методов компонента до и после его создания.</li><li>beforeMount и mounted полезны для операций, которые необходимо выполнить при рендере компонента (например, вызов API, настройка сторонних библиотек, или выполнение начальной логики).</li><li>beforeUpdate и updated можно использовать для наблюдения за изменениями данных или для манипуляций с DOM до или после его обновления.</li><li>beforeDestroy и destroyed (или beforeUnmount и unmounted в Vue 3) полезны для очистки ресурсов перед уничтожением компонента.</li></ul><h2>12.  В каком компоненте отработает mounted вначале — дочернем или родительском?</h2><p>В Vue.js хук mounted вызывается для компонента, как только его DOM вставляется в дерево DOM. Когда компонент — часть иерархии (например, родительский и дочерний компоненты), хуки жизненного цикла выполняются в определенном порядке.</p><p>Хук mounted будет вызван для дочернего компонента перед родительским.</p><p>Объяснение: родительский компонент инициирует рендеринг и монтирование дочернего компонента. Когда Vue монтирует компоненты, он сначала монтирует все дочерние компоненты, а потом родительский компонент. Это связано с тем, что родительский компонент ждет завершения монтирования дочерних компонентов, чтобы их правильно вставить в DOM.</p><h2>13.  Как изменить commit message</h2><h4>1. Изменить последний коммит</h4><p>Если нужно изменить сообщение только последнего коммита, используйте команду:</p><p>git commit --amend</p><p>После этого Git откроет редактор, где вы сможете изменить сообщение коммита. Сохраните изменения и выйдите из редактора.</p><h4>2. Изменить старый коммит</h4><p>Если нужно изменить сообщение не последнего коммита, а более старого, можно воспользоваться rebase:</p><p>git rebase -i &lt;commit_id&gt;</p><p>Здесь &lt;commit_id&gt; — идентификатор коммита, сообщение которого вы хотите изменить. Можно использовать git log для получения ID нужного коммита. В открывшемся файле замените слово pick на reword напротив коммита, который хотите изменить, и сохраните файл. Git откроет редактор для изменения сообщения этого коммита. После редактирования сохраните и выйдите.</p><p>Завершите процесс rebase:</p><p>git rebase --continue</p><h4>3. Изменить сообщение в уже отправленном коммите (Push)</h4><p>Если коммит был уже отправлен в удаленный репозиторий, а вы хотите изменить сообщение коммита, то вам нужно будет форсировать пуш.</p><p>Измените коммит с помощью git commit --amend или git rebase -i.</p><p>После изменения выполните принудительный пуш:</p><p>git push --force</p><p>Пожалуйста, перед собеседованием повторите CSS. Многие разработчики усиленно готовятся к технической сессии по JS, TS, своему фреймворку, но забывают о верстке. Если вам повезет работать над новым продуктом, то верстка будет занимать больше половины времени.</p><h2>14.  Что такое псевдоклассы в CSS? Как обратиться к псевдоклассу в JS?</h2><p>Псевдоклассы в CSS — стили, которые применяются  к элементам в зависимости от их состояния или структуры в документе.</p><p>В JavaScript нельзя напрямую изменить псевдоклассы, но можно использовать селекторы CSS для выбора элементов с псевдоклассами. Это делается с помощью методов по типу querySelector и querySelectorAll.</p><h2>15.  Что такое dvh, lvh, em и rem в CSS? Когда и почему лучше использовать каждую из этих единиц измерения?</h2><p>Эти единицы были введены в спецификации CSS, чтобы улучшить работу с адаптивным дизайном и обеспечить корректное отображение на мобильных устройствах.</p><ul><li>dvh (dynamic viewport height) — единица измерения, которая учитывает динамические изменения в размерах окна, например, высота при открытии клавиатуры на мобильных устройствах.</li><li>lvh (large viewport height) — единица измерения, которая использует максимальную высоту вьюпорта, независимо от динамических изменений (например, не учитывает изменения, связанные с клавиатурой на мобильных устройствах).</li></ul><p>Когда использовать:</p><ul><li>dvh полезен, когда нужно учитывать изменения размера окна при взаимодействии с мобильными устройствами (например, при открытии клавиатуры).</li><li>lvh полезен для работы с мобильными устройствами, когда нужно обеспечить стабильный дизайн, не зависящий от изменения высоты вьюпорта из-за динамических изменений.</li><li>em — это единица измерения, которая зависит от размера шрифта родительского элемента. 1em равен текущему размеру шрифта родительского элемента. Если в родительском элементе установлен шрифт размером 16px, то 1em будет равен 16px.</li><li>rem — это единица измерения, которая зависит от размера шрифта корневого элемента (&lt;html&gt;). 1rem равен размеру шрифта, установленному на корневом элементе (по умолчанию в большинстве браузеров это 16px).</li></ul><p>Когда и зачем использовать каждую из этих единиц?</p><ul><li>dvh/lvh: Используйте, если вам нужно учитывать динамическое изменение высоты вьюпорта (например, на мобильных устройствах при открытии клавиатуры) или если вам нужно работать с максимальной высотой вьюпорта, независимо от динамических изменений.</li><li>em: Используйте, когда размеры элементов должны зависеть от размера шрифта родительского элемента. Это полезно для создания гибких и адаптивных макетов, которые изменяются с размером шрифта.</li><li>rem: Используйте, когда нужно, чтобы размеры были относительно размера шрифта корневого элемента. Так проще поддерживать единообразие и легко масштабировать весь интерфейс.</li></ul><p>Если вы знали ответы на все вопросы, поздравляем — можете гордо считать себя мидлом и смело ходить на собеседования. Если в каких-то вопросах плаваете, то подучите теорию и порешайте побольше задачек/почитайте код других разработчиков — тогда все получится.</p>]]></content:encoded>
    </item>
    <item>
      <title>Grokаем виджеты: пишем код с Grok 3 от Маска</title>
      <link>https://tproger.ru/articles/grokaem-vidzhety--piwem-kod-s-grok-3-ot-maska</link>
      <comments>https://tproger.ru/articles/grokaem-vidzhety--piwem-kod-s-grok-3-ot-maska?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Виктория Эберт]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/grokaem-vidzhety--piwem-kod-s-grok-3-ot-maska</guid>
      <description><![CDATA[<p>Тестируем возможности нейросети Grok 3 от Илона Маска для кодинга: генерируем веб-виджеты, сравниваем с ChatGPT и DeepSeek, разбираем плюсы и минусы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/grokaem-vidzhety--piwem-kod-s-grok-3-ot-maska">Grokаем виджеты: пишем код с Grok 3 от Маска</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Визуализация]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[DPI]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Mar 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Grok 3 — новый ИИ от компании xAI, основанной Илоном Маском. Его запустили в тестовом режиме 19 февраля, и он уже наделал шуму в соцсетях. Маск <a href="https://www.theverge.com/news/614218/elon-musk-xai-big-brain-reasoning-grok-3">заявил</a>, что эта модель ищет правду, даже если та противоречит общепринятым нормам и политкорректности.</p><p>По отзывам, Grok хорошо генерирует текст и даже может создавать изображения, используя образы известных личностей. Но есть нюанс: с цензурой у него как-то не задалось. Спустя пару дней после релиза пользователь X* @LinusEkenstam <a href="https://x.com/LinusEkenstam/status/1893832876581380280">рассказал</a>, что
нейросеть выдала ему инструкцию по созданию химического оружия. Такую подробную, что даже в Breaking Bad бы позавидовали. Grok 3 не только составил пошаговый гайд и список для шопинга, но и с трогательной заботой напомнил про респиратор — дескать, безопасность превыше всего. Это в очередной раз вызвало шквал вопросов по поводу мер безопасности в компаниях техномагната.</p><p>Но какие возможности предоставляет Grok и так ли он хорош? Разберемся далее.</p><p>*Запрещен на территории РФ</p><h2>Возможности Grok 3: код</h2><p>В официальном <a href="https://x.ai/blog/grok-3">блогпосте</a> xAI говорится, что Grok 3 хорошо проявил себя в генерации кода. На тесте <b>LiveCodeBench </b>Grok 3 (Think) достиг 79,4% успеха, а Grok 3 mini показал ещё более лучший результат, набрав 80,4%. Grok 3 оснащен режимами размышлений и глубокого исследования, а также встроенным интерпретатором для исполнения кода.</p><p>На Reddit <a href="https://www.reddit.com/r/ChatGPTCoding/comments/1isrf9w/how_good_is_grok_3_at_coding/">обсуждают</a> его слабые и сильные стороны в кодинге: <a href="https://www.reddit.com/r/ChatGPTCoding/comments/1isrf9w/comment/mdj1g8e/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">некоторые</a> хвалят работу с нишевыми библиотеками на Rust, но многие критикуют модель за не самые выдающиеся результаты. Один пользователь <a href="https://www.reddit.com/r/ChatGPTCoding/comments/1isrf9w/comment/med0f86/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">отметил</a>, что хоть Grok 3 и не дотягивает до Claude Sonnet 3.5, для некоторых задач он всё-таки лучше.</p><blockquote>«Пока, судя по всему, не очень хорошо»</blockquote><blockquote>«Ерунда»</blockquote><blockquote>«Пользуюсь им уже 7 дней, и он УЖАСЕН!»</blockquote><h2>Возможности Grok 3: доступ</h2><p>20 февраля доступ к Grok 3 <a href="https://x.com/xai/status/1892400129719611567">стал бесплатным</a> на неопределенное время (<i>«пока наши серверы не расплавятся»</i>). Нейросеть доступна на <a href="http://grok.com/">grok.com</a>.</p><p>После бесплатного тестирования придётся выложить $30/месяц или $300/год за SuperGrok. Для платных юзеров — плюшки в виде <a href="https://www.techradar.com/computing/artificial-intelligence/grok-3s-voice-mode-is-unhinged-and-thats-the-point">голосового режима</a> и дополнительных запросов к «думающей» модели.</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/0afb5872-e94e-4a40-89ca-5a5005b6edda.png" alt="Grok 3 для кодинга" /><figcaption>Описание платной подписки SuperGrok</figcaption></figure><p>С доступом и базовыми возможностями разобрались. Перейдем к самому сладкому. Попробуем сгенерировать простые виджеты с помощью модели и сравнить их с результатами ChatGPT и DeepSeek.</p><h2>Генерируем простые виджеты</h2><h3>Pomodoro-таймер</h3><p>Cоздадим простой Pomodoro-таймер с классическим циклом: 25 минут работы и 5 минут отдыха. Логику и дизайн зададим в промпте:</p><p>Создай минималистичный виджет Pomodoro-таймера, который можно было бы вставить в Notion через embed (iframe). Таймер должен иметь классический режим (25 минут работы и 5 минут отдыха). <br /><br />Используй градиенты с фиолетовыми, розовыми и голубыми оттенками на белом фоне, с закругленными углами и полупрозрачными элементами. <br /><br />Виджет должен показывать, сколько времени пользователь проработал за день (например, 'Вы сегодня фокусировались 2 часа 15 минут'). Если таймер не запускался, то надпись не показывать. Таймер должен сбрасываться каждый день.<br /><br />Интерфейсу необходимо иметь кнопки управления (старт и сброс). <br />Добавь также 10 мотивирующих надписей на русском языке, которые будут меняться каждые 5 минут после нажатия кнопки старт.</p><p>Grok сгенерировал код для виджета, используя HTML, CSS и JavaScript:</p><p>Также можно протестировать таймер прямо внутри интерфейса языковой модели:</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/84a4d7e2-4c72-45b7-a4bf-829a1bf75c79.png" alt="" /><figcaption>Смотрим виджет на встроенном интерпретаторе</figcaption></figure><p>Код был сопровожден инструкцией, как задеплоить виджет:</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/5367a89a-673f-4373-8394-88dd5def67e9.png" alt="Grok 3 для написания кода" /><figcaption>Инструкция к коду от Grok 3</figcaption></figure><p>В одной из тестовых генераций Grok заботливо предупредил, что при перезагрузке страницы данные о предыдущих таймерах будут утеряны, и предложил решение:</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/acd1d7c4-9fc1-450e-9c7e-7110572b86fc.png" alt="Grok 3 для кодинга" /><figcaption>Grok 3 подумал о логике работы виджета (но не о всей)</figcaption></figure><p>Однако код не был сопровождён комментариями. Но можно попросить добавить следующей итерацией:</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/f709a76d-d3d5-4b3d-9072-13ec6df2f859.png" alt="Grok 3 комментарии для кода" /><figcaption>Grok 3 дописал комментарии к коду</figcaption></figure><h2>Сравниваем виджеты с ChatGPT и DeepSeek</h2><p>Сравним Grok со стабильным ветераном ChatGPT и дерзким новичком DeepSeek. Сначала протестируем ChatGPT-4o mini, используя тот же запрос:</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/8629cf0c-1b39-4f74-b942-dd77dfe5a948.png" alt="ChatGPT для создания виджетов" /><figcaption>Виджет таймера от ChatGPT</figcaption></figure><p>Затем попросим DeepSeek сгенерировать свою версию:</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/6a666502-c640-4225-952f-2d8b37dd1ab5.png" alt="DeepSeek для создания виджетов" /><figcaption>Виджет таймера от DeepSeek</figcaption></figure><h4>Как справились с кодом</h4><p>Все три кода реализуют таймер с базовыми функциями: отсчет времени, кнопки старта и сброса, показ общего времени после запуска и мотивационные фразы. Однако есть различия в дизайне, логике работы и оптимизации кода.</p><p>Grok 3:</p><ul><li>Самый сбалансированный вариант. Минимум избыточного кода, но не переключается на режим отдыха автоматически. Придется запускать вручную.</li><li>Умная смена мотивации. Фразы переключаются последовательным перебором и не повторяются в рамках сессии, в отличие от случайного подбора, как в DeepSeek.</li><li>Дополнительный плюс в карму за подробную инструкцию по вставке и внимание к тому, что при перезагрузке страницы таймер обнуляется. Так мы сразу сможем предусмотреть необходимые изменения, даже если не разбираемся в коде.</li></ul><p>ChatGPT:</p><ul><li>Использует одну переменную для перехода между режимами и переключает их автоматически.</li><li>Не сопроводил инструкцией и комментариями.</li><li>Видимо, решил, что пользователи слишком избалованы мотивацией и пора приучать их к суровой реальности: мотивашки есть в коде, но с запуском таймера они не появляются. Оказалось, они срабатывают раз в 5 сессий, а не минут: if (sessionCount % 5 === 0 &amp;&amp; sessionCount !== 0) {</li><li>Ошибка сброса: нет логики проверки смены дня, а счётчик накапливается бесконечно.</li><li>После остановки через сброс таймер не запускается заново, потому что startButton остаётся disabled. ИИ, который действительно заботится о нашем отдыхе!</li></ul><p>DeepSeek:</p><ul><li>Немного перегружен логикой  — два отдельных таймера для работы/отдыха, сложная система ежедневного сброса.</li><li>Есть мотивашки, но они могут повторяться внутри сессии.</li><li>Есть инструкция, но менее подробная, чем у Grok.</li><li>Современный дизайн с полупрозрачными элементами, но белый текст на кнопках может быть плохо виден.</li><li>При завершении сессии появляется всплывающее окно, что может раздражать.</li></ul><h4>Визуальный стиль</h4><p>Все три виджета имеют градиенты, но разной яркости и прозрачности. Виджеты от Grok и ChatGPT имеют яркие и насыщенные цвета, а от DeepSeek — более спокойные оттенки. Кроме того, Grok и DeepSeek имеют более приятный и эстетичный вид.  Конечно, точные требования к дизайну можно было бы задать в промпте заранее: указать цвета, уровни прозрачности, какие шрифты использовать, нужны ли градиенты на кнопках.</p><p>В идеале нейросеть могла бы сама предусмотреть что-то из этого, чтобы нам не пришлось думать:</p><ul><li>Прогресс при обновлении страницы — чтобы при перезагрузке или закрытии данные не терялись.</li><li>Длина сессий — возможность менять длительность работы и отдыха.</li><li>Паузы и возобновления — чтобы не приходилось сбрасывать таймер, если нужно прерваться.</li><li>Таймаут обновлений общего времени — в некоторых случаях обновляется каждую секунду, но логичнее делать это после завершения сессии, чтобы минимизировать нагрузку.</li><li>Всплывающие уведомления — напоминания о начале/конце сессии, если мы переключились на другую вкладку.</li><li>Возможность звуковых уведомлений — сигналов о начале и конце сессии, с возможностью отключения, чтобы не мешали.</li><li>Отслеживание продуктивности и графики прогресса — подсчёт и визуализация завершённых сессий за день, неделю, месяц.</li></ul><h3>Трекер кофе</h3><p>Напишем код для трекера кофеина. В этом случае инструкции будут чуть сложнее, так как помимо подсчета чашек кофе, нам нужен индикатор, предупреждающий о превышении нормы.</p><p>Создай код для минималистичного, стильного и современного виджета на русском языке для отслеживания выпитого кофе, который можно будет встроить в Notion через embed (iframe).<br />Добавь графический индикатор с числом чашек кофе, который меняет цвет в зависимости от количества потребленного кофе:<br />- Светло-коричневый — для оптимального потребления (до 3 чашек).<br />- Темно-коричневый (ближе к красному) — для злоупотребления (больше 3 чашек).<br />- Красный — для значительного превышения нормы (больше 5 чашек).<br />Кнопки: кнопка «+» добавляет одну чашку кофе, кнопка «-» удаляет одну чашку кофе. Также добавь кнопку для сброса данных в конце дня.<br /><br />Отображение текущего потребления кофе в количестве чашек должно обновляться в реальном времени и отображаться рядом с графическим индикатором.<br /><br />Если потребление превышает 2 чашки, появляется мягкое предупреждение: «Похоже, ты уже выпил достаточно кофе на сегодня. Постарайся немного снизить потребление!», «Ты превысил норму кофе, давай попробуем уменьшить количество, чтобы избежать перегрузки!», «Осторожно! Ты уже немного переборщил с кофе. Лучше сделать перерыв!»<br /><br />Если потребление превышает 3 чашки, предупреждения становятся более жесткими, а надпись и кнопки становятся красными: «Ты уже на грани, не переборщи с кофе, чтобы не повредить здоровью», «Кажется, ты выпил немного больше кофе, чем нужно. Пора остановиться!», «Ты уже достиг максимума кофе на сегодня. Помни, всё хорошо в меру!», «Прекрасно, что ты так любишь кофе, но сегодня лучше сделать паузу!», «Ты уже близок к пределу. Лучше ограничить кофе и попробовать что-то лёгкое!». <br /><br />Дизайн: для фона виджета используй полупрозрачный градиент с светло-коричневыми оттенками, с закругленными углами. Кнопки одного цвета и одного оптимального размера в один ряд без градиентов с читаемыми надписями и скругленными краями.<br /><br /></p><h4>Grok 3</h4><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/0595f6c6-09dd-40ee-8b35-aa17a03b0653.png" alt="Grok 3 для виджета" /><figcaption>Виджет от Grok 3</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/f1ad0155-f598-4b66-986f-63dd577ff109.png" alt="" /><figcaption>Виджет от Grok 3 с предупреждением</figcaption></figure><ul><li>Средняя оптимальность — много кода, но структурирован;</li><li>Есть приятная анимация при нажатии кнопки;</li><li>Хорошо следует инструкциям в запросе.</li></ul><h4>ChatGPT</h4><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/ac6682dd-498a-49bd-8b34-a157a8bc3157.png" alt="" /><figcaption>Виджет от ChatGPT</figcaption></figure><ul><li>Другое расположение кнопок — прибавление справа выглядит логичнее;</li><li>Самый компактный код, но предупреждения менее вариативны;</li><li>Черный текст на индикаторе плохо читается, когда фон становится красным.</li></ul><h4>DeepSeek</h4><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/3345d3af-1059-441e-952d-cdad6a39c04e.png" alt="" /><figcaption>Виджет от DeepSeek</figcaption></figure><ul><li>Нет цветового индикатора;</li><li>Кнопка сброса оранжевая вопреки инструкции;</li><li>Потерялась часть предупреждений при добавлении чашек выше нормы.</li></ul><h2>Вайб-кодинг откладывается?</h2><p>Grok — свежий игрок, но со своими тараканами:</p><ul><li>UI-элементы выглядят лучше, чем у коллег — стилёвый дизайн, плюс автоматически добавляются анимации.</li><li>Иногда бывают проблемы с отображением результата: нужно перезагрузить страницу, чтобы увидеть результат генерации.</li><li>Хотели вайб-кодить? Придется потерпеть. В бесплатной версии есть лимит запросов и всего несколько попыток для «рассуждающего» режима. Если хотите большего — нужно оформить подписку, иначе вам предложат подождать.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-03-11/1045fbe6-3f9d-4d1c-b034-f630a2228929.png" alt="" /><figcaption>Таймауты при работе с бесплатной версией Grok 3 в режиме размышлений</figcaption></figure><p>ChatGPT — стабильный инструмент, но без магии: инструкции выполняет, но теряет нюансы и не блещет креативом.</p><p>DeepSeek ведет себя странно: то срабатывает идеально, то игнорирует детали задачи.</p><p>Все ИИ-помощники очень придирчивы к промптам:</p><ul><li>Не уточнили всё до мельчайших подробностей? Ждите сюрприз: кнопки разного размера и цвета, потерянные элементы. Попросили «закругленные кнопки»? Получайте круглые на 100%.</li><li>Нужно нянчить и доучивать — лучше расписать ТЗ по пунктам или заранее выяснить у LLM, какая информация нужна.</li><li>Сложный проект не создастся за 5 минут. В кейсах с виджетами ИИ зачастую не учитывал важные детали, например, сохранение данных при перезагрузке страницы. Нужно тщательно продумывать все пользовательские сценарии, учитывать возможные ошибки и вручную прописывать логику хранения данных и возможных взаимодействий в промпте.</li><li>На десятой итерации всё может пойти не так — исправляешь одно (дорабатывая промпт), а ломается другое (модель путается в старых инструкциях). И это еще на фоне других ИИ-нюансов, типа нестабильной работы или галлюцинаций.</li><li>Хорошо, что у всех трёх моделей есть интерпретатор, и можно сразу протестировать результат. Для новичков и тех, кто не слишком хорошо разбирается в коде, это вполне сойдёт.</li></ul><p>А если вы опытный разработчик, стоит присмотреться к Cursor и Claude Sonnet 3.7 с его Claude Code — они больше заточены под копайлотинг и предлагают более продвинутые возможности.</p>]]></content:encoded>
    </item>
    <item>
      <title>Топовые инструменты для фронтенд-разработки в 2025 году</title>
      <link>https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu</link>
      <comments>https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu</guid>
      <description><![CDATA[<p>Инструменты для фронтенд-разработки. Показываем актуальный инструментарий для frontend в 2025 году. Рассматриваем тренды для фронтендеров ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/topovye-instrumenty-dlya-frontend-razrabotki-v-2025-godu">Топовые инструменты для фронтенд-разработки в 2025 году</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Redux]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Feb 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Специальные инструменты для разработки фронтенда существенно упрощают работу программистов, ускоряют процесс, помогают создавать привлекательные интерфейсы сайтов и решают множество других прикладных задач.</p><p>Мы собрали топ самых эффективных инструментов для фронтенда в 2025 году. Актуальная информация о фреймворках, библиотеках, средствах сборки, проверки и отладки будет полезна как начинающим, так и опытным прогерам.</p><h2>Фреймворки и библиотеки для разработки интерфейсов</h2><p>Создание фронтенда, то есть клиентской части программного продукта — неотъемлемый этап разработки сайтов и приложений. Фронтендеры работают с с HTML, CSS, JavaScript, а также используют многочисленные библиотеки с готовыми решениями. Даже новички в курсе, что без фреймворков проекты сегодня не пишутся — это долго, тяжело и непродуктивно. Ниже — наиболее эффективные фреймворки для разработки UI.</p><h3>React.js</h3><p>Созданная Джорданом Валке, ведущим программистом самой известной в мире соцсети, библиотека React остается лидером в сфере разработки инфраструктуры на JavaScript UI. На <a href="http://react.js">React.js</a> написаны такие проекты, как Skype, PayPal, Airbnb, Dropbox и многие другие.</p><p>Популярность библиотеки объясняется вполне объективными причинами:</p><ul><li>Обширное комьюнити. Только на GitHub вы найдете больше 110 тыс. публикаций с тегом «react». Библиотекой пользуются во всем мире, а тысячи профессиональных программистов постоянно обновляют инструменты и актуализируют данные. Если у разработчика появится вопрос, он обязательно найдет на него ответ в сообществе.</li><li>Технологический бэкграунд. Библиотеку создали профи из FB для себя — такие проекты делаются максимально качественно и надежно. Тот факт, что технологии доверяют крупнейшие мировые корпорации, говорит сам за себя.</li><li>Активное взаимодействие с TypeScript. Этот инструмент представляет собой продвинутую версию JS, который со временем стал слишком тяжелым в плане кода. TypeScript лишен многих недостатков Java, поэтому активно применяется в React.js. В общем, в 2025 году фреймворк точно не умрет.</li><li>Версионность. В React, в отличие от Angular или Vue, код, написанный даже несколько лет назад, без проблем запустится на новейшей версии. А если там есть неактуальный элемент, программа сама подскажет, как его исправить.</li></ul><p>В React 19 появились новые, еще более мощные компоненты, повышающие производительность и пользовательский опыт:</p><ul><li>Улучшенная поддержка Server Components, с которой более удобно работать с серверным рендерингом и загружать контент в больших проектах;</li><li>Новый API — Actions, который делает более простой и продуктивной работу с формами и интерактивными элементами;</li><li>Директивы preload и preinit обеспечивают предварительную загрузку важных ресурсов, что ускоряет работу приложений;</li><li>Новый канал релизов React Canaries позволяет протестировать некоторые опции React еще до их официального выпуска.</li></ul><p>Улучшения произошли и в экосистеме React. Упрощается работа с Redux — библиотекой, которую все чаще используют в связке с React. Инструменты для работы с таблицами и интерфейсами React Table 8 более доступны и производительные.</p><h3>Vue.js</h3><p>Еще один мощный, но при этом простой и гибкий в применении инструмент для фронтенд-разработчиков — <a href="http://vue.js">Vue.js</a>. Согласно экспертным прогнозам, он сохранит свои позиции в топе-3 фреймворков для JavaScript в 2025 году.</p><p>Относительно недавно создатели Vue радикально обновили движок и архитектуру. При этом доля TypeScript кода в репозитории приближается к 99%, что расценивается профессиональными прогерами крайне позитивно.</p><p>Команда разработчиков Vue.js, возглавляемая Эваном Ю, в свое время заявила, что фреймворк станет самым простым и удобным инструментом из всех существующих. По мнению экспертов, их слова полностью подтвердились.</p><p>В числе главных преимуществ фреймворка:</p><ul><li>Подходит для новичков. Для освоения достаточно знания HTML, CSS, JavaScript;</li><li>Небольшой вес. Размер новой заархивированной библиотеки runtime меньше 10 kb;</li><li>В пакет входит виртуальный DOM — объектная модель документа;</li><li>Активное крутое сообщество. Профессионалы помогут, если у разработчика возникнут проблемы.</li></ul><p>Количество полноценных приложений, сделанных на Vue.js, превышает 36 тысяч. Это число постоянно растет, и в 2025 году тренд обязательно продлится. В экосистему внедряются новые технологии, например, Vapor Mode, — инструмент, открывающий новые горизонты для разработки высокопроизводительного софта.</p><p>Подход, заданный Composition API, позволяет создавать компоненты через импорт функций вместо обновления опций. На выходе получаем более чистую архитектуру, что особенно важно для продуктов со сложной логикой.</p><p>Появление высокоуровнего фреймворка Nuxt 4 принесет важные улучшения в плане производительности и гибкости разработки. Поддержка Vue 3.3+ в Nuxt 4 улучшает работу с анимацией и межкомпонентные переходы. Пользовательский интерфейс становится более динамичным и плавным.</p><p>На фреймворке Vue созданы сайты Ozon, Zoom, Chess (сайт для шахматистов с посещаемостью 20 млн пользователей в месяц), Livestorm — платформа для запуска вебинаров, и многие другие ресурсы.</p><h3>Angular</h3><p>Этому мощному фреймворку доверяет Google, что уже говорит само за себя. Множество десктопных и мобильных приложений создано на <a href="https://angularjs.org/">AngularJS</a> — это крутой инструмент с минимальным риском критических ошибок. На сайте фреймворка создатели призывают разработчиков сосредоточиться на приложениях, а код Angular берет на себя.</p><p>И хотя профи считают этот фреймворк более сложным в освоении, чем Vue и React, его функциональность оправдывает все трудности учебного процесса. В 2025 году эволюция Angular продолжится: его последние версии показывают существенные изменения в подходах к реактивности ПО и управлению состоянием.</p><p>Новые решения, на которые стоит обратить внимание:</p><ul><li>К числу ключевых нововведений фреймворка относится технология Signals, которая делает взаимодействие с реактивными данными более простым. «Сигналы» актуальны в том случае, когда требуется синхронное обновление UI и оптимизация производительности приложения.</li><li>В Angular 19 компоненты Standalone стали новым стандартом. Теперь они могут использоваться без добавления в модуль. Такое решение упрощает архитектуру приложений и делает подход к коду более прямолинейным.</li><li>Внедрение зависимостей (DI, Dependency Injection) дополнено новой функцией inject() — она заменяет стандартный конструктор, что также упрощает код и делает его более гибким.</li><li>Автоматическая миграция продуктов к новому API — еще один шаг к упрощению и сокращению кода. Это напрямую отражается на производительности современных приложений, в первую очередь, на больших и логически сложных.</li></ul><p>Прежние плюсы  Angular остались неизменными — расширяемость, взаимодействие с другими фреймворками и инструментами, множество надстроек и дополнений — Auto Validate, Complete, Grid и т.д.</p><p>На фреймворке написан сайт британской газеты The Guardian, интерактивные элементы PayPal, самый посещаемый сайт мониторинга погоды Weather.com, фронтенд музыкального ресурса VEVO и многие другие продукты.</p><h3>Svelte</h3><p>В свое время фреймворк предложил принципиально новый подход к разработке пользовательских интерфейсов. Концепция создателей <a href="https://svelte.dev/">Svelte</a> — делать больше с минимальными затратами. Некоторые разработчики считают Svelte больше компилятором, чем фреймворком, что по сути соответствует действительности.</p><p>В чем основные фишки Svelte:</p><ul><li>При меньшем весе проекты более производительны — им не требуется виртуальный DOM;</li><li>Фреймворк прост в освоении, поэтому подходит начинающим разработчикам;</li><li>Опытные прогеры обращают внимание на быстроту и стабильность инструмента;</li><li>Анимации в Svelte доступны прямо из коробки — сторонние библиотеки не требуются.</li></ul><p>На текущем этапе этот фреймворк рано ставить на одну ступень с React и Vue, но его рейтинг на GitHub постоянно повышается, и в 2025 году растущий тренд точно сохранится.</p><p>Фронтенд-разработкой с фреймворком Svetle пользовались такие компании, как Spotify, Ikea, Finance.yahoo, Music.apple и многие другие.</p><h3>Solid.js</h3><p>Минималистичный фреймворк, который по производительности и быстроте превосходит все остальные фреймворки из топа. <a href="https://www.solidjs.com/">Solid</a> напоминает React, но вместо виртуального DOM использует компиляцию. Проект без проблем компилируется в JavaScript-код, что обеспечивает быстрый рендеринг страницы (трансформацию кода в картинку для пользователя).</p><p>В чем плюсы:</p><ul><li>Тонкая реактивность обеспечивает оптимизацию рендеринга в реальном времени;</li><li>Есть бесшовная интеграция со всеми актуальными библиотеками на JS;</li><li>Компоненты фреймворка — стандартные JavaScript-функции: они выполняются однократно для настройки представления, после чего автоматически обновляют интерфейс.</li></ul><p>Solid.js, по состоянию на 2025, — идеальный инструмент для одностраничных приложений и продуктов с максимальной интерактивностью (чат-ботов, мессенджеров, панелей управления).</p><p>Фреймворк используют такие ресурсы, как 1c.ru, криптовалютная биржа Ape.pro, маркетплейс Майнкрафт Waypoint Studios и другие.</p><h2>Инструменты для сборки и разработки</h2><p>По мнению большинства экспертов, в 2025 году ведущим трендом в сборке и разработке на JavaScript будет работа с универсальными мета-инструментами, совместимыми с любыми фреймворками.</p><p>Топ наиболее эффективных инструментов этого направления:</p><ul><li><a href="https://vite.dev/">Vite</a>. Локальный сервер разработки от Эвана Ю. В новой версии Vita 6 возможности существенно расширились, в том числе в плане поддержки других фреймворков, помимо Vue. Благодаря модульной архитектуре и новой системе плагинов, улучшилась кастомизация сборки (процесс внесения изменений). С Vite можно использовать несколько фреймворков в одном проекте — для сложных приложений это актуальная опция. Обновления в реальном времени происходят быстро и стабильно.</li><li><a href="https://webpack.js.org/">Webpack</a>. Сборщик модулей, который компилирует части кода в единый файл. Работает с JavaScript и TypeScript. Несмотря на появление новых инструментов сборки, в 2025 году Webpack останется обязательным инструментом, особенно для работы с масштабными проектами. Он оптимизирует размер и скорость загрузки ресурсов, эффективно выстраивает процессы разработки, в том числе HMR — горячую замену модулей. Плюс обеспечивает совместимость продуктов с различными версиями браузеров.</li><li><a href="https://parceljs.org/">Parcel</a>. Главная фишка этого инструмента в том, что его не нужно настраивать и конфигурировать — это делается автоматически. Parcel применяет воркеры — скрипты для многоядерной компиляции, и содержит кэш файловых систем для ускоренной сборки. Есть поддержка из коробки JS, CSS, HTML, поэтому соответствующие плагины не требуются. Модули, которые меняются в процессе разработки, обновляются автоматически.</li></ul><h2>Тестирование и отладка</h2><p>В 2025 году в тестировании и отладке продуктов наиболее востребованы следующие инструменты:</p><ul><li><a href="https://jestjs.io/ru/">Jest</a>. Самый популярный фреймворк для тестирования кода на JavaScript. Работает с синхронным и асинхронным кодом, интегрируется с React и Vue. В числе основных плюсов — простая настройка и удобное применение. Подходит для проверки и отладки сложных приложений.</li><li><a href="https://www.cypress.io/">Cypress</a>. Инструмент для автоматизации тестирования, который подходит новичкам. Использует тест end-to-end, покрывая весь путь пользователя, и внедряется в CI/CD — процессы непрерывной доставки и развертывания. Благодаря подробной документации подходит для новичков.</li><li><a href="https://testing-library.com/docs/react-testing-library/intro">React Testing Library</a>. Библиотека эффективных инструментов для тестирования пользовательских интерфейсов UI. RTL позволяет абстрагироваться от внутренней логики компонентов и проверяет состояние реального DOM, то есть имитирует действия пользователей, руководствуясь только данными браузера.</li><li><a href="https://storybook.js.org/">Storybook</a>. Позиционируется как максимально простое средство тестирования и разработки. Создает изолированную программную среду для ускоренного и эффективного процесса.</li></ul><h2>Инструменты для контроля версий</h2><p>Актуальные в 2025 средства для контроля созданных разработчиками версий:</p><ul><li><a href="https://git-scm.com/">Git</a>. Распределенная VCS (система управления версиями) отслеживает изменения в исходном коде и файлах в совместных проектах. Позволяет править и контролировать версии в процессе разработки. Обладает расширенными возможностями работы с репозиториями.</li><li><a href="https://github.com/gitlabhq">GitHub/GitLab</a>. Службы управления репозиториями, которые используются и для управления изменениями в опенсорс-проектах. Оба репозитория обладают полным набором инструментов для контроля и интеграций, обеспечивая эффективную совместную разработку и неограниченное сотрудничество. Обладают встроенными опциями безопасности, которые разработчики могут в любой момент активировать.</li><li><a href="https://bitbucket.org/product">Bitbucket</a>. Аналог GitHub с бесплатным доступом к контролю команды до пяти разработчиков. Подходит для написания частных проектов, обладает гибкостью, совместим со множеством других инструментов, в том числе с Jira, — средой для управления проектами.  Интеллектуальный семантический поиск JQL сканирует код по запросу пользователя.</li></ul><h2>CSS-процессоры и CSS-фреймворки</h2><p>Инструменты для первичной трансляции кода, актуальные в 2025 году:</p><ul><li><a href="http://sass-lang.com/">Sass</a>. Препроцессор упрощает написание кода, исключая одинаковые участки или заменяя ключевые элементы синтаксиса одним знаком. Sass считается самым надежным языком расширений CSS, содержит средства импорта и множество других функций.</li><li><a href="http://lesscss.org/">Less</a>. Этот препроцессор поддерживает CSS и позволяет разработчикам применять его методы для улучшения и дополнения веб-приложений. В Less встроены логические, строковые, математические функции, а также функции списков.</li><li><a href="https://getbootstrap.com/">Bootstrap</a>. Классический фреймворк для ускоренной верстки со множеством встроенных компонентов. Более 20% всех сайтов в мире создано с его помощью. Автоматически выстраивает адаптивную сетку на базе Flex-модели, создает изображения, поставляется с панелями навигации и другими компонентами.</li><li><a href="https://tailwindcss.com/">Tailwind CSS</a>. Фреймворк, который пользователи называют прогрессивной версией Bootstrap. Содержит обширный каталог утилитарных классов и инструментов для прототипирования, стилизации сайтов и приложений. Легко настраивается, работает с собственными служебными шаблонами, создает сложные адаптивные макеты, в том числе с ориентацией под мобильные устройства.</li></ul><h2>Инструменты для работы с API и серверной логикой</h2><p>Эффективная работа с API обеспечивает надежность при обработке информации в приложениях.</p><p>В 2025 году топ таких инструментов выглядит следующим образом:</p><ul><li><a href="https://graphql.org/">GraphQL</a>. Язык, описывающий взаимодействие клиента с сервером.  Рассматривается как альтернатива стандартного инструмента REST. В сравнении с последним, более удобен в применении, содержит обширный инструментарий.</li><li><a href="https://www.apollographql.com/docs/react">Apollo Client</a>. Язык запросов, созданный разработчиками FB. Интегрируется с GraphQL и React для управления состоянием приложения. Предоставляет эффективные инструменты в виде поддержки кэширования, управления состоянием и исправления ошибок. Интегрируется с библиотекой Redux и другими фреймворками.</li><li><a href="https://axios-http.com/ru/docs/intro">Axios</a>. JS-библиотека для работы с HTTP-запросами, а по сути — клиент для работы в браузере и с платформой Node.js. Помогает настроить взаимодействие между frontend и backend.</li></ul><h2>UI и UX-дизайн</h2><p>Интерфейсу и комфорту пользователя современные сайты и приложения уделяют максимум внимания. На кривые и неудобные ресурсы посетители просто не приходят — зачем, если есть лаконичные и функциональные продукты, отвечающие актуальным трендам цифрового дизайна.</p><p>Эти инструменты сохраняют свою актуальность в 2025 году:</p><ul><li><a href="https://www.figma.com/">Figma</a>. Графический редактор, который остается самым популярным инструментом для проектирования интерфейсов, прототипирования и тестирования. Также это среда взаимодействия команды разработчиков, доступная непосредственно в браузере. Содержит удобные инструменты, может работать в режиме многозадачности.</li><li><a href="https://helpx.adobe.com/ru/xd/get-started.html">Adobe XD</a>. ПО для работы с интерфейсами, анимированием, прототипами сайтов, сервисов и приложений от лидера индустрии. Основной инструмент UX-дизайнеров, желающих создавать юзабельные и современные макеты и делиться результатами работы с командой. Содержит многочисленные инструменты для рисования, создания 3D-эффектов, добавления интерактивных функций и анимации.</li><li><a href="https://www.sketch.com/">Sketch</a>. Выбор многих профессионалов индустрии UI/UX дизайна. Упрощает разработку интерфейсов благодаря множеству встроенных полезных функций — артбордов, редакторов, поддержкой командной работы в режиме онлайн. Работает только с macOS.</li></ul><p>При выборе фреймворков и инструментов фронтам стоит руководствоваться удобством и простотой использования, соответствием собственному профессиональному уровню, языковой поддержкой, ценой, а также спецификой создаваемого продукта.</p><p>Вспомогательные инструменты ускоряют и упрощают разработку, снижают риск ошибок и работают на результат — запуск привлекательных, быстрых и функциональных веб-продуктов и приложений.</p><p><i>Рассказывайте в комментариях, какими фреймворками и библиотеками пользуетесь вы. А если хотите найти большей полезной информации про фронтенд — вам </i><a href="https://t.me/+BDTRdPNEOY00ZjE6">сюда</a><i>.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Представлен Term-Website — аутентичный веб-симулятор Терминала</title>
      <link>https://tproger.ru/news/predstavlen-term-website---autentichnyj-veb-simulyator-terminala</link>
      <comments>https://tproger.ru/news/predstavlen-term-website---autentichnyj-veb-simulyator-terminala?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/predstavlen-term-website---autentichnyj-veb-simulyator-terminala</guid>
      <description><![CDATA[<p>Term-Website — веб-симулятор Терминала с кастомизацией, командами и темами. Идеален для обучения, игр или создания уникального портфолио</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/predstavlen-term-website---autentichnyj-veb-simulyator-terminala">Представлен Term-Website — аутентичный веб-симулятор Терминала</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 30 Dec 2024 06:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Term-Website — это <a href="https://term.micahkepe.com/">веб-приложение</a>, симулирующий работу Терминала прямо в вашем браузере.</p><p>Проект представляет собой реалистичную симуляцию терминала, где пользователь может взаимодействовать с виртуальной файловой системой, выполнять команды и менять оформление через конфигурационные файлы.</p><h2>Ключевые особенности</h2><h2>Виртуальная файловая система и команды</h2><p>Term-Website поддерживает базовые команды, такие как:</p><ul><li>ls — просмотр содержимого папки;</li><li>cd — переход между папками;</li><li>help — список доступных команд и т.д..</li></ul><p>Данные о файловой системе хранятся на стороне клиента в виде объектов JavaScript, что делает проект быстрым и удобным.</p><h2>Темы и кастомизация</h2><p>Пользователи могут менять оформление терминала, включая цветовые схемы, шрифты и стили. Это легко настроить через файл config.json, где можно:</p><ul><li>выбрать тему;</li><li>задать имя пользователя;</li><li>изменить доступные команды и их поведение.</li></ul><h2>Горячие клавиши</h2><p>Проект поддерживает популярные сочетания клавиш:</p><ul><li>Ctrl + L — очистка экрана;</li><li>Ctrl + C — отмена команды;</li><li>Стрелки вверх/вниз — история команд.</li></ul><p>Эти функции усиливают сходство с реальным терминалом.</p><h2>Техническая реализация</h2><p>Проект написан на <b>TypeScript</b>, а для создания интерфейса терминала используется библиотека <b>xterm.js</b>. Стилизация реализована с помощью <b>HTML</b> и <b>CSS</b>.</p><p>Term-Website полностью работает на стороне клиента, поэтому серверная часть не требуется. Это делает проект лёгким для развертывания и быстрой работы.</p><h2>Примеры использования</h2><ol><li><b>Портфолио разработчика.</b> Term-Website можно превратить в оригинальное портфолио. Например, интерактивный терминал может представить информацию о ваших навыках, проектах и достижениях.</li><li><b>Обучение и демонстрации.</b> Подходит для обучения основам командной строки или демонстрации алгоритмов и программного кода.</li><li><b>Игры и развлечения.</b> Добавив интерактивные задачи, проект можно превратить в игру или симулятор программирования.</li></ol><h2>Как начать?</h2><p>Чтобы использовать Term-Website:</p><p>1. Склонируйте репозиторий:</p><p>2. Установите зависимости, если требуется</p><p>3. Откройте index.html в браузере, чтобы начать работу.</p>]]></content:encoded>
    </item>
    <item>
      <title>ТОП-35 курсов HTML и CSS: онлайн-обучение верстке бесплатно и платно</title>
      <link>https://tproger.ru/articles/kursy-verstki-html-i-css-253340</link>
      <comments>https://tproger.ru/articles/kursy-verstki-html-i-css-253340?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анастасия Шишкина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kursy-verstki-html-i-css-253340</guid>
      <description><![CDATA[<p>Лучшие онлайн-курсы HTML и CSS. Список школ, осуществляющих обучение на бесплатной или платной основе, а так же цены на курсы для Frontend-разработчиков</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kursy-verstki-html-i-css-253340">ТОП-35 курсов HTML и CSS: онлайн-обучение верстке бесплатно и платно</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Dec 2024 17:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Делать интересные и функциональные сайты можно научиться в короткий срок с помощью курсов по HTML/CSS. С помощью CSS удается уникализировать стили страниц и создать по-настоящему уникальный проект. HTML позволяет создавать структуры веб-страниц. Владение этими языками требуется как веб-разработчикам, так и дизайнерам, менеджерам проектов и даже владельцам бизнеса, которые хотят создавать сайты под свои проекты самостоятельно. HTML является основой сайтов, а CSS позволяет «украсить» содержимое сайта. В развитие собственных страниц в интернете почти половина предпринимателей готова вкладывать денежные средства (по данным исследования TopDesignFirms). А это значит, что веб-разработчик без работы не останется. Он может работать как в студии, так и на фрилансе, начать собственное дело.</p><p>Совместно с экспертами агрегатора курсов <a href="https://kursfinder.ru/">Kursfinder</a> я рассмотрела более 100 программ подготовки и собрала для вас подборку из 35 лучших курсов, доступных бесплатно и платно. Еще больше <a href="https://kursfinder.ru/html-css/">курсов по HTML/CSS</a> вы найдете в каталоге нашего сервиса.</p><h2>ТОП-11 лучших курсов по HTML и CSS: онлайн-обучение верстке в 2026 году</h2><ol><li><a href="https://experts2.ru/aKlzWu?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=1">Курс «HTML и CSS» с нуля</a> от Skypro – базовый курс с большим набором бонусов.</li><li><a href="https://experts2.ru/cFmrhM?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=2">Курс «Фронтенд-разработчик»</a> от Яндекс Практикум – углубленная программа обучения с возможностью выполнить работу от реального заказчика.</li><li><a href="https://experts2.ru/CiLmgd?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=3">Профессия Frontend-разработчик PRO</a> от Skillbox – большой курс, представленный в трех различных тарифах</li><li><a href="https://experts2.ru/nPyabL?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=4">Курс «Профессиональная вёрстка на HTML и CSS»</a> от Яндекс Практикума – экспресс-курс для расширения набора навыков действующих специалистов.</li><li><a href="https://experts2.ru/hRujSy?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=5">Курсы по HTML</a> от Skillfactory – большая подборка курсов от школы, из которой вы можете выбрать подходящий для себя образовательный трек.</li><li><a href="https://experts2.ru/saiWIr?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=6">HTML и CSS. Позиционирование</a> от Хекслета – практический трек для самостоятельного обучения на тренажерах.</li><li><a href="https://experts2.ru/GclPaz?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=7">Профессия Frontend-разработчик</a> от GeekBrains – расширенный курс с большими объемами практики и возможностью пообщаться с действующими разработчиками.</li><li><a href="https://experts2.ru/AdfcHh?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=8">Онлайн-курс Вёрстка на HTML и CSS</a> от Брунояма – экспресс-курс для дизайнеров и менеджеров проектов.</li><li><a href="https://experts2.ru/bfekOY?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=9">HTML/CSS</a> от Otus – хороший базовый курс для трудоустройства и повышения своей профессиональной ценности.</li><li><a href="https://experts2.ru/DNiwrd?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=10">Онлайн-курсы HTML и CSS для начинающих</a> от Международной Школы Профессий – экспресс-курс для новичков, который позволит освоить базы.</li><li><a href="https://experts2.ru/ZpRojq?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=11">Разработка сайтов (HTML, CSS, JS)</a> от Фоксфорда – видеокурс для детей, на котором ребята смогут создать свои первые сайты и оформить портфолио.</li></ol><p>Программы, представленные в подборке, позволят вам освоить как исключительно HTML или CSS, так и погрузиться в профессию Frontend-разработчика. Кроме того, вы сможете найти курсы по разработке сайтов для детей, углубленные профессиональные программы для действующих специалистов.</p><h2>Онлайн-курсы по HTML и CSS</h2><p><b>1.</b> <a href="https://experts2.ru/aKlzWu?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=1">Курс «HTML и CSS» с нуля</a> |<b> Skypro</b></p><p>Онлайн-курс по CSS/HTML, позволяющий с нуля освоить эти языки, научиться создавать сайты под любые устройства. Для обучения доступен только один тариф – «Индивидуальный». Он предполагает наличие встреч тет-а-тет с экспертом, на которых вы можете освоить что-то новое и получить ответы на возникшие в ходе обучения вопросы. Вместе с курсом вы сможете получить дополнительные уроки по английскому языку, а также возможность участвовать в разговорной практике в течение года бесплатно. В процессе и после окончания курса вам помогут с поиском работы специалисты из центра карьеры.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/86efaf2b-bea9-459f-8f21-1ef35b500177.png" alt="" /></figure><ul><li>Стоимость: от 7 558 руб./мес. в рассрочку на 3 года.</li><li>Длительность: от 5 месяцев.</li><li>Формат обучения: вебинары с экспертом, домашние задания, дополнительные материалы.</li><li>Сертификат: диплом о переподготовке</li></ul><p><b>Кому подойдет: </b>новичкам без опыта в разработке.</p><p><b>Преимущества:</b></p><ul><li>доступ к разговорной практике в Skyeng год бесплатно;</li><li>бонусный курс по нейросетям;</li><li>быстрая проверка домашних работ;</li><li>10 индивидуальных встреч с наставником;</li><li>учеба в малых группах;</li><li>подготовка портфолио и резюме, карьерные консультации;</li><li>неограниченный доступ к материалам курса;</li><li>4 урока по английскому для IT в подарок;</li><li>регулярные групповые встречи с экспертами.</li></ul><p><b>Недостатки:</b></p><ul><li>только дорогой индивидуальный тариф обучения;</li><li>нет информации по дате начала обучения.</li></ul><p><b>Программа обучения:</b></p><ul><li>HTML и CSS.</li><li>Адаптивный дизайн.</li><li>Переменные JavaScript.</li><li>Командная разработка.</li><li>Тестирование и отладка.</li></ul><p><a href="https://experts2.ru/aKlzWu?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=1">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>2. </b><a href="https://experts2.ru/cFmrhM?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=2">Курс «Фронтенд-разработчик»</a> | <b>Яндекс Практикум</b></p><p>Программа этого курса обучения CSS, HTML и JavaScript позволит освоить все необходимые для фронтенд-разработчика навыки. Большое количество практических заданий, а также разнообразие форматов обучения обеспечат быстрое и простое усвоение материалов. В ходе обучения вас ждут стажировки от партнеров школы, работа над оплачиваемыми проектами и хакатонами. Получить сжатое содержание курса можно через YandexGPT. Платформа предлагает помощь карьерного центра в оформлении портфолио и резюме, которая будет обеспечиваться еще 7 месяцев после окончания обучения.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/9279b105-ce80-40c3-990a-16f5974938ed.png" alt="" /></figure><ul><li>Стоимость: от 17 000 руб./мес. в рассрочку на 10 месяцев.</li><li>Длительность: 10 или 13 месяцев.</li><li>Формат обучения: теория в форматах текстов и видео, практика, проекты.</li><li>Сертификат: диплом о переподготовке.</li></ul><p><b>Кому подойдет: </b>новичкам без опыта, которые хотят с нуля получить необходимые навыки и знания.</p><p><b>Преимущества:</b></p><ul><li>поддержка карьерного центра 7 месяцев после окончания курса;</li><li>бесплатный курс по нейросетям;</li><li>2 тарифа на выбор: базовый и расширенный;</li><li>11-13 проектных работы для добавления в портфолио;</li><li>возможность пройти стажировку, принять участие в оплачиваемом проекте;</li><li>оперативная поддержка;</li><li>практическое задание от компании в ходе обучение.</li></ul><p><b>Недостатки:</b></p><ul><li>размер платежей по рассрочке достаточно высокий, но есть возможность оформить кредит;</li><li>поддержка по трудоустройству носит преимущественно консультационный характер, предоставляется без каких-либо гарантий.</li></ul><p><b>Программа обучения:</b></p><ul><li>HTML и CSS.</li><li>Адаптивный дизайн.</li><li>JavaScript.</li><li>TypeSript и ООП.</li><li>React.</li><li>Роутинг и авторизация.</li><li>Тестирование.</li></ul><p><a href="https://experts2.ru/cFmrhM?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=2">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>3. </b><a href="https://experts2.ru/CiLmgd?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=3">Профессия Frontend-разработчик PRO</a> | <b>Skillbox</b></p><p>Программа этого курса предназначена для освоения всех необходимых инструментов для работы фронтенд-разработчиком. Курс постоянно обновляется в соответствии с требованиями работодателей. Он представлен в трех форматах обучения на выбор, которые отличаются по объему работы с экспертами. Во время обучения вы сможете выполнить целых 56 проектов, которые эффектно дополнят ваше портфолио. Консультации и помощь карьерного центра обеспечат всестороннюю поддержку при трудоустройстве.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/fc9b0422-ad05-4c0e-b25a-7ebdbe90c126.png" alt="" /></figure><ul><li>Стоимость: от 4 738 руб./мес. в рассрочку на 9 месяцев.</li><li>Длительность: 9 месяцев.</li><li>Формат обучения: теория в формате видео, вебинары, отработка практики на домашних заданиях, проектах, в тренажерах.</li><li>Сертификат: есть.</li></ul><p><b>Кому подойдет: </b>новичкам в IT и тем, кто хочет освоить профессию разработчика с нуля.</p><p><b>Преимущества:</b></p><ul><li>программа регулярно обновляется в соответствии с требованиями работодателей;</li><li>56+ работ для портфолио;</li><li>карьерная помощь;</li><li>персональная проверка работ с обратной связью;</li><li>обучение приближено к реальной работе;</li><li>работа над коммерческими проектами;</li><li>командная работа;</li><li>доступ поиску заказчиков в Скил Маркете;</li><li>3 тарифа обучения на выбор.</li></ul><p><b>Недостатки:</b></p><ul><li>индивидуальные консультации доступны только в «Оптимальном» и «Продвинутом» тарифах;</li><li>высокая стоимость обучения по «Продвинутому тарифу».</li></ul><p><b>Программа обучения:</b></p><ul><li>Погружение в веб-разработку.</li><li>Веб-верстка.</li><li>JavaScript.</li><li>Продвинутые курсы на выбор.</li></ul><p><a href="https://experts2.ru/CiLmgd?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=3">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>4. </b><a href="https://experts2.ru/nPyabL?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=4">Курс «Профессиональная вёрстка на HTML и CSS»</a> | <b>Яндекс Практикума</b></p><p>Профессиональный курс обучения HTML-верстке и CSS для специалистов с опытом. Все обучение основано на решении практических задач. С первого дня обучения вас ждет написание кода в соответствии с современными стандартами. Поймете, как просто и быстро превращать макеты в функциональные сайты. Сможете делать адаптивный дизайн сайтов под разные устройства, создавать анимации и сделаете 7 проектов для портфолио. При желании можно пройти вводную часть курса бесплатно, чтобы оценить качество обучения на платформе.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/6ee5dde8-c878-48e0-906e-8cf3206c8f7a.png" alt="" /></figure><ul><li>Стоимость: от 19 500 руб./мес. в рассрочку на 3 месяца.</li><li>Длительность: 3 месяца.</li><li>Формат обучения: теория в форматах текстов и видео, практика, проекты.</li><li>Сертификат: есть.</li></ul><p><b>Кому подойдет:</b> дизайнерам, бэкенд-разработчикам, менеджерам.</p><p><b>Преимущества:</b></p><ul><li>тренажер для отработки навыков с 250+ задачами;</li><li>первые 15 часов программы можно изучить бесплатно;</li><li>дополнительные материалы по каждой теме;</li><li>скидка 20% при единовременной оплате;</li><li>7 проектов для портфолио;</li><li>написание кода с первых уроков;</li><li>вебинары с наставниками с ответами на вопросы;</li><li>развернутая обратная связь по проектам;</li><li>доступна оплата за счет работодателя.</li></ul><p><b>Недостатки:</b></p><ul><li>редкий набор групп;</li><li>размер платежей при покупке курса в рассрочку или необходимость оформить кредит.</li></ul><p><b>Программа обучения:</b></p><ul><li>Семантика и лэйаут.</li><li>Доступность и интерактив.</li><li>Дизайн и адаптивность.</li><li>Красотища.</li></ul><p><a href="https://experts2.ru/nPyabL?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=4">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>5. </b><a href="https://experts2.ru/hRujSy?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=5">Курсы по HTML</a> | <b>Skillfactory  </b></p><p>Подборка из курсов обучения HTML с нуля, в которой вы сможете найти программы под разные задачи: стать Fullstack- или Frontend-разработчиком, пантестером или попробовать сразу 9 востребованных IT-профессий. Программы отличаются по длительности, форматам обучения. Примечательно, что доступны курсы интенсивного обучения, которые в 4 раза быстрее стандартных. С ними получить новую профессию можно всего за 3 месяца.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/fd2377ec-1625-4d70-993a-2117d6e1f6fd.png" alt="" /></figure><ul><li>Стоимость: от 2 650 руб./мес. в рассрочку на 3 года.</li><li>Длительность: зависит от выбранного курса.</li><li>Формат обучения: зависит от выбранного курса.</li><li>Сертификат: есть.</li></ul><p><b>Кому подойдет: </b>новичкам без опыта в разработке, которые хотят обучиться программированию.</p><p><b>Преимущества:</b></p><ul><li>большой выбор образовательных программ под разные цели;</li><li>есть интенсивные курсы, которые можно пройти в сжатые сроки;</li><li>скидка до 60% и 4 курса в подарок;</li><li>есть возможность пройти курс по профориентации;</li><li>разные дополнительные языки программирования для разработки в комплекте.</li></ul><p><b>Недостатки:</b></p><ul><li>часть программ отличается достаточно высокой ценой, в том числе, из-за сокращенного срока рассрочки;</li><li>не все курсы в подборке посвящены HTML.</li></ul><p><b>Программа обучения:</b></p><ul><li>Зависит от выбранного курса.</li></ul><p><a href="https://experts2.ru/hRujSy?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=5">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>6. </b><a href="https://experts2.ru/saiWIr?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=6">HTML и CSS. Позиционирование</a>|<b> Хекслет</b></p><p>Недорогой курс обучения HTML и CSS с нуля самостоятельно. Он входит в недорогую подписку на сервис с возможностью обучаться на любых курсах, представленных на сайте. Примечательно, что после прохождения обучения, вы сможете сохранить за собой возможность возвращаться к пройденной теории даже если подписка закончится. Программа обучения состоит из уроков, проверочных тестов и работы с тренажером. В конце вы самостоятельно создадите собственный проект – Music Box.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/bda0aa03-5fea-4dea-a601-c6afc7b1f5d5.png" alt="" /></figure><ul><li>Стоимость: 3 900 рублей в месяц по подписке.</li><li>Длительность: 5-8 недель, в зависимости от скорости освоения материалов.</li><li>Формат обучения: уроки в формате видео и текстов, упражнения и проверочные тесты.</li><li>Сертификат: нет.</li></ul><p><b>Кому подойдет:</b> тем, кому нужно повысить свои навыки работы с HTML и CSS.</p><p><b>Преимущества:</b></p><ul><li>недорогой курс, который доступен по подписке вместе с другими курсами Хекслет;</li><li>нет ограничений по времени прохождения программы (кроме времени действия подписки);</li><li>даже после отмены подписки сохраняется доступ к теории;</li><li>работа над собственным проектом;</li><li>обратная связь от поддержки по урокам;</li><li>большое разнообразие форматов обучения.</li></ul><p><b>Недостатки:</b></p><ul><li>курс для самостоятельного освоения;</li><li>достаточно простая практика, без разбора сложных задач.</li></ul><p><b>Программа обучения:</b></p><ul><li>Позиционирование элементов.</li><li>Flex и Grid.</li><li>Адаптивный сайт.</li><li>Проектная работа.</li></ul><p><a href="https://experts2.ru/saiWIr?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=6">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>7.</b> <a href="https://experts2.ru/GclPaz?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=7">Профессия Frontend-разработчик</a> | <b>GeekBrains</b></p><p>Программа обучения HTML с нуля, в которой содержится более 100 практических работ и 9 проектов для портфолио. Она доступна в одном из трех форматов обучения, которые отличаются объемами консультаций с кураторами, а также дополнительными подарками. Например, в максимальном тарифе, вы сможете получить дополнительную профессию в подарок, пообщаться с действующими тимлидами. Независимо от выбранного тарифа, школа гарантирует трудоустройство или возврат денег.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/2a4ee44f-74ca-4c27-8dc9-d1fefa7aa8f3.png" alt="" /></figure><ul><li>Стоимость: от 3 285 руб./мес. в рассрочку на 3 года.</li><li>Длительность: 9 месяцев.</li><li>Формат обучения: теория в формате видео, вебинары, практические задания и работа над проектами для портфолио.</li><li>Сертификат: есть.</li></ul><p>Кому подойдет: тем, кто хочет освоить профессию разработчика с нуля.</p><p>Преимущества:</p><ul><li>можно обратиться за бесплатной консультацией со специалистом по выбору профессии;</li><li>живое общение с экспертом;</li><li>115 практических работ и 9-11 проектов для портфолио;</li><li>задания от Хабр Фриланс и компаний-партнеров для практики;</li><li>возврат денег, если не смогли найти работу с помощью Карьерного центра;</li><li>3 тарифа обучения на выбор;</li><li>большой выбор бонусов, который зависит от выбранного тарифа.</li></ul><p>Недостатки:</p><ul><li>«Базовый» тариф практически без поддержки;</li><li>время проведения вебинаров может быть не всегда удобным.</li></ul><p>Программа обучения:</p><ul><li>Верстка.</li><li>JavaScript.</li><li>TypeScript.</li><li>Курсы на выбор.</li></ul><p><a href="https://experts2.ru/GclPaz?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=7">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>8.</b> <a href="https://experts2.ru/AdfcHh?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=8">Онлайн-курс Вёрстка на HTML и CSS</a> | <b>Бруноям</b></p><p>Экспресс-курс, который позволит вам пройти обучение верстке на HTML и CSS, расширить свои профессиональные навыки. Программа доступна в трех тарифах обучения, которые отличаются по объемам взаимодействия с наставником. Если вы хотите учиться самостоятельно, то можно хорошо сэкономить на стоимости курса. Независимо от выбранного тарифа обучения, вы можете проходить уроки в удобное для вас время. Для всех студентов предусмотрена поддержка карьерного центра и помощь с трудоустройством.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/cf4c8b65-6e58-4b04-8472-b84d6308049f.png" alt="" /></figure><ul><li>Стоимость: от 1 491 руб./мес. в рассрочку на 1 год.</li><li>Длительность: 3 месяца.</li><li>Формат обучения: уроки в формате видео, практические задания и поддержка наставника.</li><li>Сертификат: есть.</li></ul><p><b>Кому подойдет: </b>менеджерам проектов, UX/UI-дизайнерам.</p><p><b>Преимущества:</b></p><ul><li>обучение в любое время;</li><li>поддержка наставника в течение года;</li><li>хорошая скидка за раннюю оплату;</li><li>помощь Центра карьеры;</li><li>практика на большом проекте;</li><li>вечный доступ к программе обучения;</li><li>3 тарифа на выбор.</li></ul><p><b>Недостатки:</b></p><ul><li>помощь наставника не предусмотрена в тарифе «База»;</li><li>непонятно, почему группы набирают к определенной дате, если обучение по видео.</li></ul><p><b>Программа обучения:</b></p><ul><li>Введение в веб.</li><li>Git.</li><li>HTML.</li><li>CSS.</li><li>Многоколоночные макеты.</li><li>Figma.</li><li>Позиционирование.</li><li>Формы обратной связи.</li><li>Адаптивность и кроссбраузерность.</li><li>Анимации.</li></ul><p><a href="https://experts2.ru/AdfcHh?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=8">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>9. </b><a href="https://experts2.ru/bfekOY?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=9">HTML/CSS</a> | <b>Otus</b></p><p>Онлайн-курс, который отличается большими объемами взаимодействие с экспертами. Каждый урок – это «живое» общение с преподавателями, после которого вас ждет домашнее задание. Проверка практических задач проводится с индивидуальным разбором от экспертов. Для студентов доступно размещение резюме в закрытой базе OTUS, а также посещение карьерных мероприятий.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/12e7f080-b4a6-4ffb-a34f-aaf8c6d8e1c0.png" alt="" /></figure><ul><li>Стоимость: от 5 040 руб./мес. в рассрочку на 10 месяцев.</li><li>Длительность: 4 месяца.</li><li>Формат обучения: прямые эфиры с экспертами, практические задания, работа над проектом.</li><li>Сертификат: есть.</li></ul><p><b>Кому подойдет: </b>базовый курс для желающих  получить новую профессию. Подойдет веб-дизайнерам, желающим самостоятельно воплощать свои макеты в жизнь, владельцам бизнеса, которые хотят научиться формировать ТЗ на разработку правильно.</p><p><b>Преимущества:</b></p><ul><li>постоянное взаимодействие с экспертами;</li><li>работа над выпускным проектом;</li><li>карьерные мероприятия и закрытая база резюме от OTUS;</li><li>преподаватели – эксперты с многолетним опытом;</li><li>можно посетить бесплатные вебинары и оценить качество обучения;</li><li>доступно корпоративные программы.</li></ul><p><b>Недостатки:</b></p><ul><li>старт нового потока проводится не очень часто;</li><li>вебинары проходят по понедельникам, средам в 19:00 по Мск, что может быть неудобно для жителей Востока России.</li></ul><p><b>Программа обучения:</b></p><ul><li>Введение в веб.</li><li>Макеты.</li><li>Адаптивный дизайн.</li><li>Верстка.</li><li>Библиотеки.</li><li>Работа над проектами.</li></ul><p><a href="https://experts2.ru/bfekOY?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=9">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>10.</b> <a href="https://experts2.ru/DNiwrd?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=10">Онлайн-курсы HTML и CSS для начинающих</a> | <b>Международная школа профессий</b></p><p>Интенсивный курс, который поможет вам освоить основы HTML и CSS. Каждый урок – это занятия с экспертом-практиком. У вас всегда будет возможность задавать вопросы преподавателю. В программе уделяется большое внимание практической составляющей, чтобы вы могли быстро научиться применять на практике все то, чему вас научили. За счет гибкого графика, вы сможете посещать занятия в удобное для вас время. Дополнительно возможно смотреть уроки в записи.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/142eec91-bcf2-4cf4-8d25-ab65e49b6ed2.png" alt="" /></figure><ul><li>Стоимость: 8 500 рублей.</li><li>Длительность: 3 недели.</li><li>Формат обучения: онлайн-вебинары, домашние задания.</li><li>Сертификат: есть.</li></ul><p><b>Кому подойдет: </b>новичкам, которые хотят научиться верстать сайты, понять, как брать заказы на фрилансе.</p><p><b>Преимущества:</b></p><ul><li>«живые» уроки с экспертом;</li><li>практические задания;</li><li>возможность заниматься с разными группами;</li><li>доступна оплата средства материнского капитала или по программе «Социальный контракт»;</li><li>можно смотреть уроки в записи, если время проведения вебинаров вам не подходит.</li></ul><p><b>Недостатки:</b></p><ul><li>диплом специалиста выдают только на продвинутом тарифе;</li><li>ограниченное количество мест.</li></ul><p><b>Программа обучения:</b></p><ul><li>HTML.</li><li>CSS.</li><li>Макеты.</li><li>Адаптивная верстка.</li><li>Анимации.</li></ul><p><a href="https://experts2.ru/DNiwrd?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=10">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><p><b>11.</b> <a href="https://experts2.ru/ZpRojq?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=11">Разработка сайтов (HTML, CSS, JS)</a> | <b>Фоксфорд</b></p><p>Онлайн-курс для детей, который поможет освоить азы профессии разработчика сайтов. Программа доступна в формате видеоуроков, поэтому ребенок сможет заниматься в удобное для него время. Ребенок сможет собрать свое первое портфолио, состоящее из 5 проектов. Большая часть обучения – практические задания, которые позволят не только лучше усвоить полученные знания, но и закрепить материалы, самостоятельно применить их в жизни.</p><figure><img src="https://media.tproger.ru/user-uploads/108137/2024-12-09/b351238b-cb11-41a4-874c-1a715ee1705c.png" alt="" /></figure><ul><li>Стоимость: от 7 950 рублей.</li><li>Длительность: 48 ак. часов.</li><li>Формат обучения: видео в записи и практика.</li><li>Сертификат: нет.</li></ul><p><b>Кому подойдет: </b>детям от 10 лет.</p><p><b>Преимущества:</b></p><ul><li>недорогой курс;</li><li>можно получить пробный доступ бесплатно;</li><li>бесплатные материалы и тренажеры;</li><li>хорошая скидка при оплате всего курса;</li><li>ребенок разработает 5 проектов для портфолио;</li><li>развитое сообщество единомышленников;</li><li>много практики.</li></ul><p><b>Недостатки:</b></p><ul><li>поддержка работает не круглосуточно;</li><li>нет связи с преподавателями.</li></ul><p><b>Программа обучения:</b></p><ul><li>Знакомство с профессией.</li><li>HTML.</li><li>CSS.</li><li>JavaScript.</li></ul><p><a href="https://experts2.ru/ZpRojq?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=11">Ознакомиться с полной программой &gt;&gt;&gt;</a></p><h2>Еще 18 курсов по HTML и CSS: онлайн-обучение верстке</h2><p>Навыки HTML и CSS актуальны в различных сферах. В этой подборке представлены дополнительные курсы для изучения этих инструментов.</p><ul><li><a href="https://experts2.ru/qzbGZm?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Основы HTML и CSS</a> от Контур.Школы — онлайн-курс, сочетающий теорию и тестирования для более плавного погружения в тему. В программу входят не только видеоуроки, но и лонгриды для самостоятельного изучения в комфортном темпе. Вариант подойдет для тех, кто хочет освоить инструменты с нуля или только систематизировать уже имеющиеся знания. Обучаясь на платформе, слушатели узнают, как учитывать особенности страниц в процессе разработки, использовать все возможности CSS для создания дизайна страниц и др.</li><li><a href="https://experts2.ru/vrtfMO?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Буткемп: Разработай сайт на HTML, CSS, JS</a> от Фоксфорда — программа для детей, включающая в себя 4 занятия. Юные слушатели, под руководством преподавателя, смогут разобраться в основах верстки на HTML и CSS.</li><li><a href="https://experts2.ru/cMzjyW?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Создание сайтов на языках HTML, CSS, JavaScript для детей</a> от Pixel — программа подготовлена для слушателей в возрасте от 12 лет. Курс структурирован, он разбит на модули, каждый из которых включает в себя 12 занятий. Обучение ведется в небольших группах, отбираемых по возрасту слушателей. Это делает образовательный процесс более плавным и комфортным. Преподаватели дадут навыки веб-разработки с такими инструментами, как JavaScript, а также HTML и CSS.</li><li><a href="https://experts1.ru/mJvCfs?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">CSS Flexbox - полный курс и практика его использования</a> от PurpleSchool — курс, в основу которого легли актуальные данные и изменения. Изучая видеоуроки и выполняя практические задания, слушатели смогут получить навыки верстки на CSS Flexbox, создания сложных сеток при работе с веб-сайтами. Также преподаватели углубятся в темы дизайна и позиционирования элементов. Для обучения доступно три разных тарифа.</li><li><a href="https://experts2.ru/pRBetr?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">HTML и CSS - полный курс по вёрстке с нуля</a> от PurpleSchool — онлайн-курс, ориентированный на новичков. В рамках обучения слушатели смогут узнать больше о верстке сайтов. Также эксперты-практики дадут навыки работы с Figma, верстки на CSS Grid, CSS Flexbox и др. Программа доступна в трех тарифах.</li><li><a href="https://experts2.ru/yxHtCn?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Next.js 14 - с нуля, React TypeScript, Hooks, SSR и CSS Grid</a> от PurpleSchool — программа обучения, основанная на актуальных данных и требованиях от работодателей. Обучаясь на платформе, слушатели получат навыки разработки приложений на Next.js 14 и React. Кроме того, студенты смогут лучше понимать особенности работы SSR и создания веб-сайтов, ориентированных на СЕО. Для слушателей подготовлены сотни уроков с конспектами, а также практические упражнения, позволяющие отработать полученные знания и навыки. Тестирования, также включенные в программу, позволяют оценить уровень знаний по каждой из тем. Курс доступен в трех тарифах.</li><li><a href="https://experts2.ru/mzBiCe?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Основы веб разработки CSS</a> от Знанио — онлайн-курс, позволяющий получить знания и навыки, необходимые для создания сайтов с применением CSS. Преподаватель расскажет об особенностях инструмента CSS в среде веб-разработки. Также эксперт углубится и в более сложные понятия: анимация, адаптивная верстка и др.</li><li><a href="https://experts2.ru/feVSml?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Основы веб разработки HTML</a> от Знанио — авторская программа, подготовленная экспертом-практиком. Обучаясь на платформе, слушатели получат навыки, необходимые для создания сайтов на HTML. Также студенты разберутся в особенностях языка HTML и стилизации различных элементов с помощью CSS. Программа включает в себя несколько тематических модулей, изучив их, выпускники получают сертификат.</li><li><a href="https://experts2.ru/ncUjQs?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Frontend-разработчик: сайты на HTML/CSS/JavaScript	</a> от Coddy School — программа, подготовленная для слушателей в возрасте от 11 до 14 лет. На платформе доступно как индивидуальное обучение, так и работа в небольших группах. Такой формат обеспечивает плавное погружение и эффективность. Преподаватели познакомят юных слушателей с HTML и CSS. А также углубятся в базы данных, CMS и даже Adobe Photoshop. Пройти курс можно как в онлайн, так и оффлайн формате. Для слушателей доступно бесплатное пробное занятие, оно поможет определиться, подходит ли программа для дальнейшего изучения.</li><li><a href="https://experts2.ru/rnSRjv?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Frontend-разработчик</a> от Eduson Academy — программа, направленная на профпереподготовку слушателей. Обучаясь на платформе, студенты получают поддержку персонального куратора на всех этапах. Эксперты-практики помогут в освоении навыков адаптивной и кроссбраузерной верстки на HTML и CSS. Также преподаватели научат программировать на JavaScript, применять систему Git, использовать фреймворки и др. На платформе используется интерактивный формат обучения: лекции, тренажеры, тестирование и скринкасты. Программа доступна в трех разных тарифах.</li><li><a href="https://experts2.ru/AvmZbi?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Курс «Frontend-разработчик»</a> от Kata Academy — курс, рассчитанный на 9 месяцев изучения. Преподаватели помогут освоить стек, который будет востребован в различных компаниях. Изучив материалы, студенты смогут работать с типами данных в JavaScript, выполнять работу с компилятором tsc, реализовать функции и др. В обучении делается большой упор на практику. Кроме того, у студентов есть возможность поработать над проектами для пополнения портфолио.</li><li><a href="https://experts2.ru/zquaQN?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Профессия: Frontend разработчик</a> от ProductStar — курс, разработанный на основе актуальных данных. Программа подготовлена специально на новичков, людей без без опыта, а также представителей смежных профессий. Преподаватели расскажут, как применять возможности HTML, CSS и Figma во фронтенд-разработке. Дополнительно студенты узнают, как работать с JavaScript, выполнять тестирование сайтов и приложений, работать над сложными проектами и др. В программе делается большой упор на практику, приближенную к реальным задачам. Также курс включает в себя онлайн-воркшопы и работу над проектами, которыми можно пополнить портфолио.</li><li><a href="https://experts2.ru/kvXVhb?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Профессия Frontend-разработчик PRO</a> от Skillfactory — универсальная программа, подходящая как для новичков, так и для практикующих IT-специалистов. В качестве основных инструментов фронтенд-разработки преподаватели рассмотрят HTML, CSS, а также JavaScript. Дополнительно, для оптимизации рабочих процессов, преподаватели научат работать с фреймворками Next.js и др. Большая часть программы – полезная практика.</li><li><a href="https://experts2.ru/wrUnBl?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Специализация Frontend-разработчик</a> от Skillfactory — курс, рассчитанный на получение необходимых навыков с нуля. В рамках освоения творческой IT-профессии, студенты изучат такие инструменты, как HTML, CSS, JavaScript, а также API, Git и др. Эксперты расскажут, как создавать страницы с адаптивным дизайном, применять фреймворки для работы с самыми сложными проектами и др. Студентам предоставляется возможность поработать над разноплановыми проектами для отработки навыков и пополнения портфолио.</li><li><a href="https://experts2.ru/ebpZxL?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Frontend-разработчик</a> от Нетологии — программа, в которой делается большой упор на практический формат обучения. Преподаватели-практики дадут навыки по проектированию интерфейсов веб-сайтов, приложений с применением функциональных возможностей HTML, CSS и JavaScript. Одним из преимуществ обучения на платформе является возможность поработать над совместными проектами с дизайнерами, это обеспечивает плавное погружение в рабочую сферу.</li><li><a href="https://experts2.ru/dmVEyt?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Фронтенд- разработчик с нуля</a> от Merion — курс, рассчитанный на изучение новичками. В рамках программы слушатели смогут в полной мере погрузиться в профессию фронтенд разработчика, освоив такие инструменты, как HTML, CSS и JavaScript. Кроме того, преподаватели расскажут, как работать с макетами, делать адаптивные сайты и др. Курс включает в себя не только теоретические материалы, но и разнообразные лабораторные работы и практические задания. Кроме того, у слушателей есть возможность поработать над проектами для пополнения своего портфолио. Асинхронный формат обучения позволяет получать новые знания в комфортном темпе.</li><li><a href="https://experts2.ru/vyxKfN?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Онлайн‑курс HTML и CSS. Профессиональная вёрстка сайтов</a> от HTML Academy — онлайн-курс для новичков, желающих быстро освоить профессиональную верстку сайтов. Для слушателей подготовлена не только актуальная и структурированная теоретическая составляющая, но и насыщенная практика, ревью кода от ведущих экспертов. В рамках обучения студенты откроют для себя такие инструменты, как HTML, CSS, JavaScript, а также React и др. Кроме того, студенты смогут поработать над проектами для отработки полученных знаний и навыков.</li><li><a href="https://experts2.ru/qahLiT?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Онлайн‑курс HTML и CSS. Адаптивная вёрстка и автоматизация</a> от HTML Academy — программа, позволяющая в сжатые сроки получить навыки востребованного специалиста. Преподаватели-практики дадут понимание основ с помощью углубленной теории. Кроме того, в программу включена практика и ревью кода. В рамках занятий вы сможете освоить все нужные для работы инструменты.</li></ul><h2>Бесплатные курсы по HTML и CSS: онлайн-обучение верстке</h2><p>HTML и CSS – языки веб-программирования, применяемые верстки страниц сайтов. Данная связка открывает широкие функциональные возможности для разработки. В этой подборке представлены бесплатные курсы по HTML и CSS.</p><p><b>1. </b><a href="https://experts2.ru/sGwmFk?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Бесплатный курс CSS: онлайн обучение с нуля</a> — <b>Code Basics </b></p><p>Бесплатный курс по CSS, подготовленный для новичков в сфере разработки. Обучаясь на платформе, слушатели откроют для себя возможности каскадных таблиц стилей. Начиная с введения, студенты изучат такие темы, как применение HTML и CSS, наследование стилей, классы и др. Курс включает в себя несколько модулей, посвященных стилю текста, блочным элементам, расположению элементов и др. Для получения доступа ко всем материалам и отслеживания прогресса в обучении необходимо зарегистрироваться на платформе, однако попробовать силы можно и без регистрации.</p><p><b>Главное о курсе: </b></p><ul><li>для изучения подготовлены структурированные текстовые материалы;</li><li>программа включает в себя отработку практики в браузере.</li></ul><p><b>2. </b><a href="https://experts2.ru/eZfEyo?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Бесплатный курс по HTML и CSS: обучение для начинающих во frontend</a> — <b>Result University </b></p><p>Программа создана для новичков, а также специалистов, желающих открыть для себя основы фронтенд-разработки. Знакомство с такими инструментами, как HTML и CSS позволяет сделать первый шаг к профессии фронтенд-разработчика. В рамках курса слушатели узнают, как устроен HTML, как работать с текстом, различными элементами. Дополнительно слушатели смогут попробовать свои силы в написании кода для создания структуры страницы. Также студенты откроют для себя функциональные возможности CSS: синтаксис, селекторы, работа с цветом, оформлением текста и др. Для изучения материалов потребуется в среднем 2 недели.</p><p><b>Главное о курсе: </b></p><ul><li>программа включает в себя работу над итоговым проектом;</li><li>студенты получают навыки необходимые для трудоустройства.</li></ul><p><b>3. </b><a href="https://experts2.ru/mpayTQ?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Frontend-разработка: основы HTML, CSS и JavaScript</a> — <b>Нетология </b></p><p>Курс, направленный на изучение материалов с нуля. Программа посвящена изучению базовых инструментов веб-разработки: HTML, CSS, а также JavaScript. Обучение позволяет получить необходимые навыки для разработки. Преподаватели-эксперты расскажут, как редактировать HTML-код для внесения корректировок в веб-страницу, научат добавлять стили к отдельным элементам. Кроме того, слушатели узнают, как верстать, работать с различным контентом, размещенным на сайте. Программа разделена на два модуля: первый посвящен изучению основ HTML и CSS, а второй основам фронтенд-разработки с JavaScript.</p><p><b>Главное о курсе: </b></p><ul><li>в программу включена работа над итоговым проектом для закрепления навыков;</li><li>есть домашние задания.</li></ul><p><b>4. </b><a href="https://experts2.ru/kqtsHL?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Веб-разработка для начинающих: HTML и CSS</a> — <b>Stepik</b></p><p>Курс, подготовленный командой экспертов-практиков. Обучение направлено на новичков без опыта. В рамках изучения программы, студенты познакомятся аспектами создания веб-страниц с применением HTML и CSS. Преподаватели познакомят с тегами, атрибутами HTML, углубятся в вопросы структуры документа, работы с медиа элементами. Также слушатели смогут узнать о синтаксисе CSS, особенности работы со шрифтами, цветом, фоном и др.</p><p><b>Главное о курсе:</b></p><ul><li>в программе предусмотрены практические задания и работа над выпускным проектом;</li><li>включает в себя выдачу сертификата.</li></ul><p><b>5. </b><a href="https://experts2.ru/sqJjEv?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Бесплатный курс по HTML: обучение html верстке для начинающих</a> — <b>Code Basics</b></p><p>Программа познакомит слушателей с ключевыми основами верстки HTML. Студенты смогут погрузиться в темы оформления текстовых материалов, работе с типографикой. Курс включает в себя несколько модулей, посвященных изучению основ разметки, работе с текстом, медиа элементами и др. Для изучения всего материала потребуется в среднем 10 часов. Программа включает в себя структурированные лекции в текстовом формате, приступать к их изучению можно в любое комфортное время. Для изучения всех материалов и отслеживания прогресса необходима регистрация на платформе, однако начать можно и без нее.</p><p><b>Главное о курсе: </b></p><ul><li>предусмотрена практика в браузере;</li><li>прохождения обучения необходимо пройти регистрацию на платформе.</li></ul><p><b>6. </b><a href="https://experts2.ru/PWgyce?sub1=tproger-kf&amp;sub2=html-i-css-kursy&amp;sub4=netop">Основы современной верстки</a> — <b>Хекслет   </b></p><p>Программа, созданная на основе актуальных материалов. В рамках изучения слушатели познакомятся с основами верстки веб-сайтов с применением HTML. Преподаватели расскажут о разметке, а также углубятся в функциональные возможности стандарта HTML5. В качестве дополнения эксперты дадут базовые навыки стилизации и работы с текстом с применением CSS. Данная программа может быть полезна для веб-разработчиков. За счет асинхронного формата изучения, получать новые знания и отрабатывать практические навыки можно в комфортном темпе.</p><p><b>Главное о курсе: </b></p><ul><li>структурированные лекции в текстовом формате;</li><li>предусмотрен тренажер для отработки практических навыков.</li></ul><h2>F.A.Q</h2><h2>Сколько времени требуется, чтобы стать разработчиком HTML и CSS?</h2><p>HTML и CSS являются достаточно простыми, интуитивно понятными языками, особенно если вы неплохо владеете английским. Освоить особенности верстки с помощью этих языков можно с нуля в достаточно сжатые сроки. Для этого может потребоваться 2-3 месяца. Если же вы хотите не только понять, как верстать сайты, заниматься их оформлением, но и добавлять интерактивные элементы с помощью JavaScript и стать полноценным Frontend-разработчиком, то на обучение необходимому минимуму потребуется около года.</p><h2>Трудно ли стать разработчиком HTML и CSS?</h2><p>Даже если у вас совсем нет навыков разработки, плохо с точными науками, то освоить языки несложно. Но нужно понимать, что они не настолько нужны работодателю, если вы не освоили еще и JavaScript. Поэтому навыков работы с этими языками хватит для работы на фрилансе, в качестве «бонуса» дизайнерам, которые хотят самостоятельно создавать сайты по собственным макетам.</p><h2>Стоит ли учиться на курсе разработчика HTML и CSS?</h2><p>Определенно да. Навыки, полученные на курсе можно не только монетизировать в сети, но и использовать для улучшения собственных проектов. Умение верстать сайты может пригодиться не только профильным специалистам, например, разработчикам и дизайнерам. Любой эксперт, который предлагает свои услуги (репетитор, дизайнер, бьюти-мастер и т.д.), может создать для себя интересный и уникальный сайт с помощью этих языков. Мы уже не говорим и о том, что с помощью HTML/CSS вы сможете создать собственный e-commerce сайт, сделать его привлекательным и интересным для потенциальных и постоянных покупателей.</p><h2>Смогу ли я совмещать работу и обучение?</h2><p>Большинство программ обучения HTML/CSS и даже полные профессиональные курсы Frontend/Web-разработки построены таким образом, что от вас не потребуется уделять учебе по 6-8 часов ежедневно. Вы сможете заниматься в комфортном темпе, поэтому проблем с обучением не возникает. Более того, многие школы предлагают удобные мобильные приложения для обучения, что позволит вам учиться в любом месте, например, по дороге на работу/учебу.</p><h2>Кто будет помогать на платформе во время обучения?</h2><p>Все зависит от конкретной школы, курса, а также тарифа обучения. Как минимум, на ваши вопросы всегда ответят специалисты службы поддержки. Однако большинство сервисов предлагает консультации экспертов-практиков, поддержку кураторов и наставников. Помощь специалистов направлена не только на поддержку во время учебы. Большая часть школ предлагает услуги карьерного центра с гарантией трудоустройства. Это говорит о том, что вы сможете обратиться за помощью к действующему HR-специалисту, который поможет вам с формированием портфолио, созданием резюме и прохождением собеседования.</p><h2>Хватит ли проектов в портфолио по окончании обучения?</h2><p>Все, опять же, зависит от выбранного курса. Одни программы подготовки рассчитаны на обучение базовым вещам. После них вы сможете верстать простенькие сайты и такого уровня может не хватить для полноценного трудоустройства. Другие предлагают не только создание крутых сайтов в ходе обучения, но и выполнение реальных заказов от компаний-партнеров. Такой формат позволит не только создать достойное портфолио, но и откроет возможности по трудоустройству в компанию, которой понравился результат вашей работы.</p><h2>Действуют ли программы рассрочки?</h2><p>Практически все школы предоставляют программы рассрочки. Не все они бывают комфортные, например, короткий срок рассрочки потребует вносить высокие платежи ежемесячно. Большая часть школ дает рассрочку через партнерские банки, но есть и такие, которые работают без банков. Например, Яндекс Практикум предлагает рассрочку от себя. Однако ее нужно выплатить за время обучения, поэтому платежи часто доходят до 20 тысяч рублей ежемесячно.</p><h2>Какой документ я получу после окончания курса?</h2><p>Зависит от формата, длительности и особенностей обучения, а также от имеющегося у вас образования. Если вы решите освоить полноценную профессию, то вам могут предоставить диплом о профессиональной переподготовке. Если вы хотите расширить свои компетенции, то вы сможете получить удостоверение о повышении квалификации. Такие бумаги выдаются только на основе имеющегося впо или спо. Если же у вас нет диплом вуза или ссуза, то вам выдадут свидетельство или сертификат о прохождении курса.</p><h2>Смогу ли я найти работу после обучения?</h2><p>Большинство сервисов не только предлагает обучение и практику, работу над собственным проектом, но и помощь в трудоустройстве/выходе на фриланс. Более того, некоторые школы дают гарантию трудоустройства или возвращают деньги. В среднем, школы заявляют, что 69-80% студентов находят работу как в течение курса, так и в первые 3 месяца после его окончания.</p><h2>Заключение</h2><p>Специалисты, которые владеют HTML/CSS могут работать как на фрилансе, так и работать на конкретную компанию или веб-студию. Уровень их зарплат во многом зависит от стека технологий, которыми они владеют. Например, верстальщики, которые работают только с HTML/CSS после курсов могут получать зарплату в диапазоне 40-130 тысяч рублей (<a href="https://hh.ru/search/vacancy?text=Html-%D0%B2%D0%B5%D1%80%D1%81%D1%82%D0%B0%D0%BB%D1%8C%D1%89%D0%B8%D0%BA&amp;from=suggest_post&amp;area=113&amp;hhtmFrom=main&amp;hhtmFromLabel=vacancy_search_line">по данным hh.ru</a>). Если же доучиться на фронтенд-разработчика, то нижняя планка зарплаты установится на уровне 100 тысяч рублей в месяц, а верхняя – поднимется до 490 тысяч рублей.</p><p><i>Нашли неточности или ошибки в нашем рейтинге? – Расскажите, пожалуйста, об этом в комментариях. Так же дайте знать, если учились на каких-то курсах, которые не попали в подборку, я проверю и добавлю их в наш топ.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>В CSS появилось удобное центрирование объектов одной строкой кода через align-content</title>
      <link>https://tproger.ru/news/--v-css-poyavilos-udobnoe-centrirovanie-obektov-odnoj-strokoj-koda-cherez-align-content</link>
      <comments>https://tproger.ru/news/--v-css-poyavilos-udobnoe-centrirovanie-obektov-odnoj-strokoj-koda-cherez-align-content?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--v-css-poyavilos-udobnoe-centrirovanie-obektov-odnoj-strokoj-koda-cherez-align-content</guid>
      <description><![CDATA[<p>В 2024 году CSS получила долгожданное обновление — свойство align-content, которое устраняет сложные обходные решения для вертикального центрирования элементов. Теперь веб-разработчики могут центровать контент всего одной строкой кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--v-css-poyavilos-udobnoe-centrirovanie-obektov-odnoj-strokoj-koda-cherez-align-content">В CSS появилось удобное центрирование объектов одной строкой кода через align-content</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 19 Aug 2024 06:53:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2024 году в CSS наконец-то добавили свойство, которое облегчит жизнь всем веб-разработчикам: align-content.</p><p>Это обновление устраняет необходимость в сложных обходных решениях, которые ранее требовались для вертикального центрирования элементов. Теперь достаточно всего одной строки кода, чтобы контент оказался там, где нужно.</p><h2>Почему это важно?</h2><p>Долгие годы веб-разработчики сталкивались с тем, что вертикальное центрирование было настоящей головной болью.</p><p>Приходилось использовать различные хаки и трюки, включая использование псевдоэлементов, сложные комбинации флексбоксов и гридов. Всё это было как танцы с бубном, только в мире CSS.</p><p>Вспомним, что до появления современных CSS-технологий, разработчики часто прибегали к таблицам и даже JavaScript, чтобы добиться желаемого результата.</p><h2>Меньше кода — больше результата</h2><p>Теперь с align-content ситуация коренным образом изменилась.</p><p>Одной строчкой кода можно сделать то, что раньше требовало множества ухищрений. Это не просто удобство — это революция в том, как мы будем писать стили в будущем. Все эти хитрости, с которыми мы жили столько лет, наконец-то уходят в прошлое.</p>]]></content:encoded>
    </item>
    <item>
      <title>Манипуляции с CSS в HTML-письмах обходят предупреждения безопасности в Outlook</title>
      <link>https://tproger.ru/news/--manipulyacii-s-css-v-html-pismah-obhodyat-preduprezhdeniya-bezopasnosti-v-outlook</link>
      <comments>https://tproger.ru/news/--manipulyacii-s-css-v-html-pismah-obhodyat-preduprezhdeniya-bezopasnosti-v-outlook?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--manipulyacii-s-css-v-html-pismah-obhodyat-preduprezhdeniya-bezopasnosti-v-outlook</guid>
      <description><![CDATA[<p>Исследователи из Certitude обнаружили уязвимость в функции «First Contact Safety Tip» в Outlook, позволяющую обходить антивирусную защиту и скрывать предупреждения. Microsoft пока не устранила проблему, увеличивая риск открытия вредоносных писем пользователями. Уязвимость связана с манипуляциями CSS в HTML-письмах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--manipulyacii-s-css-v-html-pismah-obhodyat-preduprezhdeniya-bezopasnosti-v-outlook">Манипуляции с CSS в HTML-письмах обходят предупреждения безопасности в Outlook</a>»</p>]]></description>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Aug 2024 06:07:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Исследователи обнаружили метод обхода антивирусной защиты в Outlook, что повышает риск открытия пользователями вредоносных писем.</p><p>Уязвимость связана с функцией «First Contact Safety Tip», которая предупреждает получателей в Outlook при получении письма с неизвестного адреса.</p><h2>Обход предупреждений безопасности</h2><p>Аналитики Certitude, обнаружившие эту уязвимость, сообщили о своем открытии Microsoft, но компания пока не приняла мер по устранению проблемы.</p><p>Функция «First Contact Safety Tip» предназначена для оповещения пользователей Outlook при получении писем от новых контактов. Она выводит сообщение: <i>«Вы не часто получаете письма от xyz@example.com. Узнайте, почему это важно»</i>.</p><h2>Скрытие предупреждения</h2><p>Главная особенность этой функции заключается в том, что предупреждение добавляется к основному тексту HTML-письма, что открывает возможность для манипуляций с использованием CSS, встроенного в письмо.</p><p>Certitude обнаружила, что можно скрыть это сообщение безопасности, изменив CSS, как показано ниже:</p><p>Подобные изменения делают предупреждение невидимым для получателя письма.</p><p>Certitude также нашла способ добавить HTML-код, который подделывает иконки, добавляемые Outlook к зашифрованным/подписанным письмам, чтобы они выглядели более безопасными.</p><h2>Реакция Microsoft</h2><p>Certitude отправила Microsoft доказательство концепции этих техник и подробный отчет через Microsoft Researcher Portal (MSRC). Однако, Microsoft ответила:</p><blockquote>Мы определили, что ваше обнаружение действительно, но не соответствует нашим требованиям для немедленного обслуживания, учитывая, что это в основном применимо к фишинговым атакам. Тем не менее, мы отметили ваше обнаружение для будущего рассмотрения как возможность улучшить наши продукты.</blockquote><p>На момент публикации Microsoft не дала дополнительных комментариев по поводу своего решения не устранять риск немедленно.</p>]]></content:encoded>
    </item>
    <item>
      <title>30 самых полезных библиотек Python для веб-разработки в 2024 году</title>
      <link>https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu</link>
      <comments>https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лена Капаца]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu</guid>
      <description><![CDATA[<p>Полный список библиотек Python для веб-разработки: от Django и FastAPI до pandas и cryptography. Сохраните в закладки — пригодится каждому разработчику.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/30-samyh-poleznyh-bibliotek-python-dlya-veb-razrabotki-v-2024-godu">30 самых полезных библиотек Python для веб-разработки в 2024 году</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Jul 2024 09:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы только подступились к верстке своего первого сайта на Python, эта статья поможет разобраться, какие библиотеки Python и инструменты — мастхэв, и чем вообще руководствоваться при выборе инструмента.</p><p>Кстати, вы можете проверить свои знания: <a href="https://tproger.ru/quiz/zachem-nuzhna-eta-biblioteka-python-v-veb-razrabotke">попробуйте угадать, для чего нужна та или иная Python-библиотека</a>.</p><p>Гайд написан владелицей Django-сайта. Если вам интересно, как пересесть с nocode-CMS вроде WordPress на самописную админку, посмотрите эту статью.</p><h2>Универсально для всех фреймворков</h2><p>Даже если не все инструменты понятны и нужны сразу, сохраните этот листинг в закладки: тогда тулы вроде gunicorn станут «на вырост».</p><ul><li><a href="https://pillow.readthedocs.io/">pillow</a>: библиотека для работы с изображениями.</li><li><a href="https://www.psycopg.org/docs/">psycopg</a>: один из лучших адаптеров PostgreSQL для Python.</li><li><a href="https://pypi.org/project/python-dateutil/1.4/">python-dateutil</a>: расширение для стандартного py-модуля datetime.</li><li><a href="https://www.npmjs.com/package/bootstrap-icons">boostrap-icons</a>: npm-пакет с иконками, прикручиваемый к HTML-темплейту.</li></ul><ul><li><a href="https://tzdata.readthedocs.io/">tzdata</a>: утилита с информацией о временных зонах.</li><li><a href="https://urllib3.readthedocs.io/">urllib3</a>: для выполнения запросов к веб-серверам.</li><li><a href="https://requests.readthedocs.io/">requests</a>: одна из самых популярных библиотек для HTTP-запросов на Python.</li><li><a href="https://pypi.org/project/sqlparse/">sqlparse</a>: форматирование и парсинг SQL-запросов.</li><li><a href="https://pypi.org/project/text-unidecode/">text-unidecode</a>: транслитерация из Unicode в ASCII.</li></ul><ul><li><a href="https://pandas.pydata.org/docs/">pandas</a>: библиотека для работы с табличными данными.</li><li><a href="https://eff-certbot.readthedocs.io/">certbot</a>: бесплатные SSL-сертификаты.</li></ul><ul><li><a href="https://plotly.com/python/">plotly</a>: дизайнерские графики с тонкой настройкой почти любого аспекта.</li></ul><ul><li><a href="https://fastapi.tiangolo.com/">FastAPI</a>: современный, быстрый веб-фреймворк для создания API.</li><li><a href="https://docs.pytest.org/en/stable/contents.html">pytest</a>: быстрее способа писать тесты для ваших функций просто нет.</li><li><a href="https://docs.gunicorn.org/">gunicorn</a>: сервер для запуска Python веб-приложений.</li></ul><ul><li><a href="https://pypi.org/project/six/">six</a>: библиотека для совместимости кода между Python 2 и 3.</li></ul><ul><li><a href="https://pypi.org/project/PyYAML/">PyYAML</a>: человекочитаемый формат конфигов.</li></ul><p>Для подобных файлов Python нужен отдельный коннектор</p><ul><li><a href="https://pypi.org/project/wheel/">wheel</a>: ускоряет установку библиотек и модулей.</li><li><a href="https://pypi.org/project/charset-normalizer/">charset-normalizer</a>: управляет кодировкой текста.</li></ul><p>Помимо прочего, обеспечивает совместимость с разными браузерами и спасает от вредоносного кода, отправляемого через формы.</p><ul><li><a href="https://pypi.org/project/idna/">idna</a>: обработка доменных имен с интернациональными символами.</li></ul><ul><li><a href="https://pypi.org/project/typing-extensions/">typing-extensions</a>: аннотация типов для разных версий Python.</li></ul><p>Инструмент позволяет, например, на Python 2, использовать аннотацию типов крайней версии языкового пакета.</p><ul><li><a href="https://pypi.org/project/cryptography/">cryptography</a>: шифрование, хэширование — защита ваших данных от третьих лиц.</li></ul><p>Прочитать зашифрованное сообщение без «ключа» у хакера не получится.</p><ul><li><a href="https://pypi.org/project/fsspec/">fsspec</a>: унифицирует обращение с файлами вне зависимости от ОС.</li><li><a href="https://pypi.org/project/MarkupSafe/">MarkupSafe</a>: безопасное отображение HTML/XML-текста.</li><li><a href="https://pypi.org/project/python-slugify/">python-slugify</a>: создание коротких дружелюбных URL.</li></ul><h2>Django-мастхэв</h2><ul><li><a href="https://pypi.org/project/django-tailwind/">django-tailwind</a>: интеграция CSS-фреймворка Tailwind с Django.</li><li><a href="https://django-tinymce.readthedocs.io/">django-tinymce</a>: интеграция WYSIWYG-редактора TinyMCE.</li></ul><ul><li><a href="https://pypi.org/project/django-mathjax/">django_mathjax</a>: пакет для встраивания MathJax.</li></ul><p>Вжух! И читатель увидит следующее:</p><ul><li><a href="https://pypi.org/project/django-orm/">django-orm</a>: переключение между SQLite и PostgreSQL.</li><li><a href="https://pypi.org/project/django-js-asset/">django-js-asset</a>: управление зависимыми от JavaScript файлами.</li></ul><h2>Заключение</h2><p>Стоит признать: подбор стека — задача не для новичков. Пока начинающий веб-разработчик только-только справляется со стандартными для сайта фичами, вроде форм обратной связи и картинками с CDN-ссылок, оперативной памяти мозга на выбор библиотек, как правило, не остается. Вы можете воспользоваться предложенными в статье общепринятыми решениями, однако функционал моего блога и вашего проекта наверняка различаются. Списка выше будет недостаточно.</p><p>В такой ситуации полезны LLM: ChatGPT и прочие ассистенты даже с меньшим числом параметров справляются с выдачей общепринятых решений «на пять». Так что начинаем с проверенного комьюнити решения по умолчанию, и только потом, когда ощутим свободу и желание экспериментировать, пробуем менять pandas на polars.</p><p>Мне не хочется обманывать новоприбывших, что переписывать под новую библиотеку весь код — нормально. Это ресурсоемко и больно. Тем более, если это ваш пет-проект, и на него приходится разыскивать время.</p><p><i>Если вас как веб-разработчика порадовал какой-то новый питонический инструмент, способный потеснить укоренившиеся решения, поделитесь в комментариях.</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Работа над Serverless SSR, новости CSS и партия в DnD. Ретроперспектива недели с Сергеем Совой</title>
      <link>https://tproger.ru/articles/rabota-nad-serverless-ssr--novostyah-css-i-partiyu-v-dnd--retroperspektiva-nedeli-s-sergeem-sovoj</link>
      <comments>https://tproger.ru/articles/rabota-nad-serverless-ssr--novostyah-css-i-partiyu-v-dnd--retroperspektiva-nedeli-s-sergeem-sovoj?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rabota-nad-serverless-ssr--novostyah-css-i-partiyu-v-dnd--retroperspektiva-nedeli-s-sergeem-sovoj</guid>
      <description><![CDATA[<p>Запускаем новую рубрику на Tproger. В первом выпуске — Сергей Сова, разработчик, фронтендер и подкастер, делится своими мыслями о Serverless SSR, новостях CSS и мастхев книге. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rabota-nad-serverless-ssr--novostyah-css-i-partiyu-v-dnd--retroperspektiva-nedeli-s-sergeem-sovoj">Работа над Serverless SSR, новости CSS и партия в DnD. Ретроперспектива недели с Сергеем Совой</a>»</p>]]></description>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Ретроперспектива недели]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Jun 2024 14:05:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет, типичные программисты. Это первый выпуск в рубрике «Ретроперспектива недели», где будем рассказывать о специалистах, которые делают IT сферу медийной, а также о тех, с кем мы запускаем (или планируем запускать) коллаборации.</p><p>В этом выпуске мы поговорим с Сергеем Совой — пишет о фронтенд-разработке на effector в своём <a href="https://t.me/sergeysova">тг-канале «Сова пишет...»</a>, записывает подкасты и запустил образовательную программу <a href="https://frontend.vision">frontend.vision</a>.</p><h2>Как прошла неделя? Над чем работаешь в последнее время?</h2><p>На этой неделе я работаю над screenstory.io и ещё одним крупным проектом с той же командой. Мы готовим большую фичу, и для её реализации выбрали SSR на Cloudflare Serverless, так как у него самый вменяемые инструменты. Но условный Fastify не поддерживает инфраструктуру Cloudflare, выбрал itty-router, чтобы сохранить роутинг между serverless и локальным fastify сервером.</p><h2>Какая из последних IT новостей запомнилась больше всего? Почему?</h2><p><a href="https://motion.dev/blog/do-you-still-need-framer-motion">Do you still need Framer Motion? - Motion One Blog</a></p><p>Меня радует, что современные стандарты CSS развиваются в сторону большей мощности. Недавно появились Container Queries, а уже сейчас более <i>70%</i> браузеров их поддерживают.</p><h2>С какой сложной задачей ты столкнулся в последнее время и как её решил?</h2><p>Задача, над которой я работаю на этой неделе, оказалась настоящим вызовом. Но в любой ситуации стоит начинать с реализации самого простого, но рабочего решения. В дальнейшем рабочее решение можно итеративно усложнять, каждый раз проверяя его работоспособность.</p><h2>Что из музыки или подкастов слушал на неделе?</h2><p>Мои вкусы очень специфичны, на этой неделе переслушивал Tove Lo, Nelly Furtado, Eminem, Lady Gaga.</p><h2>Что почитать? Поделиcь своей рабочей литературой или для досуга</h2><p>Я не перестану советовать Питера Уоттса, его роман «Ложная слепота» отзывается во мне последнее время. Вы вообще видели новости AI и какие оптимизации когнитивных моделей появляются в статьях у исследователей?</p><h2>Топ-3 инструмента для работы</h2><p>С 2021 года я пользуюсь <a href="http://Linear.app">Linear.app</a> для рабочих и личных проектов, отличный инструмент планироания и декомпозиции.</p><p>Активно использую <a href="http://Morgen.so">Morgen.so</a> вместо стандартного календаря, так как есть возможность перетащить задачи из Linear прям на календарь, в виде Time Blocking.</p><p>И недавнее открытиее — Finch, где отслеживаю дневную рутину. Это такое Self Care приложение с приятной геймификацией.</p><h2>Какие планы на выходные или что можешь посоветовать из досуга?</h2><p>Обычно не строю планов на выходные, но на неделе сыграл с друзьями в легендарную партию DnD. Занятие не для каждого, но именно эта партия заставила меня пережить довольно широкий спектр эмоций!</p><h2>Как итог — любимый IT-мем недели!</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-06-21/cdb69c32-6b87-426b-a529-fcbf23a42a8e.png" alt="" /></figure><p>Это была новая рубрика на Tproger, где мы рассказываем об интересных нам людях, которые развивают IT-сообщество. Если у вас есть идеи, кого бы вы хотели видеть в следующем выпуске, дайте нам знать!</p>]]></content:encoded>
    </item>
    <item>
      <title>Margin и padding в CSS: как сразу сделать грамотно</title>
      <link>https://tproger.ru/articles/margin-i-padding-v-css--kak-srazu-sdelat-gramotno</link>
      <comments>https://tproger.ru/articles/margin-i-padding-v-css--kak-srazu-sdelat-gramotno?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лена Капаца]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/margin-i-padding-v-css--kak-srazu-sdelat-gramotno</guid>
      <description><![CDATA[<p>Разбираемся в ключевых отличиях между этими важнейшими свойствами, а также знакомимся с трюками, чтобы UI / UX вашего сайта стал еще круче и грамотнее.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/margin-i-padding-v-css--kak-srazu-sdelat-gramotno">Margin и padding в CSS: как сразу сделать грамотно</a>»</p>]]></description>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Веб-дизайн]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 30 May 2024 08:00:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Отступы играют важную роль в веб-дизайне — они обеспечивают расстояние между элементами и создают визуально приятный интерфейс. В CSS для этого используют свойства margin и padding.</p><p>В этой статье я расскажу про ключевые отличия между ними, а также познакомлю с трюками, чтобы UI/UX вашего сайта стал ещё круче.</p><p>В качестве примеров я буду использовать свой сайт на Django.</p><p>Если вы хотите перейти с nocode-сайта на самописный, изучите <a href="https://tproger.ru/articles/migriruem-s-no-code-cms-na-django-powagovyj-gajd-chast-2">пошаговый гайд по миграции на Python Django</a>.</p><h2>Что такое margin и padding</h2><p>Как я уже сказала, в CSS для управления пространством между элементами используются два ключевых свойства:</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2024-05-28/aa5c1735-f50e-4ee3-90cc-33fb754cdbc8.png" alt="Margin и padding" /><figcaption>Margin отвечает за пространство снаружи элемента, а padding — за пространство внутри</figcaption></figure><p>Большая разница между ними в том, что margin автоматически сворачивается, а padding — нет.</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2024-05-28/06f6e55b-1b4b-4819-a1b3-c3a021c818fe.jpg" alt="Виды отступов на примере" /><figcaption>Виды отступов на примере</figcaption></figure><h2>Margin</h2><p>Чтобы задать внешние отступы со всех сторон, указываем их размер в пикселях (или в других юнитах):</p><p>Кстати, вот основные единицы измерения в CSS для повторения:</p><ul><li>px (пиксели): 1px соответствует одному экранному пикселю;</li><li>cm / mm / in: санти- / миллиметры, дюймы;</li><li>em: относительно шрифта родительского элемента. Например, если шрифт родителя 16px, то 2em будет равно 32px;</li><li>rem: относительно шрифта корневого элемента. Если размер корневого шрифта 16px, то 2rem будет равно 32px;</li><li>% (проценты): относительно родительского элемента. Например, если ширина родителя 1000px, то 50% будет 500px;</li><li>vh / vw (viewport height / width): 1vh равен 1% от высоты области просмотра (viewport);</li><li>vmin / vmax: 1vmin / 1vmax равен 1% от меньшего / большего из двух измерений (ширины или высоты) области просмотра.</li></ul><p>Отдельные значения для каждой стороны задаются постфиксами top / right / bottom / left:</p><h2>Центрирование</h2><p>Чтобы разместить посередине блоковый элемент горизонтально, можно использовать постфиксы left / right:</p><h2>Перекрытие соседей</h2><p>Иногда требуется сдвинуть элемент ближе к соседу:</p><p>↑ Как меняется положение текстовых блоков, если margin = 0 или  &lt; 0.</p><h2>Padding</h2><p>Вот основной способ задания внутренних отступов:</p><p>Отдельные значения для каждой стороны задаются аналогично: постфиксами top, bottom, right, left. В целом синтаксис почти одинаковый.</p><p>Значение padding можно задавать также в процентах относительно ширины родительского элемента, что полезно для адаптивного дизайна.</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2024-05-28/cb4e6554-cb21-4f8b-b6f9-568703271ff9.png" alt="Внутренний отступ" /><figcaption>Внутренний отступ равен 50px, потому что это 10% от ширины родительского блока — 500px</figcaption></figure><h2>Почему не работает margin</h2><p>Убедитесь, что элемент является блочным, поскольку margin «дружит» только с блоками (div, p, h1-6, ul, ol. li, table, header, footer, section, article, nav).</p><h2>Margin добавляет пространство вне родительского элемента</h2><figure><img src="https://media.tproger.ru/user-uploads/79101/2024-05-28/40884b02-b39a-4307-aac9-cdd3687a05e0.png" alt="Что получается" /><figcaption>Что получается</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/79101/2024-05-28/e8b6222d-537f-42b3-becf-eba8284e93b2.png" alt="Что ожидаем" /><figcaption>Что ожидаем</figcaption></figure><p>Решение: дописываем свойство overflow:auto к div’у страницы.</p><h2>Как увеличить пространство между колонками в таблице?</h2><p>Внедряем padding-right:</p><h2>margin дочернего элемента двигает родителя</h2><p>Обновляем свойства второго:</p><h2>Заключение</h2><p>Эти свойства CSS создателям удалось сделать прозрачными и без подводных камней: по статистике, треды на Stack Overflow на эти темы закрываются быстрее других топиков.</p><p>На последок: с визуализатором блоков в Chrome Dev Tools вёрстка стилей значительно проще.</p><figure><img src="https://media.tproger.ru/user-uploads/79101/2024-05-28/d9e3c30a-2a54-42ba-b82d-73577bbf255a.png" alt="Chrome Dev Tools" /><figcaption>Chrome Dev Tools</figcaption></figure>]]></content:encoded>
    </item>
    <item>
      <title>Фронтенд-разработка: чем занимаются и сколько зарабатывают специалисты</title>
      <link>https://tproger.ru/articles/frontend-razrabotka--chem-zanimayutsya-i-skolko-zarabatyvayut-specialisty</link>
      <comments>https://tproger.ru/articles/frontend-razrabotka--chem-zanimayutsya-i-skolko-zarabatyvayut-specialisty?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Лалетин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/frontend-razrabotka--chem-zanimayutsya-i-skolko-zarabatyvayut-specialisty</guid>
      <description><![CDATA[<p>Профессия фронтенд-разработчика сейчас в числе самых востребованных в IT. Разбираем базовые вопросы для тех, кто планирует стать фронтенд-разработчиком.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/frontend-razrabotka--chem-zanimayutsya-i-skolko-zarabatyvayut-specialisty">Фронтенд-разработка: чем занимаются и сколько зарабатывают специалисты</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Фреймворки и библиотеки]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 15 May 2024 08:21:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>Для тех, кто хочет вкатиться в сферу, разобрали основные вопросы и рассказали, на что стоит обращать внимание начинающим специалистам.</p><h2>Чем занимаются фронтенд-разработчики</h2><p>Фронтенд-разработчик пишет интерфейс — ту часть сайта или приложения, с которой взаимодействуют пользователи. Задача специалиста — сделать его максимально понятным и комфортным для них.</p><p>Фронтендер отвечает за то, чтобы все элементы интерфейса были на своих местах и работали как надо: меню, кнопки и формы обратной связи, корзины, карточки товаров (и это далеко не весь список).</p><h2>Какие навыки нужны специалистам</h2><p>Самый распространенный список хард скиллов выглядит так:</p><ul><li>HTML — формирование структуры страницы;</li><li>CSS — добавление цветов, позиционирование элементов, анимации и прочее.</li><li>JavaScript и TypeScript — добавление «интерактивности», элементов, которые решают  задачи пользователя прямо в браузере.</li><li>фреймворки, например, React или Vue — разработка полноценных веб-приложений.</li></ul><p>Еще фронтенд-разработчику нужны софт-скиллы. Среди них умение копать вглубь, разбираться в сути задач как с точки зрения бизнеса, так и пользователей и умение работать в команде.</p><h3>Важнейшие навыки — умения общаться и вставать на место пользователя</h3><p>Комфорт пользователя при работе с интерфейсом — одна из важнейших составляющих общего впечатления о продукте. И чтобы его обеспечить, фронтенд-разработчику нужны в первую очередь не технические навыки, а умение проявлять эмпатию, вставать на место пользователя, понимать его потребности.</p><p>И только когда эти потребности четко сформулированы, можно переходить к коду.</p><p>Чтобы создать максимально комфортное приложение, потребуется работать вместе с дизайнерами, аналитиками, бэкенд-разработчиками, тестировщиками и другими участниками команды. Можно поискать хорошие решения у коллег по цеху. Фронтенд — достаточно открытая сфера, и многие разработчики с радостью делятся своими решениями в статьях и докладах. Или даже выкладывают исходный код проектов на GitHub.</p><h3>Еще нужно постоянно быть в курсе изменений</h3><p>Фронтенд — относительно молодая и стремительно развивающаяся сфера, в которой регулярно появляются новые технологии и практики. И требования к специалистам очень зависят от трендов и потребностей аудитории.</p><p>Например, когда-то сайты были простыми, легковесными страницами. Для их разработки использовали HTML, CSS и немного JavaScript-кода. Но требования к интерфейсам росли, больше логики переносилось на клиентскую часть — доля JS начала расти и появились фреймворки, которые помогали делать самостоятельные веб-приложения.</p><p>В процессе выросло время загрузки сайта, поскольку загрузка и выполнение JavaScript-кода гораздо дороже для браузера, чем работа со статическим HTML. Чтобы вернуть время до показа пользователю контента к прежним показателям, возникла техника SSR (Server Side Rendering), которая позволяет выполнить большую часть логики формирования интерфейса на сервере. Она оказалась особенно актуальна для сайтов, на которых пользователь в первую очередь получает какую-либо информацию, а не взаимодействует с интерфейсом: сайты со статьями и новостями, лендинги и так далее. И появились метафреймворки (например, Next.js). Они позволили структурировать код так, чтобы в браузер отправлялось минимальное количество JavaScript при той же функциональности.</p><p>В противовес появилась технология PWA (Progressive Web Application), которая оказалась полезна сложным интерактивным приложениям (приложения банков, графические редакторы или интернет-магазины). Она позволила устанавливать веб-приложения на смартфоны или планшеты и пользоваться ими вне браузера, порой даже без интернета.</p><h2>Сколько зарабатывают фронтендеры</h2><p>По данным «Хабр Карьеры» зарплаты фронтенд-разработчиков составили в среднем 150 тысяч. Джуниоры в России в среднем получают 60 тысяч,  специалисты уровня мидл — 150+ тыс. руб. в месяц, а сеньоры — 280+ тыс. руб.</p><p>Стажеры получают около 40 тысяч.</p><p>Зарплата сотрудника в любой компании будет зависеть от того, насколько быстро и качественно будет решать потребности бизнеса, в том числе — взаимодействовать с клиентами.</p><h2>Куда можно расти</h2><p>Из фронтенда можно вырасти в другие специальности — не особо меняя стек технологий. Например, если перейти с React DOM на React Native, можно перейти с фронтенда в мобильную разработку. И не нужно учить новый язык и кардинально менять навыки.</p><p>А JavaScript используют везде: программирование микроконтроллеров и роботов, создание мобильных приложений и игр, даже анимация и создание видеоконтента.</p><p>Подробнее о пути развития фронтенд-разработчика вы можете узнать <a href="https://tproger.ru/articles/chto-dolzhen-umet-frontend-razrabotchik-v-2023-godu-roadmap">в статье «Что должен уметь Frontend разработчик (+Roadmap)»</a>.</p><p>Фронтенд-разработка тесно связана с DevOps. Если вы хотите расширить свои навыки и работать в динамичной среде, обратите внимание на вакансию <a href="https://tproger.ru/jobs/devops-inzhener-10">Devops-инженера в Островок — travel-tech компанию.</a> Этот опыт поможет вам лучше понять взаимодействие между разработкой и эксплуатацией.</p><h2>И пара советов напоследок</h2><p>1. Слушайте тематические подкасты, например:</p><ul><li><a href="https://web-standards.ru/podcast/">«Веб-стандарты»</a> — здесь обсуждают тренды, актуальные технологии. Это мастхэв для фронтенд-разработчика.</li><li><a href="https://podlodka.io">«Подлодка»</a> — про IT целом. Очень полезен, чтобы расширить кругозор.</li></ul><p>2. Посещайте профильные конференции и митапы:<a href="https://www.youtube.com/@HolyJS"> HolyJS</a>;<a href="https://www.youtube.com/watch?v=IfhNItY_AEA"> Frontend Conf</a>;<a href="https://www.youtube.com/@YandexforFrontend"> Я 💛 Фронтенд</a>.</p><p>3. Читайте тематические ресурсы:</p><ul><li>Популярный в русскоязычном сегменте<a href="https://habr.com/"> Habr</a>.</li><li><a href="https://dev.to/">dev.to</a> — похожий на Хабр англоязычный ресурс.</li><li><a href="https://doka.guide/?ysclid=lqfyk45ffr573948812">Дока</a> — русскоязычная энциклопедия про веб-технологии. Весь контент и исходный код есть в открытом доступе на GitHub и поддерживаются сообществом. Так что любой может внести свой вклад в ее развитие.</li><li><a href="https://developer.mozilla.org/ru/">MDN</a> — справочник преимущественно на английском языке. Русскоязычная версия обновляется с задержкой, поэтому советуем прокачать язык.</li></ul><p>4. Проходите профессиональное обучение. Могу посоветовать курс <a href="https://skillbox.ru/course/frontend-developer/">«Профессия Фронтенд-разработчик»</a>, который мы делали вместе со Skillbox.</p><p>5. Пользуйтесь интерфейсами, которые создавали другие разработчики, и черпайте вдохновение из них.</p>]]></content:encoded>
    </item>
    <item>
      <title>Стилизация участков текста с помощью CSS Custom Highlight API</title>
      <link>https://tproger.ru/articles/css-custom-highlight-api</link>
      <comments>https://tproger.ru/articles/css-custom-highlight-api?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Хайруллин Булат]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/css-custom-highlight-api</guid>
      <description><![CDATA[<p>В этой статье я расскажу, как с помощью CSS Custom Highlight API можно стилизовать выделенные диапазоны текста, а также разберу теорию на практическом примере.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/css-custom-highlight-api">Стилизация участков текста с помощью CSS Custom Highlight API</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 08 May 2024 07:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Задача по настройке внешнего вида диапазонов текста часто встречается в работе Frontend-разработчика.</p><p>В этой статье мы рассмотрим стилизацию участков текста с помощью CSS Custom Highlight API, а также изучим практическую сторону создания диапазонов выделения.</p><p>Обозначение орфографических и грамматических ошибок красивой волнистой линией в текстовых редакторах, таких как Google Docs, Word или Dropbox Paper — яркий пример стилизации отдельно взятых частей текста. Однако стилизовать отдельные участки нужно не только для того, чтобы указать пользователю на ошибки в текстах. Это полезно и во многих других случаях: например, в визуализации специфических данных в отчётах, обозначении частей кода и даже в образовательных целях, когда нужно выделить информацию на странице.</p><p>Еще одна распространенная задача — создание функции поиска и выделения текста, когда пользователь ввёл текст в поле поиска. Нажмите Ctrl/⌘+ F в веб-браузере прямо сейчас и введите что-нибудь и вы увидите, как текст из этой статьи будет подсвечиваться.</p><p>Недавно я наткнулся на статьи, в которых рассказывалось, как решить эту задачу. Я захотел разобраться в этой теме и адаптировал статьи на русский язык. Подробно я остановился на вещах, которые мне показались наиболее сложными и важными.</p><p>CSS Custom Highlight API расширяет концепцию других псевдо-элементов выделения, таких как ::selection, ::spelling-error, ::grammar-error, и ::target-text. Он предоставляет способ создания и стилизации произвольных Range-объектов, не  ограничиваясь диапазонами, определяемыми браузером.</p><p>Используя CSS Custom Highlight API, вы можете создавать текстовые диапазоны и выделять их, не влияя на структуру DOM на странице. Я считаю, что в этом главный плюс этого инструмента.</p><p>Кстати, Kata Academy набирает студентов на обучение JavaScript. Это отличная возможность, так как вы не платите за обучение, пока не устроитесь Javascript-разработчиком! Подробности здесь → <a href="https://tproger.ru/courses/kurs-po-javascript-razrabotke-ot-kata-academy?erid=LjN8KcGuo">Курс по JavaScript-разработке от Kata Academy.</a></p><h2>Оформление</h2><p>Чтобы оформить диапазоны текста на веб-странице с помощью CSS Custom Highlight API, нужно выполнить четыре шага:</p><p>1. Создать Range-объекты.</p><p>2. Создать Highlight-объекты для этих диапазонов.</p><p>3. Зарегистрировать выделения с помощью HighlightRegistry.</p><p>4. Стилизовать текст с помощью псевдоэлемента ::highlight().</p><p>Дальше я подробно остановлюсь на каждом из этих процессов.</p><h2>Создание Range диапазонов</h2><p>Первый шаг — указание текстовых диапазонов, которые нужно стилизовать. Для этого мы создаём объекты Range в JavaScript. Взгляните на пример ниже:</p><h2>Создание Highlight-объектов для диапазонов</h2><p>Следующий этап — организация инстанций Highlight-объектов для ваших текстовых диапазонов. Highlight — это программа, применяемая для создания набора диапазонов, которые будут стилизованы на веб-странице.</p><p>Несколько диапазонов могут быть связаны с одним выделением. Если вы хотите выделить несколько фрагментов текста одним и тем же способом, вам нужно создать одно выделение и инициализировать его соответствующими диапазонами, как показано в примере.</p><h2>Регистрация выделений с помощью HighlightRegistry</h2><p>После создания выделений, их надо зарегистрировать с помощью HighlightRegistry, которая доступна как CSS.highlights. CSS.highlights — это объект, напоминающий структуру класса Map, он позволяет регистрировать выделения с уникальными идентификаторами.</p><p>В приведённом выше фрагменте кода строки "user-1-highlight" и "user-2-highlight" — это пользовательские идентификаторы, которые можно использовать в CSS для применения стилей к зарегистрированным выделениям.</p><p>Вы можете зарегистрировать в реестре столько выделений, сколько вам нужно, а также удалить выделенные элементы и очистить весь реестр.</p><h2>Стилизация с помощью псевдоэлемента ::highlight()</h2><p>Последний шаг — стилизация зарегистрированных выделений. Это делается с помощью ::highlight() псевдоэлемента.</p><p>Например, для стилизации user-1-highlight, зарегистрированного на предыдущем шаге, код будет таким:</p><p><b>Результат</b></p><figure><img src="https://media.tproger.ru/user-uploads/100731/2024-05-02/3b8b0e4c-aaa7-4c0d-85b3-1c48a7481609.png" alt="Результат выделения текста с помощью ::highlight()" /><figcaption>Результат выделения текста с помощью ::highlight()</figcaption></figure><p>Как и ::selection, подмножество свойств CSS может использоваться только с ::highlight() псевдоэлементом:</p><ul><li><a href="https://css-tricks.com/almanac/properties/b/background-color/">background-color</a></li><li><a href="https://css-tricks.com/almanac/properties/c/caret-color/">caret-color</a></li><li><a href="https://css-tricks.com/almanac/properties/c/color/">color</a></li><li><a href="https://css-tricks.com/almanac/properties/c/cursor/">cursor</a></li><li><a href="https://css-tricks.com/almanac/properties/f/fill/">fill</a></li><li><a href="https://css-tricks.com/almanac/properties/s/stroke/">stroke</a></li><li><a href="https://css-tricks.com/almanac/properties/s/stroke-width/">stroke-width</a></li><li><a href="https://css-tricks.com/almanac/properties/t/text-decoration/">text-decoration</a> (который, вероятно, будет поддерживаться только во второй версии спецификации)</li><li><a href="https://css-tricks.com/almanac/properties/t/text-shadow/">text-shadow</a></li></ul><p>Это нужно, чтобы повысить скорость работы программы и браузер мог мгновенно приметь стили ко всем диапазонам.</p><h2>Пример с выделением результатов поиска</h2><p>В этом примере показано, как использовать CSS Custom Highlight API для выделения результатов поиска.</p><p>Давайте рассмотрим, как этот механизм может использоваться на практике.</p><p>Сделаем текст с выделением результатов поиска.</p><p>Приведённый ниже фрагмент HTML-кода определяет поле поиска и статью с несколькими абзацами текста:</p><p>Для прослушивания input-события в поле поиска используется JavaScript. При запуске события код находит совпадения для введённого текста. Затем он создает диапазоны для совпадений и использует CSS Custom Highlight API для создания и регистрации search-results объекта highlight:</p><p>Наконец, ::highlight() псевдоэлемент используется в CSS для оформления выделений:</p><p>Результат:</p><figure><img src="https://media.tproger.ru/user-uploads/100731/2024-05-02/91269a89-44bd-4eba-9cbf-eae9ba9df4b2.png" alt="Выделение результатов поиска" /><figcaption>Выделение результатов поиска</figcaption></figure><h2>Заключение</h2><p>Итак, действительно ли CSS Custom Highlight API лучший инструмент для стилизации отдельных диапазонов текста? Да, конечно.</p><p>Во-первых, даже если CSS Custom Highlight API поначалу может показаться немного сложным (необходимость создавать диапазоны, выделять и затем регистрировать их и, наконец, стилизовать), это всё равно намного проще, чем делать это без CSS Custom Highlight API. Чтобы выполнить эту задачу без этого инструмента, разработчику нужно выделять отдельные участки текста, создавать новые элементы DOM и вставлять их в нужные места. Такой способ требует больше времени у разработчика.</p><p>Что ещё более важно, браузерные движки могут стилизовать эти диапазоны очень и очень быстро. Причина, по которой с псевдоэлементом  ::highlight() разрешено использовать только подмножество свойств CSS, заключается в том, что это подмножество содержит только те свойства, которые могут быть применены браузером эффективно и без необходимости воссоздавать макет страницы. Выделение диапазонов текста путём вставки новых элементов DOM на страницу вокруг них требует от движка гораздо большей работы.</p><p>Несмотря на возможности CSS Custom Highlight API, стоит обсудить и потенциальные проблемы. Одна из них — различная поддержка браузерами, что может вызвать конфликты в разработке. Кроме того, некоторые более сложные стилистические приёмы могут быть недоступны или требуют сложных решений.</p><p>Надеюсь, эта статья была полезной для вас. Спасибо за внимание.</p><h3>Источники</h3>]]></content:encoded>
    </item>
    <item>
      <title>Платформа для работы с исходным кодом GitVerse получила масштабное обновление</title>
      <link>https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3</link>
      <comments>https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3</guid>
      <description><![CDATA[<p>На платформе доступны новые инструменты, ускоряющие разработку, реализован чат в GigaCode, а пользоваться GitVerse теперь может малый и средний бизнес.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3">Платформа для работы с исходным кодом GitVerse получила масштабное обновление</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[PyCharm]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[ARM]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Фулстек-разработка: полный цикл]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Mar 2024 16:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик платформы СберТех (дочерняя компания Сбера) внес десятки улучшений в базовую функциональность платформы для работы с исходным кодом <a href="https://gitverse.ru/promo/announcement-conference?utm_source=sm_tproger&amp;utm_medium=cpm&amp;utm_campaign=sm_202401033103_media_march_2024_rk528559gr6134&amp;utm_content=article&amp;utm_term=event">GitVerse</a> и представил ее новые возможности, которые помогают ускорить и упростить разработку. Об этом команда платформы рассказала на онлайн-презентации «GitVerse: открой вселенную кода».</p><h2>CI/CD-инструменты</h2><p>CI/CD-инструменты позволят автоматизировать сборку исходного кода и процессы поставки. Разработчики теперь могут воспользоваться уже написанными скриптами сборки, в один клик перенося свои проекты с Git-репозиториев. Технология оповещения о новых событиях на сервере (вебхуки) позволяет реализовать еще больше сценариев автоматизации. По событиям в GitVerse можно вызвать через API сторонние сервисы. Например, при определенных событиях в репозитории можно запустить сторонний сборочный конвейер или отправить уведомление в мессенджер.</p><h2>Новые функции персонального AI-ассистента разработчика GigaCode</h2><p>Теперь AI-ассистент поможет разработчику решать задачи, связанные с кодом, в окне чата непосредственно в среде разработки. Сервис чата также доступен и в GitVerse, где при просмотре репозитория можно получить объяснение, что делает та или иная часть кода, а также советы по его улучшению. Список языков программирования, которые поддерживает GigaCode, пополнил Ruby, а также стала доступна генерация текстовых данных в формате JSON. На сегодняшний день AI-ассистент поддерживает уже более 15 популярных языков программирования и устанавливается как плагин в привычные среды разработки, включая IDEA, PyCharm, VSCode, Jupyter.</p><h2>Функциональность для организаций</h2><p>Теперь разработка на GitVerse доступна не только индивидуальным разработчикам, но и малым и средним предприятиям. Компании могут организовать совместную работу команды и управлять доступами к своим репозиториям.</p><blockquote>При разработке новой функциональности мы учитываем пожелания пользователей, добавляем необходимые инструменты, чтобы они могли вести разработку еще проще и быстрее. С каждым релизом платформа будет становиться все более удобной и пополняться новыми популярными репозиториями, open source-версиями продуктов и инструментами для эффективной разработки. Будущее разработки мы видим в создании удобной среды по принципу единого окна, в которой все члены команды могут работать на своем этапе производственного процесса, заказывать облачную инфраструктуру и общаться. На всех этапах разработки партнерскую роль будет занимать AI: помогать писать код, советовать, как сконфигурировать стенд, готовить документацию, подсказывать шаги по CI/CD-конвейеру</blockquote><p>Также на мероприятии представили дорожную карту развития платформы, согласно которой в этом году появится еще больше полезной функциональности для разработчиков:</p><ul><li>новые инструменты для управления проектами, позволяющие удобно организовывать рабочие процессы;</li><li>интегрированная среда разработки позволит разворачивать полностью настроенные инструменты разработки в облаке. Функциональность будет доступна прямо из браузера: разработчик сможет легко и быстро открыть любой репозиторий GitVerse в среде разработки;</li><li>новые функции GigaCode: генерация тестов, автоматическое создание документации и умный рефакторинг. Число языков, которые поддерживает GigaCode, пополнят PHP, HTML, CSS, Markdown и Rust; <b> </b></li><li>инструменты для безопасной разработки (оркестрация CI/CD, статический анализатор, управление секретами и безопасность зависимостей);</li><li>удобный и безопасный вход через популярные сервисы идентификации личности, а также мобильная версия платформы.</li></ul><p><i>Реклама Реклама АО “Сбертех” ИНН 7736632467, </i> <i>LjN8KXJG3</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Как бесплатно выучить HTML и CSS</title>
      <link>https://tproger.ru/articles/kak-besplatno-vyuchit-html-i-css</link>
      <comments>https://tproger.ru/articles/kak-besplatno-vyuchit-html-i-css?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-besplatno-vyuchit-html-i-css</guid>
      <description><![CDATA[<p>Как выучить CSS и HTML и стать фронтендером бесплатно, не покупая курсы от онлайн-школ. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-besplatno-vyuchit-html-i-css">Как бесплатно выучить HTML и CSS</a>»</p>]]></description>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Фулстек-разработка: полный цикл]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 14 Mar 2024 13:30:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Можно ли выучить CSS и HTML и стать фронтендером бесплатно, не покупая курсы от онлайн-школ? Узнали у экспертов, какими источниками пользоваться, чтобы начать карьеру во фронтенде.</p><p>Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики.</p><p>Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на <a>experts@tproger.ru</a>, мы расскажем, как это сделать.</p><p>В Интернете можно
найти множество платных онлайн курсов
от разных школ, которые за 1-6 месяцев
сделают из вас frontend-разработчика,
однако  HTML
и CSS
вполне можно выучить бесплатно. Раньше
для этого были нужны бумажные книги (по
ним как раз я училась), но сейчас кроме
книг вся необходимая информация есть
в Интернете. Однако надо понимать, что
ознакомительные курсы предоставляются
бесплатно, а вот продвинутую часть
придется собирать по кусочкам из разных
источников.</p><h2>С
чего начать</h2><p>Большинство
онлайн-школ предоставляют базовый курс
изучения HTML
и СSS
бесплатно, такие курсы можно найти у
htmlacademy.ru, ru.hexlet.io, wayup.in, itproger.com, stepik.org.
Рекомендую выбрать несколько школ и
пройти их бесплатные курсы, чтобы
получить общее представление о верстке.</p><p>После
того, как база пройдена – можно
ознакомиться с более сложными курсами
и полезными статьями на тему CSS,
HTML.</p><ul><li>У
	htmlacademy есть блог <a href="https://htmlacademy.ru/blog">https://htmlacademy.ru/blog</a>,
	где рассматриваются разные моменты
	создания сайтов как простые, так и
	сложные.</li><li>А
	у Хекслет есть сайт <a href="https://code-basics.com/ru">https://code-basics.com/ru</a>
	с бесплатными базовыми курсами не
	только по CSS&amp;HTML,
	но и по разным языкам программирования.</li><li><a href="https://webref.ru/">https://webref.ru</a>,
	<a href="https://html5book.ru/">https://html5book.ru</a>,
	<a href="https://doka.guide/">https://doka.guide</a>
	– это сайты- справочники, на которых
	также есть бесплатные учебные курсы
	по HTML,
	CSS
	и JS.</li><li>Если
	вы хорошо владеете английским, то вам
	пригодится сайт <a href="https://www.w3schools.com/">https://www.w3schools.com/</a>
	- где есть много информации с примерами
	и видео.</li></ul><h2>Что
насчет видео</h2><p>Если
вам проще воспринимать информацию из
видео, то вам подойдут youtube-каналы:</p><ul><li><a href="https://www.youtube.com/@WebCademy">https://www.youtube.com/@WebCademy</a></li><li><a href="https://www.youtube.com/@LectorWeb">https://www.youtube.com/@LectorWeb</a></li><li><a href="https://www.youtube.com/@Glo_Academy">https://www.youtube.com/@Glo_Academy</a></li></ul><p>Но
даже если просто вбить в поиск YouTube
фразу «изучение html css с нуля» - вам
предложат более 20 плейлистов по
самообучению верстке.</p><h2>А
что дальше</h2><p>После
изучения основ HTML
и CSS,
стоит также изучить язык программирования
JavaScript
и jQuery,
потому что без анимации полноценно
создавать сайты не получится.</p><p>Обязательно
ознакомьтесь с популярными системами
управления сайтами (CMS)
– Wordpress,
Joomla,
Битрикс, Tilda,
так как именно эти системы вам с большой
вероятностью встретятся при поиске
работы или фриланса.</p><p>Дальнейшее
обучение будет более специализированное
– фреймворки, препроцессоры,
программирование, продвижение (СЕО),
дизайн и т.д.</p><p>Главное
в обучении – интересовать этим и не
бросать на половине пути. И тогда у вас
всё получится! Удачи!</p><p>Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики.</p><p>Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на <a>experts@tproger.ru</a>, мы расскажем, как это сделать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как научиться анимациям в CSS за 2 минут</title>
      <link>https://tproger.ru/articles/kak-nauchitsya-animaciyam-v-css-za-2-minut</link>
      <comments>https://tproger.ru/articles/kak-nauchitsya-animaciyam-v-css-za-2-minut?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-nauchitsya-animaciyam-v-css-za-2-minut</guid>
      <description><![CDATA[<p>На Youtube-канале Slaying The Dragon вышло видео о том, как можно научиться CSS-анимациям, используя два пути.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-nauchitsya-animaciyam-v-css-za-2-minut">Как научиться анимациям в CSS за 2 минут</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 06 Feb 2024 09:10:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>На Youtube-канале Slaying The Dragon вышло видео о том, как можно научиться CSS-анимациям, используя два пути.</p><p>Вот, о чём идёт речь в видео:</p><ol><li>В CSS существует два способа создания анимаций: переходы (transitions) и анимации (animations).</li><li>Переходы используются для плавного изменения свойств при взаимодействии пользователя, например, при наведении курсора.<br /></li><li>Анимации позволяют контролировать анимацию по кадрам с помощью ключевых кадров (keyframes) для создания сложных анимаций.<br /></li><li>Для создания перехода необходимо указать свойства transition: transition-property, transition-duration, transition-timing-function и transition-delay.<br /></li><li>Можно использовать сокращенную запись свойства transition, объединяя все параметры перехода.<br /></li><li>При изменении нескольких свойств можно использовать ключевое слово 'all' в свойстве transition для применения анимации ко всем свойствам.<br /></li><li>Для создания анимации необходимо определить ключевые кадры с помощью синтаксиса @keyframes и задать параметры анимации: animation-name, animation-duration и другие.<br /></li><li>Свойство animation-fill-mode определяет, как стили из ключевых кадров применяются до и после выполнения анимации.<br /></li><li>Можно использовать сокращенную запись свойства animation, объединяя все параметры анимации.<br /></li><li>Для повышения удобства использования и избежания жесткой привязки анимации к элементам можно создавать утилитарные классы с анимацией.<br /></li><li>Создание утилитарных классов позволяет создать свою мини-библиотеку анимаций и использовать их в различных элементах HTML.<br /></li><li>Примеры анимаций включают движение влево (slideInLeft), вправо (slideInRight), вращение (rotate) и отскок (bounce).<br /></li><li>Свойство transform-origin позволяет изменять точку, относительно которой происходит трансформация (например, вращение).<br /></li><li>Использование процентов в @keyframes дает больший контроль над промежуточными состояниями анимации.<br /></li></ol><p>Ниже — транскрибированный перевод ролика на русском языке.</p><p>Существует два способа создания анимаций в CSS: переходы и анимации. Переходы ждут изменения свойства и затем позволяют этим изменениям происходить со временем.</p><p>Без перехода любые изменения свойства происходили бы немедленно. Переходы следует использовать, когда свойства изменяются интерактивно, например, в CSS свойство может измениться при наведении и фокусировке. Анимации, однако, предоставляют ключевые кадры для более тонкого управления анимацией и позволяют создавать сложные анимации на основе кадров.</p><p>Используйте анимации, когда хотите создать сложные анимации, которые просто работают, не дожидаясь изменения свойств интерактивно. Также можно создавать потрясающие анимации, комбинируя переходы и анимации вместе.</p><h2>Переходы в CSS</h2><p>В этом примере я использовал переходы, чтобы сделать появление блоков при наведении на шары, и использовал анимации, чтобы заставить кольца вращаться по кругу.</p><p>Я также использовал немного JavaScript, чтобы отслеживать положение мыши и перемещать кольца к мыши, создавая эффект туннеля. Этот пример едва затрагивает то, что возможно с анимациями, и в этом видео я расскажу вам обо всех основных концепциях анимации в CSS, которые вам нужно знать, чтобы начать творчески подходить к созданию красивых анимаций CSS для ваших собственных проектов. Чтобы создать переход, сначала нам нужен компонент, который имеет изменение свойства. В моем HTML у меня есть кнопка с классом button. В моем CSS у меня есть стили для кнопки, и у меня также есть состояние наведения. Все, что это делает, перемещает нашу кнопку на 10 пикселей вверх, когда мы наводим на нее курсор. Мы видим, что именно происходит, но это происходит немедленно.</p><p>Так не двигаются вещи в реальном мире. Мы можем сделать состояние наведения происходящим со временем, используя свойства перехода. Свойство перехода, длительность перехода, функция времени перехода и задержка перехода. Свойство перехода определяет, к какому свойству должен применяться эффект перехода.</p><p>В нашем состоянии наведения мы используем только свойство transform, поэтому здесь мы можем сказать transform. Длительность перехода определяет, сколько времени займет эффект перехода. Я установлю его на 0,3 секунды. Функция времени перехода определяет кривую ускорения для перехода.</p><p>Общие возможные значения, которые можно использовать здесь, - это ease in, easeOut, EaseInOut, Linear и Ease, который является значением по умолчанию. Задержка перехода определяет задержку перед тем, как должен начаться переход. Я хочу, чтобы мой переход начался в тот момент, когда элемент наведен, поэтому я устанавливаю этот параметр на 0 секунд. Когда мы наводим на нашу кнопку, мы видим, что кнопка перемещается на 10 пикселей вверх со временем, и это намного лучше, чем раньше, но в нашем коде мы можем вместо использования этих четырех свойств использовать сокращенное свойство перехода. В свойстве перехода мы можем установить те же значения, которые мы передали в наши четыре свойства, а также в том же порядке. Так что transform, 0,3 секунды, ease и задержка 0 секунд. Наведя на нашу кнопку, мы видим, что это отлично работает, но мы можем еще больше сократить наш код. Если у нас задержка 0 секунд, то мы можем ее полностью удалить. Кроме того, ease - это функция времени по умолчанию, поэтому мы также можем ее удалить.</p><p>Теперь, когда мы наводим на нашу кнопку, мы видим, что она все еще отлично работает. Иногда у вас может быть более одного изменяемого свойства. Например, возможно, при наведении я хочу, чтобы цвет фона совпадал с цветом рамки.</p><p>И также, возможно, я хочу, чтобы цвет текста был белым. Когда я навожу на свою кнопку, единственное свойство, которое имеет эффект перехода, - это transform. Поэтому я могу внутри свойства перехода через запятую перечислить различные свойства, которые я хочу анимировать. Свойство цвета фона с длительностью 0,3 секунды и свойство цвета с длительностью 0,3 секунды также. Теперь, когда я навожу на свою кнопку, все анимируется, но вернемся к нашему коду: если бы у меня было более трех свойств в нашем состоянии наведения, перечисление каждого свойства через запятую заняло бы много времени, особенно если они имели бы одинаковую длительность, функцию времени и задержку.</p><p>В таких случаях вместо этого мы можем ничего не перечислять через запятую и в первом значении вместо определения свойства мы можем заменить его ключевым словом all. Теперь все будет иметь примененный к нему эффект перехода. Чтобы создать анимацию, сначала нам нужен элемент, который мы хотим анимировать.</p><h2>Анимация в CSS</h2><p>В моем HTML у меня есть элемент с классом Heading1. Чтобы анимировать этот заголовок, я могу перейти к моему файлу CSS и добавить ключевой кадр. Синтаксис для этого - at keyframes и фигурные скобки.</p><p>Между ключевыми кадрами и фигурными скобками идет название нашей анимации. Я назову ее slide in left. Внутри фигурных скобок идет сама анимация.</p><p>Я хочу, чтобы мой заголовок находился слева на экране, а затем скользил в свое исходное положение. Для этого мне нужно определить правила от начала до конца анимации. Внутри фигурных скобок я могу добавить значения from и to. From представляет начало анимации или 0% завершено, и 2 представляет конец анимации, или 100% завершено.</p><p>У обоих есть фигурные скобки. Я хочу, чтобы анимация началась на 300 пикселей влево, поэтому внутри фигурных скобок from я могу добавить трансформацию translateX минус 300 пикселей. Затем внутри фигурных скобок two я могу добавить трансформацию translateX и установить ее в ноль. Я устанавливаю эту в ноль, потому что translateX ноль вернет элемент в его исходное положение.</p><p>Посмотрев на наш заголовок, мы видим, что ничего не происходит. Это потому, что мы не сказали нашему заголовку анимироваться. Я могу выбрать наш заголовок по его классу и здесь добавить семь свойств анимации. Имя анимации, длительность анимации, функция времени анимации, задержка анимации, количество итераций анимации, направление анимации и режим заполнения анимации. Свойство имени анимации предназначено для выбора ключевого кадра, который вы хотите использовать для анимации элемента. Мы создали ключевой кадр под названием SlideInLeft, поэтому в свойстве имени анимации в качестве значения я передам SlideInLeft.</p><p>После установки свойства имени анимации мы видим, что наш заголовок все еще не анимируется. Это потому, что нам нужно установить длительность анимации. Свойство длительности анимации устанавливает время, необходимое для завершения одного круга анимации. Когда вы создаете анимацию ключевого кадра, вы определяете правила анимации от 0% до 100%. Это свойство определяет, сколько времени требуется для анимации от 0% до 100%. По умолчанию это 0 секунд, но если я оставлю его на 0 секунд, наша анимация никогда не запустится. Поэтому я установлю его на 1 секунду.</p><p>Теперь мы видим, что наш заголовок анимируется. Свойство функции времени анимации определяет кривую ускорения для анимации. По умолчанию это ease, но у нас есть те же варианты, что и раньше.</p><p>Ease, ease in, ease out, ease in out и linear. Я установлю свое на ease in. Свойство задержки анимации устанавливает задержку перед запуском анимации. По умолчанию это 0 секунд, что означает, что анимация будет запущена сразу после загрузки страницы.</p><p>Я оставлю его на значение по умолчанию 0 секунд пока. Свойство количества итераций анимации определяет, сколько раз вы хотите запустить анимацию. По умолчанию это 1, что означает, что анимация завершит один круг и затем перестанет анимироваться. Если я установлю его на 2 или более, то анимация будет запущена 2 или более раз.</p><p>Я также могу установить его на бесконечность, и это заставит анимацию работать бесконечно. Я оставлю его на значение по умолчанию 1. Свойство направления анимации определяет, будет ли анимация запускаться нормально или в обратном порядке. По умолчанию это normal, но если я установлю его на reverse, это просто запустит анимацию с последнего ключевого кадра и завершит ее на первом ключевом кадре. Я оставлю его на значение по умолчанию normal.</p><p>И, наконец, свойство режима заполнения анимации определяет, как анимация будет применять стили из нашего ключевого кадра до и после его выполнения. Это трудно понять без некоторых визуальных подсказок, поэтому я установлю значение по умолчанию none. Я добавлю трансформацию к нашему заголовку translate X минус 150 пикселей. И я добавлю задержку анимации в одну секунду. Начальное положение нашей анимации все еще находится на 200 пикселей влево, а конечное положение нашей анимации все еще посередине страницы. Однако у нашего заголовка теперь есть трансформация x минус 150 пикселей. Это не изменило исходное положение нашего заголовка. Наше исходное положение все еще находится посередине страницы. Однако трансформация, которую мы добавили в заголовок, сдвинет заголовок на 150 пикселей влево перед началом анимации и после завершения анимации.</p><p>Мы видим это, когда смотрим на наш заголовок. Он находится на 150 пикселей влево, и через секунду задержки начинается анимация, а когда анимация заканчивается, заголовок снова сдвигается на 150 пикселей влево. Мы можем использовать свойство режима заполнения анимации, чтобы изменить это поведение.  Если я установлю его на forwards, хотя заголовок начинается на 150 пикселей влево, когда анимация заканчивается, вместо того чтобы отталкивать заголовок обратно на 150 пикселей влево, как раньше, мы видим, что заголовок остается посередине. И это потому, что forwards применит стили из последнего ключевого кадра к нашему заголовку, когда анимация заканчивается. Если я установлю его на backwards, заголовок начнется со стилей, определенных в первом ключевом кадре, но когда анимация заканчивается, backwards ничего не делает, и заголовок снова сдвигается на 150 пикселей влево. Наконец, если я установлю его на both, теперь заголовок начинается со стилей из первого ключевого кадра и заканчивается со стилями из последнего ключевого кадра.</p><p>С установленным режимом заполнения анимации на both, элемент никогда не сдвигается на 150 пикселей влево, потому что он говорит, что элемент должен начинаться со стилей из первого ключевого кадра и заканчиваться со стилями из последнего ключевого кадра. Это свойство анимации определенно самое сложное для понимания, но, надеюсь, теперь это имеет смысл. Написание этих 7 свойств каждый раз, когда вы хотите анимировать элемент, - это слишком много работы. Мы можем использовать сокращенное свойство анимации. Оно принимает те же 7 значений свойств: имя, длительность, функцию времени, задержку, количество итераций, направление и режим заполнения. Я просто скопирую и вставлю значения, которые у нас были в отдельных свойствах в сокращенную анимацию.</p><p>Имя - slideInLeft, длительность - 1 секунда, функция времени - easeIn, задержка - 1 секунда, количество итераций - 1, направление - нормальное, и режим заполнения - both. Теперь я могу удалить отдельные свойства анимации, и мы видим, что наш заголовок все еще анимируется, как и раньше, но теперь мы используем только одно свойство вместо семи. Мы можем сделать его еще короче, удалив все значения по умолчанию. Наше количество итераций и длительность установлены на свои значения по умолчанию, поэтому я могу просто удалить их полностью, и наша анимация все равно будет работать так же. В настоящее время у нас задержка одна секунда, я предпочел бы, чтобы не было задержки, поэтому вместо того, чтобы говорить ноль секунд, я могу просто удалить это полностью, потому что ноль секунд - это значение задержки по умолчанию. Я могу удалить трансформацию, которую я добавил ранее, и теперь, когда ее нет, мне действительно не нужно, чтобы режим заполнения был установлен на both.</p><p>Он может быть установлен на свое значение по умолчанию - none, поэтому я просто удаляю его полностью. Наша анимация все еще ведет себя так, как мы задумали, но теперь посмотрите, насколько чист наш код. В настоящее время наша анимация размещена на самом элементе. Это плохо для использования. Вместо того чтобы выбирать элемент заголовка по его классу и давать ему анимацию, я создам утилитарный класс специально для анимации slide in left и дам ему свойство анимации со всеми теми же значениями.</p><p>Наш заголовок больше не анимируется. Это потому, что нам нужно перейти к нашему HTML и дать нашему заголовку утилитарный класс slide in left. Это лучше, потому что теперь, если у меня были бы другие элементы, которые также хотели бы иметь ту же анимацию, вместо того чтобы выбирать их в CSS и давать им свойство анимации, мне просто нужно дать им утилитарный класс, и они будут анимироваться так же. Но таким образом мы экономим код, повторно используя утилитарный класс slide in left. Фактически, мы можем уйти еще дальше с этой архитектурой утилитарных классов. В самом верху нашего файла CSS я добавлю комментарий, говорящий о утилитарных классах, я также добавлю комментарий прямо над нашим ключевым кадром, говорящий о анимациях.</p><p>Под нашим первым комментарием я собираюсь иметь пять утилитарных классов. Первый будет называться animate с свойством длительности анимации, установленным на одну секунду, и режимом заполнения анимации, установленным на both. Второй утилитарный класс будет называться animate-dash-dash-infinite с свойством количества итераций анимации, установленным на бесконечность. Третий утилитарный класс будет называться animate-dash-dash-delay-dash-one-second с свойством задержки анимации, установленным на одну секунду. Четвертый утилитарный класс будет называться animate-dash-dash-fast с свойством длительности анимации, установленным на 0.6 секунды. Пятый утилитарный класс будет называться animate-dash-dash-slow с свойством длительности анимации, установленным на 3 секунды. И, наконец, последнее, что нам нужно сделать, это перейти к нашему классу slide in left и заменить сокращенную анимацию свойством имени анимации, установленным на имя нашего ключевого кадра, и свойством функции времени анимации, установленным на любую кривую ускорения, которую мы хотим.</p><p>Я установлю ее на ease in. Теперь с этой архитектурой работает так, что в HTML каждому элементу, который я хочу анимировать, я даю класс animate. Я хочу, чтобы все они анимировались, поэтому я дам им всем класс animate.</p><p>Затем я могу выбрать анимацию, которую хочу. В нашем случае у нас есть только одна анимация, анимация скольжения влево. В классах каждого элемента я дам slideInLeft. Мы видим, что все наши элементы анимированы. Теперь мы можем использовать различные утилитарные классы там, где хотим. Например, возможно, я хочу, чтобы первый заголовок был быстрым. Я могу дать ему утилитарный класс animate-dash-dash-fast. И теперь мы видим, что наш заголовок движется быстрее, чем другие. Возможно, я хочу, чтобы второй заголовок был медленным. Я могу дать ему утилитарный класс animate-dash-dash-slow. И теперь он анимируется медленнее, чем другие. И, наконец, возможно, я хочу, чтобы у третьего заголовка была задержка в 1 секунду и постоянное повторение его анимации бесконечно по какой-то причине. Для этого я могу дать ему утилитарные классы animate-dash-dash-delay-1-seconds и animate-dash-dash-infinite. Мы можем улучшить эту архитектуру, используя двойные классы. В нашем CSS я могу добавить префикс animate к каждому из этих четырех утилитарных классов. И это позволяет утилитарным классам работать только в том случае, если класс animate существует в том же элементе. Это может помочь нам избежать возможных несчастных случаев, которые могут возникнуть при именовании наших классов. Работая с анимациями таким образом, мы фактически можем создать свою собственную мини-библиотеку анимаций. И причина, по которой это работает так хорошо, заключается в том, что мы разъединили отношение между анимацией и элементом, превратив каждую анимацию в повторно используемый утилитарный класс.</p><p>Ну, у нас есть только одна анимация, так что давайте добавим еще несколько. Мы можем дать нашему slideInLeft брата по имени slideInRight. Поскольку эта анимация будет такой же, но появляться справа, я просто скопирую код из нашего slideInLeft и вставлю его вниз. Мы можем переименовать ключевой кадр из slideInLeft в slideInRight. Мы можем сделать то же самое с именем класса и свойством имени анимации. Затем в нашем transform translateX-200 я просто уберу отрицательное значение, и теперь элемент будет появляться справа. В нашем HTML я дам второму заголовку класс slideInRight вместо slideInLeft. И теперь мы видим, что наш заголовок появляется справа. Вернувшись к нашему CSS, внизу файла, я добавлю новый ключевой кадр под названием rotate. Он начнется с transform: rotate, установленным на 0, и закончится с transform: rotate, установленным на 360 градусов. Под нашим ключевым кадром я могу добавить класс rotate и дать ему имя анимации rotate, а также установить функцию времени анимации на linear. Затем в нашем HTML, в нашем последнем заголовке, я заменю slide in left на rotate. Я оставлю утилитарный класс animate-dash-dash-infinite, но заменю утилитарный класс animate-dash-dash-delay на одну секунду на animate-dash-dash-slow. И теперь мы видим, что наш последний заголовок вращается бесконечно от своей центральной точки. Это то, что я хочу, но, например, если я хочу, чтобы заголовок вращался не от своего центра, а от одного из его углов, то я могу в классе rotate дать ему свойство transform-origin, которое по умолчанию имеет центр, и установить его на верхний левый угол.</p><p>Теперь последний заголовок все еще вращается, но не от своей центральной точки, а от его верхнего левого угла. Я сделаю еще одну анимацию, эта будет сложнее других. Я создам новый ключевой кадр внизу файла под названием bounce. Я также создам класс bounce сейчас, а не позже, и дам ему имя анимации bounce.</p><p>Мне не нужно устанавливать функцию времени анимации, потому что я хочу, чтобы кривая ускорения была ease, и ease является значением по умолчанию. В моем HTML, на первом заголовке, я заменю slide in left на bounce и уберу утилитарный класс animate-dash-dash-fast. Что я хочу сделать с этой анимацией, это заставить элемент подпрыгивать почти как упругий мяч. Это можно сделать полностью с помощью transform translateY, потому что наша анимация будет вертикальной. Анимация подпрыгивания начинается на земле, поэтому я установлю начало анимации с transform: translateY. Конец анимации также должен быть на земле, поэтому я установлю его на 0.</p><p>Теперь нам нужны некоторые промежуточные анимации. Для этого мы можем заменить наши from и to на 0% и 100%. Используя проценты, мы получаем больше контроля над ключевыми кадрами, потому что теперь я могу установить некоторые промежуточные значения, например 40%, которые я установлю в translateY минус 30 пикселей.</p><p>Наш заголовок поднимается и опускается, но не отскакивает. Я добавлю 50% с трансформацией translateY, установленной на 0. И добавлю 60% с трансформацией translateY, установленной на минус 15 пикселей.</p><p>Это выглядит довольно хорошо, но мы все еще можем сделать это лучше. В настоящее время мы переходим от translateY 0 к translateY минус 30 пикселей от 0% до 40%. Чтобы сделать это более динамичным, я добавлю 20% с трансформацией translateY, установленной на 0. Теперь происходит следующее: с 0% до 20% мы остаемся на 0. Но начиная с 20%, мы можем ускориться к минус 30 пикселям, и это сделает нашу анимацию лучше.</p><p>Это незаметно, но все же лучше. Мы можем сделать то же самое между 60% и 100%, я добавлю 80% с трансформацией translateY, установленной на 0. Наш заголовок определенно выглядит так, будто он отскакивает, и анимация точно такая, как мне нужно. Однако внутри нашего ключевого кадра мы многократно повторяем себя с теми translateY, установленными на 0. В программировании действительно хочется избегать повторений, поэтому чтобы очистить все, мне нужно просто удалить все проценты, где я повторяю translateY 0. И затем на моем 0% я могу через запятую перечислить все проценты, которые имели translateY 0. Такие как 0%, 20%, 50%, 80% и 100%. Причина, по которой это работает, заключается в том, что проценты ключевых кадров не обязательно должны быть упорядочены. Я мог бы иметь 60% наверху всего, и анимация все равно бы работала идеально. Я вернусь к этому, потому что я считаю, что это более чисто и читаемо.</p><p>Это практически все, что вам нужно знать, чтобы начать творить и создавать красивые анимации самостоятельно.</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие новые фишки CSS нужно выучить прямо сейчас</title>
      <link>https://tproger.ru/articles/kakie-novye-fiwki-css-nuzhno-vyuchit-pryamo-sejchas</link>
      <comments>https://tproger.ru/articles/kakie-novye-fiwki-css-nuzhno-vyuchit-pryamo-sejchas?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-novye-fiwki-css-nuzhno-vyuchit-pryamo-sejchas</guid>
      <description><![CDATA[<p>Что нужно выучить в CSS прямо сейчас, чтобы быть крутыми специалистами через пару лет и не отстать от трендов и новинок в CSS.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-novye-fiwki-css-nuzhno-vyuchit-pryamo-sejchas">Какие новые фишки CSS нужно выучить прямо сейчас</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 02 Feb 2024 13:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Спросили специалистов уровня middle и senior, что нужно выучить в CSS прямо сейчас, чтобы быть крутыми специалистами через пару лет и не отстать от трендов и новинок в CSS.</p><p>Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики.</p><p>Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на <a>experts@tproger.ru</a>, мы расскажем, как это сделать.</p><p>Каждый год в каскадных таблицах стилей CSS появляются какие-то новшества. Лучше не хвататься за самое новое, а подождать немного, пока это не станет поддерживаться большинством популярных браузеров.</p><p>Что же необходимо изучить из того, что уже закрепилось в CSS и используется повсеместно?</p><ul><li>Двумерная сетка грид (grid layout) и модуль гибкого контейнера флекс (flex).</li><li>Препроцессоры (например, Sass, tLess). Они сильно упрощают жизнь при написании кода.</li><li>Фреймворки (для начинающих подойдут Bootstrap, Bulma и Materialize).</li><li>Анимация (animation).</li><li>Адаптивность / responsive – правильное отображение сайта на разных устройствах.</li><li>БЭМ (Блок Элемент Модификатор) – компонентный подход к веб-разработке, который стал популярен в последние годы. Он затрагивает написание css (убирается каскадность) и принципы именования классов элементов.</li></ul><p>15 основных новинок CSS за 2022 и 2023 года:</p><ol><li>Контейнерные запросы (@container) вместо медиа запросов. Поддержка tбраузерами – 87.42%.</li><li>Новые псевдоклассы-функции :where(), :has(). У :has() поддержка – 87.43%.</li><li>Использование математических операторов в медиа-запросах. Поддержка браузерами 70%.</li><li>Использование of в псевдоклассах :nth. Поддержка – 85.72%</li><li>Свойство accent-color для основного цвета сайта на формах или по всему сайту. Уже поддерживается во всех современных браузерах.</li><li>Сбалансированный tперенос текста с помощью text-wrap: balance; Поддержка – 37.71%</li><li>Новые динамические единицы измерения: svh, svw, lvh, lvw, dvh, dvw. Поддержка – 87.99%</li><li>Каскадные слои. Поддержка – 90.58%</li><li>Вложенность стилей друг в друга, как в Sass. Поддержка – 63.74%</li><li>Плавная прокрутка скроллбара свойством scroll-behavior: smooth; Поддерживается браузерами.</li><li>Стилизация сайта по пользовательским предпочтением операционной системы (prefers-reduced-motion, prefers-contrast, prefers-reduced-transparency, inverted-colors и другие).</li><li>Адаптивность к форм-фактору, т.е. учет складных и гибких экранов при создании сайтов. Пока не получила большого распространения.</li><li>Псевдокласс t:focus-visible. Поддерживается всеми браузерами.</li><li>Индивидуальные свойства трансформации. Поддержка – 91.19%</li><li>color-mix(): и color-contrast(). Поддерживается не всеми браузерами. Стоит изучить, но пока не использовать.</li></ol><p>На мой взгляд стоит изучить те новинки, которые хотя бы на 70% поддерживаются браузерами.</p><p>В настоящее время особой необходимости в изучении новых фич CSS для повседневной работы нет, так как многие из них пока не поддерживаются на всех браузерах. Однако, следить за этими тенденциями и быть готовым к использованию в будущем может быть полезным.</p><p>Рекомендую сконцентрироваться на освоении основ, таких как display: grid (хотя его применение может быть ограничено в старых версиях браузеров) и flexbox, transitions и animations (для создания плавных и креативных анимаций), backdrop-filter (эффекты размытия фона, полезные для создания стилизованных элементов интерфейса), variables и calc (использование переменных и вычислений может значительно улучшить поддерживаемость и гибкость кода).</p><p>Для новичков важно освоить SCSS, включая использование миксинов и функций, изучив примеры в крупных библиотеках, например, Bootstrap, чтобы расширить свои навыки и избежать избыточного изобретения.</p><p>Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики.</p><p>Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на <a>experts@tproger.ru</a>, мы расскажем, как это сделать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Когда фронтендеру пора остановиться в изучении HTML, CSS и JS</title>
      <link>https://tproger.ru/articles/kogda-pora-ostanovisya-v-izuchenii-html--css-i-js</link>
      <comments>https://tproger.ru/articles/kogda-pora-ostanovisya-v-izuchenii-html--css-i-js?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kogda-pora-ostanovisya-v-izuchenii-html--css-i-js</guid>
      <description><![CDATA[<p>IT-блогер Chris Sean рассказал, каких знаний в HTML, CSS и JS достаточно для работы во фронтенде.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kogda-pora-ostanovisya-v-izuchenii-html--css-i-js">Когда фронтендеру пора остановиться в изучении HTML, CSS и JS</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 Feb 2024 11:12:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>IT-блогер Chris Sean рассказал, каких знаний в HTML, CSS и JS достаточно для работы во фронтенде.</p><p>Вот, о чём идёт речь в видео:</p><ol><li>Вопрос о том, сколько нужно знать HTML, CSS и JavaScript для того, чтобы устроиться на работу в 2023 году, часто задают.</li><li>HTML и CSS не являются сложной частью, важно понимать основы структуры HTML-документа и основные элементы, такие как div.<br /></li><li>Большинство компаний имеют дизайнера, который предоставляет дизайн в виде изображения или файла в Figma или Sketch, задача разработчика - перевести это в код.<br /></li><li>Необходимо знать CSS, но не требуется глубоко владеть дизайном, так как существуют инструменты, например, Tailwind CSS, которые упрощают работу.<br /></li><li>Основное внимание при обучении следует уделять JavaScript и фреймворкам, так как это займет более 75% времени обучения.<br /></li><li>HTML и CSS можно быстро изучить, достаточно понимать, как работает DOM и основные теги, а также использовать CSS для улучшения внешнего вида сайта.<br /></li><li>Важно уметь использовать поисковые системы для решения задач по HTML и CSS, а также использовать библиотеки и фреймворки для ускорения разработки.<br /></li><li>JavaScript является более сложной частью, так как часто это первый язык программирования, который изучают разработчики, и включает в себя работу с различными фреймворками и инструментами, такими как ReactJS, Next.js и TypeScript.<br /></li><li>Необходимо изучить терминологию JavaScript, основы работы с массивами, объектами, понимание объектно-ориентированного программирования и манипуляции с DOM.<br /></li><li>Важно не только изучать JavaScript, но и практиковаться в создании веб-сайтов, чтобы закрепить знания и построить крепкий фундамент для трудоустройства.<br /></li></ol><p>Ниже — транскрибированный перевод ролика на русском языке.</p><p>Сколько знаний HTML, CSS и JavaScript вам нужно знать сегодня, чтобы быть нанятым? Давайте разберемся в этом прямо сейчас. Это вопрос, который я получил много, много, много, много раз, верно? И это ответ, который я дал много, много раз в комментариях. Но я поднимаю этот вопрос сейчас, потому что это фактически вопрос, который я задал генеральному директору boot.dev в одном из последних эпизодов моего подкаста, если вы хотите посмотреть, ссылка в описании ниже. Но давайте услышим его ответ на вопрос, сколько HTML, CSS и JavaScript должен знать веб-разработчик, фронтенд-инженер. Давайте посмотрим прямо сейчас.</p><h2>Сколько HTML и CSS разработчики вообще должны знать</h2><p>Вам это понадобится, но HTML и CSS не являются сложной частью. HTML - это язык разметки, верно? Вы изучаете основные строительные блоки, такие как divs и прочее. Это действительно не занимает много времени, чтобы ознакомиться со структурой HTML-документа. А CSS, вы можете потратить столько времени на его освоение. Но в конечном итоге, в большинстве компаний, где вы будете работать, вы не будете дизайнером. И вот здесь я изначально столкнулся с проблемой, я думал, что, чтобы быть фронтенд-разработчиком, мне нужно быть очень хорошим в дизайне.</p><p>Это не обязательно так. В большинстве компаний, где вы будете работать, будет дизайнер, который предоставит вам дизайн, либо изображение, либо файл Figma или что-то в Sketch. Ваша задача - просто перевести это в код. Так что, я имею в виду, вам нужно знать CSS.</p><p>Я просто хочу упомянуть один из моих любимых инструментов. Я использую Tailwind CSS на фронтенде, в основном на boot dev, потому что дело в том, что CSS не так уж сложно понять, как он работает. У вас есть границы, у вас есть тени, у вас есть эти вещи, вы можете гуглить, когда застряли. Но что сложно, это написать чистый CSS, потому что, я убежден, это почти невозможно. Так что ответ таков: вам нужно изучить HTML и CSS, но вам придется потратить гораздо больше времени на JavaScript. Мой прогноз составляет 75% и более вашего обучения до того, как вы получите первую работу на фронтенде, будет связано с JavaScript в каком-то фреймворке.</p><p>Я думаю, одна из самых больших ошибок, которую совершает начинающий разработчик, когда учится программировать, заключается в том, что он тратит слишком много времени на изучение определенных языков, тратит слишком много времени, которого ему не нужно, или, снова, добавлю к этому, изучает неправильные технические языки. И как сказал Лейн, что люди склонны делать, это тратить слишком много времени на HTML, CSS.</p><p>Почему? Он сказал, что когда вы работаете фронтенд-разработчиком, многие начинающие разработчики думают, что им нужно быть лучшими дизайнерами. Многие начинающие разработчики думают, что им нужно иметь хорошие навыки дизайна. Нет, это не работа фронтенд-инженера, фронтенд-разработчика, веб-разработчика, как бы вы его ни называли. Наша задача - взять дизайн, который дизайнер UI/UX дает нам, и превратить этот дизайн в реальность, не с помощью ручки и бумаги, а с использованием фактического цвета. И мне нравится то, что он сказал, потому что Лейн сказал, что люди тратят слишком много времени на HTML CSS. Люди тратят слишком много времени на это, думая, что им нужно придумывать креативные дизайны.</p><p>Но дело в том, что это совсем не наша работа. Наша задача - превратить то, что люди создали с помощью Photoshop, Adobe XD, я не знаю, назовите это как угодно, они создают эти красивые дизайны, и наша задача - превратить это в реальное изображение в коде.</p><h2>Так что сколько HTML и CSS разработчик вообще должен знать, чтобы быть нанятым</h2><p>То, что вам нужно знать, в основном, это что? Что такое DOM?</p><p>Каковы основные структуры при создании веб-сайта с использованием HTML? Я имею в виду, посмотрите на Craigslist. Они имеют все основы на craigslist.com. Не самый лучший пример, но это буквально HTML. Может быть немного CSS, чтобы сделать веб-сайт более удобным для мобильных устройств, но в основном это и есть, просто и понятно.</p><p>Я думаю, что вам нужно просто знать, что такое теги, что такое метки, верно? Что такое заголовок? Что такое тело? Какие есть теги HTML? Что такое тег якоря? Вам нужно понять, как работает DOM. Что представляют собой все эти различные элементы в HTML?</p><p>Почему это так важно? Потому что вам нужно хотя бы иметь базовое представление. Я бы сказал, крепкое представление о HTML, что занимает, возможно, месяц, если не меньше, чтобы понять, не полностью понять, но хотя бы понять основы. И теперь, когда вы понимаете, как работает HTML, какова структура тела, заголовка? Вам нужно знать просто достаточно, чтобы использовать CSS. В чем смысл использования CSS? Вы используете CSS, чтобы сделать вещи красивыми как ад.</p><p>Это в основном и есть. Вы используете CSS, чтобы сделать вещи более удобными. Но люди иногда склонны тратить слишком много времени на CSS, когда так многие люди, как я, так многие люди, как Лейн, так многие другие фронтенд-разработчики, склонны использовать фронтенд-фреймворк и библиотеку, чтобы создавать эти красивые веб-сайты, нам уже не нужно писать все это с нуля.</p><p>Хорошо, некоторые компании, к сожалению, делают. Но мы используем библиотеки, которые позволяют нам создавать эти веб-сайты быстрее, чем когда-либо, и делать их максимально чистыми, используя CSS или JavaScript или фронтенд-библиотеку, такую как Tailwind, верно? Как Tailwind CSS. Теперь есть одна вещь, с которой я хочу поспорить с Лейном по одному вопросу, а именно. Он сказал, что HTML. NTSS не является сложной частью.</p><p>Я согласен, но я также не согласен. Я думаю, что люди склонны недооценивать, прежде всего Лейн, будучи в основном разработчиком бэкэнда, я могу честно понять, почему он сказал эти слова. Потому что как разработчик бэкэнда, и сейчас я работаю в бэкэнде, это очень сложно, верно? То, что я делаю в бэкэнде, намного сложнее, чем то, что я когда-либо делал как фронтенд-разработчик. Возможно, потому что как фронтенд-разработчик, я перешел на должность среднего уровня. Я никогда не стал старшим фронтенд-разработчиком, и сразу после этого перешел в бэкэнд.</p><p>Возможно, в этом дело. Но из того, что я видел и что я делаю сейчас, разработка бэкэнда намного сложнее с моей точки зрения. Но то, что я пытаюсь сказать, это то, что HTML CSS намного сложнее, чем люди понимают. Но то, что я хочу, чтобы люди поняли и осознали, это то, что вам не нужно знать достаточно или все HTML CSS, которые есть, прежде чем перейти к JavaScript, потому что из-за этого, Google. Вы буквально можете найти что угодно в Google о том, как создать что-то с помощью HTML CSS. Вы используете фронтенд-библиотеку, библиотеку CSS, такую как Tailwind CSS.</p><p>Что вы можете сделать? Гуглить. Как создать меню гамбургеров с использованием Tailwind CSS? Просто введите это в Google, скопируйте код, который вы найдете в интернете, и вставьте его в свой текстовый редактор. Бум, у вас есть меню гамбургеров.</p><p>Как создать нижний колонтитул с использованием Tailwind CSS, или что угодно, или Bootstrap, назовите это, и возможно, вы все еще используете Materialize, который существует уже некоторое время. Гуглить, гуглить, гуглить. Суть того, что мы пытаемся сказать, заключается в том, что количество HTML и CSS, которое вам нужно знать, достаточно, чтобы теперь вы знаете, как гуглить, и исследовать, чтобы интернет помог вам создать то, чего вы не знаете, как можно быстрее, верно?</p><h2>Сколько нужно учить JavaScript</h2><p>Вот и все. И затем он говорит следующее. Он говорит, что JavaScript - это сложная часть. Я с ним на миллион процентов согласен в этом. JavaScript будет очень сложным для всех, кто пытается научиться программированию.</p><p>Почему? Потому что JavaScript в большинстве случаев будет первым языком программирования, который вы когда-либо изучите. Когда речь идет о JavaScript, это уже не только JavaScript. Есть ванильный JavaScript. Некоторые компании все еще используют jQuery, верно?</p><p>Компании в наши дни либо используют SvelteJS, не так много используют AngularJS, но он все еще существует. И многие другие компании сейчас используют ReactJS.  И даже когда вы изучаете ReactJS, этого уже недостаточно. Когда вы изучаете ReactJS, в чем суть? Теперь вы переходите к использованию NextJS. Next.js делает использование React.js еще лучше. И это еще не все, потому что зная JavaScript, теперь вам нужно использовать другой инструмент, такой как TypeScript, чтобы помочь вам писать ваш JavaScript, чтобы уменьшить количество ошибок. Итак, есть еще много разных вещей, которые вам нужно изучить. Итак, вопрос заключается в том, сколько JavaScript мне нужно знать, Крис? Об этом я расскажу в следующем видео.</p><p>Просто шучу, давайте обсудим это прямо сейчас. Очевидно, вам нужно изучить много вещей в JavaScript, и я могу рассказать только о части, но, на мой взгляд, самая важная часть - изучить терминологию. Как разработчик вам нужно не просто звучать как разработчик, но и знать язык разработчиков.</p><p>Почему? Потому что, когда вы общаетесь с другими разработчиками, особенно в JavaScript, многие разработчики будут использовать терминологию, которую вы, возможно, даже никогда не слышали. Например, что такое map? Как вы мапите массив? Что такое массив вообще?</p><p>Что такое объект? Что такое JSON? Это даже не JavaScript, но вы часто используете JSON, когда дело доходит до JavaScript, по крайней мере, я использовал. Понимание этих различных терминов, функций, циклов и т. д., просто понимание терминологии по различным вещам чрезвычайно важно, когда вы начинаете изучать JavaScript. Не пропускайте вещи при изучении JavaScript, понимайте терминологию. Теперь, в описании ниже, я размещу список различной терминологии, которую вы можете изучить, когда дело доходит до JavaScript. Надеюсь, это поможет, но давайте перейдем к следующей части.</p><p>Хорошо, я быстро пройдусь по этому списку на своем телефоне, хорошо? Так вот, во-первых, когда дело доходит до JavaScript, вам нужно изучить такие вещи, как булев тип, число, строки и т. д., различные операторы при работе с JavaScript, верно? Вам нужно даже изучить TypeScript, чтобы помочь вам избежать ошибок. TypeScript спасет вас, когда вы изучаете это. Далее, что вам нужно изучить, это вещи, как работать с массивами, как работать с различными объектами, что такое объектно-ориентированное программирование. Основы - это то, что вам нужно изучить, когда дело доходит до этого.</p><p>И даже сверх того, вам нужно изучить, как манипулировать DOM. Как писать функции клика, когда дело доходит до JavaScript? Что такое map? Что такое функция? Что такое оператор IF? Как писать оператор IF?</p><p>Как использовать операторы, такие как двойное равно или тройное равно? Когда использовать обратные кавычки? Когда вам даже не нужно использовать точки с запятой в JavaScript, но практически все основы, когда дело доходит до JavaScript, достаточно, чтобы позволить вам манипулировать DOM. Кроме того, вам нужно изучить события.</p><p>Слушатели, когда ждать клика, и вместо вас, вы назовете это, это будет особенно полезно, когда вы начнете работать с API. Но прежде всего, сколько JavaScript вам нужно знать? Вы не знаете достаточно JavaScript, если даже не создали два или три веб-сайта, используя JavaScript. Многие люди просто учатся, учатся, учатся. Это ошибка, которую люди часто делают, это то, что они продолжают учиться без остановки, когда дело доходит до JavaScript, но не строят ничего. Ваша цель, когда вы изучаете что-то в JavaScript, - построить как можно больше вещей, чтобы применить то, что вы узнали. Убедитесь, что вы не забудете это. Вы построите крепкое основание и найдете работу оттуда. В любом случае, надеюсь, это поможет.</p>]]></content:encoded>
    </item>
    <item>
      <title>Профессионал или профан: хорошо ли вы знаете CSS Flexbox — тест</title>
      <link>https://tproger.ru/articles/css-flexbox-test</link>
      <comments>https://tproger.ru/articles/css-flexbox-test?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/css-flexbox-test</guid>
      <description><![CDATA[<p>Пройдите тест и узнайте, хорошо ли вы понимаете CSS Flexbox — инструмент для создания гибких и адаптивных сайтов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/css-flexbox-test">Профессионал или профан: хорошо ли вы знаете CSS Flexbox — тест</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 31 Jan 2024 09:36:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>CSS Flexbox — это инструмент для создания гибких и адаптивных макетов в веб-разработке. Он позволяет расположить элементы в контейнере таким образом, чтобы они могли гибко реагировать на размер экрана или окна браузера.</p><p>Пройдите тест и узнайте, насколько хорошо вы понимаете концепции и свойства Flexbox, которые делают его таким мощным инструментом.</p><p>Узнайте, профессионал вы или полный профан. &gt;:-)</p>]]></content:encoded>
    </item>
    <item>
      <title>5 новых функций CSS, которые вы обязаны знать в 2024 году</title>
      <link>https://tproger.ru/articles/5-novyh-funkcij-css--kotorye-vy-obyazany-znat-v-2024-godu</link>
      <comments>https://tproger.ru/articles/5-novyh-funkcij-css--kotorye-vy-obyazany-znat-v-2024-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-novyh-funkcij-css--kotorye-vy-obyazany-znat-v-2024-godu</guid>
      <description><![CDATA[<p>Рассказали о 5 новых функциях в CSS: о cелекторе :has(), запросах к контейнерам, вложенности CSS, text-wrap:balance и :focus-visible.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-novyh-funkcij-css--kotorye-vy-obyazany-znat-v-2024-godu">5 новых функций CSS, которые вы обязаны знать в 2024 году</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 30 Jan 2024 11:20:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>IT-блог Academind рассказал о 5 новых функциях в CSS, которые веб-разработчики обязаны знать в 2024 году: о cелекторе :has(), запросах к контейнерам, вложенности CSS, text-wrap:balance и :focus-visible.</p><p>Вот, о чём рассказывают в видео:</p><ol><li>Для изменения цвета акцента радиокнопки, которая является частью элемента input, используется псевдокласс :checked в традиционном CSS.</li><li>Изменение стиля родительского элемента в зависимости от дочернего или потомка традиционно требовало JavaScript, но с latest.css можно использовать псевдоселектор :has.</li><li>С помощью :has можно определить условия, при которых стили применяются к родительскому элементу, например, сделать границы розовыми, если внутри есть выбранный input.</li><li>Поддержка псевдоселектора :has в браузерах очень хорошая.</li><li>Контейнерные запросы (container queries) позволяют адаптировать макет повторно используемого компонента в зависимости от доступного пространства для конкретного компонента на веб-сайте.</li><li>Используя контейнерные запросы, можно создавать компоненты, которые изменяют свой макет в зависимости от размера контейнера, в котором они находятся, без повторения CSS-кода.</li><li>Контейнерные запросы полностью поддерживаются всеми современными браузерами.</li><li>Вложенность селекторов теперь поддерживается в чистом CSS без использования препроцессоров, что упрощает поддержку и чтение кода.</li><li>Свойство text-wrap с новым значением balance позволяет балансировать количество символов на каждой строке, улучшая визуальное восприятие текста.</li><li>Поддержка свойства text-wrap со значением balance в браузерах очень хорошая.</li><li>Стилизация элементов при фокусировке важна для доступности и пользовательского опыта, а новый псевдокласс :focus-visible позволяет различать элементы, выбранные с помощью клавиатуры или мыши.</li><li>Совместимость псевдокласса :focus-visible с браузерами очень хорошая, что позволяет использовать его в проектах.</li></ol><p>Ниже представлена транскрибация ролика на русском языке.</p><h2>Применение селектора has</h2><p>Кнопка радио и граница розовые для выбранного элемента списка. Здесь установлено стандартное оформление: синяя кнопка и серая граница.</p><p>Кнопка радио является частью элемента ввода, поэтому мы обращаемся только к этому элементу ввода, добавляем псевдокласс checked и изменяем акцентный цвет в соответствии с нашими потребностями. Это традиционный CSS. Однако граница является частью элемента списка, то есть родительского элемента.</p><p>При использовании традиционного CSS изменение стиля родительского элемента в зависимости от потомка или дочернего элемента требовало JavaScript. Используя latest.css, мы можем применить hasSelector к нашему родителю, элементу списка в нашем случае. При пустых скобках ничего не изменится, у нас все еще нет изменения цвета для нашей границы здесь. Но внутри нашего hasSelector мы теперь можем определить условие, которое должно быть выполнено, чтобы применить стиль внутри наших фигурных скобок к нашему родителю. Добавление элемента ввода сделает все наши границы розовыми.</p><p>Поскольку каждый элемент списка здесь содержит элемент ввода, добавление только отмеченных полей ввода даст нам результат, который мы видели в начале. Has управляет стилизацией родительского элемента, к которому он применяется, в зависимости от его потомков.</p><p>Поддержка браузера для псевдоселектора Has очень хорошая. С помощью контейнерных запросов мы можем настраивать макет многоразового компонента в зависимости от доступного пространства для конкретного компонента на нашем сайте.</p><p>На этой странице используется один и тот же компонент четыре раза. Для раздела с избранным курсом мы используем другой макет, чем для последних курсов, поскольку раздел с избранным курсом предоставляет больше места для этого многоразового компонента.</p><p>В этом примере используются два раздела: раздел с избранным курсом и раздел с последними курсами, с одинаковой структурой. Каждая карточка курса внутри раздела обернута элементом курса. Для раздела с избранным курсом у нас есть только одна карточка курса. Для последних курсов у нас есть три отдельные карточки курсов. С помощью флагов отображения на классах курсов мы определяем стандартный макет наших компонентов курсов.</p><p>Таким образом, каждый компонент должен быть отображен рядом друг с другом горизонтально.</p><h2>Контейнерные запросы</h2><p>Контейнерные запросы затем включаются путем добавления свойства типа контейнера на наш класс курса. Таким образом, оболочка для наших отдельных компонентов курсов. Используя значение inline size, достаточно определить только ширину нашего контейнера здесь.</p><p>С этим параметром мы теперь можем выполнять запросы к этому элементу курса. И в зависимости от размера этого контейнера мы можем настраивать макет элементов внутри этого контейнера. Синтаксис добавления контейнера теперь позволяет нам ссылаться на этот контейнер, который мы определили, добавляя здесь минимальную ширину. Мы устанавливаем значение, когда эти правила, определенные внутри этого контейнерного запроса, должны быть активными.</p><p>Без использования этих контейнерных запросов макет всех компонентов был бы одинаковым, и, следовательно, дополнительное пространство, которое у нас есть для раздела с избранным курсом, …не использовалось бы должным образом.</p><p>С помощью контейнерных запросов многоразовые компоненты, настраивая их макет в зависимости от доступного пространства для отдельного компонента, могут быть созданы легко.</p><p>Контейнерные запросы полностью поддерживаются всеми современными браузерами. Использование традиционного CSS для применения конкретных стилей к конкретным элементам внутри контейнера всегда означало повторение, поэтому нам приходилось снова и снова обращаться к контейнеру перед определением стиля для соответствующего элемента.</p><h2>Вложенные селекторы</h2><p>Вложенные селекторы были возможны только с препроцессорами, такими как ZAS. Это изменилось, поскольку обычный CSS теперь также поддерживает вложенные правила, что делает наш код более легким в обслуживании и более читаемым. Мы просто вкладываем элементы, которые мы хотим стилизовать, внутри нашего контейнерного элемента, не повторяя базовый класс контейнера.</p><p>Поддержка браузера очень хорошая для последних версий наиболее популярных браузеров.</p><h2>Свойство text wrap в CSS</h2><p>Свойство text wrap управляет тем, как текст переносится внутри элемента.</p><p>Со вновь введенным значением balance для свойства text wrap CSS балансирует количество символов в каждой строке, чтобы избежать ситуаций, когда у нас есть одно слово в нашем подзаголовке здесь, вместо того чтобы иметь два слова здесь, что балансирует общий вид нашего подзаголовка.</p><p>Поддержка браузера для balance очень хорошая, поэтому вы можете использовать это значение в ваших проектах. Элементы веб-сайта доступны через щелчок, клавишу Tab или с помощью клавиатурной навигации. Стилизация фокусированных элементов важна для доступности пользователей и общего пользовательского опыта.</p><h2>Псевдокласс focus-visible</h2><p>С помощью псевдокласса focus мы смогли применить наши собственные индивидуальные стили к элементам нашего выбора.</p><p>Стили применяются ко всем элементам, где мы используем этот псевдокласс, независимо от того, выбираем ли мы элемент с помощью щелчка мыши, клавиши Tab или клавиатурной навигации. При фокусировке кнопки с помощью клавиатурной навигации подсветка имеет много смысла, для щелчка или клавиши Tab это не слишком разумно.</p><p>Со вновь введенным классом focus visible эта проблема теперь исправлена. Focus visible выделяет элементы при навигации с помощью клавиши Tab на клавиатуре, но может различать между элементами, которые не должны быть выделены при выборе с помощью щелчка мыши или клавиши Tab. Таким образом, кнопки не выделяются, а здесь выделяется поле ввода.</p><p>Совместимость браузера с focus visible очень хорошая, поэтому вы можете использовать его в ваших проектах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Фронтенд-разработчик: что это за профессия и где ей обучиться</title>
      <link>https://tproger.ru/articles/frontend-razrabotchik-chto-eto-za-professiya-i-gde-ej-obuchitsya-erid-ljn8kqpux</link>
      <comments>https://tproger.ru/articles/frontend-razrabotchik-chto-eto-za-professiya-i-gde-ej-obuchitsya-erid-ljn8kqpux?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Юсупов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/frontend-razrabotchik-chto-eto-za-professiya-i-gde-ej-obuchitsya-erid-ljn8kqpux</guid>
      <description><![CDATA[<p>Рассказываем о профессии фронтенд-разработчика: сколько получают в сфере, какие навыки нужны и где ей обучиться.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/frontend-razrabotchik-chto-eto-za-professiya-i-gde-ej-obuchitsya-erid-ljn8kqpux">Фронтенд-разработчик: что это за профессия и где ей обучиться</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Фронтенд-разработка с нуля]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 26 Jan 2024 16:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<ol><li><a href="https://tproger.ru/#one">Кто такой фронтенд-разработчик</a></li><li><a href="https://tproger.ru/#two">Что должен уметь фронтенд-разработчик</a></li><li><a href="https://tproger.ru/#three">Какие задачи выполняет фронтенд-разработчик</a></li><li><a href="https://tproger.ru/#four">Какая зарплата у фронтенд-разработчика</a></li><li><a href="https://tproger.ru/#five">Где обучиться профессии фронтенд-разработчика</a></li><li><a href="https://tproger.ru/#six">Какие плюсы и минусы в профессии фронтенд-разработчик</a></li><li><a href="https://tproger.ru/#seven">Какими инструментами пользуются фронтенд-разработчики</a></li><li><a href="https://tproger.ru/#eight">Какое будущее у профессии фронтенд-разработчик</a></li><li><a href="https://tproger.ru/#nine">Заключение</a></li></ol><h2>Кто такой фронтенд-разработчик</h2><p>Фронтенд-разработчик — это специалист, который занимается созданием и разработкой пользовательского интерфейса веб-сайта или веб-приложения. Он работает с языками HTML, CSS и JavaScript, а также с различными фреймворками и библиотеками, такими как React, Angular или Vue.js.</p><p>Задачи фронтенд-разработчика включают разработку и верстку страниц, создание интерактивных элементов и взаимодействие с бэкенд-частью системы. Он отвечает за то, чтобы пользовательский интерфейс был удобным, привлекательным и функциональным. Фронтенд-разработчик работает в тесном сотрудничестве с дизайнерами, бэкенд-разработчиками и другими участниками команды для создания качественного и эффективного веб-приложения.</p><p>Фронтенд-разработчик также может называться <a href="https://ed4.edscale.online/click?o=30&amp;a=553&amp;sub_id4=+LjN8KQpUX&amp;deep_link=https://practicum.yandex.ru/frontend-developer/">веб-разработчиком</a>, UI/UX разработчиком или фронтенд-дизайнером. Все эти термины относятся к специалисту, который занимается созданием и разработкой пользовательского интерфейса веб-сайта или веб-приложения.</p><h2>Что должен уметь фронтенд-разработчик</h2><p>Фронтенд-разработчик должен обладать определенными навыками и знаниями, чтобы эффективно выполнять свою работу. Вот некоторые из них:</p><ul><li><b>Знание языков HTML, CSS и JavaScript</b>: фронтенд-разработчик должен владеть HTML для создания структуры веб-страницы, CSS для оформления и стилизации элементов и JavaScript для добавления интерактивности и динамического поведения.</li></ul><ul><li><b>Работа с фреймворками и библиотеками</b>: фронтенд-разработчик должен быть знаком с популярными фреймворками и библиотеками, такими как React, Angular, Vue.js, jQuery и другими. Он должен уметь использовать их для создания компонентов, обработки событий и взаимодействия с серверной частью приложения.</li></ul><ul><li><b>Верстка и макетирование</b>: фронтенд-разработчик должен уметь верстать веб-страницы с использованием HTML и CSS. Он должен иметь понимание принципов адаптивной верстки, чтобы обеспечить корректное отображение сайта на различных устройствах. Кроме того, важно владеть навыками работы с CSS-препроцессорами, такими как SASS или LESS, для повышения эффективности и удобства кодирования.</li></ul><ul><li><b>Интерактивные элементы и анимация</b>: фронтенд-разработчик должен уметь создавать интерактивные элементы: кнопки, формы, слайдеры. Он должен быть знаком с различными методами создания анимации и эффектов, чтобы улучшить пользовательский опыт.</li></ul><ul><li><b>Оптимизация производительности</b>: фронтенд-разработчик должен быть знаком с техниками оптимизации производительности, такими как сжатие файлов, кэширование, асинхронная загрузка ресурсов и другие методы для ускорения загрузки страницы.</li></ul><ul><li><b>Интеграция с бэкенд-частью</b>: фронтенд-разработчик должен уметь интегрировать пользовательский интерфейс с серверной частью приложения. Он должен быть знаком с API и протоколами взаимодействия с сервером, чтобы обеспечить передачу данных и синхронизацию между клиентской и серверной частями.</li></ul><ul><li><b>Тестирование и отладка</b>: фронтенд-разработчик должен уметь тестировать и отлаживать пользовательский интерфейс, чтобы обнаружить и исправить ошибки и проблемы, связанные с функциональностью и отображением элементов.</li></ul><ul><li><b>Поддержка и обновление</b>: фронтенд-разработчик должен быть готов поддерживать и обновлять пользовательский интерфейс веб-приложения. Он должен следить за новыми технологиями и трендами в веб-разработке и вносить соответствующие изменения в приложение.</li></ul><p>Кроме того, фронтенд-разработчик должен обладать хорошими коммуникативными навыками, уметь работать в команде и быть готовым к постоянному обучению и саморазвитию.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2024-01-26/b1da19c8-46da-4e22-b47f-7d49718a0ccd.jpeg" alt="" /><figcaption>Вот примеры требований от работодателей</figcaption></figure><h2>Какие задачи выполняет фронтенд-разработчик</h2><p>Он может выполнять множество других задач, связанных с созданием и разработкой пользовательского интерфейса веб-сайта или веб-приложения. Вот некоторые примеры:</p><ul><li><b>Верстка веб-страниц</b>: фронтенд-разработчик создает HTML-структуру и применяет CSS для оформления и стилизации веб-страниц. Он заботится о том, чтобы страницы были отзывчивыми и хорошо отображались на различных устройствах и экранах.</li></ul><ul><li><b>Разработка интерактивных элементов</b>: фронтенд-разработчик создает интерактивные элементы, такие как кнопки, формы, слайдеры и другие, с помощью JavaScript. Он обеспечивает работу этих элементов, обрабатывает события и взаимодействует с серверной частью приложения.</li></ul><ul><li><b>Адаптивная верстка</b>: фронтенд-разработчик обеспечивает адаптивность веб-сайта, чтобы он корректно отображался на различных устройствах и экранах. Он использует медиа-запросы CSS и другие техники для создания отзывчивого дизайна.</li></ul><ul><li><b>Разработка анимации и эффектов</b>: фронтенд-разработчик может создавать анимацию и эффекты, чтобы улучшить пользовательский опыт и визуальное восприятие веб-сайта. Он может использовать CSS анимацию, JavaScript библиотеки или другие инструменты для создания динамических эффектов.</li></ul><ul><li><b>Интеграция с серверной частью</b>: фронтенд-разработчик интегрирует пользовательский интерфейс с серверной частью приложения. Он обеспечивает передачу данных и синхронизацию между клиентской и серверной частями, используя API и протоколы взаимодействия.</li></ul><ul><li><b>Тестирование и отладка</b>: фронтенд-разработчик тестирует и отлаживает пользовательский интерфейс, чтобы обнаружить и исправить ошибки и проблемы, связанные с функциональностью и отображением элементов. Он может использовать инструменты разработчика браузера, консоль JavaScript и другие средства для выявления и устранения проблем.</li></ul><ul><li><b>Поддержка и обновление</b>: фронтенд-разработчик поддерживает и обновляет пользовательский интерфейс веб-приложения. Он следит за новыми технологиями и трендами в веб-разработке и вносит соответствующие изменения в приложение.</li></ul><h2>Какая зарплата у фронтенд-разработчика</h2><p>Зарплата фронтенд-разработчика может значительно варьироваться в зависимости от опыта работы, уровня квалификации, региона и размера компании. В среднем, начинающий фронтенд-разработчик может рассчитывать на зарплату от 50 000 до 80 000 рублей в месяц. С опытом работы и профессиональным ростом зарплата может достигать от 100 000 до 200 000 рублей в месяц и выше.</p><p>Однако, стоит отметить, что эти цифры являются приблизительными и могут различаться в зависимости от многих факторов. Кроме того, зарплата может зависеть от наличия сертификатов, дипломов, портфолио проектов или кейсов и других профессиональных достижений.</p><figure><img src="https://media.tproger.ru/user-uploads/75379/2024-01-26/6a2d7028-1dfc-4f2f-95ce-a65f9428840c.jpeg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2024-01-26/fa6aca02-587e-4f59-aa33-cd195864b9d2.jpeg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/75379/2024-01-26/33249e48-7347-4412-9b52-3fb27938ef94.jpeg" alt="" /><figcaption>Примерные вилки зарплат фронтенд-разработчика. Источник: hh.ru</figcaption></figure><h2>Где обучиться профессии фронтенд-разработчика</h2><p>В целом, выбор места обучения зависит от ваших личных предпочтений и возможностей. Однако, обучение на курсе может принести больше результатов, чем при самостоятельном поиске информации. Поскольку на курсе все материалы уже структурированы и отобраны по темам.</p><p>Кроме того, курсы сопровождают эксперты, готовые помочь, ответить на вопросы и проверить домашние задания. А по окончанию курса можно получить сертификат, который в дальнейшем вы добавите в свое резюме.</p><p>А также прохождение курсов и успешное выполнение заданий помогут вам улучшить свою самоуверенность и мотивацию. Вы будете видеть прогресс в своих навыках и будете готовы к новым вызовам и проектам.</p><p>Яндекс Практикум предлагает <a href="https://ed4.edscale.online/click?o=30&amp;a=553&amp;sub_id4=+LjN8KQpUX&amp;deep_link=https://practicum.yandex.ru/frontend-developer/">курс фронтенд-разработчика</a>, на котором вы изучите HTML, CSS, языки программирования JavaScript, TypeScript, библиотеку React.</p><p>На курсе будут сеансы парного программирования, лайвкодинг и хакатон. Создадите 10+ проектов для портфолио и получите обратную связь от экспертов Яндекса.</p><p>Курс подойдет вам, если:</p><ul><li>у вас нет опыта в IT или технического образования;</li><li>вы уже пробовали учиться самостоятельно, но вам нужна помощь и обратная связь от опытного специалиста;</li></ul><ul><li>вы хотите обучаться системно. Чтобы вся информация была в одном месте;</li></ul><ul><li>вы уже работаете в IT на смежной роли, но хотите сменить направление или освоить новые навыки.</li></ul><p>Вас поддержат практикующие специалисты, которые сами прошли этот трудный путь:</p><ul><li>наставники научат искать ответы. В дальнейшем вы сможете решить любой вопрос самостоятельно;</li></ul><ul><li>код-ревьюеры проверят ваш код и проекты. Все код-ревьюеры — действующие веб-разработчики;</li></ul><ul><li>кураторы сделают обучение комфортным. Ответят на вопросы, напомнят о сроках, пришлют ссылки на записи вебинаром, поддержат и выслушают;</li></ul><ul><li>техническая поддержка работает 24/7.</li></ul><p>Вы будете учиться не одни.</p><p>Рядом будут другие студенты и студентки. Можно обсудить проект, дать совет, попросить помощи, обрести интересные знакомства и полезные связи.</p><h3>Что вы получите после курса</h3><ul><li>Диплом — он не даёт гарантий сам по себе, но выделит вас на фоне других кандидатов при поиске работы.</li><li>Портфолио из 5 проектов.</li><li>Возможность познакомиться и учиться вместе с единомышленниками.</li><li>Помощь с поиском работы —  для этого у Яндекс Практикума есть карьерный центр. Там расскажут про рынок труда и компании, которые нанимают junior-разработчиков. Помогут собрать портфолио и составить резюме. Подготовят к собеседованиям и научат вести разговор.</li></ul><p>10 000+ выпускников Практикума уже нашли новую работу.</p><h2>Какие плюсы и минусы в профессии фронтенд-разработчика</h2><p>Как и в любой профессии, у фронтенд-разработчика есть свои плюсы и минусы. Вот некоторые из них:</p><h3>Плюсы</h3><ul><li><b>Востребованность</b>: веб-разработка является неотъемлемой частью современного мира, на рынке много вакансий в этом направлении.</li></ul><ul><li><b>Карьерный рост</b>: можно профессионально рости и развиваться. Они могут стать лидерами команды разработки или специалистами в определенных областях, таких как UX/UI дизайн или разработка мобильных приложений.</li></ul><ul><li><b>Творческая работа</b>: фронтенд-разработчики имеют возможность проявить свою творческую натуру при создании пользовательского интерфейса и взаимодействия с пользователями.</li></ul><ul><li><b>Гибкость</b>: фронтенд-разработчики могут работать в различных отраслях и компаниях, от стартапов до крупных корпораций. Они также имеют возможность работать удаленно или по гибкому графику.</li></ul><h3>Минусы</h3><ul><li><b>Тесная связь с кодом</b>: фронтенд-разработчики часто проводят много времени перед экраном компьютера, работая с кодом и деталями пользовательского интерфейса. Это может быть физически и эмоционально утомительно.</li></ul><ul><li><b>Быстрые темпы развития</b>: веб-технологии постоянно меняются и развиваются. Фронтенд-разработчики должны постоянно обновлять свои знания и навыки, чтобы оставаться востребованными на рынке труда.</li></ul><ul><li><b>Совместная работа</b>: фронтенд-разработчики часто работают в команде с бэкенд-разработчиками, дизайнерами и другими участниками проекта. Это требует хорошей коммуникации и умения работать в коллективе.</li></ul><ul><li><b>Стресс:</b> фронтенд-разработчики могут столкнуться со стрессом, связанным с сроками, ошибками в коде или сложными требованиями проекта. Умение управлять стрессом и работать под давлением является важной навыком для этой профессии.</li></ul><p>Однако, важно отметить, что эти плюсы и минусы могут варьироваться в зависимости от конкретной ситуации и личных предпочтений. Фронтенд-разработка — это интересная и динамичная профессия, которая может стать любимым делом.</p><h2>Какими инструментами пользуются фронтенд-разработчики</h2><p>Фронтенд-разработчик использует различные инструменты для создания и разработки пользовательского интерфейса веб-сайта или веб-приложения. Вот некоторые из основных инструментов, которые часто используются в работе фронтенд-разработчика:</p><ul><li><b>Текстовые редакторы и интегрированные среды разработки (IDE)</b>: фронтенд-разработчики используют текстовые редакторы или IDE для написания и редактирования кода. Некоторые популярные редакторы включают Visual Studio Code, Sublime Text и Atom.</li></ul><ul><li><b>Браузеры</b>: фронтенд-разработчики используют браузеры для проверки и тестирования своего кода. Они могут использовать различные браузеры, такие как Google Chrome, Firefox, Safari и другие, чтобы убедиться, что их веб-страницы и интерфейсы отображаются корректно на разных платформах и устройствах.</li></ul><ul><li><b>HTML и CSS</b>: HTML (HyperText Markup Language) и CSS (Cascading Style Sheets) являются основными языками для создания структуры и внешнего вида веб-страниц. Фронтенд-разработчики используют эти языки для создания разметки и стилизации веб-страниц.</li></ul><ul><li><b>JavaScript</b>: JavaScript является языком программирования, который позволяет добавлять интерактивность и динамическое поведение на веб-страницах. Фронтенд-разработчики используют JavaScript для создания интерактивных элементов, обработки событий и взаимодействия с серверной частью приложения.</li></ul><ul><li><b>Библиотеки и фреймворки</b>: фронтенд-разработчики могут использовать различные библиотеки и фреймворки, такие как React, Angular и Vue.js, для ускорения разработки и улучшения производительности. Эти инструменты предоставляют готовые компоненты и функциональность, которые упрощают создание сложных интерфейсов.</li></ul><ul><li><b>Системы контроля версий</b>: фронтенд-разработчики часто используют системы контроля версий, такие как Git, для отслеживания изменений в коде и совместной работы с другими разработчиками.</li></ul><ul><li><b>Инструменты тестирования</b>: фронтенд-разработчики могут использовать различные инструменты тестирования, такие как Jest, Mocha и Jasmine, для проверки и подтверждения правильности работы своего кода.</li></ul><h2>Какое будущее у профессии фронтенд-разработчик</h2><p>Развитие профессии фронтенд-разработчика имеет хорошую тенденцию. С ростом веб-технологий и развитием интернета, потребность в квалифицированных фронтенд-разработчиках постоянно растет. Вот несколько факторов, которые указывают на будущее этой профессии:</p><ul><li><b>Рост веб-технологий:</b> веб-технологии постоянно развиваются, и фронтенд-разработчики играют ключевую роль в их развитии. С появлением новых технологий, таких как веб-компоненты, Progressive Web Apps (PWA) и WebAssembly, фронтенд-разработчики имеют больше возможностей для создания инновационных и мощных веб-приложений.</li></ul><ul><li><b>Увеличение числа веб-пользователей</b>: количество людей, использующих интернет, продолжает расти. Это означает, что веб-сайты и веб-приложения становятся все более популярными. Увеличение числа веб-пользователей создает больший спрос на квалифицированных фронтенд-разработчиков, способных создавать удобные и привлекательные пользовательские интерфейсы.</li></ul><ul><li><b>Развитие мобильных устройств</b>: с увеличением числа людей, использующих мобильные устройства для доступа в интернет, фронтенд-разработчики должны учитывать мобильную адаптивность и оптимизацию своих веб-приложений. Это создает дополнительные возможности для развития и специализации в области мобильной фронтенд-разработки.</li></ul><ul><li><b>Увеличение автоматизации</b>: с развитием автоматизации и инструментов разработки, фронтенд-разработчики могут ускорить и упростить процесс разработки. Это позволяет им сосредоточиться на более сложных и творческих задачах, таких как создание интерактивных элементов и анимации.</li></ul><ul><li><b>Рост удаленной работы</b>: с развитием удаленной работы, фронтенд-разработчики имеют возможность работать из любой точки мира. Это расширяет их возможности для трудоустройства и позволяет работать с международными клиентами и проектами.</li></ul><p>В целом, будущее профессии фронтенд-разработчика выглядит многообещающим. С постоянным развитием веб-технологий и ростом спроса на квалифицированных фронтенд-разработчиков, эта профессия предлагает множество возможностей для роста и развития.</p><h2>Заключение</h2><p>Фронтенд-разработка является важной и востребованной областью веб-разработки. Профессия фронтенд-разработчика требует знания и навыков в области HTML, CSS и JavaScript, а также способности создавать привлекательный и функциональный пользовательский интерфейс. Благодаря постоянному развитию и изменениям в веб-технологиях, фронтенд-разработчики всегда имеют возможность обновлять свои навыки и быть в курсе последних тенденций. Если вы интересуетесь технологиями веб-разработки и обладаете творческим мышлением, то фронтенд-разработка может быть стать любимым делом.</p><p><i>Реклама ООО «Стратеджик Инсайтс», LjN8KQpUX</i></p>]]></content:encoded>
    </item>
  </channel>
</rss>