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         |
----------------          ----------------

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).


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

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


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.


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>


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


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

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>

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


-1

Dalam kasus saya,

    word-break: break-all;

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


A -1 dari saya karena ini adalah jawaban yang salah. Ini memecah garis di setiap karakter JIKA diperlukan.
Emobe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.