ฉันจะตัดข้อความในแท็กล่วงหน้าได้อย่างไร


720

pre แท็กมีประโยชน์อย่างยิ่งสำหรับบล็อคโค้ดใน HTML และสำหรับการดีบั๊กขณะเขียนสคริปต์ แต่ฉันจะทำให้การตัดคำข้อความแทนที่จะพิมพ์ออกมาหนึ่งบรรทัดยาวได้อย่างไร

คำตอบ:


1009

คำตอบจากหน้านี้ใน 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

140

วิธีนี้ใช้งานได้ดีในการตัดข้อความและบำรุงรักษาพื้นที่สีขาวภายในpre-tag:

pre {
    white-space: pre-wrap;
}

3
นี่เป็นเพราะ CSS 3 เท่านั้น - ดูคำตอบจาก adambox เพื่อความเข้ากันได้มากขึ้น
ลิง Lorem

60

ฉันพบว่าการข้ามแท็กล่วงหน้าและใช้ white-space: การพอกล่วงหน้าบน div เป็นวิธีแก้ปัญหาที่ดีกว่า

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

3
ง่ายกว่าคำตอบยอดนิยม ขอบคุณ!
Ricky

4
ในกรณีของฉันฉันต้องการแสดงข้อความที่จัดรูปแบบไว้ล่วงหน้าซึ่งมีแท็บเพื่อสร้างตาราง ผมใช้วิธีการแก้ปัญหาของคุณ PLUS ผมเพิ่มตัวอักษร monspace เพื่อคอลัมน์ทั้งหมดถูกจัดชิด:style="white-space: pre-wrap; font-family:monospace;"
ม.ค.

1
แม้ว่าสิ่งนี้จะง่ายขึ้น แต่อาจมีความหมายมากขึ้นในการใช้<pre>โค้ดบล็อก
Angelos Chalaris

2
ฉันรู้ว่าฉันมาช้าไปกับเกมนี้ แต่ทำไมการแก้ปัญหานี้ดีกว่าตั้งหนึ่งครั้งในสไตล์ชีท ฉันมีหลาย divs ในหน้าจอแสดงผล HTML เดียวที่ต้องการสิ่งนี้ ดูเหมือนว่าการแก้ไของค์ประกอบองค์ประกอบในสไตล์ชีทจะแก้ไขปัญหาทั้งหมดได้
webfrogs

1
@ webfrogs ใช่แล้วการสร้างคลาส. dragrap จะดีที่สุด
Mason240

36

รวบรัดที่สุดนี้บังคับให้เนื้อหาห่อภายในของแท็ก "ก่อน" โดยไม่ทำลายคำ ไชโย!

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

ดูตัวอย่างสดที่นี่


20

นี่คือสิ่งที่ฉันต้องการ มันเก็บคำจากการแตกหัก แต่ได้รับอนุญาตสำหรับความกว้างแบบไดนามิกในพื้นที่ก่อน

word-break: keep-all;

17

ฉันแนะนำให้ลืม pre และใส่ไว้ใน textarea

การเยื้องของคุณจะยังคงอยู่และรหัสของคุณจะไม่ถูกห่อคำกลางเส้นทางหรืออะไรสักอย่าง

เลือกช่วงข้อความในพื้นที่ข้อความได้ง่ายขึ้นหากคุณต้องการคัดลอกไปยังคลิปบอร์ด

ต่อไปนี้เป็นข้อความที่ตัดตอนมา php ดังนั้นหากคุณไม่ได้อยู่ใน php วิธีที่คุณแพ็คตัวอักษรพิเศษ html จะแตกต่างกันไป

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

สำหรับข้อมูลเกี่ยวกับวิธีคัดลอกข้อความไปยังคลิปบอร์ดใน js ดูที่: ฉันจะคัดลอกไปยังคลิปบอร์ดใน JavaScript ได้อย่างไร .

อย่างไรก็ตาม ...

ฉันเพิ่งตรวจสอบบล็อคโค้ดสแต็คโอเวอร์โฟลว์และพวกมันห่อในแท็ก <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
จะไม่ใช้พื้นที่ข้อความสำหรับสิ่งอื่นที่ไม่ใช่อินพุตจะไม่ถูกต้องทางความหมายหรือไม่ ดูเหมือนจะเป็นทางออกที่แปลกสำหรับฉัน
Josh M.

2
ไม่ถูกต้องเชิงความหมายเท่ากับการเพิ่มรูปแบบการจัดกลุ่มลงในแท็ก "pre" เมื่อ "pre" แสดงให้เห็นว่าข้อความที่มีอยู่มีการจัดรูปแบบไว้ล่วงหน้าดังนั้นจึงไม่จำเป็นต้องมีการจัดรูปแบบเพิ่มเติมและค่อนข้างจะเป็น ให้ความหมาย "ความหมาย" มากกว่า "การทำงาน"
ekerner

1
ฉันไม่คิดว่า<pre>มีความหมายเชิงความหมายใด ๆ (ไม่เหมือน<code>) มันก็หมายความว่าควรขึ้นบรรทัดใหม่และช่องว่างหลายช่อง
Flimm

1
มันสั้นสำหรับ "รูปแบบล่วงหน้า" คุณกำลังแนะนำว่าจริง ๆ แล้วมันสั้นสำหรับการจัดรูปแบบล่วงหน้าและ newlines- และ - หลายช่องว่างเท่านั้น?
ekerner

ประเภทของเนื้อหามีไว้เพื่อระบุโดยแท็กภายในขึ้นอยู่กับประเภทของข้อความที่จัดรูปแบบไว้ล่วงหน้า ฉันจะแนะนำเพื่อนของฉันไปยังหน้า wiki ที่ติดแท็กล่วงหน้า: w3.org/wiki/HTML/Elements/pre
joshperry

14

ฉันรวม @richelectron และ @ user1433454 คำตอบ
มันทำงานได้ดีมากและรักษารูปแบบข้อความ

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

</pre>

13

คุณสามารถ:

pre { white-space: normal; }

เพื่อรักษาแบบอักษร monospace แต่เพิ่ม word-wrap หรือ:

pre { overflow: auto; }

ซึ่งจะทำให้ขนาดคงที่พร้อมการเลื่อนในแนวนอนสำหรับสายยาว


โอ้ขอบคุณสำหรับการเตือนความจำล้น! เหมาะสำหรับการแสดงบนมือถือ
XTL

6

ลองใช้ดู

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

หรือดีกว่าโยน CSS


อันนี้ดูเหมือนว่าจะทำงานใน IE 7 แต่ไม่ใช่ 6 นี่เป็นข้อเสนอแนะเดียวที่ดูเหมือนจะสัญญากับ IE ... คำแนะนำอื่น ๆ ทั้งหมดนั้นดีสำหรับเบราว์เซอร์อื่น ๆ ...
topwik

ไม่เป็นไรจะต้องเป็นสิ่งที่แคชเบราว์เซอร์ รีสตาร์ท IE 6 และทั้งหมดเป็นอย่างดี ไชโย
topwik

2
ปัญหาเกี่ยวกับการแก้ปัญหานี้คือมันจะละลายอักขระขึ้นบรรทัดใหม่ ... เช่นการแยกข้อความใด ๆ ในย่อหน้าจะหายไป
Chris W.

4

ใช้white-space: pre-wrapและนำหน้าบางส่วนสำหรับการแบ่งบรรทัดอัตโนมัติภายในpres

อย่าใช้word-wrap: break-wordเพราะเพียงแค่นี้แบ่งคำครึ่งหนึ่งซึ่งอาจเป็นสิ่งที่คุณไม่ต้องการ


3

วิธีที่ดีที่สุดในการข้ามเบราว์เซอร์ทำงานให้ฉันได้รับการแบ่งบรรทัดและแสดงรหัสหรือข้อความที่ถูกต้อง: (chrome, Internet explorer, Firefox)

CSS:

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

HTML:

<xmp> your text or code </xmp>

ใช้งานได้ดีสำหรับฉัน :-)
Wesley Tuzza

7
xmp เลิกใช้แล้วตั้งแต่ HTML 3.2 ถูกลบออกจาก HTML5 อย่างสมบูรณ์และไม่สามารถทำงานได้อย่างถูกต้องตั้งแต่เริ่มต้น มันไม่ได้นำมาใช้อย่างสม่ำเสมอในเบราว์เซอร์ต่างๆ
PeterToTheThird

ใช้ white-space: การพอกล่วงหน้า และคำตัดคำ: break-word; ใน CSS ของฉันเก็บการเยื้องของ (json) ตัวอย่างบรรทัดก่อนเอาสิ่งนี้ออก (Chrome)
Peter Visser

1

ต่อไปนี้ช่วยฉัน:

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

ขอบคุณ


3
ฉันคิดว่าการใช้ดีกว่าwhite-space: pre-wrap;เพราะเคารพพื้นที่สีขาว
Ivan Ferrer Villa

-1

<pre>องค์ประกอบย่อมาจาก "ก่อนจัดรูปแบบข้อความ" และมีวัตถุประสงค์เพื่อให้การจัดรูปแบบของข้อความ (หรืออะไรก็ตาม) ระหว่างแท็กของมัน ดังนั้นจึงไม่จำเป็นต้องมีการตัดคำอัตโนมัติหรือแบ่งบรรทัดภายใน<pre>-Tag

ข้อความในองค์ประกอบที่จะปรากฏในตัวอักษรความกว้างคงที่ (มักจะ Courier) และมันจะเก็บรักษาทั้งพื้นที่และแบ่งสาย

ที่มา: w3schools.comเน้นทำด้วยตัวเอง


เป็นเพียงการระบุข้อเท็จจริงว่าเป็นไปได้ที่จะตัดข้อความอัตโนมัติภายในแท็กล่วงหน้าแม้ว่าจะไม่ใช่ความตั้งใจของแท็กล่วงหน้าที่จะตัดคำอัตโนมัติ
rob_st

นี่เป็นเพียงการตอบคำถามของผู้เขียนที่ถูกต้องเท่านั้น คำตอบอื่น ๆ หรือ "วิธีแก้ปัญหา" ที่เป็นไปได้ส่งเสริมการใช้องค์ประกอบ <pre> ในทางที่ผิด โดยพื้นฐานแล้วหากคุณต้องการใส่ชนิดภายในองค์ประกอบ <pre> และปิดมันให้ใช้แท็ก <p> แทนและกำหนดสไตล์ในแบบที่คุณต้องการด้วยคลาส CSS
Markus

ฉันไม่แน่ใจว่าทำไมผู้คนถึงมีประโยชน์ในการให้คำแนะนำ "ฉันฉลาดกว่าคุณ" แบบนี้ ไม่แท็ก <p> ไม่ใช่สิ่งทดแทนที่เหมาะสม: แท็กนั้นไม่ได้เว้นช่องว่างหรือการขึ้นบรรทัดใหม่ แท็ก <pre> มีประโยชน์สำหรับการรักษาตัวแบ่งบรรทัด แต่บางครั้งก็จำเป็นต้องเพิ่มการตัดคำเพิ่มเติมเช่นเดียวกับโปรแกรมแก้ไขรหัสใด ๆ อาจรักษาตัวแบ่งบรรทัดและเพิ่มการตัดคำในบรรทัดยาว
dwk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.