Bootstrap 3.0 - Fluid Grid ที่มีขนาดคอลัมน์คงที่


126

ฉันกำลังเรียนรู้วิธีใช้ Bootstrap ตอนนี้ฉันกำลังลุยเลย์เอาต์อยู่ แม้ว่า Bootstrap จะดูดี แต่ทุกอย่างที่ฉันเห็นก็ดูล้าสมัย สำหรับชีวิตของฉันฉันมีสิ่งที่ฉันคิดว่าเป็นเค้าโครงพื้นฐานที่ฉันคิดไม่ออก เค้าโครงของฉันมีลักษณะดังต่อไปนี้:

---------------------------------------------------------------------------
|       |       |                                                         |
|       |       |                                                         |
| 240px | 160px | All Remaining Width of the Window                       |
|       |       |                                                         |
|       |       |                                                         |
--------------------------------------------------------------------------|

เส้นตารางนี้ต้องใช้ความสูงเต็มของหน้าต่าง จากความเข้าใจของฉันฉันต้องผสมความกว้างคงที่และของไหล อย่างไรก็ตาม Bootstrap 3.0 ดูเหมือนจะไม่มีคลาสของเหลวอีกต่อไป แม้ว่าจะเป็นเช่นนั้น แต่ฉันก็ไม่สามารถหาวิธีผสมของไหลกับขนาดคอลัมน์คงที่ได้ ไม่มีใครรู้วิธีทำใน Bootstrap 3.0?


พิจารณาการใช้ตารางข้างแถวและคอลัมน์
kalu

นี่คือตัวอย่างของเหลวคงที่สำหรับ Bootstrap 3: codeply.com/go/GN4QinVrjI
Zim

คำตอบ:


32

ไม่มีวิธีง่ายๆในการผสมของไหลและความกว้างคงที่กับ Bootstrap 3 ซึ่งหมายความว่าจะเป็นเช่นนี้เนื่องจากระบบกริดได้รับการออกแบบให้เป็นสิ่งที่ลื่นไหลและตอบสนองได้ดี คุณสามารถลองแฮ็กอะไรบางอย่างได้ แต่มันจะขัดกับสิ่งที่ระบบ Responsive Grid กำลังพยายามทำซึ่งมีจุดประสงค์เพื่อให้เลย์เอาต์นั้นไหลผ่านอุปกรณ์ประเภทต่างๆ

หากคุณต้องการยึดติดกับเลย์เอาต์นี้ฉันจะพิจารณาจัดวางเพจของคุณด้วย CSS ที่กำหนดเองและไม่ใช้กริด


5
ฉันเดาว่าเรื่องแบบนี้จะต้องรอให้ Flexbox รองรับอย่างเต็มที่ แต่ก็ยังง่อยอยู่จริงๆ โมเดลของ Bootstrap นั้นยอดเยี่ยมเมื่อจำนวนคอลัมน์คงที่ แต่เช่นหากคุณสามารถซ่อนและแสดงคอลัมน์แบบไดนามิกได้การสนับสนุนอย่างน้อยหนึ่งคอลัมน์เพื่อให้เป็นของเหลวจะเริ่มมีความสมเหตุสมผลมากขึ้น
Nate Bundy

1
โปรดแก้ไขคำตอบของคุณเพื่อรวมการอ้างอิงลิงก์นี้พร้อมกับโซลูชัน ขอแสดงความนับถือ: stackoverflow.com/questions/8740779/…
Morty

151

แก้ไข:เนื่องจากผู้คนจำนวนมากดูเหมือนจะต้องการทำสิ่งนี้ฉันได้เขียนคำแนะนำสั้น ๆ พร้อมกรณีการใช้งานทั่วไปที่นี่https://www.atlascode.com/bootstrap-fixed-width-sidebars/ https://www.atlascode.com/bootstrap-fixed-width-sidebars/หวังว่าจะช่วยได้

ระบบกริด bootstrap3 รองรับการซ้อนแถวซึ่งช่วยให้คุณปรับแถวรูทเพื่อให้เมนูด้านข้างมีความกว้างคงที่

คุณต้องวางช่องว่างภายในแถวรูทด้านซ้ายจากนั้นมีแถวลูกซึ่งมีองค์ประกอบเค้าโครงตารางปกติของคุณ

นี่คือวิธีที่ฉันมักจะทำ http://jsfiddle.net/u9gjjebj/

HTML

<div class="container">
    <div class="row">
        <div class="col-fixed-240">Fixed 240px</div>
        <div class="col-fixed-160">Fixed 160px</div>
        <div class="col-md-12 col-offset-400">
            <div class="row">
            Standard grid system content here
            </div>
        </div>
    </div>
</div>

CSS

.col-fixed-240{
    width:240px;
    background:red;
    position:fixed;
    height:100%;
    z-index:1;
}

.col-fixed-160{
    margin-left:240px;
    width:160px;
    background:blue;
    position:fixed;
    height:100%;
    z-index:1;
}

.col-offset-400{
    padding-left:415px;
    z-index:0;
}

อันนี้ดี แต่ถ้าคุณใส่ไว้ในคอลัมน์คงที่เช่นนี้ <p> <a class="btn btn-default" href="#" role="button"> ดูรายละเอียด & raquo; </a> </p> หรือ Bootstrap dropdown สิ่งเหล่านี้จะไม่ทำงานในคอลัมน์คงที่ มีวิธีแก้ไขหรือไม่?
Vaclav Elias

@VaclavElias ลองใส่ค่าต่างขนาดเต็มด้วยตำแหน่ง: สัมพัทธ์แล้วดรอปดาวน์? จะช่วยได้ถ้าคุณสร้าง jsfiddle เพื่อแสดงปัญหา
w00t

ฉันยังไม่เห็นวิธีการทำงานในเบราว์เซอร์ทั้งหมด แต่อย่างอื่นทำได้ดีทำได้ดี
Phil Cooper

มีวิธีดำเนินการกับคอลัมน์คงที่ทางด้านขวามือหรือไม่?
Sean

3
position: fixedหมายความว่าเมื่อเลื่อนเนื้อหาของคอลัมน์นั้นจะลอยอยู่เหนือส่วนที่เหลือของหน้า ในกรณีของฉันฉันแก้ไขโดยใช้position: absolute.
laurent

26

หรือใช้คุณสมบัติการแสดงผลกับเซลล์ตาราง

CSS

.table-layout {
    display:table;
    width:100%;
}
.table-layout .table-cell {
    display:table-cell;
    border:solid 1px #ccc;
}

.fixed-width-200 {
    width:200px;
}

HTML

<div class="table-layout">
    <div class="table-cell fixed-width-200">
        <p>fixed width div</p>
    </div>
    <div class="table-cell">
        <p>fluid width div</p>    
    </div>
</div>

http://jsfiddle.net/DnGDz/


1
ปัญหาคือเมื่อคุณกำลังใช้อดีต ".visible-xs , becouse display: table-cell` become display:block...
Dariusz Filipiak

21

ฉันมีปัญหาที่แตกต่างกันเล็กน้อย:

  • ฉันต้องการรวมคอลัมน์คงที่และแบบไหลเป็นส่วนหนึ่งของตารางแทนที่จะเป็นส่วนหนึ่งของเลย์เอาต์แบบเต็มหน้าต่าง
  • ฉันต้องแก้ไขคอลัมน์ทั้งทางซ้ายและขวา
  • ฉันไม่กังวลเกี่ยวกับพื้นหลังคอลัมน์ที่ใช้ความสูงเต็มของแถวที่มี

เป็นผลให้ฉันหันไปfloatหาคอลัมน์ซ้ายและขวาจากนั้นสามารถใช้ Bootstrap rowเพื่อทำคอลัมน์ของไหลระหว่างนั้น

<div>
    <div class="pull-left" style="width:240px">Fixed 240px</div>
    <div class="pull-right" style="width:120px">Fixed 120px</div>
    <div style="margin-left:240px;margin-right:120px">
        <div class="row" style="margin:0px">
            Standard grid system content here
        </div>
    </div>
</div>

4
@Schemetrical ฉันไม่ได้มีคำถาม ฉันอธิบายว่าฉันมีปัญหาที่แตกต่างกันเล็กน้อยและเพิ่มวิธีแก้ปัญหาที่ฉันได้มาเพื่อช่วยเหลือผู้อื่นที่มาถึงที่นี่จาก Google
Paddy Mann

1
คำตอบของคุณมีค่ามาก ค่อนข้างง่าย แต่แก้ปัญหาของฉัน ขอบคุณมาก.
Charles

ทำไมคุณไม่สามารถให้แถว div ระยะขอบที่ div มีอยู่ในคำตอบของคุณ
GreenAsJade

คำตอบนี้ถูกต้องตามกฎหมายอย่างจริงจัง หากคุณต้องการใช้คอลัมน์ bootstrap แต่ไม่ต้องการให้คอลัมน์เหล่านั้นยุบตามความกว้างของหน้าจอนี่คือสิ่งที่คุณต้องการ (ใช้ pull-left / pull-right แทน col-md-3 เป็นต้น)
แซม

ดูเหมือนจะเป็นคำตอบที่ดี ฉันมีปัญหาบางอย่างกับฉันmarginและpaddingในแถวของฉันอยู่ตรงกลาง แต่ที่ควรเป็นปัญหา solveable ผลที่ตามมาโดยไม่ได้ตั้งใจของการใช้แนวทางนี้คืออะไร?
Vishal

15

อัปเดต 2018

IMO วิธีที่ดีที่สุดในการเข้าถึงสิ่งนี้ใน Bootstrap 3 คือการใช้แบบสอบถามสื่อที่สอดคล้องกับเบรกพอยต์ของ Bootstrap เพื่อให้คุณใช้เฉพาะคอลัมน์ที่มีความกว้างคงที่ซึ่งเป็นหน้าจอที่ใหญ่ขึ้นจากนั้นจึงปล่อยให้เลย์เอาต์ซ้อนกันแบบตอบสนองบนหน้าจอขนาดเล็ก ด้วยวิธีนี้คุณสามารถตอบสนอง ...

@media (min-width:768px) {
  #sidebar {
      width: inherit;
      min-width: 240px;
      max-width: 240px;
      min-height: 100%;
      position:relative;
  }
  #sidebar2 {
      min-width: 160px;
      max-width: 160px;
      min-height: 100%;
      position:relative;
  }
  #main {
      width:calc(100% - 400px);
  }
}

Working Bootstrap Fixed-Fluid Demo

Bootstrap 4จะมี flexbox ดังนั้นรูปแบบเช่นนี้จะง่ายขึ้นมาก: http://www.codeply.com/go/eAYKvDkiGw


3

ตกลงคำตอบของฉันดีมาก:

<style>
    #wrapper {
        display:flex;    
        width:100%;
        align-content: streach;
        justify-content: space-between;
    }    

    #wrapper div {
        height:100px;
    }

    .static240 {
        flex: 0 0 240px;
    }
    .static160 {
        flex: 0 0 160px;
    }

    .growMax {
        flex-grow: 1;
    }

</style>

<div id="wrapper">
  <div class="static240" style="background:red;" > </div>
  <div class="static160"  style="background: green;" > </div> 
  <div class="growMax"  style="background:yellow;"  ></div>
</div>

jsfiddle สนามเด็กเล่น

หากคุณต้องการรองรับเบราว์เซอร์ทั้งหมดให้ใช้https://github.com/10up/flexibility


1

อัปเดต 2014-11-14: โซลูชันด้านล่างเก่าเกินไปฉันแนะนำให้ใช้วิธีการจัดวางกล่องแบบยืดหยุ่น นี่คือภาพรวม: http://learnlayout.com/flexbox.html


ทางออกของฉัน

HTML

<li class="grid-list-header row-cw row-cw-msg-list ...">
  <div class="col-md-1 col-cw col-cw-name">
  <div class="col-md-1 col-cw col-cw-keyword">
  <div class="col-md-1 col-cw col-cw-reply">
  <div class="col-md-1 col-cw col-cw-action">
</li>

<li class="grid-list-item row-cw row-cw-msg-list ...">
  <div class="col-md-1 col-cw col-cw-name">
  <div class="col-md-1 col-cw col-cw-keyword">
  <div class="col-md-1 col-cw col-cw-reply">
  <div class="col-md-1 col-cw col-cw-action">
</li>

SCSS

.row-cw {
  position: relative;
}

.col-cw {
  position: absolute;
  top: 0;
}


.ir-msg-list {

  $col-reply-width: 140px;
  $col-action-width: 130px;

  .row-cw-msg-list {
    padding-right: $col-reply-width + $col-action-width;
  }

  .col-cw-name {
    width: 50%;
  }

  .col-cw-keyword {
    width: 50%;
  }

  .col-cw-reply {
    width: $col-reply-width;
    right: $col-action-width;
  }

  .col-cw-action {
    width: $col-action-width;
    right: 0;
  }
}

โดยไม่ต้องแก้ไขโค้ดเลย์เอาต์ bootstrap มากเกินไป


อัปเดต (ไม่ใช่จาก OP):การเพิ่มข้อมูลโค้ดด้านล่างเพื่อให้เข้าใจคำตอบนี้ได้ง่ายขึ้น แต่ดูเหมือนจะไม่ได้ผลเท่าที่ควร


-1 คำตอบนี้ไม่สมเหตุสมผลสำหรับฉัน คอลัมน์ไม่รวมคอลัมน์ชื่อและแป้นพิมพ์ถึง 12 คอลัมน์ทับซ้อนกัน ฉันไม่เข้าใจว่ามันมีคะแนนโหวต +2 ได้อย่างไร
Mariano Desanze

-3

ทำไมไม่ตั้งค่าสองคอลัมน์ทางซ้ายเป็นค่าคงที่ด้วย css ของคุณเองแล้วสร้างเค้าโครงกริดใหม่ของคอลัมน์ทั้ง 12 คอลัมน์สำหรับเนื้อหาที่เหลือ

<div class="row">
    <div class="fixed-1">Left 1</div>
    <div class="fixed-2">Left 2</div>
    <div class="row">
        <div class="col-md-1"></div>
        <div class="col-md-11"></div>
    </div>
</div>

ใน Bootstrap คอลัมน์เท่านั้นที่สามารถเป็นชายด์ของแถวได้
Sai Dubbaka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.