CSS สามารถบังคับให้แบ่งบรรทัดหลังจากแต่ละคำในองค์ประกอบหรือไม่


159

ฉันกำลังสร้างเว็บไซต์ที่พูดได้หลายภาษากับเจ้าของช่วยฉันด้วยการแปลบางอย่าง วลีที่แสดงบางข้อความต้องมีตัวแบ่งบรรทัดเพื่อรักษารูปแบบของเว็บไซต์

น่าเสียดายที่เจ้าของไม่ใช่คนคอมพิวเตอร์ดังนั้นหากเขาเห็นว่าfoo<br />barมีโอกาสเขาจะแก้ไขข้อมูลในขณะที่เขากำลังแปลอยู่

มีวิธีแก้ปัญหา CSS (นอกเหนือจากการเปลี่ยนความกว้าง) เพื่อใช้กับองค์ประกอบที่จะแตกหลังจากทุกคำ?

(ฉันรู้ว่าฉันสามารถทำสิ่งนี้ใน PHP ได้ แต่ฉันสงสัยว่ามีกลอุบายที่ดีที่ฉันไม่รู้จักใน CSS เพื่อทำสิ่งเดียวกันให้สำเร็จหรืออาจใช้คุณสมบัติ CJK)

แก้ไข

ฉันจะพยายามทำแผนภาพสิ่งที่เกิดขึ้น:

----------------          ----------------
| Short Word   |          | Gargantuan   |
|              |          | Word         |
----------------          ----------------

คำยาวแบ่งโดยอัตโนมัติคำสั้นไม่ได้ ฉันอยากให้มันเป็นแบบนี้:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------

2
ใน HTML องค์ประกอบต่างๆจะแยกตามทุกคำเมื่อความกว้างขององค์ประกอบที่กำหนดนั้นต้องการ คุณหมายถึงคำพูดไหม?
Paul D. Waite

@ พอล - ไม่ฉันต้องการโซลูชันที่ไม่ได้อิงกับการแก้ไขความกว้าง ปัญหาคือวลีบางอย่างยาวขึ้นและแตกอัตโนมัติ (เช่นคุณอธิบาย) และวลีสั้นและไม่แตกทำให้การนำเสนอไม่สอดคล้องกัน
เบ็น

@Paul - ใช่มันเหมือนกับที่คุณอธิบายอย่างแน่นอน ไม่เป็นอันตรายต่อเค้าโครง แต่จริง ๆ แล้วอาจดูดีขึ้นได้
เบ็น

คุณสามารถใช้การเว้นวรรคคำ แต่มันจะมีผลต่อคำทั้งหมด .. ฉันคิดว่าคุณไม่สามารถห่อคำเหล่านั้นในองค์ประกอบขยาย
แม้ว

@meo - ดูเหมือนว่าขอบคุณสำหรับความคิด
Ben

คำตอบ:


261

ใช้

.one-word-per-line {
    word-spacing: <parent-width>; 
}

.your-classname{
    width: min-intrinsic;
    width: -webkit-min-content;
    width: -moz-min-content;
    width: min-content;
    display: table-caption;
    display: -ms-grid;
    -ms-grid-columns: min-content;
}

โดยที่<parent-width>ความกว้างขององค์ประกอบพาเรนต์ (หรือค่าสูงตามอำเภอใจที่ไม่พอดีกับหนึ่งบรรทัด) ด้วยวิธีนี้คุณจึงมั่นใจได้ว่าจะมีตัวแบ่งบรรทัดหลังจากตัวอักษรตัวเดียว ใช้งานได้กับ Chrome / FF / Opera / IE7 + (และอาจแม้แต่ IE6 เพราะรองรับการเว้นวรรคคำเช่นกัน)


นี่เป็นคำตอบที่ดีที่สุดแน่นอน
เฮซาด

31
@ToniMichelCaubet คำตอบคือยากมากที่จะแปลความหมาย แต่เขาหมายถึง.parent { word-spacing: 100px; }ที่100pxเป็นความกว้างขององค์ประกอบหลักที่ ปัญหาคือว่าวิธีนี้จะไม่ทำงานถ้าคุณมีพ่อแม่ของเหลว
John Kurlak

5
เพียงตั้งค่าที่สูงมากสำหรับการเว้นวรรคคำเช่นword-spacing: 100000pxและคุณไม่ต้องกังวลเกี่ยวกับผู้ปกครองที่เป็นของเหลวในแง่ของความกว้าง การตั้งค่าระยะห่างของคำ 100% จะสมเหตุสมผล (มันจะเป็น 100% ของความกว้างพาเรนต์) แต่ค่าที่แสดงเป็นเปอร์เซ็นต์ไม่ได้รับการสนับสนุนสำหรับคุณสมบัติ css นั้น
วิส

1
สิ่งนี้มีประโยชน์มาก ฉันใช้มันอยู่ในสถานการณ์ที่มีการตอบสนองที่ที่หนึ่งที่ฉันต้องการความกว้างข้อความในแท็บการห่อเพื่อให้พวกเขากำลังทั้งหมดความสูงเดียวกันword-spacing: 2em; และมีความกว้างของมือถือที่ฉันอยากให้พวกเขาเป็นบรรทัดเดียว:word-spacing: unset;
Will

1
สิ่งนี้ช่างมหัศจรรย์. จากปีที่ผ่านมาในอนาคตขอบคุณพวง :)
ลูคัสเมดินา

124

คำตอบที่ได้รับจาก @HursVanBloob ทำงานเฉพาะกับคอนเทนเนอร์หลักความกว้างคงที่ แต่ล้มเหลวในกรณีของภาชนะบรรจุของเหลวที่มีความกว้าง

ฉันลองคุณสมบัติมากมาย แต่ไม่มีอะไรทำงานตามที่คาดไว้ ในที่สุดฉันก็ได้ข้อสรุปว่าการให้word-spacingคุณค่าที่ยิ่งใหญ่นั้นใช้ได้ผลดีอย่างสมบูรณ์แบบ

p { word-spacing: 9999999px; }

หรือสำหรับเบราว์เซอร์สมัยใหม่คุณสามารถใช้vwหน่วยCSS (ความกว้างของภาพเป็น% ของขนาดหน้าจอ)

p { word-spacing: 100vw; }

นั่นคือสิ่งที่ฉันจะลอง!
vaskort

นี่เป็นทางออกที่ยอดเยี่ยม!
Joe Conlin

หยุดพักด้วย & nbsp; แม้
Matt Fletcher

2
มันใช้งานไม่ได้สำหรับฉันที่ทำให้ความกว้างของของไหลสูงขึ้นมาก
Onza

@Onza คุณสามารถแชร์ลิงก์ซอแสดงถึงปัญหาของคุณได้หรือไม่
Deepak Yadav

37

วิธีการแก้ปัญหาทางเลือกอธิบายไว้ในประโยคแยกเป็นหนึ่งคำต่อบรรทัดโดยใช้display:table-caption;กับองค์ประกอบ


จริง ๆ แล้วจัดกลุ่มคำโดยยึดตามความกว้างของคำที่ยาวที่สุด
James South

1
แม้ว่าสิ่งนี้สามารถจัดกลุ่มคำในบรรทัด แต่ก็ใช้งานได้ดีในหลาย ๆ สถานการณ์และไม่รู้สึกว่าแฮ็คเป็นตัวเลือกการเว้นวรรคคำขนาดใหญ่
Dale

1
นี่คือหนึ่งที่ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันเป็นคนดี!
Matt Fletcher

1
มันไม่ได้ให้ผลใด ๆ
jafarbtech

32

ลองใช้white-space: pre-line;ดู มันสร้างตัวแบ่งบรรทัดที่ใดก็ตามที่ตัวแบ่งบรรทัดปรากฏในรหัส แต่ละเว้นช่องว่างพิเศษ (แท็บและช่องว่าง ฯลฯ )

ก่อนอื่นให้เขียนคำของคุณเป็นบรรทัดแยกในรหัสของคุณ:

<div>Short
Word</div>

จากนั้นใช้สไตล์กับองค์ประกอบที่มีคำ

div { white-space: pre-line; }

ระวังแม้ว่าการขึ้นบรรทัดใหม่ทุกครั้งในโค้ดภายในองค์ประกอบจะสร้างการขึ้นบรรทัดใหม่ ดังนั้นการเขียนต่อไปนี้จะส่งผลให้มีการแบ่งบรรทัดพิเศษก่อนคำแรกและหลังคำสุดท้าย:

<div>
    Short
    Word
</div>

มีบทความยอดเยี่ยมเกี่ยวกับCSS Tricksอธิบายคุณลักษณะอื่น ๆ ของ white-space


คุณควรอธิบายวิธีwhite-spaceใช้ตอบคำถาม ขออภัยฉันไม่เห็นด้วย
jlgrall

2
บทความเกี่ยวกับCSS Tricksอธิบายอย่างเต็มที่ดังนั้นฉันคิดว่าลิงก์จะเพียงพอแทนที่จะพยายามรวบรวมคำตอบกลับมาที่นี่
Nass

ตกลงดังนั้นคุณแนะนำให้วางตัวแบ่งบรรทัดจริงในแหล่งที่มาและใช้ CSS " white-space: pre;" เพื่อแสดงตัวแบ่งบรรทัดเหล่านั้นเหมือน<pre>แท็กจะทำอย่างไร <br />ที่สามารถทำงานและแบ่งบรรทัดควรดูเป็นธรรมชาติมากขึ้นในการแปลกว่า ฉันจะพยายามที่จะแก้ไขคำตอบของคุณเพื่อเพิ่ม :)
jlgrall

เผง ที่จริงแล้วwhite-space: pre-line;น่าจะเหมาะสมกว่าเพราะจะไม่สนใจช่องว่างพิเศษในรหัสของคุณ ฉันจะอัปเดตคำตอบ
Nass

ดีอาจแค่เพิ่มwhite-space: pre;สำหรับ IE 7
jlgrall

12

หากคุณต้องการเลือกโซลูชั่นที่แตกต่างนอกเหนือจากคำตอบที่ให้ ...

วิธีอื่นคือให้ความกว้างของคอนเทนเนอร์เป็น 0 และเพื่อให้แน่ใจว่าสามารถมองเห็นการล้นได้ จากนั้นแต่ละคำจะล้นออกมาและจะอยู่ในสายของตัวเอง

div {
  width: 0;
  overflow: visible;
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

หรือคุณสามารถใช้หนึ่งในwidthค่าที่เสนอใหม่เหล่านั้นโดยที่ยังคงมีอยู่ตามเวลาที่คุณอ่าน

div {
  width: min-intrinsic;       /* old Chrome, Safari */
  width: -webkit-min-content; /* less old Chrome, Safari */
  width: -moz-min-content;    /* current Firefox */
  width: min-content;         /* current Chrome, Safari; not IE or Edge */
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>


4

คุณไม่สามารถกำหนดเป้าหมายแต่ละคำใน CSS อย่างไรก็ตามด้วย jQuery เล็กน้อยคุณอาจจะทำได้

ด้วย jQuery คุณสามารถรวมคำแต่ละคำใน a <span>และจากนั้นตั้งค่า CSS ขยายdisplay:blockที่จะวางไว้ในบรรทัดของตัวเอง

ในทฤษฎีของหลักสูตร: P


ใช่ฉันกลัวเรื่องนั้น สามารถทำได้ใน PHP ด้วย แต่ดูเหมือนว่าเป็นวิธีแก้ปัญหาที่น่าเกลียด ผมคิดว่าอาจจะมีบาง:first-childเคล็ดลับหรือบางสิ่งบางอย่างออกมี ...
เบน

@Steve: ไม่ปัจจุบัน CSS selectors อนุญาตให้คุณเลือกองค์ประกอบ HTML เท่านั้นไม่ใช่โหนดข้อความ ฉันได้ดูโมดูลข้อความ CSS 3แต่ดูเหมือนจะไม่มีสิ่งใดที่มีการหยุดพักหลังจากแต่ละคำในองค์ประกอบ ทางออกของ Mark คือทางออกที่ดีที่สุดของคุณ
Paul D. Waite

@Paul, @Mark - หากพวกคุณคนใดคนหนึ่งต้องการตัวแทนคุณสามารถตอบได้และฉันจะยอมรับมัน ฉันจะทำเครื่องหมายนี้เช่นเถียง (ตอนนี้) ต่อmeta.stackoverflow.com/questions/48013/...
เบ็น

ฉันคิดว่ามาร์คได้ทำคำตอบแล้วตัวแทนทั้งหมดเป็นของเขาเท่าที่ฉันกังวล
Paul D. Waite

@ Paul - 1 ทีมให้คนที่แต่งตัวประหลาดป้ายหรือสิ่งที่ :)
เบน

2

https://jsfiddle.net/bm3Lfcod/1/

สำหรับผู้ที่มองหาวิธีการแก้ปัญหาที่ทำงานภายในคอนเทนเนอร์หลักที่ยืดหยุ่นกับเด็ก ๆ ที่มีความยืดหยุ่นทั้งสองมิติ เช่น. ปุ่ม navbar

//the parent (example of what it may be)
div {
  display:flex;
  width: 100%;
}

//The children
a {
  display: inline-block;
}

//text wrapper
span {
  display: table-caption;
}

ลองให้CSSคุณสมบัติอื่น ๆ ที่คุณสามารถให้ได้ พูดทรัพย์สินที่อาจทำให้เกิดbrowser reflow
Deepak Yadav

1
เบราว์เซอร์ reflow?
Onza

2

ฉันประสบปัญหาเดียวกันและไม่มีตัวเลือกใด ๆ ช่วยฉันได้ บริการเมลบางตัวไม่รองรับสไตล์ที่ระบุ นี่คือเวอร์ชันของฉันซึ่งแก้ไขปัญหาและทำงานได้ทุกที่ที่ฉันตรวจสอบ:

<table>
    <tr>
        <td width="1">Gargantuan Word</td>
    </tr>
</table>

หรือใช้ CSS:

<table>
    <tr>
        <td style="width:1px">Gargantuan Word</td>
    </tr>
</table>

2

ทางออกที่ดีที่สุดคือword-spacingทรัพย์สิน

เพิ่ม<p>ในคอนเทนเนอร์ที่มีขนาดเฉพาะ (ตัวอย่าง300px) และหลังจากคุณต้องเพิ่มขนาดนั้นเป็นค่าในการเว้นวรรคคำ

HTML

<div>
 <p>Sentence Here</p>
</div>

CSS

div {
 width: 300px;
}

p {
 width: auto;
 text-align: center;
 word-spacing: 300px;
}

ด้วยวิธีนี้ประโยคของคุณจะถูกทำลายและกำหนดไว้ในคอลัมน์เสมอ แต่ส่วนของย่อหน้าจะเป็นแบบไดนามิก

นี่คือตัวอย่าง Codepen


-1

ในกรณีของฉัน

    word-break: break-all;

ทำงานอย่างสมบูรณ์หวังว่ามันจะช่วยให้ผู้มาใหม่อื่น ๆ เช่นฉัน


-1 จากฉันเพราะนี่เป็นคำตอบที่ไม่ถูกต้อง นี่จะเป็นการแบ่งบรรทัดให้กับตัวละครทุกตัวถ้าจำเป็น
Emobe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.