0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>9 июн 2025</li>
2
<ul><li>9 июн 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Рассказываем, как отображать код и сохранять пробелы и переносы.</p>
4
</ul><p>Рассказываем, как отображать код и сохранять пробелы и переносы.</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
5
<p>Иллюстрация: Polina Vari для Skillbox Media</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
7
<p>Если вы когда-либо пытались вставить на сайт кусок кода или ASCII-арт, то могли заметить проблему: браузер съедает все пробелы, табуляции и переносы строк. В результате аккуратно отформатированный текст превращается в скомканный и трудночитаемый блок.</p>
7
<p>Если вы когда-либо пытались вставить на сайт кусок кода или ASCII-арт, то могли заметить проблему: браузер съедает все пробелы, табуляции и переносы строк. В результате аккуратно отформатированный текст превращается в скомканный и трудночитаемый блок.</p>
8
<p>Чтобы сохранить исходное форматирование - пробелы, табуляцию и переносы, - используется тег <pre>. В HTML <pre> помогает правильно отображать такие тексты на странице.</p>
8
<p>Чтобы сохранить исходное форматирование - пробелы, табуляцию и переносы, - используется тег <pre>. В HTML <pre> помогает правильно отображать такие тексты на странице.</p>
9
<p><strong>Содержание</strong></p>
9
<p><strong>Содержание</strong></p>
10
<ul><li><a>Тег <pre>: что это и как пишется</a></li>
10
<ul><li><a>Тег <pre>: что это и как пишется</a></li>
11
<li><a>Когда стоит использовать тег <pre></a></li>
11
<li><a>Когда стоит использовать тег <pre></a></li>
12
<li><a>Как правильно применять тег <pre> на практике</a></li>
12
<li><a>Как правильно применять тег <pre> на практике</a></li>
13
<li><a>Возможности тега <pre>: стилизация, адаптивность, интерактивность</a></li>
13
<li><a>Возможности тега <pre>: стилизация, адаптивность, интерактивность</a></li>
14
<li><a>Частые ошибки</a></li>
14
<li><a>Частые ошибки</a></li>
15
<li><a>Полезные советы и лайфхаки</a></li>
15
<li><a>Полезные советы и лайфхаки</a></li>
16
</ul><p>Тег <pre> (от англ. preformatted text) используется для вывода текста "как есть", без автоматического удаления лишних пробелов или игнорирования переносов строк. Это особенно важно, если мы хотим точно воспроизвести форматирование исходного текста, например при работе с кодом, логами и поэзией.</p>
16
</ul><p>Тег <pre> (от англ. preformatted text) используется для вывода текста "как есть", без автоматического удаления лишних пробелов или игнорирования переносов строк. Это особенно важно, если мы хотим точно воспроизвести форматирование исходного текста, например при работе с кодом, логами и поэзией.</p>
17
<p><pre> - парный, то есть имеет тег закрытия </pre>. Он создаёт внутри себя блок с предварительно отформатированным текстом. При этом браузер не трогает пробелы, переносы и табуляцию.</p>
17
<p><pre> - парный, то есть имеет тег закрытия </pre>. Он создаёт внутри себя блок с предварительно отформатированным текстом. При этом браузер не трогает пробелы, переносы и табуляцию.</p>
18
<!-- С <pre> все отступы сохраняются --> <pre> /\_/\ ( o.o ) > ^ < </pre> <!-- а без него - теряются --> <div> /\_/\ ( o.o ) > ^ < </div><p>Если использовать <pre>, на выходе получится картинка, а без него всё оформление сломается.</p>
18
<!-- С <pre> все отступы сохраняются --> <pre> /\_/\ ( o.o ) > ^ < </pre> <!-- а без него - теряются --> <div> /\_/\ ( o.o ) > ^ < </div><p>Если использовать <pre>, на выходе получится картинка, а без него всё оформление сломается.</p>
19
<em>Скриншот: Google Chrome / Skillbox Media</em><p>А это пример использования тега <pre> для вывода блока кода:</p>
19
<em>Скриншот: Google Chrome / Skillbox Media</em><p>А это пример использования тега <pre> для вывода блока кода:</p>
20
<pre> function hello() { console.log("Hello, world!"); } </pre> <div> function hello() { console.log("Hello, world!"); } </div><p>Получится вот так:</p>
20
<pre> function hello() { console.log("Hello, world!"); } </pre> <div> function hello() { console.log("Hello, world!"); } </div><p>Получится вот так:</p>
21
<em>Скриншот: Google Chrome / Skillbox Media</em><p>Обратите внимание, что текст внутри <pre> выглядит иначе, чем обычный текст на странице: код будто напечатан на печатной машинке. В типографике такие шрифты называют моноширинными (или monospaced). По умолчанию браузер самостоятельно меняет шрифт внутри тега <pre> на моноширинный - например, на Courier или Menlo (в зависимости от операционной системы и браузера).</p>
21
<em>Скриншот: Google Chrome / Skillbox Media</em><p>Обратите внимание, что текст внутри <pre> выглядит иначе, чем обычный текст на странице: код будто напечатан на печатной машинке. В типографике такие шрифты называют моноширинными (или monospaced). По умолчанию браузер самостоятельно меняет шрифт внутри тега <pre> на моноширинный - например, на Courier или Menlo (в зависимости от операционной системы и браузера).</p>
22
<p>Тег <pre> применяется для отображения специфичных текстов, в которых важно сохранить исходное форматирование. Это могут быть:</p>
22
<p>Тег <pre> применяется для отображения специфичных текстов, в которых важно сохранить исходное форматирование. Это могут быть:</p>
23
<ul><li>исходный код - для демонстрации фрагментов программного кода;</li>
23
<ul><li>исходный код - для демонстрации фрагментов программного кода;</li>
24
<li>логи и терминал - для отображения вывода командной строки;</li>
24
<li>логи и терминал - для отображения вывода командной строки;</li>
25
<li>поэзия и таблицы ASCII - чтобы сохранить табуляцию, переносы и точное расположение слов и символов;</li>
25
<li>поэзия и таблицы ASCII - чтобы сохранить табуляцию, переносы и точное расположение слов и символов;</li>
26
<li>ASCII-арт и псевдографика - для создания символьных картинок и ретростилей.</li>
26
<li>ASCII-арт и псевдографика - для создания символьных картинок и ретростилей.</li>
27
</ul><p>Одна из главных особенностей тега <pre> - он не сжимает пробелы и табуляции. Мы можем поставить столько пробелов, сколько требуется, без риска, что браузер их проигнорирует.</p>
27
</ul><p>Одна из главных особенностей тега <pre> - он не сжимает пробелы и табуляции. Мы можем поставить столько пробелов, сколько требуется, без риска, что браузер их проигнорирует.</p>
28
<p>Текст в теге pre</p> <pre> Проходя мимо камина, бросила взгляд на стишок в рамке. Десять негритят решили пообедать, Один внезапно подавился - их осталось девять. "Какой ужас - прямо как у нас сегодня вечером..." - подумала девушка. </pre> <p>Текст в теге div</p> <div> Проходя мимо камина, бросила взгляд на стишок в рамке. Десять негритят решили пообедать, Один внезапно подавился - их осталось девять. "Какой ужас - прямо как у нас сегодня вечером..." - подумала девушка. </div><p>Результат:</p>
28
<p>Текст в теге pre</p> <pre> Проходя мимо камина, бросила взгляд на стишок в рамке. Десять негритят решили пообедать, Один внезапно подавился - их осталось девять. "Какой ужас - прямо как у нас сегодня вечером..." - подумала девушка. </pre> <p>Текст в теге div</p> <div> Проходя мимо камина, бросила взгляд на стишок в рамке. Десять негритят решили пообедать, Один внезапно подавился - их осталось девять. "Какой ужас - прямо как у нас сегодня вечером..." - подумала девушка. </div><p>Результат:</p>
29
<em>Скриншот: Google Chrome / Skillbox Media</em><p>Сам по себе тег <pre> не семантический - он влияет только на внешний вид текста, но не помогает поисковым системам понять его смысл. Скринридеры (программы, которые озвучивают текст людям с нарушениями зрения) читают текст внутри него без выделения интонацией.</p>
29
<em>Скриншот: Google Chrome / Skillbox Media</em><p>Сам по себе тег <pre> не семантический - он влияет только на внешний вид текста, но не помогает поисковым системам понять его смысл. Скринридеры (программы, которые озвучивают текст людям с нарушениями зрения) читают текст внутри него без выделения интонацией.</p>
30
<p>Есть теги, которые можно использовать внутри <pre> и которые помогут скринридерам и поисковым системам определить, что за контент лежит внутри, а также правильно его интерпретировать.</p>
30
<p>Есть теги, которые можно использовать внутри <pre> и которые помогут скринридерам и поисковым системам определить, что за контент лежит внутри, а также правильно его интерпретировать.</p>
31
<p>Примеры таких тегов:</p>
31
<p>Примеры таких тегов:</p>
32
<ul><li><code> - для записи кода;</li>
32
<ul><li><code> - для записи кода;</li>
33
<li><samp> - для записи вывода результатов скриптов (например, сообщения об ошибках);</li>
33
<li><samp> - для записи вывода результатов скриптов (например, сообщения об ошибках);</li>
34
<li><kbd> - для обозначения ввода пользователя (например, комбинации клавиш).</li>
34
<li><kbd> - для обозначения ввода пользователя (например, комбинации клавиш).</li>
35
</ul><pre><code>const x = 10;</code></pre> <!-- Код --> <pre><samp>Ошибка: файл не найден</samp></pre> <!-- Вывод программы --> <pre><kbd>Ctrl + C</kbd></pre> <!-- Клавиша --><p>Можно также добавить рядом с блоком тега <pre> описание или подпись, чтобы помочь поисковым системам понять, о чём этот блок:</p>
35
</ul><pre><code>const x = 10;</code></pre> <!-- Код --> <pre><samp>Ошибка: файл не найден</samp></pre> <!-- Вывод программы --> <pre><kbd>Ctrl + C</kbd></pre> <!-- Клавиша --><p>Можно также добавить рядом с блоком тега <pre> описание или подпись, чтобы помочь поисковым системам понять, о чём этот блок:</p>
36
<p>Ниже представлен код ошибки в консоли:</p> <pre>...</pre><p>Если вы хотите показать HTML-код внутри <pre>, обязательно экранируйте символы <, >, &, а то браузер решит, что это настоящие теги, и не отобразит их. Для этого нужно использовать специальные конструкции:</p>
36
<p>Ниже представлен код ошибки в консоли:</p> <pre>...</pre><p>Если вы хотите показать HTML-код внутри <pre>, обязательно экранируйте символы <, >, &, а то браузер решит, что это настоящие теги, и не отобразит их. Для этого нужно использовать специальные конструкции:</p>
37
<p>& lt; - для обозначения <;</p>
37
<p>& lt; - для обозначения <;</p>
38
<p>& gt; - для обозначения >;</p>
38
<p>& gt; - для обозначения >;</p>
39
<p>& amp; - для символа &.</p>
39
<p>& amp; - для символа &.</p>
40
<p>Тег <pre> поддерживает стандартные глобальные атрибуты: class, id, style, title, hidden и другие, поэтому легко будет и стилизовать тег, и добавить ему интерактивности.</p>
40
<p>Тег <pre> поддерживает стандартные глобальные атрибуты: class, id, style, title, hidden и другие, поэтому легко будет и стилизовать тег, и добавить ему интерактивности.</p>
41
<p>Через CSS можно улучшить внешний вид <pre>, сделав его более современным и удобным. Стили позволяют изменить шрифт на более подходящий - например, сейчас популярны моноширинные Fira Code или Consolas. Помимо шрифта, для соответствия стилистике страницы настраиваются фон блока, цвет текста, его размер и другие свойства.</p>
41
<p>Через CSS можно улучшить внешний вид <pre>, сделав его более современным и удобным. Стили позволяют изменить шрифт на более подходящий - например, сейчас популярны моноширинные Fira Code или Consolas. Помимо шрифта, для соответствия стилистике страницы настраиваются фон блока, цвет текста, его размер и другие свойства.</p>
42
pre { background: #282a36; color: #f8f8f2; padding: 20px; border-radius: 8px; font-family: 'Fira Code', monospace; line-height: 1.6; overflow-x: auto; }<p>На узких экранах, например на мобильных устройствах, длинные строки будут обрезаться, потому что сам по себе тег <pre> не адаптивный. Решение может быть такое:</p>
42
pre { background: #282a36; color: #f8f8f2; padding: 20px; border-radius: 8px; font-family: 'Fira Code', monospace; line-height: 1.6; overflow-x: auto; }<p>На узких экранах, например на мобильных устройствах, длинные строки будут обрезаться, потому что сам по себе тег <pre> не адаптивный. Решение может быть такое:</p>
43
pre { overflow-x: auto; /* Добавляем горизонтальную прокрутку */ white-space: pre-wrap; /* Переносим длинные строки */ word-break: break-all; /* Разбиваем длинные слова (на крайний случай) */ }<p>Тег <pre> может быть помощником при создании интерактивных решений на странице.</p>
43
pre { overflow-x: auto; /* Добавляем горизонтальную прокрутку */ white-space: pre-wrap; /* Переносим длинные строки */ word-break: break-all; /* Разбиваем длинные слова (на крайний случай) */ }<p>Тег <pre> может быть помощником при создании интерактивных решений на странице.</p>
44
<p>1. Показать/скрыть содержимое - скрываем логи и показываем их по клику.</p>
44
<p>1. Показать/скрыть содержимое - скрываем логи и показываем их по клику.</p>
45
<pre id="log" hidden>[1] Загрузка данных... [2] Обработка... [3] Готово</pre> <button onclick="document.getElementById('log').hidden ^= true">Показать/скрыть</button><em>Скриншот: Google Chrome / Skillbox Media</em><p>2. Ленивая загрузка логов - показываем первые десять строк логов, а остальное подгружаем сначала по клику на кнопке, а затем по скроллу.</p>
45
<pre id="log" hidden>[1] Загрузка данных... [2] Обработка... [3] Готово</pre> <button onclick="document.getElementById('log').hidden ^= true">Показать/скрыть</button><em>Скриншот: Google Chrome / Skillbox Media</em><p>2. Ленивая загрузка логов - показываем первые десять строк логов, а остальное подгружаем сначала по клику на кнопке, а затем по скроллу.</p>
46
<p><strong>HTML</strong></p>
46
<p><strong>HTML</strong></p>
47
<div> <pre id="lazy"> </pre> <button id="loadMore">Загрузить ещё</button> </div><p><strong>JavaScript</strong></p>
47
<div> <pre id="lazy"> </pre> <button id="loadMore">Загрузить ещё</button> </div><p><strong>JavaScript</strong></p>
48
// Пример "лога" из 22 строк const logs = Array.from({length: 22}, (_, i) => `Лог ${i+1}: пример записи`); const container = document.getElementById("lazy"); const btn = document.getElementById("loadMore"); let start = 0; const limit = 10; let allLoaded = false; // Функция для рендеринга новых строк логов function renderLines(lines) { // Добавляем строки через переносы (\n), чтобы сохранить форматирование внутри <pre> container.textContent += lines.join('\n') + '\n'; } // Функция загрузки новых логов function loadLogs() { if (allLoaded) return; const slice = logs.slice(start, start + limit); renderLines(slice); start += slice.length; if (start >= logs.length) { allLoaded = true; btn.style.display = "none"; // Скрываем кнопку, если все логи загружены } } // Обработчик события прокрутки контейнера container.addEventListener("scroll", () => { // Проверяем, достигнут ли конец контейнера if ( container.scrollTop + container.clientHeight >= container.scrollHeight - 5 ) { loadLogs(); } }); // Обработчик клика по кнопке "Загрузить ещё" btn.addEventListener("click", loadLogs); // Загружаем первые 10 строк при старте loadLogs();<p><strong>CSS</strong></p>
48
// Пример "лога" из 22 строк const logs = Array.from({length: 22}, (_, i) => `Лог ${i+1}: пример записи`); const container = document.getElementById("lazy"); const btn = document.getElementById("loadMore"); let start = 0; const limit = 10; let allLoaded = false; // Функция для рендеринга новых строк логов function renderLines(lines) { // Добавляем строки через переносы (\n), чтобы сохранить форматирование внутри <pre> container.textContent += lines.join('\n') + '\n'; } // Функция загрузки новых логов function loadLogs() { if (allLoaded) return; const slice = logs.slice(start, start + limit); renderLines(slice); start += slice.length; if (start >= logs.length) { allLoaded = true; btn.style.display = "none"; // Скрываем кнопку, если все логи загружены } } // Обработчик события прокрутки контейнера container.addEventListener("scroll", () => { // Проверяем, достигнут ли конец контейнера if ( container.scrollTop + container.clientHeight >= container.scrollHeight - 5 ) { loadLogs(); } }); // Обработчик клика по кнопке "Загрузить ещё" btn.addEventListener("click", loadLogs); // Загружаем первые 10 строк при старте loadLogs();<p><strong>CSS</strong></p>
49
div { padding: 40px; } pre { background: #f5f5f5; color: #333; padding: 16px; border-radius: 4px; overflow-x: auto; /* Горизонтальная прокрутка */ white-space: pre-wrap; /* Перенос строк */ word-break: break-word; /* Разрыв длинных слов */ font-family: 'Fira Code', monospace; margin: 0 30px 30px; width: 500px; height: 200px; /* Ограничиваем блок по высоте, чтобы включить прокрутку */ overflow-y: auto; /* Вертикальная прокрутка */ } button { background: #353c8c; padding: 10px; width: 300px; border-radius: 10px; color: #fefefe; font-size: 16px; letter-spacing: 0.06em; margin: 0 30px 30px; cursor: pointer; }<em>Скриншот: Google Chrome / Skillbox Media</em><p>3. Анимация набора текста: создаём эффект печатания.</p>
49
div { padding: 40px; } pre { background: #f5f5f5; color: #333; padding: 16px; border-radius: 4px; overflow-x: auto; /* Горизонтальная прокрутка */ white-space: pre-wrap; /* Перенос строк */ word-break: break-word; /* Разрыв длинных слов */ font-family: 'Fira Code', monospace; margin: 0 30px 30px; width: 500px; height: 200px; /* Ограничиваем блок по высоте, чтобы включить прокрутку */ overflow-y: auto; /* Вертикальная прокрутка */ } button { background: #353c8c; padding: 10px; width: 300px; border-radius: 10px; color: #fefefe; font-size: 16px; letter-spacing: 0.06em; margin: 0 30px 30px; cursor: pointer; }<em>Скриншот: Google Chrome / Skillbox Media</em><p>3. Анимация набора текста: создаём эффект печатания.</p>
50
<p><strong>HTML</strong></p>
50
<p><strong>HTML</strong></p>
51
<pre id="terminal"></pre><p><strong>CSS</strong></p>
51
<pre id="terminal"></pre><p><strong>CSS</strong></p>
52
#terminal { background: #000000; color: #00ff00; padding: 10px; height: 200px; width: 500px; overflow-y: auto; border-radius: 4px; box-shadow: inset 0 0 5px rgba(0,0,0,0.5); }<p><strong>JavaScript</strong></p>
52
#terminal { background: #000000; color: #00ff00; padding: 10px; height: 200px; width: 500px; overflow-y: auto; border-radius: 4px; box-shadow: inset 0 0 5px rgba(0,0,0,0.5); }<p><strong>JavaScript</strong></p>
53
const lines = ['> npm install', '> npm run start', 'App запущено']; const charDelay = 100; // задержка между символами (мс) const lineDelay = 500; // задержка после окончания строки (мс) const term = document.getElementById('terminal'); let lineIndex = 0; let charIndex = 0; function type() { if (lineIndex >= lines.length) return; const currentLine = lines[lineIndex]; if (charIndex < currentLine.length) { // печатаем следующий символ term.textContent += currentLine[charIndex++]; term.scrollTop = term.scrollHeight; setTimeout(type, charDelay); } else { // завершили строку -- печатаем переход на новую строку term.textContent += '\n'; term.scrollTop = term.scrollHeight; lineIndex++; charIndex = 0; setTimeout(type, lineDelay); } } // Стартуем эффект type();<em>Скриншот: Google Chrome / Skillbox Media</em><p>В 1990-2000-е годы, когда возможности HTML только формировались, тег <pre> был незаменим для организации табличных и формовых макетов. В то время тегов <table> и <form> ещё не существовало, и разработчики выравнивали колонки с помощью пробелов, а интерактивные элементы, например кнопки, создавали при помощи ASCII‑графики - то есть картинок из символов, вроде нашего котика. Сегодня подобные приёмы воспринимаются как элемент ностальгии, но они забавные. Вот пара сайтов, где используются возможности тега <pre>:</p>
53
const lines = ['> npm install', '> npm run start', 'App запущено']; const charDelay = 100; // задержка между символами (мс) const lineDelay = 500; // задержка после окончания строки (мс) const term = document.getElementById('terminal'); let lineIndex = 0; let charIndex = 0; function type() { if (lineIndex >= lines.length) return; const currentLine = lines[lineIndex]; if (charIndex < currentLine.length) { // печатаем следующий символ term.textContent += currentLine[charIndex++]; term.scrollTop = term.scrollHeight; setTimeout(type, charDelay); } else { // завершили строку -- печатаем переход на новую строку term.textContent += '\n'; term.scrollTop = term.scrollHeight; lineIndex++; charIndex = 0; setTimeout(type, lineDelay); } } // Стартуем эффект type();<em>Скриншот: Google Chrome / Skillbox Media</em><p>В 1990-2000-е годы, когда возможности HTML только формировались, тег <pre> был незаменим для организации табличных и формовых макетов. В то время тегов <table> и <form> ещё не существовало, и разработчики выравнивали колонки с помощью пробелов, а интерактивные элементы, например кнопки, создавали при помощи ASCII‑графики - то есть картинок из символов, вроде нашего котика. Сегодня подобные приёмы воспринимаются как элемент ностальгии, но они забавные. Вот пара сайтов, где используются возможности тега <pre>:</p>
54
<ul><li><a>https://shbox.neocities.org/</a></li>
54
<ul><li><a>https://shbox.neocities.org/</a></li>
55
<li><a>https://asciicosmos.neocities.org/</a></li>
55
<li><a>https://asciicosmos.neocities.org/</a></li>
56
</ul><p>А в целом с его помощью можно:</p>
56
</ul><p>А в целом с его помощью можно:</p>
57
<ul><li>встраивать в веб‑страницы оригинальные ASCII‑логотипы, создавая неожиданный дизайнерский эффект;</li>
57
<ul><li>встраивать в веб‑страницы оригинальные ASCII‑логотипы, создавая неожиданный дизайнерский эффект;</li>
58
<li>разрабатывать текстовые игры в стиле классических консольных приложений и инди‑проектов начала 2000‑х;</li>
58
<li>разрабатывать текстовые игры в стиле классических консольных приложений и инди‑проектов начала 2000‑х;</li>
59
<li>генерировать "мемы" из символов, придавая интерфейсу уникальность.</li>
59
<li>генерировать "мемы" из символов, придавая интерфейсу уникальность.</li>
60
</ul><p>Не забывайте экранировать символы <, > и &, используя для этого & lt;, & gt;, & amp;. Иначе браузер решит, что вы хотите записать реальный код.</p>
60
</ul><p>Не забывайте экранировать символы <, > и &, используя для этого & lt;, & gt;, & amp;. Иначе браузер решит, что вы хотите записать реальный код.</p>
61
<!-- Неправильно: --> <pre>10 <span>20</span></pre><p>Браузер выведет "10 20".</p>
61
<!-- Неправильно: --> <pre>10 <span>20</span></pre><p>Браузер выведет "10 20".</p>
62
<!-- Правильно: --> <pre>10 &lt;span&gt20&lt;/span&gt</pre><p>Браузер выведет:</p>
62
<!-- Правильно: --> <pre>10 &lt;span&gt20&lt;/span&gt</pre><p>Браузер выведет:</p>
63
10 <span>20</span><p>Нельзя помещать блочные теги, такие как <div> или <p>, внутрь <pre> - это нарушает спецификацию. Соответствие разметки правилам можно проверить с помощью<a>валидатора</a>.</p>
63
10 <span>20</span><p>Нельзя помещать блочные теги, такие как <div> или <p>, внутрь <pre> - это нарушает спецификацию. Соответствие разметки правилам можно проверить с помощью<a>валидатора</a>.</p>
64
<p>На мобильных устройствах текст внутри <pre> может вылезти за границы экрана. Использование overflow-x: auto для добавления горизонтального скролла внутри <pre> улучшает адаптивность страницы.</p>
64
<p>На мобильных устройствах текст внутри <pre> может вылезти за границы экрана. Использование overflow-x: auto для добавления горизонтального скролла внутри <pre> улучшает адаптивность страницы.</p>
65
<ul><li>Использовать <pre> для таблиц не совсем корректно. Для таблиц существует тег <table>, а для нетабличных сеток - CSS Grid.</li>
65
<ul><li>Использовать <pre> для таблиц не совсем корректно. Для таблиц существует тег <table>, а для нетабличных сеток - CSS Grid.</li>
66
</ul><ul><li>Для подсветки синтаксиса внутри <pre> можно использовать библиотеки, например Prism.js.</li>
66
</ul><ul><li>Для подсветки синтаксиса внутри <pre> можно использовать библиотеки, например Prism.js.</li>
67
<li>Если тег <pre> по каким-то причинам не подходит, можно применить только стилизацию: white-space: pre-line заменяет <pre>, если нужно сохранить переносы.</li>
67
<li>Если тег <pre> по каким-то причинам не подходит, можно применить только стилизацию: white-space: pre-line заменяет <pre>, если нужно сохранить переносы.</li>
68
<li>Лучше минимизировать объём текста в <pre> на первичном просмотре: можно показывать первые строки, а остальное загружать по скроллу или кнопке.</li>
68
<li>Лучше минимизировать объём текста в <pre> на первичном просмотре: можно показывать первые строки, а остальное загружать по скроллу или кнопке.</li>
69
<li>Попробуйте сгенерировать ASCII-логотип и разместить его в README.md своего пет-проекта на GitHub - это будет выглядеть интересно. Для этого пригодятся:</li>
69
<li>Попробуйте сгенерировать ASCII-логотип и разместить его в README.md своего пет-проекта на GitHub - это будет выглядеть интересно. Для этого пригодятся:</li>
70
</ul><ul><li><a>ASCII Generator</a> - чтобы создать логотип из текста;</li>
70
</ul><ul><li><a>ASCII Generator</a> - чтобы создать логотип из текста;</li>
71
<li><a>Text to ASCII Art</a> - поэкспериментировать со шрифтами.</li>
71
<li><a>Text to ASCII Art</a> - поэкспериментировать со шрифтами.</li>
72
</ul><a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>
72
</ul><a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>