अतिप्रवाह सामग्री के साथ एक फ्लेक्सबॉक्स स्क्रॉल करना


214

यहां छवि विवरण दर्ज करें

यहाँ उपरोक्त लेआउट को प्राप्त करने के लिए कोड का उपयोग किया जा रहा है:

.header {
  height: 50px;
}

.body {
  position: absolute;
  top: 50px;
  right: 0;
  bottom: 0;
  left: 0;
  display: flex;
}

.sidebar {
  width: 140px;
}

.main {
  flex: 1;
  display: flex;
  flex-direction: column;
}

.content {
  flex: 1;
  display: flex;
}

.column {
  padding: 20px;
  border-right: 1px solid #999;
}
<div class="header">Main header</div>
<div class="body">
  <div class="sidebar">Sidebar</div>

  <div class="main">
    <div class="page-header">Page Header. Content columns are below.</div>
    <div class="content">
      <div class="column">Column 1</div>
      <div class="column">Column 1</div>
      <div class="column">Column 1</div>
    </div>
  </div>
</div>

मैंने स्टाइल के लिए उपयोग किए गए कोड को छोड़ दिया। आप कलम में यह सब देख सकते हैं ।


उपरोक्त काम करता है, लेकिन जब contentक्षेत्र की सामग्री ओवरफ्लो हो जाती है, तो यह पूरे पृष्ठ को स्क्रॉल करता है। मैं केवल, स्क्रॉल करने के लिए सामग्री क्षेत्र में ही चाहते हैं तो मैं जोड़ा overflow: autoकरने के लिए contentdiv

अब इसके साथ समस्या यह है कि स्तंभ स्वयं अपने माता-पिता की ऊँचाई से आगे नहीं बढ़ते हैं, इसलिए सीमाएँ भी कट जाती हैं।

यहां स्क्रॉलिंग इश्यू को दर्शाने वाला पेन है

मैं contentक्षेत्र को स्वतंत्र रूप से स्क्रॉल करने के लिए कैसे निर्धारित कर सकता हूं , जबकि अभी भी उसके बच्चे contentबॉक्स की ऊंचाई से परे हैं ?

जवाबों:


264

मैंने इस बारे में टैब एटकिंस (फ्लेक्सबॉक्स कल्पना के लेखक) से बात की है, और यह वह है जो हम साथ आए:

HTML:

<div class="content">
    <div class="box">
        <div class="column">Column 1</div>
        <div class="column">Column 2</div>
        <div class="column">Column 3</div>
    </div>
</div>

सीएसएस:

.content {
    flex: 1;
    display: flex;
    overflow: auto;
}

.box {
    display: flex;
    min-height: min-content; /* needs vendor prefixes */
}

यहाँ पेन हैं:

  1. छोटे स्तंभों को बढ़ाया जा रहा है
  2. लंबे समय तक कॉलम ओवरफ्लो करना और स्क्रॉल करना

इसका कारण यह है क्योंकि align-items: stretchइसकी वस्तुओं को सिकोड़ने की ज़रूरत नहीं है, यदि उनके पास एक आंतरिक ऊंचाई है, जो यहाँ द्वारा पूरा किया गया है min-content


3
वे काम करते हैं जब माता-पिता की ऊंचाई उसके बच्चों पर निर्भर नहीं करती है, आम तौर पर, जो यहां मामला है। न्यूनतम ऊंचाई: 100% वास्तव में फ़ायरफ़ॉक्स में आपके खिंचाव-समान-जब-कॉलम-ए-शॉर्ट मुद्दे को ठीक करता है (हालांकि क्रोम में नहीं)। यकीन नहीं होता है कि अगर यह क्रोम बग या फ़ायरफ़ॉक्स बग है।
ढोलबर्ट

1
@ ढोलबर्ट - टैब एटकिंस ने मेरी इसमें मदद की। मैंने अपना उत्तर अपडेट कर दिया है।
जोसफ सिलबर

3
ध्यान दें कि फ़ायरफ़ॉक्स वर्तमान में केवल चौड़ाई मानों के लिए "न्यूनतम-सामग्री" का समर्थन करता है, ऊंचाई मानों का नहीं - इसलिए यह फ़ायरफ़ॉक्स में काम नहीं करेगा, अगर यह आपके लिए मायने रखता है। (उदाहरण देखें Bugzilla.mozilla.org/show_bug.cgi?id=852367 )
dholbert 23

2
@ डॉलबर्ट - इन पेन के साथ समस्या यह है कि वे सार्वजनिक थे, इसलिए कोई भी उन्हें बदल सकता था। मैंने उनका स्वामित्व ले लिया, इसलिए यहां आप जाएं: codepen.io/JosephSilber/pen/pmyHh
यूसुफ

5
हां, यह IE11 में टूट गया है
स्टीव

119

मैंने बहुत परीक्षण और त्रुटि के बाद इस समस्या को बहुत ही शिष्टता से हल किया।

मेरी ब्लॉग पोस्ट देखें: http://geon.github.io/programming/2016/02/24/flexbox-full-page-web-app-layout

मूल रूप से, एक फ्लेक्सबॉक्स सेल को स्क्रॉल करने योग्य बनाने के लिए, आपको इसके सभी माता-पिता बनाने overflow: hidden;होंगे, या यह सिर्फ आपकी अतिप्रवाह सेटिंग्स की अनदेखी करेगा और इसके बजाय माता-पिता को बड़ा बना देगा।


11
यह मेरे मामले में भी काम किया, लेकिन वाह, मैं वास्तव में यह क्यों काम करता है की एक व्याख्या देखना चाहूंगा । ज्यादातर समय, मुझे लगता है कि सीएसएस चश्मा इस तरह की चीज के लिए पूरी तरह से अपमानजनक है।
18

2
आपके ब्लॉग पोस्ट से: "मुझे नहीं पता कि यह क्यों काम करता है, और चश्मा कुछ भी नहीं कहता है" । इसलिए, मैं इसकी व्याख्या कर रहा हूं कि यह क्यों काम करता है। मैंने ऐनक को स्किम कर लिया है, लेकिन जैसा कि आपने कहा, वहाँ कुछ भी नहीं निकलता है।
मार्कियन

3
इसके बारे में कुछ और सोचने के बाद, मुझे लगता है कि यह समझ में आता है। डिफ़ॉल्ट व्यवहार प्रत्येक div के लिए यह सब बच्चों को शामिल करने के लिए विस्तार करने के लिए है, इसलिए पत्ती नोड्स पर छिपाने के लिए कोई अतिप्रवाह नहीं होगा। आपको ओवरफ्लो करने के लिए मजबूर करने की आवश्यकता है: डोम के ऊपर से सभी तरह से छिपा हुआ है, इसलिए किसी भी माता-पिता के पास बच्चों को समायोजित करने का मौका नहीं है जब तक आप उस नोड के नीचे नहीं होते हैं जिसे आप ओवरफ्लो और स्क्रॉल करना चाहते हैं।
जियोन

3
मुझे यकीन नहीं है कि यह वास्तव में समझाता है। एक तत्व पर छिपे हुए ओवरफ्लो की स्थापना इसे अपने सभी बच्चों, AFAIK को शामिल करने के लिए विस्तार करने से नहीं रोकती है। एमडीएन के अनुसार: "अतिप्रवाह संपत्ति निर्दिष्ट करती है कि क्या सामग्री को क्लिप करना है, स्क्रॉलबार को प्रस्तुत करना है या जब यह ब्लॉक स्तर के कंटेनर को ओवरफ्लो करता है तो केवल सामग्री प्रदर्शित करता है।" इसके अतिरिक्त, दृश्यमान के अलावा किसी भी चीज़ के लिए अतिप्रवाह स्थापित करना एक नया ब्लॉक स्वरूपण संदर्भ बनाता है - लेकिन यह प्रासंगिक नहीं हो सकता है, क्योंकि फ्लेक्स कंटेनर पहले से ही अपने स्वयं के ब्लॉकिंग स्वरूपण संदर्भ बनाते हैं: developer.mozilla.org/en-US/docs/Web/Guide / सीएसएस /…
मार्कियन

1
मुझे यह जोड़ना चाहिए कि मैं मानता हूं कि आपका स्पष्टीकरण सहज ज्ञान युक्त है, लेकिन मुझे नहीं लगता कि यह एक सटीक तकनीकी स्पष्टीकरण है, जो मैं चाहता हूं। केवल सही मायने में समझने के कारण ही मैं भविष्य में समाधान को याद रख पाऊंगा!
मार्कियन

55

के साथ कार्य करना position:absolute;के साथ flex:

फ्लेक्स आइटम को साथ रखें position: relative। फिर इसके अंदर, एक और <div>तत्व जोड़ें :

position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;

यह तत्व को उसके रिश्तेदार-तैनात माता-पिता की सीमाओं तक विस्तारित करता है, लेकिन इसे विस्तारित करने की अनुमति नहीं देता है। अंदर, overflow: auto;फिर उम्मीद के मुताबिक काम करेंगे।

  • उत्तर में शामिल कोड स्निपेट - क्लिक करें यहां छवि विवरण दर्ज करेंऔर फिर पूरा पृष्ठस्निपेट OR चलाने के बाद क्लिक करें
  • CODEPEN के लिए यहां क्लिक करें
  • परिणाम: यहां छवि विवरण दर्ज करें

.all-0 {
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}
p {
  text-align: justify;
}
.bottom-0 {
  bottom: 0;
}
.overflow-auto {
  overflow: auto;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet"/>


<div class="p-5 w-100">
  <div class="row bg-dark m-0">
    <div class="col-sm-9 p-0 d-flex flex-wrap">
      <!-- LEFT-SIDE - ROW-1 -->
      <div class="row m-0 p-0">
        <!-- CARD 1 -->
        <div class="col-md-8 p-0 d-flex">
          <div class="my-card-content bg-white p-2 m-2 d-flex flex-column">
            <img class="img img-fluid" src="https://via.placeholder.com/700x250">
            <h4>Heading 1</h4>
            <p>
              Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old...
          </div>
        </div>
        <!-- CARD 2 -->
        <div class="col-md-4 p-0 d-flex">
          <div class="my-card-content bg-white p-2 m-2 d-flex flex-column">
            <img class="img img-fluid" src="https://via.placeholder.com/400x250">
            <h4>Heading 1</h4>
            <p>
              Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old...
          </div>
        </div>
      </div>
      <div class="row m-0">
        <!-- CARD 3 -->
        <div class="col-md-4 p-0 d-flex">
          <div class="my-card-content bg-white p-2 m-2 d-flex flex-column">
            <img class="img img-fluid" src="https://via.placeholder.com/400x250">
            <h4>Heading 1</h4>
            <p>
              Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old...
          </div>
        </div>
        <!-- CARD 4 -->
        <div class="col-md-4 p-0 d-flex">
          <div class="my-card-content bg-white p-2 m-2 d-flex flex-column">
            <img class="img img-fluid" src="https://via.placeholder.com/400x250">
            <h4>Heading 1</h4>
            <p>
              Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old...
          </div>
        </div>
        <!-- CARD 5-->
        <div class="col-md-4 p-0 d-flex">
          <div class="my-card-content bg-white p-2 m-2 d-flex flex-column">
            <img class="img img-fluid" src="https://via.placeholder.com/400x250">
            <h4>Heading 1</h4>
            <p>
              Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old...
          </div>
        </div>
      </div>
    </div>
    <div class="col-sm-3 p-0">
      <div class="bg-white m-2 p-2 position-absolute all-0 d-flex flex-column">
        <h4>Social Sidebar...</h4>
        <hr />
        <div class="d-flex overflow-auto">
          <p>
            Topping candy tiramisu soufflé fruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart. Pudding cupcake danish apple pie apple pie. Halva fruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart.
            opping candy tiramisu soufflé fruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart. Pudding cupcake danish apple pie apple pie. Halva fruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart.
            opping candy tiramisu soufflé fruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart. Pudding cupcake danish apple pie apple pie. Halva fruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart.
            Pudding cupcake danish apple pie apple pie. Halvafruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart. Pudding cupcake danish apple pie apple pie. Halvafruitcake ice cream chocolate bar. Bear claw ice cream
            chocolate bar donut sweet tart. Pudding cupcake danish apple pie apple pie. Halvafruitcake ice cream chocolate bar. Bear claw ice cream chocolate bar donut sweet tart. Pudding cupcake danish apple pie apple pie. Halvafruitcake ice cream chocolate
            bar. Bear claw ice cream chocolate bar donut sweet tart. Pudding cupcake danish apple pie apple pie. Halva
        </div>
      </div>
    </div>
  </div>

शुभ लाभ...


2
यह समाधान विशेष रूप से उपयोगी है यदि अंदर के घटक में पैडिंग सेट है क्योंकि यह जहां चाहे वहां स्थिति में इसे अच्छी तरह से बंद कर देगा। यह बहुत सरल है। (हाँ, आप box-sizing: border-boxइसके बजाय सेट कर सकते हैं लेकिन यह कुछ तृतीय पक्ष नियंत्रणों के लिए अधिक जटिल हो सकता है)।
सिमोन_विवर

2
तुमने मेरी रात बचाई!
बोटिया फ्लोरिन

2
धन्यवाद। किसी तरह मैं निराश हूं कि यह आवश्यक है, लेकिन मैं सलाह के लिए आभारी हूं!
मथियास

9

थोड़ी देर लेकिन यह मदद कर सकता है: http://webdesign.tutsplus.com/tutorials/how-to-make-responsive-scrollable-panels-with-flexbox--cms-23269

मूल रूप से आगे रहने के लिए की जरूरत है html, bodyकरने के लिए height: 100%; और एक में अपने सभी सामग्री लपेट<div class="wrap"> <!-- content --> </div>

सीएसएस:

html, body {
  height: 100%;
}

.wrap {
  height: 100vh;
  display: flex;
}

मेरे लिए काम किया। आशा करता हूँ की ये काम करेगा


"ऊंचाई: 100vh" का उपयोग करते समय आपको बहुत सावधान रहना चाहिए क्योंकि यह आईओएस सफारी बनाम एंड्रॉइड में अलग तरीके से मापता है। एक URL बार की ऊंचाई को ध्यान में रखता है और दूसरा नहीं करता है।
सीन एंडरसन

7

इसे जोड़ो:

align-items: flex-start;

के लिए नियम के लिए .content {}। कम से कम (फ़ायरफ़ॉक्स और क्रोम में) मेरे लिए इसे आपकी कलम में ठीक कर देता है।

डिफ़ॉल्ट रूप से, .contentहै align-items: stretch, यह अपने आप ही ऊंचाई मैच के लिए प्रति अपने ऑटो ऊंचाई बच्चों के सभी आकार में आता है जो http://dev.w3.org/csswg/css-flexbox/#algo-stretch । इसके विपरीत, मूल्य flex-startबच्चों को अपनी खुद की ऊंचाइयों की गणना करने देता है, और खुद को इसके शुरुआती किनारे (और अतिप्रवाह, और एक स्क्रॉलिंग ट्रिगर) में संरेखित करता है।



इसके अलावा, कॉलम अब समान ऊंचाई नहीं होंगे, जो कि फ्लेक्सबॉक्स के मुख्य आकर्षणों में से एक है।
जोसेफ सिलबर

ठीक है। यह मेरे लिए स्पष्ट नहीं था कि यह एक डिजाइन की कमी थी - क्षमा करें।
ढोलबर्ट

महान सुझाव
व्लाद

1

एक मुद्दा जो मुझे आया है, वह यह है कि स्क्रॉलबार के लिए एक तत्व को निर्दिष्ट किया जाना चाहिए (और% के रूप में नहीं)।

चाल प्रत्येक स्तंभ के भीतर विभाजनों के एक और सेट को घोंसला बनाने के लिए है, और स्तंभ माता-पिता के प्रदर्शन को फ्लेक्स-दिशा: कॉलम के साथ फ्लेक्स पर सेट करें।

    html, body {
        height: 100%;
        margin: 0;
        padding: 0;
    }

    body {
        overflow-y: hidden;
        overflow-x: hidden;
        color: white;
    }

    .base-container {
        display: flex;
        flex: 1;
        flex-direction: column;
        width: 100%;
        height: 100%;
        overflow-y: hidden;
        align-items: stretch;
    }

    .title {
        flex: 0 0 50px;
        color: black;
    }

    .container {
        flex: 1 1 auto;
        display: flex;
        flex-direction: column;
    }

        .container .header {
            flex: 0 0 50px;
            background-color: red;
        }

        .container .body {
            flex: 1 1 auto;
            display: flex;
            flex-direction: row;
        }

            .container .body .left {
                display: flex;
                flex-direction: column;
                flex: 0 0 80px;
                background-color: blue;
            }
                .container .body .left .content,
                .container .body .main .content,
                .container .body .right .content {
                    flex: 1 1 auto;
                    overflow-y: auto;
                    height: 100px;
                }
                .container .body .main .content.noscrollbar {
                    overflow-y: hidden;
                }

            .container .body .main {
                display: flex;
                flex-direction: column;
                flex: 1 1 auto;
                background-color: green;
            }

            .container .body .right {
                display: flex;
                flex-direction: column;
                flex: 0 0 300px;
                background-color: yellow;
                color: black;
            }

    .test {
        margin: 5px 5px;
        border: 1px solid white;
        height: calc(100% - 10px);
    }
</style>

और यहाँ HTML है:

<div class="base-container">
    <div class="title">
        Title
    </div>
    <div class="container">
        <div class="header">
            Header
        </div>
        <div class="body">
            <div class="left">
                <div class="content">
                    <ul>
                        <li>1</li>
                        <li>2</li>
                        <li>3</li>
                        <li>4</li>
                        <li>5</li>
                        <li>6</li>
                        <li>7</li>
                        <li>8</li>
                        <li>9</li>
                        <li>10</li>
                        <li>12</li>
                        <li>13</li>
                        <li>14</li>
                        <li>15</li>
                        <li>16</li>
                        <li>17</li>
                        <li>18</li>
                        <li>19</li>
                        <li>20</li>
                        <li>21</li>
                        <li>22</li>
                        <li>23</li>
                        <li>24</li>
                    </ul>
                </div>
            </div>
            <div class="main">
                <div class="content noscrollbar">
                    <div class="test">Test</div>
                </div>
            </div>
            <div class="right">
                <div class="content">
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>Right</div>
                    <div>End</div>
                </div>
            </div>
        </div>
    </div>
</div>

https://jsfiddle.net/LiamFlavelle/czpjdfr4/


0

इस समस्या का समाधान overflow: auto;सामग्री आवरण को स्क्रॉल करने योग्य बनाने के लिए .content में जोड़ना है।

इसके अलावा, overflowedइस कोडपेन की तरह फ्लेक्सबॉक्स रैपर और स्क्रॉल करने योग्य सामग्री के साथ भी हालात हैं

इसका समाधान overflow: hidden (or auto);बड़ी सामग्री के आसपास रैपर के माता-पिता को जोड़ने के लिए है (अतिप्रवाह के साथ सेट: ऑटो;)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.