CSS có thể buộc ngắt dòng sau mỗi từ trong một phần tử không?


159

Tôi đang xây dựng một trang web đa ngôn ngữ, với chủ sở hữu giúp tôi một số bản dịch. Một số cụm từ được hiển thị cần ngắt dòng để duy trì phong cách của trang web.

Thật không may, chủ sở hữu không phải là một anh chàng máy tính, vì vậy nếu anh ta thấy foo<br />barcó cơ hội anh ta sẽ sửa đổi dữ liệu bằng cách nào đó khi anh ta dịch.

Có một giải pháp CSS (bên cạnh việc thay đổi độ rộng) để áp dụng cho một phần tử sẽ bị hỏng sau mỗi từ không?

(Tôi biết tôi có thể làm điều này trong PHP, nhưng tôi tự hỏi liệu có một mẹo nhỏ nào tôi không biết về CSS để thực hiện điều tương tự, có lẽ là trong các tính năng của CJK.)

BIÊN TẬP

Tôi sẽ cố gắng vẽ sơ đồ những gì đang xảy ra:

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

Từ dài tự động ngắt, từ ngắn không. Tôi muốn nó trông như thế này:

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

2
Trong HTML, các phần tử sẽ ngắt sau mỗi từ, khi độ rộng của phần tử đã cho yêu cầu. Bạn có nghĩa là trong các từ?
Paul D. Chờ

@Paul - Không, tôi cần một giải pháp không dựa trên việc sửa chiều rộng. Vấn đề là, một số cụm từ dài hơn và tự động ngắt (như bạn mô tả) và một số cụm từ ngắn hơn và không ngắt, tạo ra một bản trình bày không nhất quán.
Ben

@Paul - Vâng, giống như bạn mô tả chính xác. Không làm hại bố cục thực sự, nhưng nó có thể trông tốt hơn.
Ben

bạn có thể sử dụng khoảng cách từ nhưng nó sẽ ảnh hưởng đến tất cả các từ .. Tôi nghĩ rằng bạn không thể xoay quanh việc bọc các từ đó trong các thành phần span.
meo

@meo - Có vẻ như vậy, cảm ơn vì suy nghĩ
Ben

Câu trả lời:


261

Sử dụng

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

trong đó <parent-width>chiều rộng của phần tử cha (hoặc giá trị cao tùy ý không khớp với một dòng). Bằng cách đó, bạn có thể chắc chắn rằng thậm chí còn có một dấu ngắt dòng sau một chữ cái. Hoạt động với Chrome / FF / Opera / IE7 + (và có thể cả IE6 vì nó cũng hỗ trợ khoảng cách từ).


Đây chắc chắn là câu trả lời hay nhất
imho

31
@ToniMichelCaubet Câu trả lời là thực sự khó khăn để giải thích, nhưng ông có nghĩa là: .parent { word-spacing: 100px; }nơi 100pxlà chiều rộng của phần tử cha mẹ. Vấn đề là giải pháp này không hoạt động nếu bạn có cha mẹ lỏng.
John Kurlak

5
Chỉ cần đặt một giá trị rất cao cho khoảng cách từ, chẳng hạn như word-spacing: 100000pxbạn sẽ không phải lo lắng về việc phụ huynh có thể thay đổi về chiều rộng. Đặt khoảng cách từ 100% sẽ có ý nghĩa (nó sẽ là 100% chiều rộng cha mẹ), nhưng các giá trị được biểu thị bằng tỷ lệ phần trăm không được hỗ trợ cho thuộc tính css đó.
sboisse

1
Điều này rất hữu ích. Tôi đã sử dụng nó trong một tình huống đáp ứng, trong đó ở một chiều rộng, tôi muốn văn bản trong các tab được bao bọc để chúng có cùng chiều cao: word-spacing: 2em; và ở chiều rộng di động, tôi muốn chúng ở dạng một dòng:word-spacing: unset;
Will

1
Thật đáng kinh ngạc. Từ những năm trong tương lai, cảm ơn rất nhiều :)
Lucas Medina

124

Câu trả lời được đưa ra bởi @HursVanBloob chỉ hoạt động với vùng chứa cha mẹ có chiều rộng cố định, nhưng không thành công trong trường hợp thùng chứa chiều rộng chất lỏng .

Tôi đã thử rất nhiều tài sản, nhưng không có gì làm việc như mong đợi. Cuối cùng tôi đã đi đến một kết luận rằng việc đưa ra word-spacingmột giá trị rất lớn hoạt động hoàn toàn tốt.

p { word-spacing: 9999999px; }

hoặc, đối với các trình duyệt hiện đại, bạn có thể sử dụng vwđơn vị CSS (chiều rộng trực quan tính bằng% kích thước màn hình).

p { word-spacing: 100vw; }

đó là những gì tôi sẽ cố gắng!
vaskort

Đây là một giải pháp tuyệt vời!
Joe Conlin

Hoàn toàn nghỉ với & nbsp; Tuy nhiên.
Matt Fletcher

2
Vâng, nó không hoạt động đối với tôi mà làm cho chiều rộng chất lỏng của container đi rất cao.
Onza

@Onza bạn có thể chia sẻ một liên kết fiddle, cho thấy vấn đề của bạn?
Deepak Yadav

37

Một giải pháp thay thế được mô tả trên Câu riêng biệt cho một từ trên mỗi dòng , bằng cách áp dụng display:table-caption;cho thành phần


Điều này thực sự chỉ nhóm các từ dựa trên chiều rộng của từ dài nhất.
James South

1
Mặc dù điều này có thể nhóm các từ trên một dòng nhưng nó hoạt động thực sự tốt trong nhiều tình huống và không cảm thấy khó chịu như tùy chọn khoảng cách từ lớn.
Dale

1
Đây là một trong những hoạt động hoàn hảo cho tôi, một trong những tốt đẹp!
Matt Fletcher

1
Nó không cho kết quả nào
jafarbtech

32

Hãy thử sử dụng white-space: pre-line;. Nó tạo ra một ngắt dòng bất cứ nơi nào một ngắt dòng xuất hiện trong mã, nhưng bỏ qua khoảng trắng thừa (các tab và khoảng trắng, v.v.).

Đầu tiên, viết từ của bạn trên các dòng riêng biệt trong mã của bạn:

<div>Short
Word</div>

Sau đó áp dụng kiểu cho phần tử chứa các từ.

div { white-space: pre-line; }

Hãy cẩn thận , mỗi ngắt dòng trong mã bên trong phần tử sẽ tạo ra ngắt dòng. Vì vậy, viết những điều sau đây sẽ dẫn đến ngắt dòng thêm trước từ đầu tiên và sau từ cuối cùng:

<div>
    Short
    Word
</div>

Có một bài viết tuyệt vời về Thủ thuật CSS giải thích các thuộc tính khoảng trắng khác.


Bạn nên giải thích làm thế nào white-spacecó thể được sử dụng để trả lời câu hỏi. Xin lỗi, nhưng tôi không thấy thế nào.
jlgrall

2
Vâng, bài viết về CSS Tricks giải thích nó đầy đủ, vì vậy tôi nghĩ rằng một liên kết là đủ, thay vì cố gắng lấy lại câu trả lời ở đây.
Nass

Ok, vì vậy, bạn đề nghị đặt ngắt dòng thực trong nguồn và sử dụng CSS " white-space: pre;" để hiển thị các ngắt dòng như <pre>thẻ sẽ làm gì? Điều đó có thể làm việc, và một ngắt dòng sẽ trông tự nhiên hơn đối với người dịch hơn là a <br />. Tôi sẽ cố gắng chỉnh sửa câu trả lời của bạn để thêm nó :)
jlgrall

Chính xác. Thực sự, white-space: pre-line;có lẽ sẽ phù hợp hơn, vì nó bỏ qua khoảng trắng thừa trong mã của bạn. Tôi sẽ cập nhật câu trả lời.
Nass

Tốt, có lẽ chỉ cần thêm white-space: pre;cho IE 7.
jlgrall

12

Nếu bạn muốn có thể chọn từ các giải pháp khác nhau, ngoài các câu trả lời đã cho ...

Một phương pháp khác là cung cấp cho vùng chứa có chiều rộng bằng 0 và đảm bảo có thể nhìn thấy tràn. Sau đó, mỗi từ sẽ tràn ra khỏi nó và sẽ nằm trên một dòng riêng.

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

Hoặc bạn có thể sử dụng một trong những widthgiá trị mới được đề xuất , miễn là chúng vẫn tồn tại vào thời điểm bạn đọc nó.

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

Bạn không thể nhắm mục tiêu từng từ trong CSS. Tuy nhiên, với một chút jQuery có lẽ bạn có thể.

Với jQuery, bạn có thể gói từng từ trong một chuỗi <span>và sau đó đặt chuỗi CSS để display:blockđặt nó trên dòng riêng của nó.

Về lý thuyết tất nhiên: P


Đúng, tôi sợ điều đó. Có thể làm điều đó trong PHP nhưng nó có vẻ là một giải pháp xấu. Tôi đã nghĩ rằng có thể có một số :first-childmẹo hoặc một cái gì đó ngoài kia ...
Ben

@Steve: không, bộ chọn CSS hiện chỉ cho phép bạn chọn các thành phần HTML, không phải các nút văn bản. Tôi đã xem xét mô-đun CSS 3 Text , nhưng dường như không có bất cứ điều gì buộc phải nghỉ sau mỗi từ trong một phần tử. Giải pháp của Mark là đặt cược tốt nhất của bạn.
Paul D. Chờ

@Paul, @Mark - Nếu một trong các bạn muốn đại diện, bạn có thể đưa ra câu trả lời và tôi sẽ chấp nhận. Tôi sẽ đánh dấu điều này là không thể trả lời (hiện tại) cho mỗi meta.stackoverflow.com/questions/48013/iêu .
Ben

Tôi nghĩ Mark đã làm cho nó trở thành một câu trả lời, tất cả các đại diện là của anh ấy như tôi quan tâm.
Paul D. Chờ

@Paul - Người chơi nhóm +1 tặng anh chàng huy hiệu hoặc thứ gì đó :)
Ben

2

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

Đối với những người tìm kiếm một giải pháp hoạt động trong một thùng chứa cha mẹ linh hoạt với một đứa trẻ linh hoạt ở cả hai chiều. ví dụ. nút điều hướng.

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

Hãy thử đưa ra khoảng đó bất kỳ CSStài sản khác mà bạn có thể cung cấp. Nói một tài sản có thể gây rabrowser reflow
Deepak Yadav

1
trình duyệt lại?
Onza

2

Tôi đã đối mặt với cùng một vấn đề, và không có lựa chọn nào ở đây giúp tôi. Một số dịch vụ thư không hỗ trợ các kiểu được chỉ định. Đây là phiên bản của tôi, đã giải quyết vấn đề và hoạt động ở mọi nơi tôi đã kiểm tra:

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

HOẶC sử dụng CSS:

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

2

Giải pháp tốt nhất là word-spacing tài sản.

Thêm <p>vào một thùng chứa với một kích thước cụ thể (ví dụ 300px) và sau khi bạn phải thêm kích thước đó làm giá trị trong khoảng cách từ.

HTML

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

CSS

div {
 width: 300px;
}

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

Theo cách này, câu của bạn sẽ luôn bị phá vỡ và được đặt trong một cột, nhưng phần của đoạn sẽ là động.

Dưới đây là một ví dụ Codepen


0

Trong trường hợp của tôi,

    word-break: break-all;

làm việc một cách hoàn hảo, hy vọng nó sẽ giúp ích cho bất kỳ người mới nào khác như tôi.


A -1 từ tôi vì đây là một câu trả lời không chính xác. Điều này phá vỡ dòng ở mỗi nhân vật NẾU cần thiết.
Emobe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.