উপচে পড়া সামগ্রী সহ একটি ফ্লেক্সবক্স স্ক্রোল করা


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

আমি এ সম্পর্কে ট্যাব অ্যাটকিন্স (ফ্লেক্সবক্স স্পিকারের লেখক) এর সাথে কথা বলেছি এবং এটিই আমরা এনেছি:

এইচটিএমএল:

<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% ফায়ারফক্সে (যদিও ক্রোমে নেই) আপনার প্রসারিত-এমনকি-কলামগুলি হ'ল সংক্ষিপ্ত সমস্যাটি স্থির করে। নিশ্চিত না হ'ল এটি যদি কোনও ক্রোম বাগ বা ফায়ারফক্স বাগ হয়।
olোলবার্ট

1
@ দহলবার্ট - ট্যাব অ্যাটকিন্স আমাকে এতে সাহায্য করেছে। আমি আমার উত্তর আপডেট করেছি।
জোসেফ সিলবার

3
নোট করুন যে ফায়ারফক্স বর্তমানে প্রস্থের মানগুলির জন্য "মিনি-সামগ্রী" সমর্থন করে, উচ্চতার মান নয় - সুতরাং এটি আপনার পক্ষে বিবেচিত হলে ফায়ারফক্সে কাজ করবে না। (উদাহরণস্বরূপ bugzilla.mozilla.org/show_bug.cgi?id=852367 দেখুন )
hোলবার্ট

2
@ olোলবার্ট - এই কলমের সমস্যাটি হ'ল তারা প্রকাশ্য ছিল, তাই যে কেউ এগুলি পরিবর্তন করতে পারে। আমি তাদের মালিকানা নিয়েছি, সুতরাং আপনি এখানে যান: codepen.io/ জোসেফসিলবার
জোসেফ সিলবার

5
হ্যাঁ, এটি
স্টিভ

119

আমি অনেক পরীক্ষার এবং ত্রুটির পরেও খুব সুন্দরভাবে এই সমস্যাটি সমাধান করেছি।

আমার ব্লগ পোস্টটি দেখুন: http://geon.github.io/programming/2016/02/24/flexbox-full-page-web-app-layout

মূলত, একটি ফ্লেক্সবক্স সেলটি স্ক্রোলযোগ্য করতে আপনাকে এর সমস্ত পিতামাতাকে তৈরি করতে হবে overflow: hidden;, বা এটি কেবল আপনার ওভারফ্লো সেটিংসকে উপেক্ষা করবে এবং পরিবর্তে পিতামাতাকে আরও বড় করবে।


11
এটি আমার ক্ষেত্রেও কাজ করেছে, তবে বাহ, আমি কেন এটি কাজ করে তার একটি ব্যাখ্যা দেখতে চাই । বেশিরভাগ সময়, আমি সিএসএস স্পেসগুলি এই ধরণের জিনিসটির জন্য সম্পূর্ণ অনির্বচনীয় বলে মনে করি।
মার্কিয়ান

2
আপনার ব্লগ পোস্ট থেকে: "কেন এটি কাজ করে সে সম্পর্কে আমার কোনও ধারণা নেই, এবং চশমাগুলি কিছুই বলে না" । সুতরাং, আমি কেন এটি কাজ করে তার ব্যাখ্যা খুঁজছি। আমি চশমাগুলিকে ঝাঁকিয়েছি, কিন্তু যেমন আপনি বলেছিলেন, কিছুই সেখানে লাফ দেয় না।
মার্কিয়ান

3
এটি সম্পর্কে আরও কিছু চিন্তা করার পরে, আমি এটি বোধ করি বলে মনে করি। ডিফল্ট আচরণটি প্রতিটি ডিভের সমস্ত শিশুকে ধারণ করার জন্য এটি প্রসারিত করা হয়, সুতরাং পাতার নোডগুলিতে কোনও ওভারফ্লো হবে না। আপনাকে ওভারফ্লো জোর করতে হবে: ডিওএমের শীর্ষ থেকে সমস্ত উপায়ে লুকানো রয়েছে, সুতরাং কোনও পিতামাতাই আপনার সন্তানদের সংযুক্ত করার সুযোগ পাবেন না যতক্ষণ না আপনি নোডে নামবেন না যেখানে আপনি উপচে পড়া এবং স্ক্রোল করতে চান।
জিওন

3
আমি নিশ্চিত নই যে এটি সত্যই ব্যাখ্যা করেছে। কোনও উপাদানকে লুকিয়ে রেখে ওভারফ্লো সেট করা এটির সমস্ত বাচ্চা, এএফএআইকে ধারণ করে এটি প্রসারিত হতে বাধা দেয় না। এমডিএন-এর মতে: "ওভারফ্লো সম্পত্তিটি ক্লিপ করতে হবে কিনা তা নির্দিষ্ট করে, স্ক্রোলবারগুলি রেন্ডার করবে বা কেবল কন্টেন্ট প্রদর্শন করবে যখন এটি ব্লক স্তরের ধারককে উপচে ফেলেছে।" অতিরিক্তভাবে, দৃশ্যমান ব্যতীত অন্য কোনওটিতে ওভারফ্লো সেট করা একটি নতুন ব্লক ফর্ম্যাটিং প্রসঙ্গ তৈরি করে - তবে এটি প্রাসঙ্গিক হতে পারে না, কারণ ফ্লেক্স পাত্রে ইতিমধ্যে তাদের নিজস্ব ব্লক ফর্ম্যাটিং প্রসঙ্গ তৈরি করে: ডেভেলপার.মোজিলা.আর / ইউএস / ডকস / ওয়েবে / গুয়াইড / সিএসএস /…
মার্কিয়ান

1
আমার যুক্ত হওয়া উচিত যে আমি আপনার ব্যাখ্যাটি স্বজ্ঞাত জ্ঞান তৈরির সাথে সম্মত , তবে আমি মনে করি না এটি একটি সঠিক প্রযুক্তিগত ব্যাখ্যা, যা আমি চাই। শুধুমাত্র সত্যিকারের কারণটি বুঝতে পারলে আমি সমাধানটি ভবিষ্যতে মনে করতে সক্ষম হব!
মার্কিয়ান

55

নিয়ে কাজ করা position:absolute;সহ flex:

এর সাথে ফ্লেক্স আইটেমটি অবস্থান করুন position: relative। এর অভ্যন্তরে এর <div>সাথে আরও একটি উপাদান যুক্ত করুন :

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

এটি উপাদানটিকে তার আপেক্ষিক-অবস্থানযুক্ত পিতামাতার সীমানায় প্রসারিত করে, তবে এটি প্রসারিত করতে দেয় না। ভিতরে, overflow: auto;তারপরে প্রত্যাশা অনুযায়ী কাজ করবে।

  • উত্তরে কোড স্নিপেট অন্তর্ভুক্ত - স্নিপেট ওআর চালানোর পরে ক্লিক করুন এখানে চিত্র বর্ণনা লিখুনএবং তারপরে ক্লিক করুনপুরো পাতা
  • কোডপেনের জন্য এখানে ক্লিক করুন
  • ফলাফল: এখানে চিত্র বর্ণনা লিখুন

.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" ব্যবহার করার সময় আপনার খুব সতর্ক হওয়া উচিত। একটি ইউআরএল বারের উচ্চতা বিবেচনা করে এবং অন্যটি তা গ্রহণ করে না।
সান অ্যান্ডারসন

7

এটি যুক্ত করুন:

align-items: flex-start;

জন্য নিয়ম .content {}। এটি আমার জন্য এটি আপনার কলমে ঠিক করে দেয়, কমপক্ষে (ফায়ারফক্স এবং ক্রোম উভয় ক্ষেত্রে)।

ডিফল্টরূপে, .contentআছে align-items: stretch, যা এটি তার নিজস্ব উচ্চতা বাচ্চাদের সমস্ত নিজের আকারের সাথে মাপতে আকার দেয়, প্রতি http://dev.w3.org/csswg/css-flexbox/#algo-stretch । বিপরীতে, মানটি flex-startবাচ্চাদের তাদের নিজস্ব উচ্চতাগুলি গণনা করতে দেয় এবং এটিকে তার প্রারম্ভের প্রান্তে সংযুক্ত করে (এবং উপচে পড়া এবং একটি স্ক্রোলবার ট্রিগার করে)।



এছাড়াও, কলামগুলি আর সমান উচ্চতা হবে না, যা ফ্লেক্সবক্সের অন্যতম প্রধান আকর্ষণ।
জোসেফ সিলবার 4'14

ঠিক আছে. এটি আমার কাছে পরিষ্কার ছিল না যে এটি একটি ডিজাইনের সীমাবদ্ধতা ছিল - দুঃখিত।
hোলবার্ট

দুর্দান্ত পরামর্শ
ভ্লাদ

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>

এবং এখানে এইচটিএমএল:

<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;বিষয়বস্তু মোড়কে স্ক্রোলযোগ্য করার জন্য। বিষয়বস্তুতে যুক্ত করা।

তদ্ব্যতীত, overflowedএই কোডেকটির মতো ফ্লেক্সবক্স মোড়ক এবং স্ক্রোলযোগ্য সামগ্রী সহ এমন পরিস্থিতি রয়েছে

সমাধানটি overflow: hidden (or auto);বড় সামগ্রীর চারপাশে মোড়ক (ওভারফ্লো: অটোর সাথে সেট করুন) এর পিতামাতার সাথে যুক্ত করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.