2015-07-30 8 views
5

ho un layout con barre laterali tela destro e sinistro, che racchiude l'area del contenuto principale nel mezzo.Flex Disposizione con posizione fissa (senza scorrimento) barra laterale

Le barre laterali e contenuto principale sono elementi flessibili, posizionati in un layout flessibile da sinistra a destra.

Le barre laterali contengono menu e meta collegamenti.

La mia domanda è: sfogliando, quando l'area del contenuto, è possibile lasciare le barre laterali in posizione fissa, in modo tale da rimanere in posizione superiore e non scorrere verso il basso?

JS Fiddle: http://jsfiddle.net/Windwalker/gfozfpa6/2/

HTML:

<div class="flexcontainer"> 
    <div class="flexitem" id="canvas-left"> 
     <p>This content should not scroll</p> 
    </div> 
    <div class="flexitem" id="content"> 
     <div> 
      <p>Scrolling Content</p> 
     </div> 
    </div> 
    <div class="flexitem" id="canvas-right"> 
     <p>This content should not scroll</p> 
    </div> 
</div> 

CSS:

.flexcontainer { 
    display: flex; 
    flex-direction: row; 
    min-height: 100%; 
    align-items: stretch; 
} 
.flexitem { 
    display: flex; 
} 
#canvas-left { 
    background: yellow; 
    order: -1; 
    flex: 0 0 57px; 
} 
#content { 
    background: green; 
    order: 1; 
    padding: 1rem; 
} 
#content div { 
    display: block; 
} 
#canvas-right{ 
    background: blue; 
    order: 2; 
    flex: 0 0 57px; 
} 
+0

Nonostante quanto sopra, io non la penso così. Una volta che inizi ad aggiungere proprietà 'position' come assoluto o fisso, stai rimuovendo il contesto di formattazione dei blocchi e quindi' flexbox' non si applicherebbe più (AFAIK). * Forse * qualcosa con 'align-self' ma senza vedere alcun codice o struttura è difficile commentare. –

risposta

6

Consultare la domanda simile con la soluzione fornita: How to simulate 'position:fixed' behavior on Flexbox-aligned sidebar.

Secondo il codice si può anche avvolgere la contenuto interno in "position: fixed" wrapper:

<div class="flexitem" id="canvas-left"> 
    <div class="fixed"> 
     <p>This content should not scroll</p> 
    </div> 
</div> 

E aggiungere styling corretto nei CSS:

.fixed { 
    position: fixed; 
    width: 57px; /* according to #canvas-left */ 
} 

Ecco un esempio del vostro codice con barra laterale sinistra fissa: http://jsfiddle.net/8hm3849m/. Nota che questo trucco non ti fornirà una griglia flessibile adatta per le barre laterali, la larghezza del wrapper dovrebbe essere corretta (o imposta dinamicamente tramite JavaScript).

+0

Grazie mille per questa soluzione! :-) – Windwalker

0

io non so come farlo con flex, ma ecco un easyer/css alternativo rimuovere tutto ciò che flex ... e cercare di non aggiungere mai imbottitura per un div esterno, la sua easyer in voci interiori, allora non avete bisogno di calcolare se ci sono molte div

.flexcontainer { 
    display: block; 
    min-height: 100%; 
    align-items: stretch; 
} 
.flexitem { 
    display: flex; 
} 
#canvas-left { 
    background: yellow; 
    order: -1; 
    left: 0px; 
    width: 20%; 
    position: fixed; 
} 
#content { 
    position: absolute; 
    background: green; 
    order: 1; 
    width: 60%; 
    left: 20%; 
} 
#content p { 
    display: block; 
    padding: 1rem; 
} 
#canvas-right{ 
    background: blue; 
    order: 2; 
    right: 0px; 
    width: 20%; 
    position: fixed; 
} 
+0

nessun problema, il tuo benvenuto :) –

+0

Spiacente, ho premuto il tasto invio troppo presto. Ecco il mio vero pensiero sulla tua proposta: il tuo approccio mostra il motivo per cui inizialmente ho scelto una tecnica di layout flessibile: la colonna di sinistra è un menu di navigazione con icone, che può essere compresso ed espanso, ovvero la larghezza della colonna di sinistra cambia e la colonna di contenuto dovrebbe sempre allineare alla colonna dell'area di disegno sinistra, indipendentemente dalla sua larghezza effettiva. – Windwalker

+0

Ovviamente, potrei farlo aggiungendo classi CSS come 'menu-expanded' o' menu-collapsed' per scambiare l'offset del 20% con un altro valore, ma questo è un po 'codificato .....: -/ – Windwalker