Mengatur panjang karakter maks dalam CSS

182

Saya membuat situs web responsif untuk sekolah dan pertanyaan saya adalah:

Bagaimana cara menetapkan panjang karakter maksimum kalimat (dengan CSS) di situs web saya (seperti 75 karakter) bahwa ketika saya memiliki layar yang sangat besar, kalimat tidak akan melangkah lebih jauh dari 75 karakter.

Saya telah mencoba lebar maks tetapi itu mengacaukan tata letak saya. Saya menggunakan permintaan flexbox dan media untuk membuatnya responsif.

Sharif1111
sumber
1
Jika Anda menggunakan textareaatau inputada properti max panjang ( maxlength="50"ini dalam HTML) untuk mereka atau Anda harus menggunakan Javascript. Saya juga kira saya salah membaca ini, menetapkan lebar akan memaksa kalimat untuk turun ke baris berikutnya ketika hits akhir. Ini adalah perilaku default.
Ruddy
2
Lihatlah ini: stackoverflow.com/questions/20552957/… - ini adalah CSS ellipsis, ini mungkin membantu Anda
Darren Sweeney
Meskipun Anda tidak dapat menggunakan CSS sendirian untuk melakukan ini, Anda dapat membatasi jumlah karakter yang ditampilkan menggunakan CSS seperti yang disarankan Darren. Anda perlu mengatur wadah teks ke white-space: no-wrap, text-overflow: ellipsis, dan overflow: hidden. Kemudian cukup atur ukuran untuk wadah Anda.
Patrick Lyver
1
Apa yang Anda maksud dengan menetapkan batas seperti itu? Apa yang harus terjadi ketika terlampaui? Apa yang Anda maksud dengan “kalimat”? Ini bukan konsep CSS. Bagaimana Anda bermaksud mengenali atau menandai kalimat? Atau maksud Anda sebenarnya panjang garis ? Jika ya, apa masalah Anda dengannya? Biasanya teks membungkus secara otomatis kecuali jika Anda melakukan hal-hal khusus untuk mencegahnya.
Jukka K. Korpela

Jawaban:

254

Anda selalu dapat menggunakan metode terpotong dengan mengatur max-widthdan melimpah ellipsisseperti ini

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

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

Untuk pemotongan multi-line lihatlah flexsolusinya. Contoh dengan pemotongan pada 3 baris.

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

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

Vangel Tzo
sumber
1
Terima kasih, saya mengerti penggunaan elipsis tetapi saya tidak melihat bagaimana ini menyelesaikan masalah saya. Saya pikir elipsis tepat untuk ketika layar menjadi lebih kecil tetapi ketika itu semakin besar saya ingin memotongnya 75 karakter. jadi seperti yang dikatakan Jean-luc, hanya mungkin dengan javascript? maaf saya baru coding
Sharif1111
Anda dapat melihat ruang apa yang muncul 75 karakter sesuai dengan tipografi Anda dan menetapkan lebar maksimum sesuai dengan itu. Sayangnya Anda tidak dapat mengatur properti CSS untuk memotong kalimat berdasarkan karakter. Atau Anda dapat menggunakan metode pemotongan truncate dengan manfaat bahwa Anda dapat menentukan metode truncate sesuai dengan baris.
Vangel Tzo
1
Ini mempengaruhi lebar paragraf, bukan panjang kalimat. Dan 200px dapat berupa apa saja dalam hal karakter (bahkan tergantung pada apakah Anda memiliki banyak i atau banyak W, dan pada ukuran dan wajah font).
Jukka K. Korpela
Anda benar tentang itu. Periksa jawaban Paulie_D tampaknya menjadi solusi yang tepat untuk Anda
Vangel Tzo
@VangelTzo Ini hanya untuk satu baris. Bisakah ini dilakukan untuk beberapa baris? Terima kasih
Biswas
108

Ada 'nilai panjang' CSS dari ch.

Dari MDN

Unit ini mewakili lebar, atau lebih tepatnya ukuran gerak maju, dari mesin terbang '0' (nol, karakter Unicode U + 0030) dalam font elemen.

Ini mungkin mendekati apa yang Anda cari.

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>

Paulie_D
sumber
2
Apakah ini sudah diterapkan oleh browser apa pun? Sepertinya tidak bekerja sama sekali untuk saya. Sunting: Still draft dev.w3.org/csswg/css-values/#lengths
Turnip
Saya pikir saya akan pergi dengan jawaban Anda, saya pikir ini akan sama jika saya menetapkan max-width: 30em; Cukup dekat untukku. Terima kasih!
Sharif1111
Tidak yakin tentang tabel kompatibilitas di MDN ... tapi ini ( chunit) tampaknya tidak berfungsi (seperti yang diharapkan) bagi saya di Chrome 50, IE11 atau FF45 ?!
MrWhite
Ya, saya memiliki hasil yang sama dengan @ w3dk. Saya hanya mengatur a heightdan overflow:hidden. Saya memang suka elipsis, tetapi saya hanya bisa membuatnya bekerja jika saya atur white-space:no-wrap. Dalam kasus saya, teks dapat dibungkus, hanya saja tidak melebihi batas karakter tertentu di dalam wadahnya.
Chris22
1
Tidak yakin mengapa ini memiliki begitu banyak suara karena jelas tidak lengkap dan tidak bekerja dengan kode yang disediakan. Anda perlu menambahkanwhite-space: nowrap;
Kevin M
48

Coba ini untuk memotong karakter setelah mengaturnya ke lebar maksimal. Saya telah menggunakan 75ch dalam hal ini

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>

Untuk pemotongan multiline, silakan ikuti tautan.

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

Kami akan menggunakan css webkit untuk ini. Singkatnya WebKit adalah mesin rendering browser web HTML / CSS untuk Safari / Chrome. Ini mungkin spesifik browser karena setiap browser didukung oleh mesin rendering untuk menggambar halaman web HTML / CSS.

VK Singh
sumber
1
teksnya juga harus monospace, sekarang Anda memotong teks setelah 93 karakter: codepen.io/anon/pen/bRELeb
Fabrizio Calderan
Jawaban terbaik di sini. Khususnya karena Anda bahkan menyebutkan pemotongan multiline;) Ngomong-ngomong, jika memilih opsi multiline, Anda dapat menggunakan juga max-width:100%;untuk div pembungkus. Jadi, Anda memiliki pemotongan yang responsif.
xarlymg89
20

contoh kode:

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

    

Hossein Jafari
sumber
4

Itu tidak mungkin dengan CSS, Anda harus menggunakan Javascript untuk itu. Meskipun Anda dapat mengatur lebar p hingga 30 karakter dan huruf berikutnya akan turun secara otomatis, tetapi sekali lagi ini tidak akan seakurat itu dan akan bervariasi jika karakter menggunakan huruf kapital.

Jean-Luc
sumber
1
lebih baik Anda perlu memeriksa dengan jawaban @ VangelTzo
Benjamin
Anda benar sekali Jean-Luc, @VangelTzo adalah solusi tetapi tidak memberikan kontrol cout sama sekali.
Guillaume Fe
Ini adalah jawaban yang tepat - Anda tidak dapat mengubah menurut jumlah karakter dalam CSS. Anda harus menggunakan 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;
}

HASIL

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Setelah itu, ligula, dapibus dan duduk di atasnya, mattis d ...

Jsfiddle

imtaher
sumber
2
Hai, selamat datang di SO! Saya mengedit jawaban Anda dengan menambahkan kode ke badan. Untuk referensi di masa mendatang, harap sertakan kode Anda dalam jawaban di samping memberikan tautan ke jsfiddle!
hatef
ini adalah jawaban terbaik karena ini juga membahas tinggi dan bukan hanya lebar. Kerja bagus!
Grasper
1
Pertanyaannya meminta solusi css.
dryleaf
1

Solusi CSS murni untuk memotong karakter multi-baris

Saya memiliki masalah yang sama dan menemukan solusi css hanya luar biasa ini dari Hackingui.com . Anda dapat membaca artikel untuk informasi tetapi di bawah ini adalah kode utamanya.

Saya mengujinya dan bekerja dengan sempurna. Semoga seseorang menemukan itu berguna sebelum memilih opsi sisi JS atau server

  /* 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;
}
Benny Thadikaran
sumber
1

Jawaban Kotak CSS Modern

Lihat kode yang berfungsi penuh pada CodePen . Diberikan HTML berikut:

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

Anda dapat menggunakan CSS Grid untuk membuat tiga kolom dan memberi tahu wadah untuk mengambil lebar maksimum 70 karakter untuk kolom tengah yang berisi paragraf kami.

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

p {
  grid-column: 2 / 3;
}

Ini seperti apa (Checkout CodePen untuk contoh yang berfungsi penuh):

masukkan deskripsi gambar di sini

Berikut adalah contoh lain di mana Anda bisa menggunakan minmax untuk menetapkan rentang nilai. Pada layar kecil lebarnya akan diatur menjadi 50 karakter dan pada layar besar lebarnya 70 karakter.

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

p {
  grid-column: 2 / 3;
}
Muhammad Rehan Saeed
sumber
1
Tidak sadar Anda bisa menggunakan chkolom. Menyenangkan.
Will
Juga, mengingat pokok bahasan, cukup manis bahwa ID pena Anda rrdOvr. ;)
Will
1

Posting ini adalah untuk solusi CSS, tetapi pos tersebut sudah cukup lama, jadi kalau-kalau orang lain tersandung dan menggunakan kerangka JS modern seperti Angular 4+, ada cara sederhana untuk melakukan ini melalui Pipa Angular tanpa harus main-main dengan CSS.

Mungkin ada cara "Bereaksi" atau "Vue" untuk melakukan ini juga. Ini hanya untuk menunjukkan bagaimana hal itu dapat dilakukan dalam suatu kerangka kerja.

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>
Sejuk
sumber
0

Coba solusi saya dengan 2 cara berbeda.

<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;
}
Super Model
sumber