html (+ css) : 줄 바꿈을위한 선호 위치 표시


109

HTML 표 셀에 표시하려는 텍스트가 있다고 가정 해 보겠습니다.

Honey Nut Cheerios, Wheat Chex, Grape-Nuts, Rice Krispies, Some random cereal with a very long name, Honey Bunches of Oats, Wheaties, Special K, Froot Loops, Apple Jacks

그리고 나는 쉼표 중 하나 다음에 우선적으로 줄을 나누기를 원합니다.

HTML 렌더러에게 지정된 지점에서 중단을 시도하고 중단 되지 않는 공백 사용하지 않고 공백 중 하나를 중단하기 전에 먼저 중단하도록 지시하는 방법이 있습니까? 나누지 않는 공백을 사용하면 무조건 너비가 커집니다. 내가 원하는 라인 배치 알고리즘은 먼저 쉼표로 그것을 시도하고 맞게 라인을 얻을 수없는 경우 줄 바꿈, 공간의 한 이후에 발생할 수 있습니다.

<span>요소 에서 텍스트 조각을 래핑하려고 시도했지만 도움이되지 않는 것 같습니다.

<html>
  <head>
      <style type="text/css">
        div.box { width: 180px; }
        table, table td { 
          border: 1px solid; 
          border-collapse: collapse; 
        }
      </style>
  </head>
  <body>
    <div class="box">
      <table>
      <tr>
          <td>lorem ipsum</td>
          <td>lorem ipsum</td>
          <td>lorem ipsum</td>
      </tr>
      <tr>
          <td>lorem ipsum</td>
          <td>
            <span>Honey Nut Cheerios,</span>
            <span>Wheat Chex,</span>
            <span>Grape-Nuts,</span>
            <span>Rice Krispies,</span>
            <span>Some random cereal with a very long name,</span>
            <span>Honey Bunches of Oats,</span>
            <span>Wheaties,</span>
            <span>Special K,</span>
            <span>Froot Loops,</span>
            <span>Apple Jacks</span>
          </td>
          <td>lorem ipsum</td>
      </tr>
      </table>
    </div>
  </body>
</html>

참고 : CSS3text-wrap: avoid 동작이 내가 원하는 것처럼 보이지만 제대로 작동하지 않는 것 같습니다.


스팬 내부에 비 분리 공백을 사용할 수 있습니다 .
Gabriele Petrioli 2011 년

3
그러나 나는 깨지지 않는 공백 을 사용하고 싶지 않습니다 . 나는 "여기에서 깨고 싶지는 않지만, 내가해야 할 일이 있다면"공간을 사용하고 싶지만, 내가 아는 한 그것들이 존재한다.
Jason S

@Jason .. 나는 당신을 느낍니다 .. 그러나 그것은 불가능합니다 .. 대답을 추가했습니다.
Gabriele Petrioli 2011 년

drat, 컴퓨터 과학자가 타이포 그래퍼의 입력없이 렌더링 알고리즘을 작성할 때 일어나는 일입니다.
Jason S

1
@ EggertJóhannesson의 답변은 좋은 해결 방법을 제공하므로 수락해야합니다!
Gabriele Petrioli 2014 년

답변:


156

사용하여

span.avoidwrap { display:inline-block; }

함께 보관하고 싶은 텍스트를 감싸서

<span class="avoidwrap"> Text </span>

먼저 선호하는 블록으로 래핑 한 다음 필요에 따라 더 작은 조각으로 래핑합니다.


16
잘 작동합니다! 추가 참고 사항 : 인라인 블록의 시작과 끝의 공백은 무시되므로 공백으로 블록의 텍스트를 구분하려면 인라인 블록 사이에 배치해야합니다. 스팬은 인라인 스타일이 차단되고 있다면 예를 들어, <span>Hello </span><span> world</span>일 것 Helloworld, 그리고 <span>Hello</span> <span>world</span>정상 것이다 Hello world.
사용자

2
<wbr>은 더 의미 론적이며 브라우저에서 제어권을 남겨 두는 것이 일반적입니다. 이 경우, 그것은 생명력이있을 때 깨지는 것을 가능하게합니다.
Lodewijk

잘 작동합니다. 중요한 경우 "-"와 같은 문자는 중단되지 않습니다. 예 : Perikles <span class = "avoidwrap"> (um & nbsp; 500-429 & nbsp; v.Chr.) </ span>
Sarah Trees

10
@Lodewijk : 줄을 끊는 <wbr>선호하는 위치가 아니라 가능한 위치를 나타냅니다 .
댄 Dascalescu

1
이 기술은 중첩 된에 <span>대해서도 작동 하므로 선호하는 중단 점 의 계층 구조 를 (실제로) 지정할 수 있습니다 .
Michael Dyck 2016

24

내가 선호하는 Dan Mall 의 매우 깔끔한 RWD 솔루션이 있습니다 . 반응 형 줄 바꿈에 관한 다른 질문이이 질문의 중복으로 표시되기 때문에 여기에 추가하겠습니다.
귀하의 경우에는 다음이 필요합니다.

<span>Honey Nut Cheerios, <br class="rwd-break">Wheat Chex, etc.</span>

미디어 쿼리의 CSS 한 줄 :

@media screen and (min-width: 768px) {
    .rwd-break { display: none; }
}

7

쉬운 대답은 너비0 인 공백 문자&#8203; 를 사용하는 것입니다 . 특정 지점에서 단어 내부에 공백 을 만드는 데 사용됩니다. . .

않는 정반대비 깨는 공간 &nbsp; (물론, 실제로 단어 목공 &#8288; () 단어 목공은 의 제로 폭 버전 비 분리 공간 )

(브레이킹 되지 않는 하이픈 과 같은 다른 non - breaking 코드도 있습니다 &#8209;) (여기 nbsp의 다양한 '변형'에 대한 광범위한 답변이 있습니다. )

HTML 전용 (CSS / JS 없음) 솔루션을 원하면 너비0 인 공간끊기지 않는 공백 의 조합을 사용할 수 있지만 이것은 정말 지저분 할 것입니다. 하며 사람이 읽을 수있는 버전을 작성하려면 약간의 노력이 필요합니다. .

ctrl+ c, ctrl+v 도움

예:

   Honey&nbsp;Nut&nbsp;Cheerios,<!---->&#8203;<!--
-->Wheat&nbsp;Chex,<!---->&#8203;<!--
-->Grape&#8209;Nuts,<!---->&#8203;<!--
-->Rice&nbsp;Krispies,<!---->&#8203;<!--
-->Some&nbsp;random&nbsp;cereal&nbsp;with&nbsp;a&nbsp;very&nbsp;long&nbsp;name,<!---->&#8203;<!--
-->Honey&nbsp;Bunches&nbsp;of&nbsp;Oats,<!---->&#8203;<!--
-->Wheaties,<!---->&#8203;<!--
-->Special&nbsp;K,<!---->&#8203;<!--
-->Froot&nbsp;Loops,<!---->&#8203;<!--
-->Apple&nbsp;Jacks

읽을 수 없습니까? 이것은 주석 태그가없는 동일한 HTML입니다.

   Honey&nbsp;Nut&nbsp;Cheerios,&#8203;Wheat&nbsp;Chex,&#8203;Grape&#8209;Nuts,&#8203;Rice&nbsp;Krispies,&#8203;Some&nbsp;random&nbsp;cereal&nbsp;with&nbsp;a&nbsp;very&nbsp;long&nbsp;name,&#8203;Honey&nbsp;Bunches&nbsp;of&nbsp;Oats,&#8203;Wheaties,&#8203;Special&nbsp;K,&#8203;Froot&nbsp;Loops,&#8203;Apple&nbsp;Jacks

그러나 이메일 html 렌더링은 완전히 표준화되지 않았기 때문에이 솔루션은 CSS / JS를 하지 않기

또한이를 <span>기반 솔루션 과 함께 사용 하면 줄 바꿈 알고리즘을 완전히 제어 할 수 있습니다.

(편집 참고 :)

내가 볼 수있는 유일한 문제는 선호하는 파손 지점을 동적으로 변경하려는 경우입니다. 이를 위해서는 각 범위에 비례하는 크기의 JS를 지속적으로 조작하고 텍스트에서 해당 HTML 엔티티를 처리해야합니다.


1
스팬 해킹이란 무엇입니까?
Jason S

스팬 태그를 활용하는 다른 답변.

또한이 솔루션이 가장 간단 해 보이지는 않지만 가장 신뢰할 수있는 솔루션입니다. 해당 엔티티는 브라우저, 이메일 파서 또는 기타 HTML 파서에서 의미 표현을 자주 변경하지 않으며 변경해서는 안되기 때문입니다.

3

대답은 아니오입니다 ( 사용 된 줄 바꿈 알고리즘은 변경할 수 없습니다 ).

그러나 몇 가지 해결 방법이 있습니다 ( 가장 좋은 방법 허용되는 답변입니다 )

구분되지 않는 공백으로 가까이 갈 수 &nbsp;있지만 함께 연결되는 단어 사이에서만 ( 스팬에 있지만 쉼표 뒤에있는 것은 아님 ) 또는 white-space:nowrap@Marcel이 언급 한대로 사용할 수 있습니다 .

두 솔루션 모두 동일한 작업을 수행 하며 자체적으로 맞지 않으면 둘 다 단어 그룹을 끊지 않습니다.


argh. :-( 악취가 나는 것은 내가 그것과 함께 살거나 줄 바꿈 알고리즘을 무 찌르기 위해 스스로 긴 줄을 감지해야한다는 것을 의미합니다.
Jason S

나는 당신의 첫 줄이 표현되는 방식 때문에 거의 계속 읽지 않았기 때문에 해결 방법에 대한 링크를 제공하기 위해 답변을 편집했습니다.
arootbeer

@arootbeer : 나는 당신의 편집을 지원하지만 Gaby는 그것을 되돌 렸습니다. 개비 : 왜? 사용자를 오도하고 싶습니까?
Dan Dascalescu 2015

@ DanDascalescu, 모든 답변이 동일한 페이지에서 허용되는 답변을 가리 키도록 변경되어야합니까? 내 답변은 1 ( 합계 ) 표이고 48 표로 수락 된 답변이 있습니다. 나는 받아 들여진 것이 주목을받는 사람이라고 확신한다 ( 그리고 당연히 그렇다 ). 게다가, 난 (사용 파괴 알고리즘을 변경하는 방법이 아니라고 주장 영업 이익이 요청으로 )
가브리엘 Petrioli

1
내 솔루션이 자신의 논리를 사용하는지 확인하십시오. 스팬 솔루션 중 하나와 그 결합, 당신은 줄 바꿈 알고리즘을 완벽하게 제어 할 수 있습니다

2

위의 마크 업과 함께 span { white-space:nowrap }. 정말 기대할 수있는만큼 좋습니다.


고맙지 만 기본적으로 span요소 내의 공백을로 변환 &nbsp;하고 공백이 전혀 깨지지 않도록 하기 때문에 작동하지 않습니다 . 렌더러가 내 항목 중 하나 사이에 침입하는 것을 막고 싶지만, 필요한 경우 그렇게하려고합니다.
Jason S

@Jason S : 내 대답에 다른 옵션을 추가했습니다.
마르셀

어떻게 &nbsp;<wbr>공간보다 다른가? 내가 말할 수 있듯이, 선택은 주어진 캐릭터가 휴식을 허용하거나 허용하지 않는 것입니다. 따라서 '-'및 ''및 &#8203;and <wbr>&shy;모두는 구분을 허용하지만 (각각 하이픈, 공백, 없음, 없음, 하이픈 전용 중단시 인쇄) 허용 &nbsp;하지 않습니다.
Jason S

@Jason S : 예제 사용 추가.
Marcel

방금 시도했지만 줄 바꿈을 위해 공백보다 우선 순위를 두지 않는 것 같습니다. 우선 순위는 내가 필요한 것입니다. 다른 캐릭터 나 요소에 대한 중단 동작이 예 또는 아니요이면 내 문제에 대한 해결책이 없습니다. 상대적인 줄 바꿈 우선 순위가 있다면 해결책이있을 수 있습니다.
Jason S

1

이제 새로운 답변에 HTML5가 있습니다.

HTML5는 <wbr> 태그를 . (단어 나누기 기회를 의미합니다.)

를 추가 <wbr>하면 브라우저가 다른 곳보다 먼저 나누 도록 지시하므로 쉼표 뒤에서 단어를 나누는 것이 쉽습니다.

Honey Nut Cheerios,<wbr> Wheat Chex,<wbr> Grape-Nuts,<wbr> Rice Krispies,<wbr> Some random cereal with a very long name,<wbr> Honey Bunches of Oats,<wbr> Wheaties,<wbr> Special K,<wbr> Froot Loops,<wbr> Apple Jacks

IE를 제외한 모든 주요 브라우저에서 지원됩니다.


12
-1. 조언하기 전에 테스트하지 않은 이유는 무엇입니까? 작동하지 않습니다. <wbr>또 다른 목적이 있습니다. 이 답변은 오래 전에 존재했던 답변 의 중복이라는 것은 말할 것도 없습니다 .
사용자

1
WBR에는 다른 목적이 없습니다. developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr
Lodewijk

13
<wbr>휴식 기회를 설정합니다. "브라우저에게 다른 곳보다 먼저 중단하라고 지시"하지 않습니다. 공백 앞에 사용하면 공백은 일반적으로 줄 바꿈 기회이므로 일반적으로 쓸모가 없습니다.
Jukka K. Korpela 2014 년

5
이것은 어떤 브라우저에서도 전혀 작동하지 않습니다. 대답은 틀 렸습니다. 일반 공백보다 줄 바꿈을 우선 <wbr>하지 않습니다 . 따라서 래핑은 예제에서 정상적으로 발생합니다.
adrian 18:32에

3
그 위치가 다르게 간주 될 때 <WBR> 신호로 구성되어, 명확히하기 위해, "여기하면 깰 수있는 장소입니다" 단어 내부 . "여기서 휴식을 취하는 것을 선호"가 아니라 "이 두 문자 사이에 공백이있는 것처럼 처리"라고되어 있습니다. 이미 공백이 있으면 <wbr>은 의미가 없습니다.
Semicolon

-1

CSS에서 여백 설정을 조정할 수 있습니다 (이 경우 여백 오른쪽).

text {
    margin-right: 20%;
}

-3

<div>대신 사용 <span>하거나 SPAN에 대한 클래스를 지정하고 display : block 속성을 지정하십시오.


-5

that ™을위한 HTML 요소가 있습니다 : (현재 표준화 된) <wbr>요소 .

나는 그것을 사용하는 것이 좋습니다. 모든 곳 에서 작동하지 않을 수도 있지만 농구를 거치지 않고 할 수있는 최선의 방법입니다.


3
-1 : <wbr>매우 긴 단어에서 중단 점을 표시하기위한 것으로, 선호하는 줄 바꿈으로 문제를 해결하지 못합니다
user

4
@ user3075942 사양 에서 직접 인용 : " wbr요소는 줄 바꿈 기회를 나타냅니다." 이것이 바로 OP가 요구 한 것입니다. 위키에서 읽은 내용을 기반으로 사람들에게 반대 투표를 중지하십시오.
Mathias Bynens 2014 년

3
예, 기회 입니다. 그러나 브라우저는 이미 공간에서 깰 기회가 있습니다. 문제는 브라우저에 중단하는 것이 더 좋은 공간을 알려주는 방법입니다.
사용자가

1
… 그리고 대답은를 사용하는 것 <wbr>입니다.
Mathias Bynens 2014 년

8
아니, 그게 답이 아닙니다. 기존의 특정 중단 점 가능성을 사용할 가능성을 높이지는 않습니다. 아직 존재하지 않는 새로운 중단 점 가능성 만 추가합니다. 연속으로 두 개의 가능성을 갖는 것은 소용이 없습니다. developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr
토린 Finnemann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.