Як загорнути текст у попередній тег?


720

pre теги є надзвичайно корисними для блоків коду в HTML та для налагодження виводу під час написання сценаріїв, але як мені зробити текстове обгортання тексту замість того, щоб роздрукувати один довгий рядок?

Відповіді:


1008

Відповідь з цієї сторінки в CSS:

pre {
    white-space: pre-wrap;       /* Since CSS 2.1 */
    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
    white-space: -pre-wrap;      /* Opera 4-6 */
    white-space: -o-pre-wrap;    /* Opera 7 */
    word-wrap: break-word;       /* Internet Explorer 5.5+ */
}

7
white-space:pre-line;(і всі аромати, сумісні з браузером) здається в деяких випадках адекватнішим (наприклад, без вкладок), оскільки він забирає пробіл на початку рядка (якщо такі є)
MediaVince

5
@MediaVince, pre-lineзгортає все пробіли (не лише на початку рядка). developer.mozilla.org/en-US/docs/Web/CSS/white-space має таблицю, що підсумовує поведінку white-spaceзначень.
Пол

1
word-wrap: break-wordне робить те, про що задається запитання, це призводить до того, що загортання рядків відбувається навіть між словами. Ви можете видалити цей рядок. У сучасних веб-переглядачах вам не потрібен жоден -mozчи інші префікси.
Flimm


60

Я виявив, що пропуск попереднього тегу та використання пробілів: попереднє обгортання діва є кращим рішенням.

 <div style="white-space: pre-wrap;">content</div>

3
Простіше, ніж популярна відповідь. Дякую!
Рікі

4
У моєму випадку я хотів показати попередньо відформатований текст, який містив вкладки, щоб скласти деяку таблицю. Я використовував ваше рішення PLUS, я додав шрифт monspace, щоб усі стовпці були вирівняні:style="white-space: pre-wrap; font-family:monospace;"
січня

1
Хоча це може бути простішим, можливо, у <pre>кодових блоках може бути більше смислового значення .
Angelos Chalaris

2
Я знаю, що я запізнююсь на цю гру, але чому це рішення краще, ніж встановити його один раз у таблиці стилів? У мене на одному екрані виводу HTML є кілька дівок, для цього знадобиться. Схоже, що єдине виправлення елемента в таблиці стилів виправляє всі проблеми.
webfrogs

1
@webfrogs Так, найкраще зробити клас .prewrap.
Мейсон240

36

Найкраще, це змушує вміст загортати тег "попередньо", не порушуючи слова. Ура!

pre {
  white-space: pre-wrap;
  word-break: keep-all
}

Дивіться живий приклад тут .


20

Це те, що мені було потрібно. Він утримував слова від розриву, але дозволяв отримати динамічну ширину в попередній області.

word-break: keep-all;

17

Я пропоную забути попередньо і просто покласти його в текстовий район.

Ваші відступи залишаться, і ваш код не буде зафіксований словом посеред шляху або чогось іншого.

Простіше вибрати діапазон тексту у текстовій області, якщо ви хочете скопіювати у буфер обміну.

Далі йде фрагмент php, тому якщо ваш не в php, то спосіб упаковки спеціальних символів html буде відрізнятися.

<textarea style="font-family:monospace;" onfocus="copyClipboard(this);"><?=htmlspecialchars($codeBlock);?></textarea>

Інформацію про те, як скопіювати текст у буфер обміну в js див.: Як скопіювати у буфер обміну в JavaScript? .

Однак ...

Я щойно оглянув блоки коду stackoverflow, і вони загортаються в тег <code>, загорнутий у тег <pre> з css ...

code {
  background-color: #EEEEEE;
  font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;
}
pre {
  background-color: #EEEEEE;
  font-family: Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;
  margin-bottom: 10px;
  max-height: 600px;
  overflow: auto;
  padding: 5px;
  width: auto;
}

Також вміст блоків коду stackoverflow виділяється синтаксисом, використовуючи (я думаю) http://code.google.com/p/google-code-prettify/ .

Це гарне налаштування, але я зараз просто збираюся з textareas.


13
Чи не використовувати текстові області для чогось іншого, крім введення, не буде семантично неправильно? Мені це здається дивним рішенням.
Джош М.

2
Не настільки семантично неправильно, як додавання купи стилів форматування до тегу "попередньо", коли "попередньо" говорить про те, що текст, що міститься, попередньо відформатований, а тому не потребує додаткового форматування і його краще вважати таким, як є;) Я пропоную не робити надати "семантиці" пріоритет над "функціональною".
екернер

1
Я не думаю, що <pre>має якесь смислове значення (на відміну від цього <code>), це просто означає, що слід зберегти нові рядки та декілька пробілів.
Флімм

1
Її коротке слово "попередньо відформатоване". Ви припускаєте, що його фактично не вистачає лише для попередньо відформатованих нових рядків і для кількох просторів?
екернер

Тип вмісту повинен визначатися внутрішнім тегом залежно від типу попередньо відформатованого тексту. Я б посилав
joshperry

14

Я поєднав відповіді @richelectron та @ user1433454.
Він працює дуже добре і зберігає форматування тексту.

<pre  style="white-space: pre-wrap; word-break: keep-all;">

</pre>

13

Ви можете:

pre { white-space: normal; }

щоб підтримувати шрифт монопростіру, але додайте обгортання слів або:

pre { overflow: auto; }

що дозволить фіксувати розмір з горизонтальною прокруткою для довгих ліній.


О, дякую за нагадування про переповнення! Відмінно підходить для мобільних дисплеїв.
XTL

6

Спробуйте використовувати

<pre style="white-space:normal;">. 

Або краще кинути CSS.


ця, здається, працює в IE 7, але не 6. це єдина пропозиція, яка здається перспективною для IE ... всі інші пропозиції були хорошими для інших браузерів ...
topwik

nevermind, напевно, був кешированим браузером. перезапустив IE 6 і все добре. ура.
topwik

2
Проблема з цим рішенням полягає в тому, що він також розчинить символи нового рядка ... Наприклад, будь-яке розділення тексту на абзаци буде втрачено.
Кріс В.

4

Використовуйте white-space: pre-wrapі деякі префікси для автоматичного розриву лінії всередині pres.

Не використовуйте, word-wrap: break-wordтому що це, звичайно, розбиває слово навпіл, що, мабуть, те, чого ви не хочете.


3

Найкращий спосіб перехресного веб-переглядача працював для мене, щоб отримати розриви рядків і показувати точний код або текст: (хром, інтернет-провідник, Firefox)

CSS:

xmp{ white-space:pre-wrap; word-wrap:break-word; }

HTML:

<xmp> your text or code </xmp>

Для мене чудово працював :-)
Веслі Тузза

7
xmp застаріло з часу використання HTML 3.2, повністю видалено з HTML5 і ніколи не працювало належним чином. Він не застосовувався послідовно серед різних браузерів.
PeterToTheThird

Використання пробілу: попереднє обгортання; і слово-обгортання: перерва-слово; у моєму css зберігає відступ фрагментів (json), попередній рядок видаляє це. (Chrome)
Пітер Віссер


-1

<pre>-Елементние означає «попередньо відформатований текстом» і призначений , щоб зберегти форматування тексту (або будь-який інший ) між його тегами. Тому насправді не вмикається автоматичне <pre>обговорення слів або перерив рядків у межах -Tag

Текст у елементі відображається шрифтом фіксованої ширини (як правило, кур'єрським), і він зберігає як пробіли, так і розриви рядків .

Джерело: w3schools.com , підкреслює зроблене власноруч.


Це просто констатує факт, що можна автоматично загортати текст у межах попереднього тегу, хоча це не є намір попереднього тегу автоматично обгортати.
rob_st

Це єдина правильна відповідь на запитання автора. Будь-яка інша відповідь або можливе "рішення" заохочує неправильне використання елемента <pre>. По суті, якщо ви хочете ввести елемент <pre> і обернути його, використовуйте тег <p> замість цього і накресліть його будь-яким способом за допомогою класу CSS.
Маркус

Я не впевнений, чому людям вважається корисним давати подібну пораду "Я розумніший за тебе". Ні, тег <p> не є відповідною заміною: він не зберігає ані пробілів, ані розривів рядків. Тег <pre> корисний для збереження розривів рядків, але іноді доводиться додавати додаткове обгортання так само, як і будь-який редактор коду може зберігати розриви рядків і додавати обгортання у довгі рядки.
dwk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.