2 sütun div düzeni: sabit genişlikte sağ sütun, sol sıvı


158

Benim gereksinimim basit: doğru olanın sabit bir boyuta sahip olduğu 2 sütun . Ne yazık ki ne yığın akışında ne de Google'da çalışan bir çözüm bulamadım. Kendi bağlamımda uygularsam, orada açıklanan her çözüm başarısız olur. Mevcut çözüm:

div.container {
    position: fixed;
    float: left;
    top: 100px;
    width: 100%;
    clear: both;
}

#content {
    margin-right: 265px;
}

#right {
    float: right;
    width: 225px;
    margin-left: -225px;
}

#right, #content {
    height: 1%; /* fixed for IE, although doesn't seem to work */
    padding: 20px;
}
<div class="container">
    <div id="content">
        fooburg content
    </div>
    <div id="right">
        test right
    </div>
</div>

Yukarıdaki kod ile aşağıdaki olsun:

|----------------------- -------|
| fooburg content  |            |
|-------------------------------|
|                  | test right | 
|----------------------- -------|

Tavsiye lütfen. Çok teşekkürler!

Yanıtlar:


268

Sol sütundaki şamandırayı çıkarın.

HTML kodunda, sağ sütunun sol sütundan önce gelmesi gerekir.

Sağda kayan nokta (ve genişlik) varsa ve sol sütunda genişlik yoksa kayan nokta yoksa esnek olacaktır :)

Ayrıca overflow: hiddendış div'e bir ve bir miktar yükseklik uygulayın (otomatik olabilir), böylece her iki iç divı çevreler.

Son olarak, sol sütuna a ekleyin width: autove overflow: hiddenbu sol sütunu sağ sütundan bağımsız hale getirir (örneğin, tarayıcı penceresini yeniden boyutlandırdıysanız ve sağ sütun sol sütuna dokunduysanız, bu özellikler olmadan, sol sütun çalışır doğru özellikleri ile, bu özellikleri ile kendi alanında kalır).

Örnek HTML:

<div class="container">
    <div class="right">
        right content fixed width
    </div>
    <div class="left">
        left content flexible width
    </div>
</div>

CSS:

.container {
   height: auto;
   overflow: hidden;
}

.right {
    width: 180px;
    float: right;
    background: #aafed6;
}

.left {
    float: none; /* not needed, just for clarification */
    background: #e8f6fe;
    /* the next props are meant to keep this block independent from the other floated one */
    width: auto;
    overflow: hidden;
}​​

Burada örnek: http://jsfiddle.net/jackJoe/fxWg7/


2
@Mir A clear: both içindeki sütunların herhangi dışında yüzer etkilemez. Temizliği sütunlar arasında sütunların aynı düzeyine yerleştirmediğiniz sürece bu "kırılgan" değildir , sonuna yerleştirirseniz zarar verilmez.
jackJoe

6
Adam'ın örneğini kullanmayı düşünürdüm. Html işaretlemenizde sağ sütunu sol sütundan önce koymanın iyi bir fikir olduğunu düşünmüyorum.
Danny_Joris

1
@Danny_Joris Kabul ediyorum. Ayrıca, medya sorguları kullanıyorsanız, sağ sütunu sol sütunun altına itmek artık zor
andrewtweber

2
Nasıl çalıştığını merak edenler için, burada bir açıklama bulabilirsiniz: stackoverflow.com/questions/25475822/…
Hashem Qolami

1
Sol sütten SONRA sağ sütuna sahip olmanın bir yolu olup olmadığını merak ediyorum, böylece düzgün bir şekilde istifleniyor (flexbox kullanmadan)
Dominic

71

Bkz. Http://www.alistapart.com/articles/negativemargins/ , tam da ihtiyacınız olan şey budur ( örnek 4 ).

<div id="container">
    <div id="content">
        <h1>content</h1>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.  Phasellus varius eleifend tellus. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nulla facilisi. Sed wisi lectus, placerat nec, mollis quis, posuere eget, arcu.</p>
        <p class="last">Donec euismod. Praesent mauris mi, adipiscing non, mollis eget, adipiscing ac, erat. Integer nonummy mauris sit amet metus. In adipiscing, ligula ultrices dictum vehicula, eros turpis lacinia libero, sed aliquet urna diam sed tellus. Etiam semper sapien eget metus.</p>
    </div>
</div>

<div id="sidebar">
    <h1>sidebar</h1>
    <ul>
        <li>link one</li>
        <li>link two</li>
    </ul>
</div>

#container {
    width: 100%;
    background: #f1f2ea url(background.gif) repeat-y right;
    float: left;
    margin-right: -200px;
}
#content {
    background: #f1f2ea;
    margin-right: 200px;
}
#sidebar {
    width: 200px;
    float: right;

1
Fantastik, basit bir çözüm ve doğru HTML sırasını da tutar!
user1794295

3
İşaretleme doğru sırada olduğu için bu, kabul edilen çözümden daha iyidir.
Petri Lehtinen

Bunu bilmiyordum. Bunu nasıl bilmiyordum. Mükemmel! Bütün 'sıvı girişi, sabit genişlikli arama düğmesi' yapmaya çalışıyorum ve kaynak sırası burada gerçekten önemli. Bu çiviler. Teşekkürler!
Malabar Front

Bu çözümü beğendim çünkü mobil kesme noktası gel, sağ sütunlar / kenar çubuğu sol sütun içeriğinin altında görünmeyecek.
dougtesting.net

Bu yöntemle yukarı gitmek için doğru sütun alamadım.
mulllhausen

29

Sağ sütunu soldan önce yerleştirmekten kaçınmak için en iyisi, sadece negatif bir sağ kenar boşluğu kullanın.

Ve bir @media ayarı ekleyerek "duyarlı" olun, böylece sağ sütun dar ekranlarda solun altına düşer.

<div style="background: #f1f2ea;">
  <div id="container">
    <div id="content">
        <strong>Column 1 - content</strong>
    </div>
  </div>
  <div id="sidebar">
    <strong>Column 2 - sidebar</strong>
  </div>
<div style="clear:both"></div>

<style type="text/css">
#container {
    margin-right: -300px;
    float:left;
    width:100%;
}
#content {
    margin-right: 320px; /* 20px added for center margin */
}
#sidebar {
    width:300px;
    float:left
}
@media (max-width: 480px) {
    #container {
        margin-right:0px;
        margin-bottom:20px;
    }
    #content {
        margin-right:0px;
        width:100%;
    }
    #sidebar {
        clear:left;
    }
}
</style>

1
Harika bir çözüm. HTML'de solun sağ altında kalmak, solun daha önemli içeriğe sahip olduğu bloglar gibi düzenler için çok önemlidir.
Jake

3
Mükemmel cevap! İşte Codepen üzerinde çalışan bir örnek: codepen.io/martinkrulltott/pen/yNxezM
Martin

11

Kullanmak için şimdiye kadarki en basit ve en esnek çözümtable display :

HTML, sol div önce gelir, sağ div ikinci gelir ... soldan sağa okur ve yazarız, bu nedenle div'leri sağdan sola yerleştirmek hiç mantıklı olmaz

<div class="container">
    <div class="left">
        left content flexible width
    </div>
    <div class="right">
        right content fixed width
    </div>
</div>

CSS:

.container {
  display: table;
  width: 100%;
}

.left {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}​​

.right {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}

Vaka örnekleri:

// One div is 150px fixed width ; the other takes the rest of the width
.left {width: 150px} .right {width: 100%}

// One div is auto to its inner width ; the other takes the rest of the width
.left {width: 100%} .right {width: auto}

Güzel, iyi çalıştı teşekkürler. Bazen flexbox'ın uygulanabilir bir alternatif olmadığı durumlarda tablolar için bir zaman ve yer vardır. Düzgün yerleştirilmeyen DOM'da daha önce doğru içeriği koymak yerine ..
Dominic

1
Bunun 'temiz' bir çözüm olmasını seviyorum. Ancak, div'larınızı tablo hücresi moduna geçirmeyle ilgili tek sorun, Tables & Tds'yi de kullanabilmenizdir. Ve taşma kaydırma gibi özellikleri
kaybedeceksiniz

Bu haksızlıktır, çünkü bu çözüm en azından anlamsal olarak doğru ve sadece RWD tekniklerine karşı dosttur, ancak bir s tableile kullanmak tdkesinlikle değildir!
ianp

Bu yöntem, bir ortam sorgusunun, sütunlar daralırsa Tabloyu normal bir div için bırakmasına kolayca izin verir. Güzel ve temiz. Severim.
AnthonyVO

6

Henüz bahsedilmeyen bir çözüm önermek istiyorum: CSS3'leri calc()karıştırmak %ve pxbirimleri kullanmak için kullanın . günümüzde mükemmel bir desteğecalc() sahiptir ve oldukça karmaşık düzenlerin hızlı bir şekilde yapılmasına izin verir.

İşte aşağıdaki kod için bir JSFiddle bağlantısı.

HTML:

<div class="sidebar">
  sidebar fixed width
</div>
<div class="content">
  content flexible width
</div>

CSS:

.sidebar {
    width: 180px;
    float: right;
    background: green;
}

.content {
    width: calc(100% - 180px);
    background: orange;
}

Ve işte bu kavramın daha karmaşık bir düzene uygulandığını gösteren başka bir JSFiddle . SCSS'yi burada değişkenleri esnek ve kendi kendini tanımlayan koda izin verdiğinden kullandım, ancak "sabit kodlanmış" değerlere sahip bir sorun yoksa düzen saf CSS'de kolayca yeniden oluşturulabilir.


2

Bu genel, HTML kaynak siparişli bir çözümdür:

  • Kaynak düzenindeki ilk sütun sıvıdır
  • Kaynak düzenindeki ikinci sütun düzeltildi
    • Bu sütun CSS kullanılarak sola veya sağa kaydırılabilir

Sağ taraftaki Sabit / İkinci Sütun

#wrapper {
  margin-right: 200px;
}
#content {
  float: left;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: right;
  width: 200px;
  margin-right: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

Soldaki Sabit / İkinci Sütun

#wrapper {
  margin-left: 200px;
}
#content {
  float: right;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: left;
  width: 200px;
  margin-left: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

Alternatif çözüm display kullanmaktır : table-cell ; eşit yükseklik sütunlarına neden olur.


sağdaki ikinci sütun çalışmaz. sol sütunda metin doluysa, sağ sütununuz yeni bir satır olarak görüntülenir.
TomSawyer

daha fazla içerik koyup yeniden boyutlandırmayı denediniz mi? sadece kodunuzu test etti ve çalışmadı.
TomSawyer

@TomSawyer Neden bahsettiğinizden emin değilim. Daha fazla içerik koymaya çalışıyorum: jsfiddle.net/salman/mva6cnxL ve jsfiddle.net/salman/mva6cnxL/1 . Kusursuz çalışır.
Salman A

Tam aradığım şey. Teşekkürler

0

Hey, yapabileceğiniz her iki kapsayıcıya sabit bir genişlik uygulamak ve daha sonra açık olan başka bir div sınıfı kullanmaktır:

div#left {

width: 600px;
float: left;
}

div#right {

width: 240px;
float: right;

}

div.clear {

clear:both;

}

sol ve sağ kabın altına açık bir div yerleştirin.


-3

Basitleştirdim: Jackjoe'un cevabını düzenledim. Yükseklik otomatik vb gerekli sanmıyorum.

CSS:

#container {
position: relative;
margin:0 auto;
width: 1000px;
background: #C63;
padding: 10px;
}

#leftCol {
background: #e8f6fe;
width: auto;
}

#rightCol {
float:right;
width:30%;
background: #aafed6;
}

.box {
position:relative;
clear:both;
background:#F39;
 }
</style>

HTML:

<div id="container">

  <div id="rightCol"> 
   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
 </div>

 <div id="leftCol">

   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

Lorem ipsum dolor sit amet, seçmenler adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consipetuer adipiscing elit.Phasellus varius eleifend.

</div>

</div>

<div class="box">
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
</div>

Orijinal soru sabit boyutlu doğru bir sütun istiyor.
Dr.Aaron Dishno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.