태그 보관물: layout

layout

긴 단어가 내 div를 깨는 것을 방지하는 방법은 무엇입니까? 이후로 한 가지

TABLE-layout에서 DIV-layout으로 전환 한 이후로 한 가지 일반적인 문제가 남아 있습니다.

문제 : 동적 텍스트로 DIV를 채우고 필연적으로 div 열의 가장자리 위로 확장되어 사이트가 비전문적 인 것처럼 보이게하는 매우 긴 단어가 있습니다.

RETRO-WHINING : 테이블 레이아웃에서는 이런 일 이 발생 하지 않았습니다 . 표 셀은 항상 가장 긴 단어의 너비까지 넓게 확장됩니다.

심각도 : 가장 중요한 사이트, 특히 “한계”와 같은 일반적인 단어가 매우 긴 독일어 사이트 ( “Geschwindigkeitsbegrenzung”)에서도이 문제가 발생합니다.

누구든지 이것에 대한 실용적인 해결책이 있습니까?



답변

소프트 하이픈

소프트 하이픈 ( ­) 을 삽입하여 브라우저에 긴 단어를 나눌 위치를 지정할 수 있습니다 .

averyvery­longword

로 렌더링 될 수 있습니다

매우 긴 단어

또는

매우
긴 단어

좋은 정규 표현식을 사용하면 필요한 경우가 아니라면 삽입하지 않을 수 있습니다.

/([^\s-]{5})([^\s-]{5})/  $1­$2

브라우저와 검색 엔진은 텍스트를 검색 할 때이 문자를 무시할 정도로 영리하며, 다른 사람을 테스트하지 않은 Chrome 및 Firefox는 텍스트를 클립 보드에 복사 할 때이를 무시합니다.

<wbr> 요소

또 다른 옵션은 HTML5로<wbr> 된 이전 IE-ism 을 삽입 하는 것입니다 .

averyvery<wbr>longword

하이픈없이 나누기 :

매우
긴 단어

너비가 0 인 공백 문자 &#8203;(또는 &#x200B)를 사용 하여 동일한 결과를 얻을 수 있습니다 .


참고 로 최신 IE, Firefox 및 Safari ( 현재 Chrome은 아님)에서 지원하는 CSShyphens: auto 도 있습니다 .

div.breaking {
  hyphens: auto;
}

그러나 하이픈 넣기 (hyphenation)는 하이픈 딕셔너리 사전을 기반으로하므로 긴 단어를 깰 수는 없습니다. 그래도 정당한 텍스트를 더 예쁘게 만들 수 있습니다.

레트로 솔루션

<table>레이아웃은 좋지 않지만 display:table다른 요소에는 좋습니다. 구식 테이블만큼 기발하고 신축성이 있습니다.

div.breaking {
   display: table-cell;
}

overflow그리고 white-space: pre-wrap아래의 답변이 너무 좋다.


답변

두 가지 수정 사항 :

  1. overflow:scroll -이것은 디자인 비용으로 콘텐츠를 볼 수있게합니다 (스크롤바는보기 흉함)
  2. overflow:hidden-오버플로를 차단합니다. 그것은 사람들이 내용을 읽을 수 없다는 것을 의미합니다.

(SO 예제에서) 패딩과 겹치지 않게하려면 패딩 내부에 내용을 담기 위해 다른 div를 만들어야 할 것입니다.

편집 : 다른 답변 상태와 같이 단어를 자르는 다양한 방법이 있습니다. 클라이언트 측에서 렌더 폭을 계산하는 것입니다 (이 서버 측은 절대로 안정적으로 작동하지 않으므로 플랫폼 간). JS 및 구분 문자 삽입 또는 비표준 및 / 또는 word-wrap: break-word 거의 호환되지 않는 CSS 태그 사용 ( Firefox에서는 작동하지 않는 것으로 나타남 )

그래도 항상 오버플로 설명자가 필요합니다. div에 너무 넓은 블록 유형의 콘텐츠 (이미지, 테이블 등)가 포함되어 있으면 레이아웃 / 디자인을 파괴하지 않도록 오버플로가 필요합니다.

따라서 다른 방법 (또는 그 조합)을 사용해야하지만 오버플로도 추가해야 모든 브라우저를 포괄 할 수 있습니다.

2를 편집하십시오 (아래 의견을 처리하십시오).

CSS overflow속성을 사용하여 시작하는 것은 완벽하지는 않지만 디자인 중단을 막습니다. overflow:hidden먼저 신청하십시오 . 오버플로는 패딩에서 깨지지 않으므로 중첩 div또는 테두리를 사용하십시오 (가장 적합한 방법).

넘쳐나는 내용을 숨기므로 의미를 잃을 수 있습니다. 을 사용 overflow:auto하거나 overflow:scroll대신에 스크롤 막대를 사용할 수 overflow:hidden있지만 div의 크기와 디자인에 따라 모양이 좋지 않거나 제대로 작동하지 않을 수 있습니다.

이 문제를 해결하기 위해 JS를 사용하여 작업을 취소하고 자동 잘라내기를 수행 할 수 있습니다. 나는 당신을 위해 의사 코드를 작성하는 중반 쯤되었지만 반쯤 진행되면 심각하게 복잡해집니다. 가능한 한 많이 표시해야하는 경우 하이픈에주의를 기울 이십시오 ( 아래 언급 됨 ).

이는 사용자의 CPU 비용으로 발생합니다. 페이지를로드하거나 크기를 조정하는 데 시간이 오래 걸릴 수 있습니다.


답변

우리가 알고 있듯이 이것은 복잡한 문제이며 브라우저간에 일반적인 방식으로 지원되지 않습니다. 대부분의 브라우저는이 기능을 기본적으로 지원하지 않습니다.

사용자 콘텐츠가 사용되었지만 HTML을 지원하지 않는 HTML 전자 메일을 사용한 일부 작업에서 간격이없는 콘텐츠 블록 주위의 래퍼에있는 다음 CSS 비트는 적어도 어느 정도 도움이 될 것입니다.

.word-break {
  /* The following styles prevent unbroken strings from breaking the layout */
  width: 300px; /* set to whatever width you need */
  overflow: auto;
  white-space: -moz-pre-wrap; /* Mozilla */
  white-space: -hp-pre-wrap; /* HP printers */
  white-space: -o-pre-wrap; /* Opera 7 */
  white-space: -pre-wrap; /* Opera 4-6 */
  white-space: pre-wrap; /* CSS 2.1 */
  white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */
  word-wrap: break-word; /* IE */
  -moz-binding: url('xbl.xml#wordwrap'); /* Firefox (using XBL) */
}

Mozilla 기반 브라우저의 경우 위에서 언급 한 XBL 파일에는 다음이 포함됩니다.

<?xml version="1.0" encoding="utf-8"?>
<bindings xmlns="http://www.mozilla.org/xbl" 
          xmlns:html="http://www.w3.org/1999/xhtml">
  <!--
  More information on XBL:
  http://developer.mozilla.org/en/docs/XBL:XBL_1.0_Reference

  Example of implementing the CSS 'word-wrap' feature:
  http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/
  -->
  <binding id="wordwrap" applyauthorstyles="false">
    <implementation>
      <constructor>
        //<![CDATA[
        var elem = this;

        doWrap();
        elem.addEventListener('overflow', doWrap, false);

        function doWrap() {
          var walker = document.createTreeWalker(elem, NodeFilter.SHOW_TEXT, null, false);
          while (walker.nextNode()) {
            var node = walker.currentNode;
            node.nodeValue = node.nodeValue.split('').join(String.fromCharCode('8203'));
          }
        }
        //]]>
      </constructor>
    </implementation>
  </binding>
</bindings>

불행히도 Opera 8+는 위의 솔루션을 좋아하지 않는 것 같습니다. 따라서 JavaScript는 Mozilla / Firefox와 같은 브라우저에 대한 솔루션이어야합니다. Opera의 최신 버전을 포함하는 또 다른 크로스 브라우저 솔루션 (JavaScript) Hedger Wang의 스크립트를 사용하는 것이 좋습니다 :
http://www.hedgerwow.com/360/dhtml/css-word-break.html

다른 유용한 링크 / 생각 :

불일치 한 Babble»블로그 아카이브»Mozilla / Firefox 용 CSS 자동 줄 바꿈
http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/

[OU] Opera에서 줄 바꿈 없음, IE에서 잘 표시됨
http://list.opera.com/pipermail/opera-users/2004-November/024467.html
http://list.opera.com/pipermail/opera- users / 2004-November / 024468.html


답변

CSS 크로스 브라우저 워드 랩

.word_wrap
{
    white-space: pre-wrap; /* css-3 */
    white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
    white-space: -pre-wrap; /* Opera 4-6 */
    white-space: -o-pre-wrap; /* Opera 7 */
    word-wrap: break-word; /* Internet Explorer 5.5+ */
}


답변

스타일을 사용하십시오 word-break:break-all;. 테이블에서 작동한다는 것을 알고 있습니다.


답변

지원하는 브라우저에서 word-wrap: break-word작동하지 않습니까?

스타일 시트의 본문 정의에 포함 된 경우 전체 문서에서 작동해야합니다.

오버플로가 좋은 해결책이 아니라면 사용자 정의 자바 스크립트 만 인공적으로 긴 단어를 나눌 수 있습니다.

참고 :이 <wbr>단어 나누기 태그도 있습니다. 이것은 브라우저가 라인을 분할 할 수있는 지점을 제공합니다. 불행히도이 <wbr>태그는 모든 브라우저에서 작동하지 않으며 Firefox 및 Internet Explorer에서만 작동합니다 (CSS 트릭을 사용하는 Opera).


답변

IE 7, Firefox 3.6.8 Mac, Firefox 3.6.8 Windows 및 Safari를 방금 확인했습니다.

word-wrap: break-word;

너비가 설정되어 있고 CSS에 오버플로가 선언되지 않은 div 내부의 긴 링크에서 작동합니다.

#consumeralerts_leftcol{
    float:left;
    width: 250px;
    margin-bottom:10px;
    word-wrap: break-word;
}

비 호환성 문제가 보이지 않습니다