CSS에서 최대 문자 길이 설정


181

학교에 반응 형 웹 사이트를 만들고 있는데 제 질문은 :

매우 큰 화면이 표시 될 때 문장이 75자를 넘지 않도록 웹 사이트에서 문장의 최대 문자 길이 (CSS 사용)를 75 자처럼 설정하는 방법은 무엇입니까?

최대 너비를 시도했지만 레이아웃이 엉망입니다. Flexbox 및 미디어 쿼리를 사용하여 반응 형으로 만듭니다.


1
사용 textarea하거나 input최대 길이 ( maxlength="50"HTML에 있음) 속성이 있거나 Javascript를 사용해야하는 경우. 또한 나는 이것을 잘못 읽은 것으로 생각합니다. 너비를 설정하면 문장이 끝에 도달했을 때 다음 줄로 떨어집니다. 이것이 기본 동작입니다.
Ruddy

2
이것을보세요 : stackoverflow.com/questions/20552957/…- 이것은 CSS 줄임표입니다. 도움이 될 것입니다
대런 스위니

CSS를 단독으로 사용하여이를 수행 할 수는 없지만 Darren이 제안한대로 CSS를 사용하여 표시되는 문자 수를 제한 할 수 있습니다. 텍스트 컨테이너를 공백 없음 : 줄 바꿈 없음, 텍스트 오버플로 : 줄임표 및 오버플로 : 숨김으로 설정해야합니다. 그런 다음 컨테이너의 크기를 설정하십시오.
Patrick Lyver

1
그러한 한계를 설정한다는 것은 무엇을 의미합니까? 초과되면 어떻게됩니까? “문장”은 무슨 뜻입니까? CSS 개념이 아닙니다. 문장을 어떻게 인식하거나 마크 업하려고합니까? 아니면 실제로 줄 길이를 의미 합니까? 그렇게한다면 문제가 무엇입니까? 일반적으로 텍스트를 방지하기 위해 특별한 작업을 수행하지 않으면 텍스트가 자동으로 줄 바꿈됩니다.
Jukka K. Korpela

답변:


254

다음 max-widthellipsis같이 a 및 overflow 를 설정하여 항상 잘림 방법을 사용할 수 있습니다

p {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200px;
}

예 : http://jsfiddle.net/3czeyznf/

여러 줄 잘림의 경우 flex솔루션을 살펴보십시오 . 3 행에서 잘림이있는 예입니다.

p {
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
}

예 : https://codepen.io/srekoble/pen/EgmyxV


1
감사합니다, 줄임표 사용을 이해하지만 이것이 어떻게 내 문제를 해결하는지 알 수 없습니다. 줄임표는 화면이 작아 질 때 적합하지만 더 커질 때 75 자로 잘라 내기를 원합니다. @ Jean-luc가 말했듯이 자바 스크립트에서만 가능합니까? 죄송합니다, 새로운 코딩
Sharif1111

타이포그래피에 따라 75자가 발생하는 공간을 확인하고 그에 따라 최대 너비를 설정할 수 있습니다. 불행히도 문자에 따라 문장을 자르도록 CSS 속성을 설정할 수 없습니다. 또는 행에 따라 자르기 방법을 지정할 수 있다는 이점과 함께 flex 자르기 방법을 사용할 수 있습니다.
Vangel Tzo

1
문장 길이가 아닌 단락 너비에 영향을줍니다. 그리고 200px는 문자 측면에서 무엇이든 될 수 있습니다 (심지어 i가 많거나 W가 많은지 여부와 글꼴 및 크기에 따라 다름).
Jukka K. Korpela

당신 말이 맞아요 Paulie_D의 답변이 귀하의 솔루션에 맞는 것 같습니다
Vangel Tzo

@VangelTzo 이것은 한 줄에만 해당됩니다. 여러 줄에 대해이 작업을 수행 할 수 있습니까? 감사합니다
Biswas

108

의 CSS '길이 값'이 ch있습니다.

MDN에서

이 단위는 요소 글꼴에서 글리프 '0'(0, 유니 코드 문자 U + 0030)의 너비 또는보다 정확하게 사전 측정을 나타냅니다.

이것은 당신이 무엇을하고 있는지 대략적인 것일 수 있습니다.

p {
  overflow: hidden;
  max-width: 75ch;
}
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt rem odit quis quaerat. In dolorem praesentium velit ea esse consequuntur cum fugit sequi voluptas ut possimus voluptatibus deserunt nisi eveniet!Lorem ipsum dolor sit amet, consectetur
  adipisicing elit. Dolorem voluptates vel dolorum autem ex repudiandae iste quasi. Minima explicabo qui necessitatibus porro nihil aliquid deleniti ullam repudiandae dolores corrupti eaque.</p>


2
이것은 모든 브라우저에서 구현 되었습니까? 나를 위해 전혀 작동하지 않는 것 같습니다. 편집 : 아직 초안 dev.w3.org/csswg/css-values/#lengths을
순무

나는 당신의 대답과 함께 갈 것이라고 생각합니다. 최대 너비를 설정하면 이것이 같을 것이라고 생각합니다 : 30em; 그것은 나를 위해 충분히 가깝습니다. 감사!
Sharif1111

MDN의 호환성 테이블에 대해 잘 모르겠지만 chChrome 50, IE11 또는 FF45 에서이 ( 단위)가 예상대로 작동하지 않는 것 같습니다!
MrWhite

예, @ w3dk와 동일한 결과가 나타납니다. 난 그냥 설정 height하고 overflow:hidden. 줄임표가 마음에 들었지만을 설정하면 효과가 white-space:no-wrap있습니다. 필자의 경우 텍스트는 줄 바꿈 할 수 있으며 컨테이너 내의 특정 문자 제한을 초과하지 않아야합니다.
Chris22

1
왜 이것이 불완전하고 제공된 코드로 작동하지 않기 때문에 왜 그렇게 많은 투표를했는지 확실하지 않습니다. 추가해야합니다white-space: nowrap;
Kevin M

48

최대 너비로 설정 한 후 문자를 자르려면 이것을 시도하십시오. 이 경우 75ch를 사용했습니다.

p {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 75ch;
}
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis etc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis etc.</p>

여러 줄 잘림의 경우 링크를 따르십시오.

예 : https://codepen.io/srekoble/pen/EgmyxV

이를 위해 웹킷 CSS를 사용할 것입니다. 간단히 말해서 WebKit은 Safari / Chrome 용 HTML / CSS 웹 브라우저 렌더링 엔진입니다. HTML / CSS 웹 페이지를 그리기 위해 모든 브라우저가 렌더링 엔진에 의해 지원되기 때문에 이는 더 구체적 일 수 있습니다.


1
텍스트는 지금 당신이 93 개 문자 이후의 텍스트를 절단하고, 고정 폭해야합니다 codepen.io/anon/pen/bRELeb
파브리 지오 Calderan

여기에 가장 좋은 답변입니다. 특히 여러 줄 잘림을 언급하기 때문에;) 그런데 여러 줄 옵션을 사용하는 max-width:100%;경우 래퍼 div 에도 사용할 수 있습니다 . 따라서 반응이 잘립니다.
xarlymg89

20

예제 코드 :

.limited-text{
    white-space: nowrap;
    width: 400px;
    overflow: hidden;
    text-overflow: ellipsis;
}
<p class="limited-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>

    



4

CSS로는 불가능합니다. 자바 스크립트를 사용해야합니다. p의 너비를 최대 30 자로 설정할 수 있지만 다음 문자는 자동으로 내려가지만 다시 정확하지 않으며 문자가 대문자 인 경우 달라질 수 있습니다.


1
@VangelTzo의 답변을 확인하는 것이 좋습니다
Benjamin

당신은 완벽하게 Jean-Luc에게, @VangelTzo는 해결 방법이지만, 어떤 cout 제어도 제공하지 않습니다.
기 illa Fe

이것은 정답입니다-CSS에서 문자 수로 조정할 수는 없습니다. JS를 사용해야합니다.
serraosays

3

HTML

<div id="dash">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis et dui. Nunc porttitor accumsan orci id luctus. Phasellus ipsum metus, tincidunt non rhoncus id, dictum a lectus. Nam sed ipsum a urna ac
quam.</p>
</div>

jQuery

var p = $('#dash p');
var ks = $('#dash').height();
while ($(p).outerHeight() > ks) {
  $(p).text(function(index, text) {
    return text.replace(/\W*\s(\S)*$/, '...');
  });
}

CSS

#dash {
  width: 400px;
  height: 60px;
  overflow: hidden;
}

#dash p {
  padding: 10px;
  margin: 0;
}

결과

Lorem ipsum의 dolor는 amet, conditetur adipiscing elit에 앉아 있습니다. Proin nisi ligula, dapibus a volutpat sit amet, mattis 등 ...

JS 피들


2
안녕하세요, SO에 오신 것을 환영합니다! 본문에 코드를 추가하여 답변을 편집했습니다. 나중에 참조 할 수 있도록 jsfiddle에 대한 링크를 제공하는 것 외에도 답변에 코드를 포함하십시오!
hatef

이것은 너비뿐만 아니라 높이도 다루기 때문에 가장 좋은 대답입니다. 잘 했어!
Grasper

1
이 질문은 CSS 솔루션을 요구합니다.
dryleaf

1

여러 줄 문자를 자르는 순수한 CSS 솔루션

나는 비슷한 문제가 있었고 Hackingui.com 에서이 우수한 CSS 전용 솔루션을 발견했습니다 . 정보는 기사를 읽을 수 있지만 아래는 기본 코드입니다.

나는 그것을 테스트했고 완벽하게 작동합니다. JS 또는 서버 측 옵션을 선택하기 전에 누군가 유용하다고 생각합니다.

  /* styles for '...' */ 
.block-with-text {
  /* hide text if it more than N lines  */
  overflow: hidden;
  /* for set '...' in absolute position */
  position: relative; 
  /* use this value to count block height */
  line-height: 1.2em;
  /* max-height = line-height (1.2) * lines max number (3) */
  max-height: 3.6em; 
  /* fix problem when last visible word doesn't adjoin right side  */
  text-align: justify;  
  /* place for '...' */
  margin-right: -1em;
  padding-right: 1em;
}

/* create the ... */
.block-with-text:before {
  /* points in the end */
  content: '...';
  /* absolute position */
  position: absolute;
  /* set position to right bottom corner of block */
  right: 0;
  bottom: 0;
}

/* hide ... if we have text, which is less than or equal to max lines */
.block-with-text:after {
  /* points in the end */
  content: '';
  /* absolute position */
  position: absolute;
  /* set position to right bottom corner of text */
  right: 0;
  /* set width and height */
  width: 1em;
  height: 1em;
  margin-top: 0.2em;
  /* bg color = bg color under block */
  background: white;
}

1

현대 CSS 그리드 답변

CodePen 에서 완전한 작동 코드를 보십시오 . 다음과 같은 HTML이 주어진다 :

<div class="container">
    <p>Several paragraphs of text...</p>
</div>

CSS Grid를 사용하여 3 개의 열을 만들고 컨테이너에 단락이 포함 된 가운데 열의 최대 너비를 70 자로 지정할 수 있습니다.

.container
{
  display: grid;
  grid-template-columns: 1fr, 70ch 1fr;
}

p {
  grid-column: 2 / 3;
}

이것은 다음과 같습니다 ( 완전히 작동하는 예제는 Checkout CodePen ).

여기에 이미지 설명을 입력하십시오

다음은 minmax를 사용하여 값 범위를 설정할 수있는 또 다른 예입니다. 작은 화면에서는 너비가 50 자로 설정되고 큰 화면에서는 너비가 70 자로 설정됩니다.

.container
{
  display: grid;
  grid-template-columns: 1fr minmax(50ch, 70ch) 1fr;
}

p {
  grid-column: 2 / 3;
}

1
ch열에 사용할 수 있다는 것을 몰랐습니다 . 아름다운.

또한, 주제를 고려할 때 펜 ID가입니다 rrdOvr. )

1

이 게시물은 CSS 솔루션에 대한 것이지만 게시물은 꽤 오래되었으므로 다른 사람들 이이 문제를 발견하고 Angular 4 +와 같은 최신 JS 프레임 워크를 사용하는 경우 Angular Pipes를 통해이 작업을 수행하지 않고도 간단한 방법이 있습니다. CSS로 혼란스러워합니다.

이 작업을 수행하는 "React"또는 "Vue"방법이있을 수 있습니다. 이것은 프레임 워크 내에서 어떻게 수행 될 수 있는지를 보여주기위한 것입니다.

truncate-text.pipe.ts

/**
 * Helper to truncate text using JS in view only.
 *
 * This is pretty difficult to do reliably with CSS, especially when there are
 * multiple lines.
 *
 * Example: {{ value | truncateText:maxLength }} or {{ value | truncateText:45 }}
 *
 * If maxLength is not provided, the value will be returned without any truncating. If the
 * text is shorter than the maxLength, the text will be returned untouched. If the text is greater
 * than the maxLength, the text will be returned with 3 characters less than the max length plus
 * some ellipsis at the end to indicate truncation.
 *
 * For example: some really long text I won't bother writing it all ha...
 */
@Pipe({ name: 'truncateText' })
export class TruncateTextPipe implements PipeTransform {
  transform(value: string, ...args: any[]): any {
    const maxLength = args[0]
    const maxLengthNotProvided = !maxLength
    const isShorterThanMaximumLength = value.length < maxLength
    if (maxLengthNotProvided || isShorterThanMaximumLength) {
      return value
    }
    const shortenedString = value.substr(0, maxLength - 3)
    return `${shortenedString}...`
  }
}

app.component.html

<h1>{{ application.name | truncateText:45 }}</h1>

0

두 가지 방법으로 내 솔루션을 사용해보십시오.

<div class="wrapper">
      <p class="demo-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>
</div>

<div class="wrapper">
  <p class="demo-2">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>
</div>

.wrapper {
  padding: 20px;
  background: #eaeaea;
  max-width: 400px;
  margin: 50px auto;
}

.demo-1 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
}

.demo-2 {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  max-width: 150px;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.