ユーザーがテキストボックスフィールドに入力したものに設定された div に動的テキストが含まれています。テキストが div に収まらない場合、現時点では端で切り取られ、境界を越えて伸びるすべてのテキストは表示されません。ボックス内に収まるようにテキストを切り詰め、最後に省略記号 (...) を追加したいと思います。例えば:
|----div width------|
Here is some sample text that is too long.
Here is some sam...
コードタグは固定幅フォントを使用しているため、例では明らかに簡単で、文字を数えるのと同じくらい簡単です。私は可変幅のフォントを持っているので、「WWWWWWWWWWWW」と入力すると、「.......」よりもはるかに少ない文字数で埋められます。
これを行う最善の方法は何ですか?ここで、テキストの実際のピクセル幅を簡単に見つけるための潜在的な解決策を見つけました: http://www.codingforums.com/archive/index.php/t-100367.html
しかし、そのような方法でも、省略記号を実装するのは少し厄介です。したがって、20 文字で収まらないことがわかった場合は、19 に切り詰めて省略記号を追加し、再度収まるかどうかを確認する必要があります。次に、18 (と省略記号) に切り捨てて、もう一度やり直してください。そしてまた。そしてまた…収まるまで。より良い方法はありますか?
編集: 答えに基づいて、元のアプローチが最適であると判断しましたが、測定のためだけに別の td 要素を作成しないことで上記のリンクのソリューションを改善しようとしましたが、これはハックのように感じます。
これが私のコードです:
<div id="tab" class="tab">
<div id="tabTitle" class="tabTitle">
<div class="line1">user-supplied text will be put here</div>
<div class="line2">more user-supplied text will be put here</div>
</div>
</div>
そしてスタイル:
.tab {
padding: 10px 5px 0px 10px;
margin-right: 1px;
float: left;
width: 136px;
height: 49px;
background-image: url(../images/example.gif);
background-position: left top;
background-repeat: no-repeat;
}
.tab .tabTitle {
height: 30px;
width: 122px;
overflow: hidden;
text-overflow: ellipsis;
font-size: 12px;
font-weight: bold;
color: #8B8B8B;
}
.tab .tabTitle .line1, .tab .tabTitle .line2 {
display:inline;
width:auto;
}
および省略記号をトリミングして追加する JavaScript:
function addOverflowEllipsis( containerElement, maxWidth )
{
var contents = containerElement.innerHTML;
var pixelWidth = containerElement.offsetWidth;
if(pixelWidth > maxWidth)
{
contents = contents + "…"; // ellipsis character, not "..." but "…"
}
while(pixelWidth > maxWidth)
{
contents = contents.substring(0,(contents.length - 2)) + "…";
containerElement.innerHTML = contents;
pixelWidth = containerElement.offsetWidth;
}
}
「line1」と「line2」の div が関数に渡されます。「WWWWWWWWWWWWWWWWWW」のような単一の単語入力の場合は機能しますが、複数単語の入力「WWWWWW wwwWWW wwwWWW」では機能しません。改行を追加し、テキストを「WWWWWW」の幅として測定するだけだからです。
テキストを非表示の測定要素にコピーせずにこれを修正する方法はありますか? テキストを折り返さないようにライン div のスタイルを設定する方法はありますか?