CSS가 요소의 각 단어 다음에 줄 바꿈을 강제 할 수 있습니까?


159

나는 다국어 사이트를 만들고 있는데, 소유자가 번역을 도와주었습니다. 표시된 문구 중 일부는 사이트 스타일을 유지하기 위해 줄 바꿈이 필요합니다.

불행히도, 소유자는 컴퓨터 사용자가 아니므로, foo<br />bar번역을하는 동안 어떻게 든 데이터를 수정할 가능성이 있습니다.

모든 단어 다음에 깨질 요소에 적용 할 CSS 솔루션 (너비 변경 외에)이 있습니까?

(PHP 에서이 작업을 수행 할 수 있다는 것을 알고 있지만 CJK 기능에서 CSS에서 동일한 작업을 수행하기 위해 알지 못하는 멋진 트릭이 있는지 궁금합니다.)

편집하다

나는 무슨 일이 일어나고 있는지 다이어그램을 시도 할 것입니다 :

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

긴 단어는 자동으로 끊어지고 짧은 단어는 자동으로 끊어지지 않습니다. 나는 다음과 같이 보이기를 원한다.

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

2
HTML에서, 주어진 요소의 너비가 그것을 요구할 때, 요소는 모든 단어 다음에 끊어집니다. 당신은 단어 내에서 의미합니까?
Paul D. Waite

@Paul-아니요, 너비 고정을 기반으로하지 않는 솔루션이 필요합니다. 문제는 일부 문구가 길고 자동으로 끊어지고 (설명한 것처럼) 일부 문구가 짧고 끊어지지 않아 일관성이없는 프레젠테이션을하는 것입니다.
Ben

@Paul-예, 정확하게 설명하는 것과 같습니다. 레이아웃에 실제로 해를 끼치 지 않지만 더 좋아 보일 수 있습니다.
Ben

단어 간격을 사용할 수는 있지만 모든 단어에 영향을 미칩니다. i 해당 단어를 범위 요소로 감싸는 것을 피할 수 없다고 생각합니다.
meo

@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)에서도 작동합니다.


이것은 확실히 최고의 답변입니다 imho
Hezad

31
@ToniMichelCaubet 해답은 실제로 해석하기 어렵지만 의미합니다. 부모 요소의 너비는 .parent { word-spacing: 100px; }어디에 있습니까 100px? 문제는 유동적 인 부모가있는 경우이 솔루션이 작동하지 않는다는 것입니다.
John Kurlak

5
단어 간격에 대해 매우 높은 값을 설정하기 만하면 word-spacing: 100000px너비 측면에서 부모가 유동적 일까 걱정할 필요가 없습니다. 단어 간격을 100 %로 설정하면 의미가 있지만 (부모 너비의 100 % 일 수 있음) 백분율로 표시된 값은 해당 CSS 속성에 지원되지 않습니다.
sboisse

1
이것은 매우 도움이되었습니다. 반응 형 상황에서 사용했습니다. 한 너비에서 탭의 텍스트를 줄 바꿈하여 모두 같은 높이가되도록합니다. word-spacing: 2em; 그리고 모바일 너비에서 한 줄로 만들고 싶습니다.word-spacing: unset;
Will

1
이것은 놀랍다. 앞으로 몇 년 동안, 많은 감사합니다 :)
Lucas Medina

124

@HursVanBloob의 답변은 고정 너비 부모 컨테이너에서만 작동하지만 유체 너비 컨테이너의 경우 실패합니다 .

많은 속성을 시도했지만 예상대로 작동하지 않았습니다. 마침내 나는 word-spacing매우 큰 가치 를 부여 하는 것이 완벽하게 작동 한다는 결론에 도달했습니다 .

p { word-spacing: 9999999px; }

또는 최신 브라우저의 경우 CSS vw단위 (화면 크기의 % 단위의 시각적 너비)를 사용할 수 있습니다 .

p { word-spacing: 100vw; }

그게 내가 시도 할 것입니다!
vaskort

이것은 훌륭한 솔루션입니다!
Joe Conlin

& nbsp; 그러나.
매트 플레처

2
컨테이너의 유체 폭을 매우 높게 만드는 것은 저에게 효과적이지 않습니다.
Onza

@Onza 문제를 보여주는 바이올린 링크를 공유 할 수 있습니까?
Deepak Yadav

37

대체 솔루션은 요소 에 적용 하여 한 줄에 한 단어로 문장을 구분 하는 방법에 설명되어 있습니다.display:table-caption;


실제로는 가장 긴 단어의 너비를 기준으로 단어 만 그룹화합니다.
James South

1
이것은 한 줄로 단어를 그룹화 할 수 있지만 많은 상황에서 실제로 잘 작동하며 대규모 단어 간격 옵션만큼 해킹되지 않습니다.
Dale

1
이것은 나를 위해 완벽하게 작동 한 것입니다.
매트 플레처

1
그것은 아무 결과도주지 않습니다
jafarbtech

32

를 사용해보십시오 white-space: pre-line;. 코드에 줄 바꿈이 나타날 때마다 줄 바꿈을 만들지 만 여분의 공백 (탭 및 공백 등)은 무시합니다.

먼저 코드에서 별도의 줄에 단어를 작성하십시오.

<div>Short
Word</div>

그런 다음 단어를 포함하는 요소에 스타일을 적용하십시오.

div { white-space: pre-line; }

조심 하지만이 요소 내부 코드의 모든 줄 바꿈은 줄 바꿈을 만듭니다. 따라서 다음을 쓰면 첫 단어 앞과 마지막 단어 뒤에 줄 바꿈이 추가됩니다.

<div>
    Short
    Word
</div>

CSS 공백에 대한 다른 공백 속성을 설명 하는 훌륭한 기사가 있습니다 .


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트릭이나 무언가 가있을 것이라고 생각 하고 있었다 ...
Ben

@Steve : 아니요, CSS 선택기는 현재 텍스트 노드가 아닌 HTML 요소 만 선택할 수 있습니다. CSS 3 Text 모듈을 살펴 보았지만 요소의 각 단어 다음에 중단을 일으키는 것은 없습니다. Mark의 솔루션이 가장 좋습니다.
Paul D. Waite

@Paul, @Mark-여러분 중 한 명이 담당자를 원한다면 그 대답을 할 수 있고 받아들이겠습니다. meta.stackoverflow.com/questions/48013/…에 따라 (현재로서는) 응답 할 수없는 것으로 표시하겠습니다 .
Ben

마크가 이미 답을했다고 생각합니다. 모든 담당자는 내가 생각하는 한 그의 것입니다.
Paul D. Waite

@Paul-+1 팀 플레이어는 그 사람에게 배지 또는 무언가를 줘 :)
Ben

2

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

두 차원 모두에서 유연한 자식을 가진 유연한 부모 컨테이너 내에서 작동하는 솔루션을 찾는 사람들을 위해. 예. 탐색 표시 줄 단추.

//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
디팍 야다 브

1
브라우저 리플 로우?
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.