web-dev-qa-db-ja.com

非常に長いCSS列のセクション区切り

CSS列を使用すると、連続したデータを手動でセクションに分割することなく列にフォーマットできます。これは、複雑で動的なコンテンツを表示するときに特に役立ちます。

ただし、列のコンテンツが長すぎて高さがビューポートよりも大きい場合は、列に分割すると読みにくくなります。リーダーが1つの列の一番下に達したら、次の列を読み始めるには手動で上にスクロールする必要があります。

従来の印刷レイアウトでは、非常に長い列の読みやすさの問題は、通常、列を「再スタート」するセクションに分割することで軽減されます。 (物理ページ自体が、無限にスクロールするWebページにはない自然な分離を形成します)。以下の画像は、水平セクションの区切りが、ビューポートの高さよりも長い柱状コンテンツを読みやすくする方法を示しています。

enter image description here

(「列を再起動する」とは、左側の列セクションの最後に到達したら、そのセクションの右側の列を読んでから、下にスクロールして次のセクションの両方の列を読み取ることを意味します。 https://www.shutterstock.com/image-vector/newspaper-template... より明確に説明されている場合があります)。

列の内容の保証はほとんどありません。段落、画像、ネストされたブロック要素、ネストされたインライン要素などをいくつでも含めることができます。マークアップの例を以下に示します。

.columns {
  columns: 2 200px;
}
.columns * {
  max-width: 100%;
}
<div class="columns">
  <div class="introduction">
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas posuere dictum tincidunt. Cras in lectus eget libero suscipit venenatis at sit amet dolor. Donec tempor cursus justo, volutpat sodales dolor tempor eu.</p>
    <p class="a-class">Pellentesque nec tempor sapien, sed vehicula sem. Ut pretium leo eget nisi cursus viverra. Ut ultrices porta nibh, sed laoreet felis condimentum sit amet. Aliquam a felis nec urna dignissim placerat sed sit amet elit. Donec elementum sagittis purus, facilisis convallis urna dapibus eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam erat volutpat. Phasellus vel placerat metus. In efficitur enim eget lacinia ultrices. Duis ultricies dignissim nisi, id ultricies nulla venenatis vitae.</p>
  </div>
  <img src="https://i.kym-cdn.com/entries/icons/original/000/016/546/hidethepainharold.jpg">
  <div class="body" style="">
    <p>Suspendisse quis ante ullamcorper, lobortis orci ut, vestibulum dolor. Aenean sit amet purus commodo, sagittis leo vel, consequat nisi. Vestibulum sit amet sem vitae sapien pulvinar finibus. Ut sapien purus, luctus condimentum iaculis quis, lobortis at elit. Cras nulla ante, scelerisque ut aliquet in, elementum vel turpis. Vestibulum ipsum magna, congue sit amet sodales vel, aliquam vel nunc. <img src="https://upload.wikimedia.org/wikipedia/commons/e/e0/SNice.svg" width="100"> Sed eu dapibus nulla. In ut libero sit amet elit elementum gravida. Suspendisse quis quam consequat, pretium felis vel, laoreet turpis. Proin fringilla lobortis magna. Duis quam sapien, sodales nec accumsan id, ullamcorper eget tellus. Aliquam vitae orci cursus, porttitor ligula ut, fringilla odio. Donec a lorem ac eros interdum varius ultricies quis nulla.</p>
  </div>
  <p contenteditable="true">Nunc in elit tincidunt, ultrices massa sed, ultricies elit. In nec accumsan metus. Nullam ultricies eget tortor ut malesuada. Fusce in elit sit amet dolor bibendum malesuada.</p>
  <div style="display:none">
    <p>Curabitur sed hendrerit massa, vitae porta enim.</p>
  </div>
  <div><div><span>hey</span><div id="an-id">
    Nullam ultricies eget tortor ut malesuada. Fusce in elit sit amet dolor bibendum malesuada. Nulla sed nisi vel nulla aliquam blandit. Nam vel tellus ut libero ultrices volutpat. Curabitur blandit quis arcu rutrum ullamcorper. Cras et pharetra augue, eget eleifend sem.
    <img src="https://socialnewsdaily.com/wp-content/uploads/2018/08/Webp.net-resizeimage-27.jpg">
  </div></div></div>
  <p>
    Mauris accumsan condimentum porttitor. Quisque tellus justo, suscipit sit amet posuere in, scelerisque nec orci. Aenean iaculis nisi in porta viverra. Sed eget ultricies nibh. Donec accumsan laoreet interdum. Donec risus mauris, dapibus et pulvinar at, posuere non nisi. Mauris at viverra nunc. Ut laoreet suscipit erat et cursus. Aenean id lacus volutpat lectus condimentum posuere. Nam ut lectus elit. Morbi sagittis elementum libero. Donec congue dolor sed tristique efficitur.
  </p>
  <p>
    <div>
      <p>Sed elementum velit sapien, et tristique justo bibendum at. Aliquam tincidunt magna nec nisi congue varius. Etiam dolor eros, rhoncus quis purus a, tempus malesuada quam. Sed bibendum condimentum eros vitae varius. Donec fermentum magna vel tellus tempus, nec finibus neque fermentum. Mauris tempus nisl sit amet lacus fermentum, at egestas urna egestas.</p>
      <p>Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse ultrices lectus vitae nisl congue, sed porta dolor luctus. Donec aliquet at sapien sit amet tincidunt. Mauris vestibulum consectetur augue at imperdiet.</p>
    </div>
  </p>
</div>

上の画像のように、列が最大の高さに達した後、自動的に列を通常のセクションに分割したいと思います。

この方法でCSS列のレイアウトを制御するプロパティは見つかりませんでした。 CSSリージョンは有望に見えますが、ブラウザーのサポートが非常に貧弱です。

JavaScriptでコンテンツの高さを計算し、各列ブロックにラッパーを挿入することはおそらく可能ですが、理想的ではありません。コンテンツは動的であり、いつでも変更される可能性があります。つまり、変更のたびに関数を実行する必要があります。さらに、コンテンツはセクション区切りを通過する必要があるサブ要素で非常に複雑になる可能性があるため、単純に各セクションにラッパーを挿入すると、レイアウトが壊れる可能性があります。

最大の高さの後に、列コンテンツのセクション区切りを自動的に設定するにはどうすればよいですか? (私はCSS列のアイデアと結婚していません。おそらくflexまたはinline-blockをクリエイティブに使用すると、必要な結果が得られます)。

15
jla

実際には、CSS列を使用した非常に単純なソリューションがあります。そしてその column-span属性。

コンテンツに何かを注入したり、HTMLタグをスタイルしたりせずに、これらすべてを実現できます。

基本的に、CSS列レイアウトモジュール印刷デザインレイアウトを複製することを目的としています(新聞のように)ここでは、見出しがストーリーのすべての列を横切るようにするというスタイルのルールがあります。したがって、column-span: allは列を分離し、折り返しをリセットします。 (私の例の色はラップを示していることに注意してください)。

この場合、コンテンツを制御しないため、ユーザーに共通の構造を提供することが最善です。たとえば、H1, H2, H3タグと<hr>とおそらく列を分割するいくつかの画像。 ユーザーが通常どおり書面でこれらのタグを実装できるようにすれば、素敵なレイアウトを実現できます。ただし、そのようなものを実装しないと決定した場合は、ユーザー次第です。折り返して長いスクロールを引き起こします。 (結果がどのようになるかを確認できるように、プレビューを提供することをお勧めします)

列スパンの例

.columns {
        margin: 30px;
        columns: 2;
}

h1, h2, h3, h4, h5 {
        column-span: all;
}



// simply to show where things wrap
h2 {
        background-color: #eee;
        padding: 5px 10px;
}

h5 {
        border-bottom: 1px solid #ddd;
        padding-bottom: 5px;
        text-align: center;
}

p:nth-of-type(1) {
        color: blue;
}

p:nth-of-type(2) {
        color: green;
}

p:nth-of-type(3) {
        color: orange;
}
p:nth-of-type(4) {
        color: teal;
}
<div class="columns">
        <p>
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras venenatis tellus non nunc tincidunt, vitae rutrum metus dapibus. Fusce at ante massa. Nam et nibh aliquet, porta nibh quis, rhoncus tortor. Aenean vestibulum neque sed urna lacinia aliquet.
                Vestibulum facilisis egestas commodo. Cras sed maximus odio. Mauris posuere, ante id posuere facilisis, ligula libero consectetur lacus, at pellentesque nibh elit at magna. Proin sollicitudin quis nibh at viverra. Duis feugiat, lorem vitae facilisis
                blandit, augue tortor cursus orci, sed porttitor eros elit at sapien. Quisque eleifend pulvinar pellentesque.
        </p>

        <h2>This is a header (h2) with column-span: all set on it</h2>

        <p>
                Donec blandit sapien leo, id aliquam purus vulputate a. Sed vel turpis ut eros suscipit blandit vel id eros. Nullam ut mauris luctus magna sollicitudin venenatis. Pellentesque leo mauris, malesuada nec purus ut, vestibulum malesuada lectus. Nullam ultricies
                tellus sapien, ut fermentum risus pretium a. Nullam magna urna, ullamcorper non congue a, efficitur nec orci. Ut aliquam molestie nisi. In at accumsan purus. Etiam non tempor ipsum. Maecenas gravida mauris in nibh vehicula ullamcorper. Sed libero lorem,
                faucibus eu lorem ut, gravida eleifend enim. Nunc vehicula fermentum consequat. Phasellus a pellentesque nisl. Nulla vel suscipit nibh, ac cursus dui. Suspendisse elementum dapibus risus. Nam egestas congue finibus.
        </p>

        <p>
                Nunc vel risus nec nulla dignissim congue. Cras sit amet lacus nec nisl mollis pellentesque in vel purus. Suspendisse efficitur mollis nibh, congue facilisis libero auctor ac. Nulla facilisi. Etiam ut erat eget erat egestas suscipit. Curabitur vitae varius
                mauris. Sed accumsan diam eros, id dapibus metus rutrum at. Nunc vitae pretium massa. Aenean quis mauris leo. Nulla egestas ligula eu libero interdum feugiat. Aliquam maximus erat et tortor auctor varius. Nulla in pharetra leo, vel suscipit nunc. Orci
                varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec nec egestas ante, vitae sollicitudin arcu. Pellentesque posuere tempus nibh, nec tempus eros pellentesque ac.
        </p>

        <p>
                Curabitur tempus massa dolor, nec congue purus efficitur id. Phasellus a dictum mauris. In porta nulla lectus, pretium semper erat semper id. Fusce ornare fringilla mi, ut auctor tortor semper non. Aliquam sed felis fermentum, molestie dolor vel, eleifend
                diam. Donec accumsan bibendum mi, sed pretium tortor pulvinar nec. Aliquam et metus accumsan, pretium neque eu, elementum ipsum. Nam dapibus risus sed velit viverra, non consequat nibh pretium. Morbi nec gravida turpis. Quisque convallis justo ut rhoncus
                porttitor. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
        </p>
        <h5>This is a header (h5) with column-span: all set on it</h5>
        <p>
                Proin fringilla, sapien molestie mattis commodo, leo ligula viverra massa, eget semper leo purus sit amet est. Quisque eu diam interdum, pretium dui sed, dictum sem. Sed cursus eu est in ultrices. Suspendisse eleifend imperdiet lectus eu consectetur.
                Duis semper libero nec magna commodo, sollicitudin pharetra magna luctus. Fusce pellentesque sollicitudin dolor, eu scelerisque elit condimentum vel. Curabitur id condimentum nisi, eu rhoncus arcu. Proin metus purus, condimentum nec semper vitae, blandit
                at leo. Proin commodo et ipsum ac euismod. Aliquam erat volutpat. Nam neque nisi, ornare sit amet metus ac, faucibus tempor nulla. Quisque tristique malesuada finibus. Praesent fermentum posuere urna, a blandit risus sollicitudin nec.
        </p>

</div>
4
Bryce Howitson

「break-inside:回避」を使用する。各段落

添付したソリューションでは、段落の途中で中断しないように、各DIVに中断回避クラスを割り当てました。

あなたが尋ねたように、段落がまだ終わっていない場合は、下にスクロールできます。段落に表示される灰色を追加しました。

いつブレークするかを制御でき、必要に応じてdivにdivを挿入することもできます。

ソリューションが効果的であることを願っています。

.columns {
  columns: 5 250px;
}
.columns * {
  max-width: 100%;
}
.break-avoid{
  break-inside: avoid;
  background-color: #ccc;
}
<div class="columns">
  <div class="introduction break-avoid">
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas posuere dictum tincidunt. Cras in lectus eget libero suscipit venenatis at sit amet dolor. Donec tempor cursus justo, volutpat sodales dolor tempor eu.</p>
    <p class="a-class">Pellentesque nec tempor sapien, sed vehicula sem. Ut pretium leo eget nisi cursus viverra. Ut ultrices porta nibh, sed laoreet felis condimentum sit amet. Aliquam a felis nec urna dignissim placerat sed sit amet elit. Donec elementum sagittis purus, facilisis convallis urna dapibus eu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam erat volutpat. Phasellus vel placerat metus. In efficitur enim eget lacinia ultrices. Duis ultricies dignissim nisi, id ultricies nulla venenatis vitae.</p>
  </div>
  <img src="https://i.kym-cdn.com/entries/icons/original/000/016/546/hidethepainharold.jpg">
  <div class="body break-avoid" style="">
    <div>
    <p>Suspendisse quis ante ullamcorper, lobortis orci ut, vestibulum dolor. Aenean sit amet purus commodo, sagittis leo vel, consequat nisi. Vestibulum sit amet sem vitae sapien pulvinar finibus. Ut sapien purus, luctus condimentum iaculis quis, lobortis at elit. Cras nulla ante, scelerisque ut aliquet in, elementum vel turpis. Vestibulum ipsum magna, congue sit amet sodales vel, aliquam vel nunc.Suspendisse quis ante ullamcorper, lobortis orci ut, vestibulum dolor. Aenean sit amet purus commodo, sagittis leo vel, consequat nisi. Vestibulum sit amet sem vitae sapien pulvinar finibus. Ut sapien purus, luctus condimentum iaculis quis, lobortis at elit. Cras nulla ante, scelerisque ut aliquet in, elementum vel turpis. Vestibulum ipsum magna, congue sit amet sodales vel, aliquam vel nunc.Suspendisse quis ante ullamcorper, lobortis orci ut, vestibulum dolor. Aenean sit amet purus commodo, sagittis leo vel, consequat nisi. Vestibulum sit amet sem vitae sapien pulvinar finibus. Ut sapien purus, luctus condimentum iaculis quis, lobortis at elit. Cras nulla ante, scelerisque ut aliquet in, elementum vel turpis. Vestibulum ipsum magna, congue sit amet sodales vel, aliquam vel nunc.Suspendisse quis ante ullamcorper, lobortis orci ut, vestibulum dolor. Aenean sit amet purus commodo, sagittis leo vel, consequat nisi. Vestibulum sit amet sem vitae sapien pulvinar finibus. Ut sapien purus, luctus condimentum iaculis quis, lobortis at elit. Cras nulla ante, scelerisque ut aliquet in, elementum vel turpis. Vestibulum ipsum magna, congue sit amet sodales vel, aliquam vel nunc. <img src="https://upload.wikimedia.org/wikipedia/commons/e/e0/SNice.svg" width="100"> Sed eu dapibus nulla. In ut libero sit amet elit elementum gravida. Suspendisse quis quam consequat, pretium felis vel, laoreet turpis. Proin fringilla lobortis magna. Duis quam sapien, sodales nec accumsan id, ullamcorper eget tellus. Aliquam vitae orci cursus, porttitor ligula ut, fringilla odio. Donec a lorem ac eros interdum varius ultricies quis nulla.</p>
    </div>
  </div>
  <p class="break-avoid" contenteditable="true">Nunc in elit tincidunt, ultrices massa sed, ultricies elit. In nec accumsan metus. Nullam ultricies eget tortor ut malesuada. Fusce in elit sit amet dolor bibendum malesuada.</p>
  <div style="display:none;" class="break-avoid">
    <p>Curabitur sed hendrerit massa, vitae porta enim.</p>
  </div>
  <div class="break-avoid"><div><span>hey</span><div id="an-id">
    Nullam ultricies eget tortor ut malesuada. Fusce in elit sit amet dolor bibendum malesuada. Nulla sed nisi vel nulla aliquam blandit. Nam vel tellus ut libero ultrices volutpat. Curabitur blandit quis arcu rutrum ullamcorper. Cras et pharetra augue, eget eleifend sem.
    <img src="https://socialnewsdaily.com/wp-content/uploads/2018/08/Webp.net-resizeimage-27.jpg">
  </div></div></div>
  <div class="break-avoid">
  <p>
    Mauris accumsan condimentum porttitor. Quisque tellus justo, suscipit sit amet posuere in, scelerisque nec orci. Aenean iaculis nisi in porta viverra. Sed eget ultricies nibh. Donec accumsan laoreet interdum. Donec risus mauris, dapibus et pulvinar at, posuere non nisi. Mauris at viverra nunc. Ut laoreet suscipit erat et cursus. Aenean id lacus volutpat lectus condimentum posuere. Nam ut lectus elit. Morbi sagittis elementum libero. Donec congue dolor sed tristique efficitur.
  </p>
 </div>
    <div class="break-avoid">
      <p>Sed elementum velit sapien, et tristique justo bibendum at. Aliquam tincidunt magna nec nisi congue varius. Etiam dolor eros, rhoncus quis purus a, tempus malesuada quam. Sed bibendum condimentum eros vitae varius. Donec fermentum magna vel tellus tempus, nec finibus neque fermentum. Mauris tempus nisl sit amet lacus fermentum, at egestas urna egestas.</p>
      <p>Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse ultrices lectus vitae nisl congue, sed porta dolor luctus. Donec aliquet at sapien sit amet tincidunt. Mauris vestibulum consectetur augue at imperdiet.</p>
    </div>
  
</div>
1
Omer