CSS, bir öğedeki her sözcükten sonra satır sonunu zorlayabilir mi?


159

Çok dilli bir site inşa ediyorum, sahibi bana bazı çevirilerde yardımcı oluyor. Görüntülenen ifadelerden bazıları, sitenin stilini korumak için satır sonlarına ihtiyaç duyar.

Ne yazık ki, sahibi bir bilgisayar adamı değil, bu yüzden foo<br />barverileri çevirirken bir şekilde değiştirme şansı olduğunu görürse .

Her kelimeden sonra kırılacak bir öğeye uygulanacak bir CSS çözümü var mı (genişliği değiştirmenin yanı sıra)?

(Bunu PHP'de yapabileceğimi biliyorum, ama belki CJK özelliklerinde aynı şeyi başarmak için CSS'de bilmediğim şık bir numara olup olmadığını merak ediyorum.)

DÜZENLE

Neler olduğunu çizmeye çalışacağım:

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

Uzun kelime otomatik olarak kırılır, kısa kelime kesilmez. Bunun gibi görünmesini istiyorum:

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

2
HTML'de, öğeler belirli bir öğenin genişliği gerektirdiğinde her sözcükten sonra kesilir. Kelimeler içinde mi demek istiyorsun?
Paul D.Waite

@Paul - Hayır, genişliği düzeltmeye dayalı olmayan bir çözüme ihtiyacım var. Sorun şu ki, bazı ifadeler daha uzun ve otomatik olarak kırılıyor (açıkladığınız gibi) ve bazı ifadeler daha kısa ve kırılmıyor, tutarsız bir sunum yapıyor.
Ben

@Paul - Evet, tam olarak tarif ettiğiniz gibi. Düzene gerçekten zarar vermemek, ama daha iyi görünebilir.
Ben

kelime aralığı kullanabilirsiniz ama tüm kelimeleri etkileyecektir .. i Bu öğeleri span öğeleri sarmak etrafında alamazsınız düşünüyorum.
meo

@meo - Öyle görünüyor, düşünce için teşekkürler
Ben

Yanıtlar:


261

kullanım

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

burada <parent-width>üst eleman (veya bir satır uymuyor rasgele bir yüksek değer) genişliğidir. Bu şekilde, tek bir harften sonra satır sonu bile olduğundan emin olabilirsiniz. Chrome / FF / Opera / IE7 + ile çalışır (ve kelime aralığını da desteklediğinden muhtemelen IE6 bile).


Bu kesinlikle en iyi cevap
imho

31
@ToniMichelCaubet Cevabı yorumlamak gerçekten zor, ama şu anlama geliyor: ana öğenin genişliği .parent { word-spacing: 100px; }nerede 100px. Sorun, sıvı bir ebeveyniniz varsa bu çözümün işe yaramamasıdır.
John Kurlak

5
Sadece kelime aralığı için çok yüksek bir değer ayarlayın word-spacing: 100000pxve ebeveynin genişlik açısından akışkan olması konusunda endişelenmenize gerek kalmaz. % 100 sözcük aralığı ayarlamak mantıklı olurdu (üst genişliğin% 100'ü olurdu), ancak yüzde cinsinden ifade edilen değerler o css özelliği için desteklenmez.
sboisse

1
Bu çok yardımcı oldu. Ben hepsi aynı yükseklikte olduğuna çok sarmak için sekmeleri metni istediğiniz genişlik birinde duyarlı duruma kullanmış: word-spacing: 2em; ve bir mobil genişlikte onları tek hat olmak istiyorum:word-spacing: unset;
Will

1
Bu harika. Gelecek yıllarda, bir demet teşekkürler :)
Lucas Medina

125

@HursVanBloob tarafından verilen cevap yalnızca sabit genişlikteki ana kap ile çalışır, ancak akışkan genişlikli kaplarda başarısız olur .

Ben birçok özellik denedim, ama hiçbir şey beklendiği gibi çalıştı. Sonunda word-spacingçok büyük bir değer vermenin gayet iyi çalıştığı sonucuna vardım .

p { word-spacing: 9999999px; }

veya modern tarayıcılar için CSS vwbirimini kullanabilirsiniz (ekran boyutunun% olarak görsel genişliği).

p { word-spacing: 100vw; }

bu ne çalışacağım!
vaskort

Bu harika bir çözüm!
Joe Conlin

Tamamen & nbsp; rağmen.
Matt Fletcher

2
Benim için işe yaramaz, kabın akışkan genişliğinin çok yüksek olmasını sağlar.
Onza

@Onza, sorununuzu gösteren bir keman bağlantısını paylaşabilir misiniz?
Deepak Yadav

37

Alternatif bir çözüm açıklanmıştır satıra bir kelime ayrı cümle uygulayarak, display:table-caption;elemana


Bu aslında sadece en uzun kelimenin genişliğine göre kelimeleri gruplandırır.
James South

1
Bu, kelimeleri bir satırda gruplayabilmesine rağmen, birçok durumda gerçekten iyi çalışır ve büyük kelime aralığı seçeneği kadar kaba hissetmez.
Dale

1
Benim için mükemmel çalışan bu, güzel olan!
Matt Fletcher

1
Herhangi bir sonuç vermez
jafarbtech

32

Kullanmayı deneyin white-space: pre-line;. Kodda bir satır sonu göründüğü yerde satır sonu oluşturur, ancak fazladan boşlukları (sekmeler ve boşluklar vb.) Yok sayar.

İlk olarak, kelimelerinizi kodunuzdaki ayrı satırlara yazın:

<div>Short
Word</div>

Ardından, stili sözcükleri içeren öğeye uygulayın.

div { white-space: pre-line; }

Dikkatli olun da, elemanın içindeki kodda her satır sonu satır sonu yaratacaktır. Yani aşağıdakileri yazmak ilk kelimeden önce ve son kelimeden sonra fazladan bir satır sonu ile sonuçlanır:

<div>
    Short
    Word
</div>

CSS Tricks'te diğer beyaz boşluk özelliklerini açıklayan harika bir makale var .


white-spaceSoruyu cevaplamak için nasıl kullanılabileceğini açıklamalısınız . Üzgünüm, ama nasıl olduğunu göremiyorum.
jlgrall

2
CSS Tricks'teki makale tam olarak açıklıyor, bu yüzden burada cevabı yeniden düzenlemeye çalışmak yerine bir bağlantının yeterli olacağını düşündüm.
Nass

Tamam, bu yüzden kaynağa gerçek satır sonları koymayı ve white-space: pre;bu satır sonlarını bir <pre>etiketin yaptığı gibi görüntülemek için CSS " " yi kullanmanızı önerir misiniz ? Bu işe yarayabilir ve satır sonu çevirmenlere a'dan daha doğal görünmelidir <br />. Eklemek için cevabınızı düzenlemeye çalışacağım :)
jlgrall

Kesinlikle. Aslında, white-space: pre-line;kodunuzda fazladan boşluk görmezden geldiği için, muhtemelen daha uygun olacaktır. Cevabı güncelleyeceğim.
Nass

İyi, belki sadece white-space: pre;IE 7 için ekleyin .
jlgrall

12

Verilen cevaplara ek olarak farklı çözümler arasından seçim yapabilmek istiyorsanız ...

Alternatif bir yöntem, kaba 0 genişliğini vermek ve taşmanın görünür olmasını sağlamaktır. Sonra her kelime taşacak ve kendi satırında olacak.

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

Veya bunu widthokuduğunuz anda hala mevcut olması koşuluyla, yeni önerilen değerlerden birini kullanabilirsiniz .

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'deki her kelimeyi hedefleyemezsiniz. Ancak, biraz jQuery ile muhtemelen olabilir.

JQuery ile her bir kelimeyi kendi satırına koyacak bir <span>ve daha sonra CSS küme aralığına sarabilirsiniz display:block.

Teorik olarak: P


Evet, bundan korkuyordum. PHP de yapabilirdi ama çirkin bir çözüm gibi görünüyor. Orada bir :first-childnumara ya da bir şey olabileceğini düşünüyordum ...
Ben

@Steve: hayır, CSS seçicileri şu anda metin düğümlerini değil, yalnızca HTML öğelerini seçmenize izin veriyor. CSS 3 Metin modülüne bir göz attım , ancak orada bir öğedeki her kelimeden sonra bir mola zorlayan bir şey yok gibi görünüyor. Mark'ın çözümü en iyi seçimdir.
Paul D.Waite

@ Paul, @Mark - İçinizden biri temsilciyi isterse, bunu cevaplayabilirsiniz, ben de kabul edeceğim. Bunu meta.stackoverflow.com/questions/48013/… başına cevapsız (şimdilik) olarak işaretleyeceğim .
Ben

Sanırım Mark zaten bir cevap verdi, tüm temsilci endişelendiğim kadarıyla onun.
Paul D.Waite

@Paul - +1 takım oyuncusu adama bir rozet falan ver :)
Ben

2

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

Her iki boyutta da esnek bir çocukla esnek bir ana kapta çalışan bir çözüm arayanlar için. Örneğin. navbar düğmeleri.

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

Bu yayılma alanını CSSverebileceğiniz diğer mülkleri vermeye çalışın . Neden olabilecek bir özellik söyleyinbrowser reflow
Deepak Yadav

1
tarayıcı yeniden akış?
Onza

2

Aynı sorunla karşılaştım ve buradaki seçeneklerin hiçbiri bana yardımcı olmadı. Bazı posta hizmetleri belirtilen stilleri desteklemez. Sorunu çözen ve kontrol ettiğim her yerde çalışan benim sürümüm:

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

VEYA CSS kullanarak:

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

2

En iyi çözüm word-spacingmülkiyettir.

Ekle <p>belirli bir boyutu (örneğin, bir kap içinde 300px) ile bir kelime aralığı değeri olarak bu boyutu eklemek zorunda sonra.

HTML

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

CSS

div {
 width: 300px;
}

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

Bu şekilde, cümleniz her zaman kırılır ve bir sütuna yerleştirilir, ancak paragrafın sonu dinamik olacaktır.

İşte bir örnek Codepen


-1

Benim durumumda,

    word-break: break-all;

mükemmel çalıştı, umarım benim gibi yeni gelen herhangi bir yardımcı olur.


Benden -1, çünkü bu yanlış bir cevap. Bu, gerekli her karakter IF'de çizgiyi kırar.
Emobe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.