レむアりトカスタムコンテンツを衚瀺する

この蚘事のナヌザヌコンテンツずは、ナヌザヌが䜜成したペヌゞ䞊のテキストを意味したす。 ほずんどの堎合、これらはコメントであり、ナヌザヌはマむクロブログに「壁に」投皿し、プロファむルに「自分に関する」情報などがありたす。 タスクは非垞に難しいずいうこずではありたせんが、泚意力ずレむアりトの十分な理解が必芁です。 この蚘事では、カスタムテキストなど、レむアりトに぀いお知っおおく必芁がある最も重芁なこずをたずめようずしたす。



カスタムコンテンツは通垞のコンテンツずは異なり、予枬䞍可胜です。 ナヌザヌは次のこずができたす。


これらすべおを考慮しお、ペヌゞに正しく衚瀺する必芁がありたす。 私たちにずっお、これは、ナニバヌサルWebコントロヌルのセットを含むLight Client 8のレむアりトデザむナヌで䜜業するプロセスに特に関連するこずが刀明したした。 カヌドのプレれンテヌションはそれぞれこれらのコントロヌルで構成されおいたす。これらのコントロヌルはほが完党にナヌザヌコンテンツで満たされ、どのようなコンテキストでも、どのような組み合わせでも正しく衚瀺される必芁がありたす。

たず、ペヌゞのどこかにカスタムテキストがある堎合は、長すぎる堎合を予枬する必芁があるず蚀わなければなりたせん。 ここでは、原則ずしお、すべおが2぀の方法のいずれかで解決されたす。

1.省略蚘号で䜙分なテキストを切り取り、
2.新しい行で折り返したす倚くの堎合、元のテキストの曞匏蚭定スペヌスず改行を保持するこずが望たしいです。

どちらの堎合も独自のニュアンスがありたすが、䞻な問題はそこにあり、カスタムテキストを含むブロックの幅には正しい制限がありたす。 私たちの蚈画は次のずおりです。最初に、省略蚘号を機胜させる方法ず耇数行コンテンツを正しく衚瀺する方法を芋぀け、次にブロック幅制限の問題の原因ずそれらを効果的に解決する方法を確認したす。

単䞀行テキスト



省略蚘号を機胜させるのは簡単で、1぀2぀3぀です。

1.ブロックの幅を制限したすこの蚘事の埌半を参照。
2.このブロックのルヌルを蚭定したすそのためだけに
overflow: hidden; text-overflow: ellipsis; white-space: nowrap; // direction: rtl; ? 

3.ブロック内のテキストを含む芁玠テキストがネストされた芁玠にある堎合、およびそのブロックたでのすべおの芪はdisplayinlineを持たなければなりたせん。 テキストに加えお、ブロック内に他の非むンラむン芁玠が存圚する可胜性がありたす。テキスト自䜓ずその芪がむンラむンであるこずのみが重芁です。

省略蚘号が機胜しない堎合、デバッグアルゎリズムは簡単です。

1. DevToolsでは、テキストの幅ず、すべおの芪の幅を順番に確認したす。
2.幅を制限する必芁のある芁玠を芋぀け、「広がり」がある堎合は、匷制的にフレヌムに戻りたす。
3.䞊蚘のすべおのCSSプロパティが蚭定されおいるこずを確認したす。
4.ブロックからテキストたでのすべおの芁玠にdisplayinlineがあるこずを確認したす。

党䞖界向けのグロヌバルサヌビスを䜿甚しおいる堎合、アラビア語やテキストの反察方向のその他の蚀語では、右偎に省略蚘号「ドット」を衚瀺する必芁がありたす。


これを行うには、方向をプログラムで決定し、cssのdirectionプロパティの察応する倀、たたはHTML属性dirの倀を蚭定する必芁がありたす。 たずえば、twitter RTLtextareaラむブラリでは、テキストの方向は次のように定矩されたす。

 //  . https://github.com/twitter/RTLtextarea/blob/master/src/RTLText.module.js function getDirection(plainText) { var rtlChar = /[\u0590-\u083F]|[\u08A0-\u08FF]|[\uFB1D-\uFDFF]|[\uFE70-\uFEFF]/mg; return plainText.match(rtlChar) ? "rtl" : "ltr"; } 

テキストの方向を指定するロゞックは、AngularJSを䜿甚する堎合はディレクティブに、ReactJSの堎合はステヌトレスコンポヌネントに入れるず䟿利です。

もちろん、省略蚘号を䜿甚しおテキストをトリミングする堎合は、芁玠の完党なコンテンツを含むツヌルチップを远加するこずを忘れないこずが重芁です。


たたは、他の方法でテキスト党䜓を芋る機䌚をナヌザヌに䞎えたす。

耇数行テキスト



改行オプションの䞻な問題は、長い単語ずフォヌマットの保存です。 この蚘事の資料を準備しお、ナヌザヌ生成コンテンツに焊点を圓おた高床なサむトでどのように解決されるかを確認するこずにしたした。 これには、facebook、twitter、vk、linkedin、livejournal、classmates、g +、youtube、Yandex market、instagram、hyper commenting system、disqus、激しい議論、cackle、livefyre、そしおもちろんhabrが含たれたす。
資源長い蚀葉改行スペヌス
habrコメントオヌバヌフロヌ非衚瀺前凊理倱われた
Facebook投皿ずコメントワヌドラップブレヌクワヌド前凊理倱われた
twitterツむヌトワヌドラップブレヌクワヌド空癜事前ラップ空癜事前ラップ
vk投皿ずコメントワヌドラップブレヌクワヌド前凊理倱われた
linkedin投皿ずコメントワヌドラップブレヌクワヌド空癜プレラむン倱われた
livejournal投皿前凊理<wbr>htmlhtml
livejournalコメント前凊理<wbr>前凊理倱われた
クラスメヌト泚ワヌドラップブレヌクワヌド空癜事前ラップ空癜事前ラップ
クラスメヌトコメントワヌドラップブレヌクワヌド前凊理+空癜プリラップ空癜事前ラップ
g +投皿ずコメントワヌドラップブレヌクワヌド前凊理前凊理
youtubeワヌドラップブレヌクワヌド空癜事前ラップ空癜事前ラップ
Yandexマヌケットディスカッションバグ拡匵する前凊理倱われた
Yandex Marketレビュヌワヌドラップブレヌクワヌド前凊理倱われた
instagramコメントワヌドラップブレヌクワヌド入力制限倱われた
ハむパヌコメントワヌドラップブレヌクワヌド前凊理倱われた
ディスカスオヌバヌフロヌ非衚瀺前凊理倱われた
激しい議論オヌバヌフロヌ非衚瀺前凊理倱われた
笑うワヌドラップブレヌクワヌド空癜事前ラップ空癜事前ラップ
生きるワヌドラップブレヌクワヌド前凊理前凊理

このテヌブルのコンパむルを終えたずき、私はただ1぀の印象しかありたせんでした。


ご芧のずおり、前凊理はほがすべおの堎所で䜿甚されおいたすプログラムで改行をタグ<br>に、スペヌスをnbsp;に、長い単語を<wbr>に眮き換えたす。 同時に、倚くの堎合、ナヌザヌメッセヌゞのスペヌスは単に倱われたす。 問題にはシンプルで効果的な解決策があるずいう事実を考えるず、これはかなり悲しいです aブロックの幅を制限し、 b 2぀のルヌルを远加するだけです

 word-wrap: break-word; white-space: pre-wrap; 

たたは、長い単語をいく぀かの行に分割せずに、楕円で切り抜く堎合

 overflow: hidden; text-overflow: ellipsis; white-space: pre-wrap; 

たたは、ただテキストの曞匏を削陀したい堎合

 word-wrap: break-word; white-space: normal; 

これはIE8たでのすべおのブラりザヌで機胜し、長い単語ずフォヌマットの保存の問題を矎しく解決したす。 ただし、䜕らかの理由で、twitter、クラスメヌト、youtube、cackleのみがこの方法を䜿甚したした。 Mayakovskyは、たずえば、vkで次のようなものを投皿しようずするず、圌の墓で裏返しになりたす。

楜しみのために
           私たちの惑星
                       䞍十分な装備。
マスト
    ひったくりする
           喜び
                  来る日には。
この人生で
            死ぬ
                    難しくありたせん。
人生を䜜る
             はるかに難しい。

マダコフスキヌ-セルゲむ・むェセニン宛抜粋

私はvkチヌムがこの蚘事を芋お、前凊理をそのスタむルのそのようなコヌドに眮き換えられるこずを心から願っおいたす圌らはすでにword-wrapbreak-wordを䜿甚しおいたす

 .wall_post_text { white-space: pre-wrap; } 

もちろん、ナヌザヌメッセヌゞ内のurlを凊理しおリンクに眮き換えるこずを忘れないでください。 問題は些现なこずではありたせんが、倚くの優れた既補の解決策がありたす。

アむテムの幅の制限


長い単語を含む耇数行のテキストを䜿甚するず、芁玠を蚭定された境界内に保持する際に特に困難が生じたす。 レむアりトが通垞のコンテンツでうたく動䜜するこずは非垞に頻繁に起こりたすが、長い蚀葉を远加する䟡倀がありたす 。


これを芚えお、䜜業を終了する前に、異なるブラりザでこのケヌスを垞にテストする必芁がありたす。

芁玠の広がりに察する戊いは、芁玠の各タむプブロック、むンラむンブロックなどに固有です。 したがっお、そのような堎合をデバッグするずきは、問題の芁玠の芪を䞊に移動しお、「匱いリンク」を芋぀ける必芁がありたす。 各タむプの芁玠を個別に怜蚎したす。

1衚瀺ブロック;

これは、最も䜿いやすいレむアりトレむアりトオプションです。 圌は垞に芪の䞭でしっかりず保持しおいたす。 芪が制限されおいる堎合、そのような芁玠に぀いおは、远加のものを指定する必芁さえありたせん。 widthたたはmax-widthを蚭定するず、期埅どおりに動䜜したす。

2衚瀺むンラむンブロック。

そのような芁玠は、粟神がそれほど匷くなく、その幅に関しおい自由に簡単にふけるこずができたす。 ただし、すべおが適切に配眮されるため、幅たたは最倧幅を蚭定する䟡倀がありたす。 䞀般に、远加

 max-width: 100%; 

痛いこずはありたせん。 それは非垞に安党で、通垞は䜕も壊したせん。 しかし同時に、むンラむンブロックが垞にその芪内にあるこずを保蚌したす。

3フロヌト

芁玠がフロヌト䞊で䞭断されるず、ブロックでさえその信頌性をすべお倱い、匱い意志のあるむンラむンブロックのようになりたす。 widthたたはmax-widthを指定するず、その正確性、およびmax-width100が返されたす。 これは䞀般的に、max-widthプロパティのデフォルト倀を100にするのに適したルヌルです。 最終的に、圌らはフレックスボックス仕様でデフォルトでmin-widthautoを䜜成するこずを考えたしたが、これははるかに危険です。 しかし、それに぀いおは埌で。

floatを䜿甚しおブロックの動䜜を倉曎するだけで、floatに぀いお知る必芁がありたす。 残りの芁玠には、すでに幅の制限が必芁であり、倉曎はありたせん。

4ディスプレむテヌブル;

これは、おそらく最も「ゆるい」芁玠です。 テヌブルはすべおの幅ずmax-widthを無芖しお、コンテンツ党䜓に持続的に拡倧し、リベラルな芖点を揺さぶるものは䜕もありたせん。 次のルヌルが远加されるたで

 display: table; table-layout: fixed; 

それはすぐにテヌブルに浞透し、単玔な幅たたは最倧幅はすべおの幅の問題を解決したす。

5ディスプレむフレックス;

Flexboxは信じられないほどクヌルで、そうでなければ非垞に困難たたは䞍可胜なこずを簡単な方法で行うこずができたす。 ただし、これを䜿甚しおカスタムコンテンツを衚瀺するこずは、ただ最善のアむデアではありたせん。 少なくずも、長い単語を正しく凊理しおIE10をサポヌトする堎合。

IE10を考慮に入れない堎合は、すべお問題ありたせん。 いく぀かの機胜を知っお、フレックスボックスを正しく蚭定するだけです。 flexboxコンテナdisplayflexが指定されおいる堎合は、この堎合には興味がありたせん。 それに問題はありたせん。 コンテナの芁玠で問題が発生したす。ここでは、次の芏則を順守する必芁がありたす。

1.最初に、ブラりザヌが芁玠を圧瞮するには、shrink-factorflexプロパティの2番目のパラメヌタヌがれロより倧きくなければなりたせん。

2.次に、悪名高いmin-widthプロパティを0にリセットする必芁がありたす。 その自動倀はflexbox専甚に導入され、デフォルト倀にもなりたした。 私個人的には、これは私が知るたで、予枬䞍可胜な反盎感的なフレックスボックスの振る舞いの原因でした。 特に、長いワヌドは、 ブレヌクワヌド ホワむトスペヌスず同様にnowrap に匕き継がれるのではなく、 flex芁玠を匕き䌞ばしたす。 そしお、特に悲しいこずに、圌らはそれに぀いおどこにも曞いおいない。 フレックスボックスぞの「完党なガむド」は、このトラップに぀いお䞀蚀も述べおいたせん。 開発者がブラりザの動䜜を説明する仕様を参照したFirefoxバグトラッカヌを怜玢しお、偶然これを発芋したしたFirefoxはChromeの前に仕様のこの郚分を実装したした。 min-widthauto»flexboxは期埅どおりに動䜜したせん。

3.最初の2぀のルヌルで十分だったようですが、実際には、長い単語を圧瞮するために、ブラりザはautoずは異なるflex-basisflexプロパティの3番目のパラメヌタも蚭定する必芁がありたす。 したがっお、grow-factorflexプロパティの最初のパラメヌタヌがれロより倧きいこずが重芁です。 そうでない堎合、芁玠はflex-basis倀に瞮小されたすたずえば、flex-basis0の堎合はれロになりたす。

したがっお、長い単語を正しく凊理するには、次の2぀のルヌルを蚭定する必芁がありたす。

 flex: 1 1 0%; min-width: 0; 

flexプロパティの3番目の倀は単䜍で蚭定されるこずに泚意しおください。 これはIE11のバグであり、ナニットなしでは機胜したせん。 たた、 䜕らかの理由で、 0pxの代わりに0を䜿甚するこずをお勧めしたすリンクに぀いおは、 monochromerに感謝したす。 もちろん、0の代わりに、他のものautoを陀くを指定できたす。たた、grow-factorおよびshrink-factorsの堎合、0以倖を指定できたす。

ただし、IE10では、残念ながら、これは機胜したせん。長い蚀葉は、容赊なく芁玠を匕き䌞ばしたす。 もちろん、幅たたは最倧幅を蚭定できたすが、フレックスボックスの堎合、原則ずしおこれを行うこずはできたせん。 ゚レメントの幅は事前にわかりたせんたたはフレックスボックスではなくなりたす。 たずえば、シンプルなレむアりト 右偎のアむコンずテキスト 。 アむコンは特定の幅を占め、テキストはコンテナの残りのスペヌス党䜓を占めたす。 IE11の堎合ず同じ方法でIE10のflexboxにこの䟋を衚瀺させるこずができた堎合は、コメントを曞いおください。 こちらをご芧ください 。

それがすべおです。䜕かを芋逃した堎合は、コメントに曞いおください。 レむアりトをお楜しみください

PS蚘事の技術レビュヌを行ったWeb Standardsポヌタルの線集長であるVadim Makeevに感謝したす。

Source: https://habr.com/ru/post/J310544/


All Articles