2015-07-01 11 views
5

Sto cercando di ottenere il seguente layout, come da screenshot.Layout con CSS (o dovrei rinunciare e utilizzare tabelle?)

Layout using tables

caratteristiche principali sono

  • schermo diviso in 3 regioni (colonne);
  • Le colonne sinistra/destra sono a larghezza fissa;
  • colonna Medio espande secondo Browser larghezza
  • colonna destra è suddivisa in due regioni
  • regione di fondo è di dimensioni fisse, sempre nella parte inferiore
  • regione superiore espande secondo altezza Browser

Uso Le tabelle HTML mi hanno impiegato circa 2 ore per generare lo screenshot sopra, con le funzionalità di cui sopra.

Dopo l'imbottitura in giro con i CSS per due giorni, non posso farlo guardando come sopra, il mio tentativo di CSS e associata screenshot seguire qui sotto:

<html> 
<head> 
    <title>My Layout</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <style type="text/css"> 
    body{ 
     height:100%; 
     background:beige; 
    } 

    #header { 
     width:100%; 
     height:60px; 
     text-align:center; 
     background:#A7C942; 
     color:#fff; 
     float:left; 
     font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 
     font-size:2em; 
    } 

    #leftDiv { 
     float:left; 
     width:150px; 
     height:90%; 
     background:aquamarine; 
    } 
    #midDiv { 
     float:left; 
     width:auto; 
     height:90%; 
     background:lightsalmon; 
     display:block; 
    } 
    #rightDiv { 
     float:right; 
     width:365px; 
     height:90%; 
     background:green; 
     display:block; 
    } 


    #topRow { 
     background-color:lightgoldenrodyellow; 
    } 

    #bottomRow { 
     background-color:lightpink; 
     height:200px; 
    } 
    </style> 
</head> 

<body> 
<div id="body"> 
    <div id="main"> 
     <div id="header">my header</div> 

     <div id="leftDiv"> 
      <p>LEFT</p> 
     </div> 

     <div id="midDiv"> 
      <p>MIDDLE</p> 
     </div> 

     <div id="rightDiv"> 
      <p>RIGHT</p> 
      <div id="topRow"> 
       TOP 
      </div> 
      <div id="bottomRow"> 
       BOTTOM 
      </div> 
     </div> 
    </div> 
</div> 
</body> 
</html> 

Schermata con i CSS: Layout using CSS

Problemi con il tentativo di CSS è:

  • La colonna centrale non si espande (parte color salmone);
  • invece il colore bianco appare dal nulla;
  • non può arrivare regione rosa per rimanere in fondo sempre
  • Avvio impossibile regione gialla di allungare su e giù
  • involucro indesiderati (cioè la regione di destra va sotto a sinistra, le regioni centrali)

Pertanto, io sto per scatenare la mia soluzione utilizzando tabelle, a meno che qualche fanatico CSS die-hard viene in soccorso con una risposta di lavoro :-)

aggiornamento grandi risposte, al momento di questo aggiornamento ce n'erano 4. Ho provato tutti e 4 su Firefox e Chrome, e ogni risposta è accettabile. Ma posso sceglierne solo una come risposta accettata, e andrò con quella che è semplice e semplice usando solo css e posizionamento assoluto (senza flexbox né css-tables).

Grazie mille a @matthewelsom, @Pangloss, @Shrinivas, @Paulie_D; Sono sicuro che chiunque si imbatta nelle tue risposte lo troverà utile per il loro caso d'uso. Upvotes per tutti, i tuoi sforzi sono apprezzati!

+2

Perché non utilizzare il bootstrap? Renderà questo più semplice e reattivo http://getbootstrap.com/css/ –

+0

@DavidChavez Sicuramente la scelta giusta qui. – codedude

+1

Domanda davvero ben fatta. Non usare il bootstrap, impara a farlo 'correttamente'! –

risposta

3

Dai un'occhiata a questo fiddle.

Esso utilizza di base CSS e HTML e NO quadro.

Gli elementi chiave che consente questo tipo di posizionamento sono queste proprietà css: left, right, top, bottom.

La demo utilizza queste proprietà.

Ecco lo snippet.

body { 
 
    background: beige; 
 
    margin: 0; 
 
} 
 
#header { 
 
    width: 100%; 
 
    height: 60px; 
 
    text-align: center; 
 
    background: #A7C942; 
 
    color: #fff; 
 
    font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 
 
    font-size: 2em; 
 
} 
 
#leftDiv { 
 
    position: absolute; 
 
    float: left; 
 
    width: 150px; 
 
    top: 60px; 
 
    bottom: 0; 
 
    background: aquamarine; 
 
} 
 
#midDiv { 
 
    position: absolute; 
 
    float: left; 
 
    top: 60px; 
 
    bottom: 0; 
 
    left: 150px; 
 
    right: 365px; 
 
    min-width: 50px; 
 
    background: lightsalmon; 
 
} 
 
#rightDiv { 
 
    position: absolute; 
 
    float: right; 
 
    width: 365px; 
 
    top: 60px; 
 
    bottom: 0; 
 
    right: 0; 
 
    background: green; 
 
} 
 
#topRow { 
 
    position: absolute; 
 
    width: 100%; 
 
    top: 0; 
 
    bottom: 50px; 
 
    min-height: 20px; 
 
    background-color: lightgoldenrodyellow; 
 
} 
 
#bottomRow { 
 
    position: absolute; 
 
    background-color: lightpink; 
 
    width: 100%; 
 
    height: 50px; 
 
    bottom: 0; 
 
}
<div id="body"> 
 
    <div id="main"> 
 
    <div id="header">my header</div> 
 
    <div id="leftDiv"> 
 
     <p>LEFT</p> 
 
    </div> 
 
    <div id="midDiv"> 
 
     <p>MIDDLE</p> 
 
    </div> 
 
    <div id="rightDiv"> 
 
     <div id="topRow">TOP</div> 
 
     <div id="bottomRow">BOTTOM</div> 
 
    </div> 
 
    </div> 
 
</div>

+0

Perché dici "senza quadro"? –

+0

@Hanoncs Shrinivas Shukla non ha utilizzato [Twitter Bootstrap] (http://getbootstrap.com), [Zurb Foundation] (http://foundation.zurb.com/) o simili per ottenere i risultati desiderati dall'OP. – hungerstar

+0

Ho notato poche persone che suggeriscono Bootstrap nella sezione commenti e non ho usato quello o qualcosa di simile. Ho appena chiarito questo. –

3

Qui andiamo al layout della tabella CSS, regolato leggermente il markup - abbiamo aggiunto un paio di contenitori <div> per applicare gli stili.

JsFiddle Demo

html, body { 
 
    height: 100%; 
 
    margin: 0; 
 
} 
 
#page, #main, #rTable { 
 
    display: table; 
 
    border-collapse: collapse; 
 
    width :100%; 
 
    height: 100%; 
 
} 
 
#page > div { 
 
    display: table-row; 
 
} 
 
#page #hRow { 
 
    background: lightgreen; 
 
    text-align: center; 
 
} 
 
#page #mRow { 
 
    height: 100%; 
 
} 
 
#main > div { 
 
    display: table-cell; 
 
    vertical-align: top; 
 
} 
 
#leftDiv { 
 
    width: 100px; 
 
    background: aquamarine; 
 
} 
 
#midDiv { 
 
    background: lightsalmon; 
 
} 
 
#rightDiv { 
 
    width: 200px; 
 
    background: green; 
 
} 
 
#rTable > div { 
 
    display: table-row; 
 
} 
 
#rTable #topRow { 
 
    background: lightgoldenrodyellow; 
 
} 
 
#rTable #bottomRow { 
 
    height: 100px; 
 
    background: lightpink; 
 
}
<div id="page"> 
 
    <div id="hRow"> 
 
     <div id="header">HEADER</div> 
 
    </div> 
 
    <div id="mRow"> 
 
     <div id="main"> 
 
      <div id="leftDiv"> 
 
       <p>LEFT</p> 
 
      </div> 
 
      <div id="midDiv"> 
 
       <p>MIDDLE</p> 
 
      </div> 
 
      <div id="rightDiv"> 
 
       <div id="rTable"> 
 
        <div id="topRow">RIGHT-TOP</div> 
 
        <div id="bottomRow">RIGHT-BOTTOM</div> 
 
       </div> 
 
      </div> 
 
     </div> 
 
    </div> 
 
</div>

3

Ecco un layout flessibile rapido, molto approssimativa, ma si otterrà l'idea. Ulteriori informazioni su Flexbox sono disponibili su CSS tricks.

Ho anche reso il design reattivo in modo che il layout riempia il 100% della larghezza su schermi con larghezza 480px.

CODEPEN HERE

html, body { 
 
    height: 100%; 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 
.wrapper { 
 
    height: 100%; 
 
    display: flex;   /* NEW, Spec - Firefox, Chrome, Opera */ 
 
    display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6, BB7 */ 
 
    display: -ms-flexbox; /* TWEENER - IE 10 */ 
 
    display: -webkit-flex; /* NEW - Safari 6.1+. iOS 7.1+, BB10 */ 
 
    
 
    -webkit-flex-direction: column; 
 
    flex-direction: column; 
 
} 
 

 
.wrapper > * { 
 
    flex: 1 100%; 
 
    -webkit-flex: 1 100%; 
 
} 
 

 
.header { 
 
    flex: 1; 
 
    -webkit-flex: 1; 
 
    
 
    background: green; 
 
    width: 100%; 
 
    max-height: 80px; 
 
} 
 

 
.below { 
 
    flex: 1; 
 
    -webkit-flex: 1; 
 
    
 
    display: flex;   
 
    display: -webkit-box; 
 
    display: -ms-flexbox; 
 
    display: -webkit-flex; 
 
    
 
    -webkit-flex-direction: row; 
 
    flex-direction: row; 
 
} 
 

 
.main { 
 
    background: deepskyblue; 
 
    flex: 3 0px; 
 
    -webkit-flex: 3 0px; 
 
    
 
    -webkit-order: 2; 
 
    order: 2; 
 
} 
 

 
.left { 
 
    background: yellow; 
 
    max-width: 100px; 
 
    flex: 1 auto; 
 
    -webkit-flex: 1 auto; 
 
    
 
    -webkit-order: 1; 
 
    order: 1; 
 
} 
 

 
.right { 
 
    background: hotpink; 
 
    max-width: 300px; 
 
    position: relative; 
 
    
 
    display: flex;   
 
    display: -webkit-box; 
 
    display: -ms-flexbox; 
 
    display: -webkit-flex; 
 
    
 
    flex: 1 auto; 
 
    -webkit-flex: 1 auto; 
 
    
 
    -webkit-order: 3; 
 
    order: 3; 
 
    
 
    -webkit-flex-direction: column; 
 
    flex-direction: column; 
 
} 
 
.top { 
 
    background: lightpink; 
 
    
 
    flex: 1 auto; 
 
    -webkit-flex: 1 auto; 
 
} 
 
.bottom { 
 
    background: salmon; 
 
    max-height: 200px; 
 
    width: 100%; 
 
    
 
    flex: 1 auto; 
 
    -webkit-flex: 1 auto; 
 
} 
 
@media screen and (max-width: 479px) { 
 
    .below { 
 
    -webkit-flex-direction: column; 
 
    flex-direction: column; 
 
    } 
 
    .left, .right, .main { 
 
    max-width: 100%; 
 
    
 
    flex: 1; 
 
    -webkit-flex: 1; 
 
    } 
 
    body, html, .wrapper { 
 
    height: auto; 
 
    } 
 
}
<div class="wrapper"> 
 
    <header class="header"><h3>Header</h3><p>Fixed height 80px, 100% width</p></header> 
 
    <div class="below"> 
 
    <article class="main"> 
 
    <h3>Flexible width Article</h3> 
 
    <p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. 
 
     Mauris placerat eleifend leo.</p> 
 
    </article> 
 
    <aside class="left"> 
 
     <h3>Left</h3> 
 
     <p>100px fixed width</p> 
 
    </aside> 
 
    <aside class="right"> 
 
    <div class="top"> 
 
     <h3>Right Top</h3> 
 
     <p>Flexible Height, Fixed width 300px</p> 
 
    </div> 
 
    <div class="bottom"> 
 
     <h3>Right Bottom</h3> 
 
     <p>Fixed width 300px, Fixed Height 200px</p> 
 
    </div> 
 
    </aside> 
 
    </div> 
 
</div>

+1

Mi piacerebbe vedere più flexbox. Vorrei solo che non avessimo quel [fastidioso scherzo di IE] (http://caniuse.com/#search=flex) da affrontare. –

+0

@ShrinivasShukla - aggiornato, typo – matthewelsom

+0

Notare quanto segue: TOP + BOTTOM = ASIDE = MAIN. BOTTOM = altezza: 200px; – matthewelsom

2

Utilizzando FlexBox questo è in realtà abbastanza semplice.

Codepen Demo

* { 
 
    margin: 0; 
 
    padding: 0; 
 
    box-sizing: border-box; 
 
} 
 
html, 
 
body { 
 
    min-height: 100%; 
 
} 
 
.wrapper { 
 
    width: 80%; 
 
    margin: auto; 
 
    display: flex; 
 
    flex-direction: column; 
 
    border: 1px solid red; 
 
    height: 100%; 
 
} 
 
header { 
 
    height: 50px; 
 
    background: green; 
 
    text-align: center; 
 
    line-height: 50px; 
 
} 
 
main { 
 
    flex-grow: 1; 
 
    border: 1px solid red; 
 
    height: 100%; 
 
    display: flex; 
 
} 
 
.left { 
 
    width: 200px; 
 
    background: lightblue; 
 
    flex: none; 
 
} 
 
.center { 
 
    flex-grow: 1; 
 
    background: salmon; 
 
} 
 
.right { 
 
    width: 300px; 
 
    flex:none; 
 
    background: yellow; 
 
    display: flex; 
 
    flex-direction: column; 
 
    flex-wrap: nowrap; 
 
} 
 
.top { 
 
    flex-grow: 1; 
 
    background: 000; 
 
} 
 
.bottom { 
 
    height: 50px; 
 
    flex: none; 
 
    background: pink; 
 
}
<div class="wrapper"> 
 
    <header> 
 
    <h2>Header</h2> 
 
    </header> 
 
    <main> 
 
    <div class="col left">Fixed Left</div> 
 
    <div class="col center">Flexible Center</div> 
 
    <div class="col right"> 
 
     <div class="top">Top Flexible Height inside fixed Right</div> 
 
     <div class="bottom">fixed Height Bottom</div> 
 
    </div> 
 
    </main> 
 
</div>

CSS-Tricks.com Ultimate Guide

prefissi sarà richiesto.

Riferimento supporto: CanIUse.com

+0

Ottimo lavoro, ma uno sviluppo web responsabile e corretto userebbe tutte le versioni dei prefissi flexbox. Qualsiasi Android prima della 4.4 si romperà senza prefissi, IE 10 si interromperà senza prefissi ... Per favore aggiungili alla tua risposta! –

+0

Non accettabile. –

+0

Che ne dici di modificare la tua risposta? Sicuramente la comunità lo accetterà poiché la risposta attuale è pigra e sta solo cercando di ottenere credibilità. –