Мобильная вёрстка блога: что показал замер на 390 px в 81 статье нашего прода
Что показал замер 81 статьи на 390 px: 171 таблица и 11 блоков кода без прокрутки, раздутый вьюпорт, срез обложки. Как проверить и что правится админкой.
Коротко
- Материал актуален на 06.10.2026. Данные — по нашему собственному продакшену, срез сделан 06.10.2026 по живому дампу: 101 запись в базе, из них 81 статья, 112 URL в sitemap.xml.
- Горизонтальный скролл на телефоне — это не «широкая таблица», а сломанный вьюпорт всей страницы. Замер одной статьи до правки: clientW 390 · scrollW 722 · innerW 722. После правки: 390 / 390 / 390.
- Необёрнутых таблиц в корпусе 171 из 202 — они живут в 64 статьях из 81 (79 % по нашему расчёту). Необёрнутых блоков кода — 20 тегов <pre> в 11 статьях из 81; там нет ни одного обёрнутого.
- Причина почти всегда одна: у широкого содержимого нет контейнера с
overflow-x:auto. Браузер не обрезает таблицу, а расширяет под неё документ. - Для робота это важнее, чем для читателя: Google индексирует rendered HTML и прямо предупреждает, что не все боты исполняют JavaScript. Проверять надо curl'ом с User-Agent поискового робота, а не взглядом в браузере.
Как измеряют ширину страницы на телефоне?
Один скриншот ничего не доказывает: на снимке раздувание видно, а кто его вызвал — нет. Мы меряем три числа в одном замере.
document.documentElement.clientWidth— сколько страница заняла по факту.document.documentElement.scrollWidth— насколько она шире экрана.window.innerWidth— какой вьюпорт отдал браузер, то есть какой он считает рабочим.
Замер делаем головным Chromium по DevTools-протоколу с эмуляцией 390 × 844, deviceScaleFactor 3, режим мобильного устройства. Три числа снимаются одновременно, потому что поломка выглядит по-разному: у блока может быть нормальная ширина, а документ при этом 722.
Норма у этого теста простая и своя для каждого сайта: docScrollW === clientW. Если ширина прокрутки больше ширины клиента — страница на телефоне скроллится целиком, и это всегда дефект вёрстки, а не «особенность дизайна».
Почему раздувается весь сайт, а не одна таблица?
Потому что у браузера есть layout-вьюпорт — та ширина, от которой считаются все раскладки. Содержимое, которое отказывается сжиматься, растягивает не себя, а документ.
Два характерных случая из нашего корпуса:
- Четырёхколоночная таблица без обёртки на экране 390 px даёт
scrollWidth579 — на 48 % шире экрана. - Блок кода в
<pre>без обёртки и сwhite-space:preдаёт layout-вьюпорт 722: вьюпорт, который браузер отдал, тоже стал 722 вместо запрошенных 390.
Дальше включается цепочка: документ шире экрана → position:fixed элементы считаются от раздутого документа → полоса прокрутки появляется под текстом, а не внутри блока. Читатель на телефоне свайпом двигает всю страницу и попутно сдвигает шапку. Именно поэтому починка «уменьшить шрифт» или «сделать колонки уже» не работает: размер элемента не является причиной, причиной является отсутствие точки прокрутки.
Сколько страниц в нашем корпусе ломаются на 390 px?
Все числа ниже — по нашему дампу и нашему скрипту, они воспроизводятся повторным прогоном. Соотношения — наше вычисление, а не внешняя норма.
| Что меряем. | Значение на 06.10.2026. | Что это значит. |
|---|---|---|
| Записей в базе. | 101. | 81 статья и 20 кейсов. |
| URL в sitemap.xml. | 112. | Робот приходит по карте, а не из листинга. |
| Статей с таблицами без прокрутки. | 64 из 81, 79 % по нашему расчёту. | Мобильная поломка — массовая, а не точечная. |
| Таких таблиц всего. | 171 из 202. | 85 % таблиц в корпусе без обёртки. |
| Статей с необёрнутым кодом. | 11. | Чинятся одной CSS-строкой, а не 11 правками. |
| Блоков «Коротко». | 17 из 81, 21 %. | Нейроответу нечего цитировать в 5 статьях из 6. |
| Строки «актуален на …». | 15 из 81, 19 %. | Честность по времени держится на тексте. |
| Статей без единой внешней ссылки. | 63. | Проверить факт читателю негде. |
Отдельная строка — связность. Статей с двумя и более входящими ссылками 61 (75 %), хотя бы одной входящей — 75 (93 %), полностью изолированных — 6. Считаем мы это не ради красивого отчёта: изолированная страница получает обход только из карты сайта, то есть индексируется медленнее остальных.
Что опаснее — таблицы или блоки кода?
Таблицы ломают чтение, код ломает вёрстку сильнее. Таблицу браузер ещё может сжать: у неё есть переносы, она режет колонки, в крайнем случае текст ляжет в две строки. У <pre> с white-space:pre такой возможности нет — каждая строка сохраняет длину.
Отсюда практический вывод: 171 необёрнутая таблица — это в основном неприятно, но поправимо самим читателем, а 20 необёрнутых блоков кода в 11 статьях — это гарантированно раздутый вьюпорт. Приоритет правки в нашем корпусе был обратный интуиции: сначала 11 статей с кодом как единичные тяжёлые дефекты, потом таблицы массово, при следующей вычитке.
Почему это важно для робота, а не только для читателя?
Документация Google по JavaScript-сайтам говорит прямо: «Keep in mind that server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript». То есть пререндеринг полезен не только ради скорости — часть краулеров JavaScript не исполняет вовсе и видит только HTML ответа сервера.
Там же про индексацию: «If the content isn't visible in the rendered HTML, Google won't be able to index it». Для нас это означало методичку: проверять отдачу надо curl'ом с User-Agent поискового робота. Разница измерена на нашем же проде: серверный HTML страницы блога с ботовым UA весит 27–36 КБ и содержит текст статьи, а тот же адрес с обычным браузерным UA отдаёт оболочку приложения примерно 4 КБ.
Мобильная ширина сюда же: страница, у которой вьюпорт раздут до 722 px, формально индексируется, но на мобильной выдаче выглядит как брак. Пороги Core Web Vitals мы приводим как прочитанную норму, а не как свою оценку. LCP — не больше 2,5 с, INP — не больше 200 мс, CLS — не больше 0,1. Мерить их надо на 75-м персентиле загрузок, отдельно для мобильных и для десктопных устройств.
При чём тут обложка статьи?
При том, что второй по частоте мобильный дефект мы нашли не в теле, а в шапке статьи. Контейнер обложки задан как блок фиксированной высоты с обрезкой, а картинка внутри — с заполнением без ограничения ширины. Мерка вертикального среза по нашей разметке: 16,1 % на 1440 px, 19,8 % на 1600 px, 25,2 % на 1920 px.
Практический смысл: цифра или дата, поставленная на обложку близко к краю, на широком экране просто исчезает. Мы решили это геометрией, а не вёрсткой — безопасная полоса содержимого y 190…530 px. Все обложки, что мы делаем сейчас, проверяются до загрузки файла: контент должен попасть в полосу, иначе карточка не уходит на сайт.
Горизонтальный срез на 390 px по нашему замеру мал — около 4 %, поэтому обложка на телефоне жива. Пропадает ровно то, что нарисовано по вертикальным краям: подписи, выноски, даты.
Как чинить: что правится в админке, а что только в коде?
Грубая ошибка — отправить все 171 таблицу в ручную правку. Часть дефектов чинится одним правилом CSS, и это как раз наш случай.
| Находка. | Правка без доступа к коду. | Правка в коде. |
|---|---|---|
| Таблица без прокрутки. | Обёртка вручную в тексте статьи. | Одно правило для контейнера статей. |
| Блок кода без прокрутки. | Неэффективно: 11 отдельных правок. | Одна CSS-строка overflow-x:auto. |
| Текст вне безопасной полосы обложки. | Перегенерировать файл по новой геометрии. | Ограничить высоту и позицию. |
| Нет строки актуальности. | Добавить в текст. | Не требует кода. |
Нет dateModified в разметке. | Неправится, поля в админке нет. | Только кодом. |
Шаблон обёртки, который мы теперь пишем сразу в теле статьи, а не чиним постфактум:
<div style="overflow-x:auto;-webkit-overflow-scrolling:touch;
margin:1.7em 0;padding-bottom:.4em">
<table> … </table>
</div>Подсказка рядом с любым блоком кода: на телефоне он прокручивается свайпом внутри себя. Строка в 75 символов в узкий экран не влезает никогда, и писать об этом надо прямо, а не надеяться на догадку читателя.
По-честному про наш случай: исходников сайта у нас на машине нет, поэтому правки уровня CSS, канонические адреса, dateModified и геометрия обложки вынесены в отдельный пакет и отдаются разработчику. Админкой закрывается то, что живёт в тексте: обёртки таблиц, блок «Коротко», строка актуальности, внешние ссылки, перелинковка.
Как проверить свой сайт за один вечер?
Пять шагов, ни один не требует подрядчика и денег.
- Открыть страницу в DevTools на ширине 390 px и в консоли прочитать
document.documentElement.scrollWidth. Признак поломки — число больше 390. - Пройти по самым длинным таблицам и блокам кода: признак — горизонтальная полоса прокрутки появляется под текстом, а не внутри блока.
- Запросить страницу с User-Agent робота и сравнить с браузерным ответом. Признак — текст статьи виден только в браузерном HTML.
- Посмотреть обложку на 1440, 1600 и 1920 px. Признак — дата или цифра уползает за край кадра.
- Посчитать по своим статьям три числа: доля с самодостаточным блоком «Коротко», доля с двумя и более входящими ссылками, доля без единой внешней ссылки. Признак — любая из трёх ниже половины.
Первые четыре шага — это один вечер руками. Пятый требует скрипта, но и он не про магию: дамп контента и подсчёт по регулярным выражениям, как в таблице выше.
Кто виноват на самом деле, если страница 722 px?
Самая дорогая ошибка в этом поиске — исправить не тот элемент. В нашем замере в список выходящих за вьюпорт попал пустой элемент с position:fixed: у него унаследованная ширина, то есть он был жертвой раздутого документа, а не причиной.
Поэтому мы ищем не по размеру элемента, а по признаку: скрипт печатает тройку clientW / scrollW / innerW и список узлов, выходящих за вьюпорт, отдельно отсекая служебный пререндерный блок. Так виновник находится за один прогон вместо ручной переборки половины DOM.
Сколько это стоит и где граница самопомощи?
Отдельной строки на «починку мобильной вёрстки» в прайсе у нас нет, и выдуманную цену приводить не будем. Граница проходит по признаку доступа: если правка живёт в тексте статьи — её делает редактор, если в CSS или в разметке страницы — нужен разработчик с репозиторием.
Что можно самому: обёртки таблиц, структура блоков, ссылки на первоисточники, геометрия новых обложек. Что нельзя: правила CSS для контейнера статей, канонические адреса, dateModified в разметке, поведение шапки при обрезке. Второй класс работ — это аудит с приоритетами и ТЗ, а не «наймите нас», потому что объём первой половины работы честно измеряется количеством статей в корпусе.
Что мы сделали со своим корпусом и что дальше?
С 05.10.2026 все новые статьи пишутся сразу с обёртками, блоком «Коротко» и строкой актуальности, а перед записью проходят механическую проверку: длины мета-тегов, баланс тегов, таблицы и код в обёртках, наличие внешней ссылки на первоисточник, внутренние ссылки и кейс. Скрипт не принимает решение за редактора — он не даёт выпустить то, что валит хоть одну красную проверку.
Старые 64 статьи — отдельная задача вычитки, она идёт по недельному циклу: в субботу проверяются даты норм, живость внешних ссылок и строка актуальности у материалов старше 60 дней. Массовая правка ширины уйдёт одной CSS-строкой вместе с пакетом кодовых правок, а не сотней записей в админке.
Этот текст сам попал в собственный срез. После записи в прод страница на 390 px показала scrollWidth 436 — скрипт-гейт проверяет разметку, а не рендер, и inline-код в нумерованных списках он не ловит. Дальше была бинарная диагностика: по одному скрываем элементы и смотрим, где ширина падает. Нашли два источника — длинные URL в разделе «Источники» (436 → 413) и 18 необёрнутых inline-фрагментов <code> (413 → 390). Обе правки сделаны через админку, стили на месте, кода не трогали; контрольный замер на живом проде — 390 / 390 / 390. Вывод, который стоит держать в гейте: проверять надо не только файл перед записью, но и отдачу после неё.
Как это связано с поиском и заявками?
Мобильная вёрстка не приносит трафик сама по себе, она перестает его отнимать. Трафик приносят тексты, которые робот индексирует и которые нейроответ может процитировать: самодостаточный блок с фактами и датами, ссылка на первоисточник, связность внутри корпуса. Про то, чем задачи SEO и GEO реально отличаются, мы разбирали замеры на 76 страницах прода, а приёмку работ по измеримым критериям — в чек-листе из 24 пунктов.
Если нужен разбор вашего сайта, а не этого текста: техническая часть — в материале про аудит скорости, автоматический контроль — про гейты качества при сборке, связность корпуса — про внутреннюю перелинковку.
Мы проверяем мобильную отдачу и индексирование как часть аудита: по кейсу технического аудита видно, что находки формулируются числом, а не ощущением. Замерить ваш корпус и получить список того, что ломает мобильную выдачу, можно в рамках SEO- и GEO-аудита. Напишите в форму контактов — вернёмся с перечнем проверенных дефектов и приоритетом правок, а не с обещанием позиций.
Источники
- web.dev, «Web Vitals» — пороги LCP, INP, CLS и правило 75-го перцентиля: web.dev/articles/vitals, текст прочитан 06.10.2026.
- Google Search Central, «Crawl and index JavaScript» — про пререндеринг, rendered HTML и ботов, которые не исполняют JavaScript: developers.google.com/…/javascript-seo-basics, страница обновлена 04.03.2026, прочитана 06.10.2026.
- Числа по корпусу — дамп нашего прода и логи замеров 06.10.2026, методика описана в тексте, соотношения — наше вычисление.