"..."
サイズ変更可能な要素内のテキストの途中に省略記号 ( ) を実装する必要があります。これがどのように見えるかです。そう、
"Lorem ipsum dolor sit amet. Ut ornare dignissim ligula sed commodo."
になる
"Lorem ipsum dolor sit amet ... commodo."
要素がテキストの幅に引き伸ばされると、省略記号が消えます。これはどのように行うことができますか?
"..."
サイズ変更可能な要素内のテキストの途中に省略記号 ( ) を実装する必要があります。これがどのように見えるかです。そう、
"Lorem ipsum dolor sit amet. Ut ornare dignissim ligula sed commodo."
になる
"Lorem ipsum dolor sit amet ... commodo."
要素がテキストの幅に引き伸ばされると、省略記号が消えます。これはどのように行うことができますか?
この問題を解決する私の例を提案したいと思います。
主なアイデアは、テキストを 2 つの偶数部分 (または、長さが奇数の場合は最初の部分が大きい) に分割し、そのうちの 1 つは最後に省略記号を持ち、もう 1 つは右に揃えて配置することtext-overflow: clip
です。
自動/ユニバーサルにしたい場合は、jsで行う必要があるのは、文字列を分割して属性を設定することだけです。
ただし、いくつかの欠点があります。
text-overflow: ''
現時点では FF でのみ機能します)direction: rtl
感嘆符は文字列の左側に移動されるため、文字列の末尾には感嘆符を付けないでください。::after
単語の右側をタグに入れ、感嘆符を疑似要素に入れることでこれを修正できると思います。しかし、私はまだそれを適切に機能させていません。しかし、これらすべてを使用すると、特にブラウザーの境界線をドラッグするときに、非常にクールに見えます。これは、jsfiddle ページで簡単に実行できます: https://jsfiddle.net/extempl/93ymy3oL/。または、以下の max-width を固定してスニペットを実行するだけです。
スポイラーの下のGif:
body {
max-width: 400px;
}
span::before, span::after {
display: inline-block;
max-width: 50%;
overflow: hidden;
white-space: pre;
}
span::before {
content: attr(data-content-start);
text-overflow: ellipsis;
}
span::after {
content: attr(data-content-end);
text-overflow: '';
direction: rtl;
}
<span data-content-start="Look deep into nature, and then you "
data-content-end= "will understand everything better"></span>
<br>
<span data-content-start="https://www.google.com.ua/images/branding/g"
data-content-end= "ooglelogo/2x/googlelogo_color_272x92dp.png"></span>
そこで、私の同僚は余分な dom 要素を使用しない解決策を考え出しました。div がオーバーフローしているかどうかを確認し、最後の n 文字のデータ属性を追加します。残りはcssで行います。
ここにいくつかの HTML があります:
<div class="box">
<div class="ellipsis" data-tail="some">This is my text it is awesome</div>
</div>
<div class="box">
<div class="ellipsis">This is my text</div>
</div>
そしてCSS:
.box {
width: 200px;
}
.ellipsis:before {
float: right;
content: attr(data-tail);
}
.ellipsis {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
これは必須の jsfiddle です: http://jsfiddle.net/r96vB/1/
次の Javascript 関数は、OS X のように中間の切り捨てを行います。
function smartTrim(string, maxLength) {
if (!string) return string;
if (maxLength < 1) return string;
if (string.length <= maxLength) return string;
if (maxLength == 1) return string.substring(0,1) + '...';
var midpoint = Math.ceil(string.length / 2);
var toremove = string.length - maxLength;
var lstrip = Math.ceil(toremove/2);
var rstrip = toremove - lstrip;
return string.substring(0, midpoint-lstrip) + '...'
+ string.substring(midpoint+rstrip);
}
途中の文字を省略記号に置き換えます。私のユニットテストは次のことを示しています:
var s = '1234567890';
assertEquals(smartTrim(s, -1), '1234567890');
assertEquals(smartTrim(s, 0), '1234567890');
assertEquals(smartTrim(s, 1), '1...');
assertEquals(smartTrim(s, 2), '1...0');
assertEquals(smartTrim(s, 3), '1...90');
assertEquals(smartTrim(s, 4), '12...90');
assertEquals(smartTrim(s, 5), '12...890');
assertEquals(smartTrim(s, 6), '123...890');
assertEquals(smartTrim(s, 7), '123...7890');
assertEquals(smartTrim(s, 8), '1234...7890');
assertEquals(smartTrim(s, 9), '1234...67890');
assertEquals(smartTrim(s, 10), '1234567890');
assertEquals(smartTrim(s, 11), '1234567890');
これはゲームの後半かもしれませんが、私はこれに対する解決策を探していました.同僚が非常にエレガントな解決策を提案したので、それを共有します. いくつかの JS が必要ですが、それほど多くはありません。
div
ラベルを入れるのに必要なサイズがあると想像してください:
<div style="width: 200px; overflow: hidden"></div>
div
これで、ラベル付きの文字列と、それが収まるDOM 要素 ( this ) の 2 つのパラメーターを取る関数ができました。
function setEllipsisLabel(div, label)
最初に行うことはspan
、このラベルで を作成し、それを に配置することdiv
です:
var span = document.createElement('span');
span.appendChild(document.createTextNode(label));
span.style.textOverflow = 'ellipsis';
span.style.display = 'inline-block';
div.appendChild(span);
プロパティを「省略記号」に設定text-overflow
して、テキストが切り捨てられると、これを示すために最後に素敵な「...」が追加されるようにします。display
また、これらの要素が後で操作できる実際のピクセル寸法を持つように、「インライン ブロック」に設定します。これまでのところ、純粋な CSS でできなかったことは何もありません。
しかし、省略記号を真ん中に置きたいのです。まず、それが必要かどうかを確認する必要があります...これは、と比較することで実行できますdiv.clientWidth
-省略記号は、が よりも広いspan.clientWidth
場合にのみ必要です。span
div
省略記号が必要な場合は、単語の最後に固定数の文字を表示することから始めましょう。たとえば 10 文字です。したがって、ラベルの最後の 10 文字のみを含むスパンを作成し、それを分割:
var endSpan = document.createElement('span');
endSpan.style.display = 'inline-block';
endspan.appendChild(document.createTextNode(label.substring(label.length - 10)));
div.appendChild(endSpan);
次に、元の幅をオーバーライドしてspan
、新しい幅に合わせましょう。
span.style.width = (div.clientWidth - endSpan.clientWidth) + 'px';
この結果、次のような DOM 構造ができました。
<div style="width: 200px; overflow: hidden">
<span style="display: inline-block; text-overflow: ellipsis; width: 100px">
A really long label is shown in this span
</span>
<span style="display: inline-block"> this span</span>
</div>
最初のスパンは「省略記号」に設定されているためspan
、text-overflow
最後に「...」が表示され、その後に 2 番目のスパンの 10 文字が続き、省略記号はdiv
.
endSpan の 10 文字の長さをハードコーディングする必要もありません。これは、span
の初期幅と の比率を計算div
し、ラベルの長さから適切な比率を引き、2 で割ることによって概算できます。
フレックス ボックスについていくつか調査した結果、この純粋な CSS ソリューションを見つけました。これはかなりクールだと思います。
<div style="width:100%;border:1px solid green;display:inline-flex;flex-wrap:nowrap;">
<div style="flex: 0 1 content;text-overflow: ellipsis;overflow:hidden;white-space:nowrap;"> Her comes very very very very very very very very very very very very very very very very very very very long </div>
<div style="flex: 1 0 content;white-space:nowrap;"> but flexible line</div>
</div>
別の刺し傷:
function truncate( str, max, sep ) {
max = max || 10;
var len = str.length;
if(len > max){
sep = sep || "...";
var seplen = sep.length;
if(seplen > max) { return str.substr(len - max) }
var n = -0.5 * (max - len - seplen);
var center = len/2;
return str.substr(0, center - n) + sep + str.substr(len - center + n);
}
return str;
}
console.log( truncate("123456789abcde") ); // 123...bcde (using built-in defaults)
console.log( truncate("123456789abcde", 8) ); // 12...cde (max of 8 characters)
console.log( truncate("123456789abcde", 12, "_") ); // 12345_9abcde (customize the separator)
middle、nearEnd、および End でトリミングできる関数を作成しましたが、サーバー側で最終的に必要になったため、まだテストされていません
//position acceptable values : middle, end, closeEnd
function AddElipsis(input, maxChars, position) {
if (typeof input === 'undefined') {
return "";
}
else if (input.length <= maxChars) {
return input;
}
else {
if (position == 'middle') {
var midPos = Math.floor(maxChars / 2) - 2;
return input.substr(0, midPos) + '...' + input.substr(input.length - midPos, input.length);
}
else if (position == 'closeEnd') {
var firstPart = Math.floor(maxChars * 0.80) - 2;
var endPart = Math.floor(maxChars * 0.20) - 2;
return input.substr(0, firstPart) + '...' + input.substr(input.length - endPart, input.length);
}
else {
return input.substr(0, maxChars - 3) + '...';
}
}
}
これにより、省略記号とプレースホルダー テキストの位置をより細かく制御できます。
function ellipsis(str, maxLength, ellipsisLocationPercentage,placeholder) {
/*
ARGUMENTS:
str - the string you want to maninpulate
maxLength - max number of characters allowed in return string
ellipsisLocationPercentage (optional) - How far (percentage wise) into the return string you want the ellipses to be placed
Examples:
.85 : This is a very long string. This is a very long string. This is a very long string. This is a ver[...]very long string.
.25 : This is a very long string. [...]g. This is a very long string. This is a very long string. This is a very long string.
placeholder (optional) - this will be used to replace the removed substring. Suggestions : '...', '[..]', '[ ... ]', etc....
*/
if(ellipsisLocationPercentage == null || isNaN(ellipsisLocationPercentage) || ellipsisLocationPercentage >= 1 || ellipsisLocationPercentage <= 0){
//we've got null or bad data.. default to something fun, like 85% (that's fun, right??)
ellipsisLocationPercentage = .85;
}
if(placeholder == null || placeholder ==""){
placeholder = "[...]";
}
if (str.length > (maxLength-placeholder.length)) {
//get the end of the string
var beginning = str.substr(0, (maxLength - placeholder.length)*ellipsisLocationPercentage );
var end = str.substr(str.length-(maxLength - placeholder.length) * (1-ellipsisLocationPercentage));
return beginning + placeholder + end;
}
return str;
}
この関数は、次のように呼び出すことで呼び出すことができます。
ellipsis("This is a very long string. Be Scared!!!!", 8);//uses default values
ellipsis("This is a very long string. Be Scared!!!!", 8,.5);//puts ellipsis at half way point
ellipsis("This is a very long string. Be Scared!!!!", 8,.75,'<..>');//puts ellipsis at 75% of the way into the string and uses '<..>' as the placeholder