Дедупликация и очистка CSS
Большой CSS-файл: убираем точные дубликаты, пустые правила, повторяющиеся свойства и правила, которые перебивают друг друга.
ДедупликацияОчистка CSS без поломки вёрстки
Удаляет дубликаты и неиспользуемые правила, корректно обрабатывает каскад, CSS-переменные и наследование — включая стили от body и предков блока.
var() и вложенные селекторыИнструменты
Три режима под три задачи: почистить файл, вычистить мёртвое из страницы и забрать стили одного блока.
Большой CSS-файл: убираем точные дубликаты, пустые правила, повторяющиеся свойства и правила, которые перебивают друг друга.
ДедупликацияВставьте HTML страницы и CSS — останутся только селекторы, которые реально что-то выбирают в этой разметке.
ФильтрТри поля: HTML всей страницы, CSS всей страницы и селектор блока. Оставляем стили блока, всё внутри него, наследуемые стили предков (включая body/html) и переменные.
Экспорт блокаПочему это безопасно
Победитель объявления считается по важности, специфичности и порядку в файле. Правила отдаются в исходном порядке, поэтому перебивание равных селекторов не ломается.
Цвет, шрифт, line-height, letter-spacing, visibility и SVG fill/stroke приходят от всех предков блока — текст не теряет оформление после выгрузки.
Сохраняются и правила с var(--x), и те, что объявляют --x, транзитивно: цепочка --a: var(--b) уезжает целиком, даже если объявление живёт на другом элементе.
@media, @supports, @layer, @container фильтруются рекурсивно и сохраняют обёртку. Объявление внутри @media не имеет права удалять то же свойство из базового правила.
:hover, :focus, ::before, :has() статически не вычислить — поэтому они сохраняются всегда: потерять ховер хуже, чем оставить лишнее правило.
Сколько правил было и стало, какие селекторы удалены, какие унаследованные стили и переменные сохранены, diff удалённых строк — всё видно до копирования.
Для каждого элемента считается победившее значение каждого свойства — до и после очистки. Если хотя бы одно значение отличается, тест падает.
@media и @supports удаляются целиком@keyframes и @font-face остаются только при ссылке на нихСценарии
Один экран — один файл стилей вместо 180 КБ фреймворка.
Вытаскиваем стили виджета из старого проекта вместе с предками и переменными.
Команда получает только свои правила — без чужих хедеров и футеров.
Наследие bootstrap-эпохи, дубли после джунов и «временных» правок.
Экспорт стилей одной страницы вместо глобального CSS сайта.
После рефакторинга остаётся мёртвый CSS — его видно в отчёте и можно удалить.
Переносим стили только для тех экранов, что остались на старой вёрстке. Остальное в новый проект не едет.
Показываем, какие правила страница использует на самом деле, а какие написаны зря. Годится и для обучения, и для ревью.
В поле цели можно вписать селектор или вставить HTML самого блока — найдём его в странице сами.
.card, #main, .sidebar__item
До и после
Цифры усреднённые: реальная экономия зависит от разметки, но мёртвые правила есть почти в каждом проекте.
Как это работает
Веб-интерфейс бесплатен и без ограничений. Для автоматизации — ключ с балансом: запросы по 0.10–0.30 ₽, пополнение картой или криптовалютой.
# экспорт одного блока по API curl -X POST https://css-cleaner.ru/api/v1/block \ -H "X-Api-Key: $CSSCLEANER_KEY" \ -d html=@page.html -d css=@site.css \ -d target=.card \ | jq -r .css > card.css
Детали
Победитель объявления определяется по важности, специфичности и порядку; перебивающие правила сливаются безопасно.
Наследуемые свойства от html, body и любого предка блока сохраняются — текст не теряет шрифт и цвет.
Правила с var() и все объявления нужных переменных сохраняются транзитивно, включая --x: var(--y).
@media, @supports и @layer фильтруются рекурсивно и сохраняют структуру и порядок правил.
Вопросы
Дубликат — правило с тем же селектором и набором объявлений: точные копии удаляются без изменения вида страницы. Правила, которые перебивают друг друга, сливаются только тогда, когда между ними нет правила той же специфичности с конфликтующим свойством, потому что там победителя определяет порядок в файле.
Селекторы переводятся в XPath и проверяются по DOM страницы. Для каждого элемента считается победитель каскада по важности, специфичности и порядку. Объявления, которые не выигрывают ни на одном элементе, помечаются как не участвующие в рендере.
Свойства color, font-family, font-size, line-height, letter-spacing, text-align, visibility, fill/stroke и custom properties наследуются. Если выгрузить только правила самого блока, текст потеряет шрифт и цвет. Инструмент добавляет правила всех предков блока, включая html и body.
Правила, объявляющие custom properties (:root { --x: … }), и все правила, использующие var(), сохраняются, а переменные, объявленные на предках блока, подтягиваются автоматически.
Да: вставьте HTML и CSS всей страницы и укажите селектор блока. В ответе будут правила блока, всего, что внутри него, наследуемые стили предков и переменные.
Веб-интерфейс бесплатен и без ограничений. JSON API тарифицируется по ключу с балансом — от 0,10 ₽ за запрос, оплата картой через ЮKassa или криптовалютой.
Файл никуда не уходит: обработка идёт на нашем сервере, ничего не сохраняется и не передаётся третьим лицам.