Bisakah CSS memaksa satu baris setelah setiap kata dalam suatu elemen?

159

Saya sedang membangun situs multibahasa, dengan pemiliknya membantu saya dengan beberapa terjemahan. Beberapa frasa yang ditampilkan memerlukan jeda baris untuk mempertahankan gaya situs.

Sayangnya, pemiliknya bukan orang komputer, jadi jika dia melihat foo<br />barada kemungkinan dia akan mengubah data entah bagaimana saat dia menerjemahkan.

Apakah ada solusi CSS (selain mengubah lebar) untuk diterapkan ke elemen yang akan pecah setelah setiap kata?

(Saya tahu saya bisa melakukan ini dalam PHP, tapi saya bertanya-tanya apakah ada trik bagus yang tidak saya ketahui dalam CSS untuk mencapai hal yang sama, mungkin dalam fitur CJK.)

EDIT

Saya akan mencoba untuk memetakan apa yang terjadi:

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

Kata panjang terputus secara otomatis, kata pendek tidak. Saya ingin terlihat seperti ini:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------
Ben
sumber
2
Dalam HTML, elemen memecah setiap kata, ketika lebar elemen yang diberikan membutuhkannya. Apakah yang Anda maksudkan dengan kata-kata?
Paul D. Waite
@ Paul - Tidak, saya perlu solusi yang tidak didasarkan pada memperbaiki lebar. Masalahnya adalah, beberapa frasa lebih panjang dan pecah secara otomatis (seperti yang Anda jelaskan) dan beberapa frasa lebih pendek dan tidak pecah, membuat presentasi yang tidak konsisten.
Ben
@ Paul - Ya, sepertinya Anda menjelaskan dengan tepat. Tidak benar-benar merusak tata letak, tetapi bisa terlihat lebih baik.
Ben
Anda dapat menggunakan spasi kata tetapi itu akan mempengaruhi semua kata .. i Pikirkan Anda tidak bisa membungkus kata-kata itu dalam elemen span.
meo
@meo - Sepertinya begitu, terima kasih atas pemikirannya
Ben

Jawaban:

261

Menggunakan

.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;
}

di mana <parent-width>lebar elemen induk (atau nilai tinggi sewenang-wenang yang tidak masuk ke dalam satu baris). Dengan begitu Anda dapat yakin bahwa bahkan ada jeda setelah satu huruf. Bekerja dengan Chrome / FF / Opera / IE7 + (dan mungkin bahkan IE6 karena mendukung spasi kata).

Hurs van Bloob
sumber
Ini jelas merupakan jawaban terbaik imho
Hezad
31
@ToniMichelCaubet Jawabannya sangat sulit untuk diartikan, tetapi maksudnya adalah: di .parent { word-spacing: 100px; }mana 100pxlebar elemen induk. Masalahnya adalah bahwa solusi ini tidak berfungsi jika Anda memiliki orangtua yang fluida.
John Kurlak
5
Cukup tetapkan nilai yang sangat tinggi untuk spasi kata seperti word-spacing: 100000pxdan Anda tidak perlu khawatir orangtua menjadi cair dalam hal lebar. Mengatur jarak kata 100% akan masuk akal (itu akan menjadi 100% dari lebar induk), tetapi nilai yang dinyatakan dalam persentase tidak didukung untuk properti css itu.
sboisse
1
Ini sangat membantu. Saya menggunakannya dalam situasi responsif, di mana pada satu lebar saya ingin teks dalam tab untuk membungkus sehingga mereka semua sama tingginya: word-spacing: 2em; dan pada lebar ponsel saya ingin mereka menjadi satu-baris:word-spacing: unset;
Will
1
Ini luar biasa. Dari tahun-tahun mendatang, terima kasih banyak :)
Lucas Medina
124

Jawaban yang diberikan oleh @HursVanBloob hanya berfungsi dengan wadah induk dengan lebar tetap, tetapi gagal jika wadah dengan lebar cairan .

Saya mencoba banyak properti, tetapi tidak ada yang berhasil seperti yang diharapkan. Akhirnya saya sampai pada kesimpulan bahwa memberikan word-spacingnilai yang sangat besar bekerja dengan sangat baik.

p { word-spacing: 9999999px; }

atau, untuk browser modern Anda dapat menggunakan vwunit CSS (lebar visual dalam% dari ukuran layar).

p { word-spacing: 100vw; }
Deepak Yadav
sumber
itulah yang akan saya coba!
vaskort
Ini solusi hebat!
Joe Conlin
Istirahat total dengan & nbsp; meskipun.
Matt Fletcher
2
Yah itu tidak berhasil bagi saya yang membuat lebar cairan wadah menjadi sangat tinggi.
Onza
@Onza, bisakah kamu membagikan tautan biola, menunjukkan masalahmu?
Deepak Yadav
37

Solusi alternatif dijelaskan pada kalimat terpisah ke satu kata per baris , dengan menerapkan display:table-caption;elemen

malcomio
sumber
Ini sebenarnya hanya mengelompokkan kata berdasarkan lebar dari kata terpanjang.
James South
1
Meskipun ini dapat mengelompokkan kata-kata pada satu baris, ia berfungsi dengan sangat baik dalam banyak situasi dan tidak terasa seterkaya pilihan spasi kata yang besar.
Dale
1
Ini yang bekerja dengan baik untuk saya, bagus!
Matt Fletcher
1
Itu tidak memberikan hasil apa pun
jafarbtech
32

Coba gunakan white-space: pre-line;. Itu menciptakan jeda baris di mana pun jeda baris muncul dalam kode, tetapi mengabaikan spasi putih (tab dan spasi dll).

Pertama, tulis kata-kata Anda pada baris terpisah dalam kode Anda:

<div>Short
Word</div>

Kemudian terapkan gaya ke elemen yang mengandung kata-kata.

div { white-space: pre-line; }

Namun hati-hati , setiap jeda baris dalam kode di dalam elemen akan membuat jeda baris. Jadi, menulis yang berikut ini akan menghasilkan jeda baris tambahan sebelum kata pertama dan setelah kata terakhir:

<div>
    Short
    Word
</div>

Ada artikel bagus tentang Trik CSS yang menjelaskan atribut ruang putih lainnya.

Nass
sumber
Anda harus menjelaskan bagaimana white-spacebisa digunakan untuk menjawab pertanyaan. Maaf, tapi saya tidak mengerti caranya.
jlgrall
2
Nah artikel tentang Trik CSS menjelaskan sepenuhnya, jadi saya pikir link akan cukup, daripada mencoba memuntahkan jawabannya di sini.
Nass
Oke, jadi Anda menyarankan untuk meletakkan jeda baris nyata di sumber, dan menggunakan CSS " white-space: pre;" untuk menampilkan jeda baris seperti yang dilakukan <pre>tag? Itu bisa bekerja, dan satu baris harus terlihat lebih alami untuk penerjemah daripada <br />. Saya akan mencoba mengedit jawaban Anda untuk menambahkannya :)
jlgrall
Persis. Yah sebenarnya, white-space: pre-line;mungkin akan lebih tepat, karena mengabaikan spasi kosong dalam kode Anda. Saya akan memperbarui jawabannya.
Nass
Bagus, mungkin tambahkan saja white-space: pre;untuk IE 7.
jlgrall
12

Jika Anda ingin dapat memilih dari solusi yang berbeda, di samping jawaban yang diberikan ...

Metode alternatif adalah memberi wadah lebar 0 dan untuk memastikan luapan terlihat. Maka setiap kata akan keluar dari itu dan akan berada di jalurnya sendiri.

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

Atau Anda dapat menggunakan salah satu dari widthnilai - nilai yang baru diusulkan , asalkan masih ada pada saat Anda membaca ini.

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>

Tuan Lister
sumber
4

Anda tidak dapat menargetkan setiap kata dalam CSS. Namun, dengan sedikit jQuery Anda mungkin bisa.

Dengan jQuery Anda dapat membungkus setiap kata dalam <span>dan kemudian rentang rentang CSS display:blockyang akan menempatkannya pada barisnya sendiri.

Secara teori tentu saja: P

Menandai
sumber
Ya, saya takut itu. Bisa melakukannya di PHP juga tetapi sepertinya solusi yang jelek. Saya berpikir mungkin ada :first-childtrik atau sesuatu di luar sana ...
Ben
@Steve: tidak, pemilih CSS saat ini hanya memungkinkan Anda memilih elemen HTML, bukan node teks. Saya telah melihat modul Teks CSS 3 , tetapi tampaknya tidak ada apa pun di sana yang memaksa istirahat setelah setiap kata dalam suatu elemen. Solusi Mark adalah taruhan terbaik Anda.
Paul D. Waite
@ Paul, @ Mark - Jika salah satu dari kalian ingin perwakilan, Anda bisa membuat jawaban dan saya akan menerimanya. Saya akan menandainya sebagai tidak dapat dijawab (untuk saat ini) per meta.stackoverflow.com/questions/48013/… .
Ben
Saya pikir Mark sudah membuat jawaban, semua perwakilan adalah miliknya sejauh yang saya ketahui.
Paul D. Waite
@ Paul - Pemain tim +1 memberi orang itu lencana atau sesuatu :)
Ben
2

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

Bagi mereka yang mencari solusi yang bekerja dalam wadah orangtua yang fleksibel dengan anak-anak yang fleksibel di kedua dimensi. misalnya. tombol 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;
}
Onza
sumber
Coba berikan rentang itu CSSproperti lain yang bisa Anda berikan. Katakan properti yang dapat menyebabkanbrowser reflow
Deepak Yadav
1
peramban reflow?
Onza
2

Saya menghadapi masalah yang sama, dan tidak ada opsi di sini yang membantu saya. Beberapa layanan email tidak mendukung gaya yang ditentukan. Ini versi saya, yang menyelesaikan masalah dan bekerja di mana saja saya periksa:

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

ATAU menggunakan CSS:

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

Solusi terbaik adalah word-spacingproperti.

Tambahkan <p>dalam wadah dengan ukuran tertentu (contoh 300px) dan setelah itu Anda harus menambahkan ukuran itu sebagai nilai dalam spasi kata.

HTML

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

CSS

div {
 width: 300px;
}

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

Dengan cara ini, kalimat Anda akan selalu rusak dan diatur dalam kolom, tetapi dengan paragraf akan menjadi dinamis.

Berikut contoh Codepen

Cosimo mau
sumber
-1

Dalam kasus saya,

    word-break: break-all;

bekerja dengan baik, semoga membantu pendatang baru lainnya seperti saya.

Emanuel Hiroshi
sumber
A -1 dari saya karena ini adalah jawaban yang salah. Ini memecah garis di setiap karakter JIKA diperlukan.
Emobe