Làm cách nào để bọc văn bản trong thẻ trước?


720

pre các thẻ siêu hữu ích cho các khối mã trong HTML và để gỡ lỗi đầu ra trong khi viết tập lệnh, nhưng làm cách nào để tạo văn bản bao bọc văn bản thay vì in ra một dòng dài?

Câu trả lời:


1009

Câu trả lời, từ trang này trong 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;(và tất cả các hương vị tương thích với trình duyệt) có vẻ đầy đủ hơn trong một số trường hợp (chẳng hạn như các tab) vì nó sẽ lấy đi khoảng trống ở đầu dòng (nếu có một số)
MediaVince

5
@MediaVince, thu pre-linegọn tất cả các khoảng trắng (không chỉ ở đầu dòng). developer.mozilla.org/en-US/docs/Web/CSS/white-space có một bảng tóm tắt hành vi của các white-spacegiá trị.
Paul

1
word-wrap: break-wordkhông làm những gì câu hỏi đang yêu cầu, nó gây ra sự kết thúc dòng xảy ra ngay cả ở giữa các từ. Bạn có thể xóa dòng đó. Trên các trình duyệt hiện đại, bạn không cần bất kỳ -moztiền tố nào khác.
Flimm

140

Điều này hoạt động rất tốt để bọc văn bản và duy trì khoảng trắng trong pre-tag:

pre {
    white-space: pre-wrap;
}

3
Điều này là do chỉ có CSS ​​3 - xem câu trả lời từ adambox để biết thêm khả năng tương thích.
khỉ lorem

60

Tôi đã thấy rằng bỏ qua thẻ trước và sử dụng khoảng trắng: gói trước trên div là một giải pháp tốt hơn.

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

3
Dễ dàng hơn câu trả lời phổ biến. Cảm ơn!
Ricky

4
Trong trường hợp của tôi, tôi muốn hiển thị văn bản được định dạng trước có chứa các tab để tạo một số bảng. Tôi đã sử dụng giải pháp của bạn PLUS Tôi đã thêm một phông chữ không gian để tất cả các cột được căn chỉnh:style="white-space: pre-wrap; font-family:monospace;"
Jan

1
Mặc dù điều này có thể dễ dàng hơn, nhưng có thể có nhiều giá trị ngữ nghĩa hơn trong việc sử dụng <pre>cho các khối mã.
Angelos Chalaris

2
Tôi biết điều này là tôi đã trễ trò chơi này, nhưng tại sao giải pháp này tốt hơn là đặt nó một lần trong biểu định kiểu? Tôi có nhiều div trên một màn hình đầu ra HTML sẽ cần điều này. Có vẻ như một sửa chữa duy nhất cho phần tử trong biểu định kiểu sẽ khắc phục tất cả các vấn đề.
webfrogs

1
@webfrogs Vâng, tạo một lớp .prewrap sẽ là tốt nhất.
Mason240

36

Một cách ngắn gọn nhất, điều này buộc nội dung phải bọc bên trong thẻ "pre" mà không ngắt từ. Chúc mừng!

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

Xem ví dụ trực tiếp tại đây .


20

Đây là những gì tôi cần. Nó giữ cho các từ không bị phá vỡ nhưng cho phép chiều rộng động trong khu vực trước.

word-break: keep-all;

17

Tôi đề nghị quên trước và chỉ cần đặt nó trong một textarea.

Việc thụt lề của bạn sẽ vẫn còn và mã của bạn sẽ không bị ngắt dòng ở giữa một đường dẫn hoặc một cái gì đó.

Dễ dàng hơn để chọn phạm vi văn bản trong một khu vực văn bản quá nếu bạn muốn sao chép vào clipboard.

Sau đây là một đoạn trích php, vì vậy nếu bạn không ở dạng php thì cách bạn đóng gói các ký tự đặc biệt html sẽ khác nhau.

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

Để biết thông tin về cách sao chép văn bản vào bảng tạm trong js, hãy xem: Làm cách nào để sao chép vào bảng tạm trong JavaScript? .

Tuy nhiên...

Tôi vừa kiểm tra các khối mã stackoverflow và chúng bọc trong thẻ <code> được bọc trong thẻ <pre> bằng 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;
}

Ngoài ra, nội dung của các khối mã stackoverflow là cú pháp được tô sáng bằng cách sử dụng (tôi nghĩ) http://code.google.com.vn/p/google-code-prettify/ .

Đó là một thiết lập tốt nhưng bây giờ tôi chỉ đi với textareas.


13
Sẽ không sử dụng các khu vực văn bản cho một cái gì đó ngoài đầu vào là không chính xác về mặt ngữ nghĩa? Có vẻ như một giải pháp kỳ lạ với tôi.
Josh M.

2
Không đúng về mặt ngữ nghĩa như việc thêm một loạt các kiểu định dạng vào thẻ "pre" khi "pre" gợi ý rằng văn bản chứa được định dạng trước và do đó không yêu cầu định dạng bổ sung và thay vào đó là được sử dụng ưu tiên "ngữ nghĩa" hơn "chức năng".
ekerner

1
Tôi không nghĩ <pre>có bất kỳ ý nghĩa ngữ nghĩa nào (không giống như <code>), nó đơn giản có nghĩa là các dòng mới và nhiều không gian cần được bảo tồn.
Flimm

1
Viết tắt của "định dạng trước". Bạn đang đề xuất rằng nó thực sự ngắn gọn chỉ dành cho định dạng trước-dòng mới và nhiều không gian?
ekerner

Loại nội dung có nghĩa là được chỉ định bởi một thẻ bên trong, tùy thuộc vào loại văn bản được định dạng trước. Tôi sẽ giới thiệu bạn bè của mình đến trang wiki tiền thẻ w3c: w3.org/wiki/HTML/Elements/pre
joshperry

14

Tôi đã kết hợp câu trả lời @richelectron và @ user1433454.
Nó hoạt động rất tốt và bảo tồn các định dạng văn bản.

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

</pre>

13

Bạn có thể:

pre { white-space: normal; }

để duy trì phông chữ đơn cách nhưng thêm từ-quấn, hoặc:

pre { overflow: auto; }

sẽ cho phép một kích thước cố định với cuộn ngang cho các dòng dài.


Oh, cảm ơn bạn đã nhắc nhở tràn! Tuyệt vời cho màn hình di động.
XtL

6

Hãy thử sử dụng

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

Hoặc tốt hơn là ném CSS.


cái này có vẻ hoạt động trong IE 7 nhưng không phải 6. đây là gợi ý duy nhất có vẻ hứa hẹn cho IE ... tất cả các đề xuất khác đều tốt cho các trình duyệt khác ...
topwik

nevermind phải là một bộ nhớ đệm trình duyệt. khởi động lại IE 6 và tất cả đều tốt. chúc mừng
topwik

2
Vấn đề với giải pháp này là nó cũng sẽ hòa tan các ký tự dòng mới ... Ví dụ, mọi phân tách văn bản thành các đoạn văn sẽ bị mất.
Chris W.

4

Sử dụng white-space: pre-wrapvà một số tiền tố để ngắt dòng tự động bên trong pres.

Không sử dụng word-wrap: break-wordbởi vì điều này, tất nhiên, sẽ phá vỡ một nửa từ mà có lẽ là điều bạn không muốn.


3

Cách trình duyệt chéo tốt nhất giúp tôi có được ngắt dòng và hiển thị mã hoặc văn bản chính xác: (chrome, trình duyệt internet, Firefox)

CSS:

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

HTML:

<xmp> your text or code </xmp>

Làm việc rất lớn đối với tôi :-)
Wesley Tuzza

7
xmp đã không còn được sử dụng kể từ HTML 3.2, đã bị xóa hoàn toàn khỏi HTML5 và không bao giờ hoạt động chính xác để bắt đầu. Nó không được thực hiện nhất quán giữa các trình duyệt khác nhau.
PeterToTheThứ ba

Sử dụng khoảng trắng: bọc trước; và word-quấn: break-word; trong css của tôi, giữ thụt các đoạn (json), dòng trước loại bỏ điều này. (Chrome)
Peter Visser

1

Sau đây đã giúp tôi:

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

Cảm ơn


3
Tôi nghĩ sử dụng tốt hơn white-space: pre-wrap;vì nó tôn trọng khoảng trắng
Biệt thự Ivan Ferrer

-1

Các <pre>-Element viết tắt của "trước định dạng văn bản" và được thiết kế để giữ cho các định dạng của văn bản (hoặc bất kỳ) giữa các thẻ của nó. Do đó, nó thực sự không có ý định tự động ngắt dòng hoặc ngắt dòng trong <pre>-Tag

Văn bản trong một phần tử được hiển thị theo phông chữ có chiều rộng cố định (thường là Chuyển phát nhanh) và nó giữ nguyên cả khoảng trắng và ngắt dòng .

nguồn: w3schools.com , nhấn mạnh được thực hiện bởi chính tôi.


Nó chỉ nêu thực tế rằng có thể tự động bọc văn bản trong thẻ trước mặc dù đó không phải là ý định tự động bọc thẻ trước.
rob_st

Đây là câu trả lời đúng duy nhất cho câu hỏi của tác giả. Bất kỳ câu trả lời hoặc "giải pháp" khả thi nào khác đều khuyến khích việc sử dụng sai phần tử <pre>. Về cơ bản, nếu bạn muốn đặt kiểu bên trong của phần tử <pre> và bao bọc nó, thay vào đó, hãy sử dụng thẻ <p> và tạo kiểu cho nó theo bất kỳ cách nào bạn muốn với lớp CSS.
Markus

Tôi không chắc tại sao mọi người thấy hữu ích khi đưa ra lời khuyên "Tôi thông minh hơn bạn". Không, thẻ <p> không phải là sự thay thế phù hợp: nó không bảo toàn khoảng trắng cũng như ngắt dòng. Thẻ <pre> rất hữu ích để bảo toàn ngắt dòng, nhưng đôi khi cần phải thêm gói bổ sung, giống như bất kỳ trình chỉnh sửa mã nào có thể vừa bảo toàn ngắt dòng và thêm gói vào dòng dài.
lùn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.