2015-04-14 13 views
9

Sto usando lo flexbox layout per stilare un elenco di attività passate. La descrizione del compito e il tempo saranno sempre di lunghezza molto variabile.flexbox | elemento flessibile che viene espulso dal div contenente (fuori dallo schermo)

Tutto sembra perfetto finché non viene immessa una descrizione dell'attività che è abbastanza lunga da avvolgere su una seconda riga e quindi l'elemento "orario" (all'estrema destra dello schermo) viene leggermente spostato verso destra - fuori dallo schermo - nascondendo alcuni dei contenuti.

Si può vedere la descrizione breve visualizza perfettamente sotto, ma quella lunga spinge quello che dovrebbe essere '00: 08 'fuori dallo schermo E la descrizione dell'attività si sposta anche a sinistra !!

flex-item-pushed-off-screen-chrome

Ecco a fiddle per il codice (che è al di sotto come da regolamento di StackOverflow). Se si modifica il riquadro ridimensionando il risultato, il '00: 08 'non cade dalla pagina ma si sposta chiaramente troppo verso destra.

Lo screenshot precedente è in Chrome o Safari (i due browser che stavo utilizzando) quando si riduce la larghezza della finestra finché la descrizione non si inserisce su una seconda riga.

Vorrei che tutto fosse visualizzato secondo la prima riga (breve descrizione) se possibile! E anche per capire perché questo si comporta come è attualmente.

P.S. Ho provato a usare i float e ad usare un layout di visualizzazione da tavolo, ma entrambe queste tecniche hanno causato alcuni bug, principalmente a causa del contenuto di lunghezza variabile (quindi per favore non suggerirli come alternative :)).

ul { 
 
     margin:0; 
 
     padding: 0; 
 
    } 
 
    #tasklist{ 
 
     width: 100%; 
 
    } 
 
    
 
     .task-one-line{ 
 
     display: flex; 
 
     flex-direction:row; 
 
     flex-wrap: nowrap; 
 
     justify-content: space-between; 
 
     align-item: baseline; /*flex-end*/ 
 
     display: -webkit-flex; 
 
     -webkit-flex-direction:row; 
 
     -webkit-flex-wrap: nowrap; 
 
     -webkit-justify-content: space-between; 
 
     -webkit-align-item: baseline; 
 
     border-bottom: 1px solid #d3d3d3; 
 
     width: 100%; 
 
     } 
 
    
 
     .task-one-line i{ 
 
      width:1.5em; 
 
      padding: 0.5em 0.3em 0.5em 0.3em; 
 
      /*border: 1px solid green;*/ 
 
     } 
 
    
 
      span.task-desc{ 
 
      flex-grow: 5; 
 
      -webkit-flex-grow: 5; 
 
      text-align:left; 
 
      padding: 0.3em 0.4em 0.3em 0.4em; 
 
      /*border: 1px solid red;*/ 
 
      } 
 
      
 
      span.task-time{ 
 
      flex-grow: 1; 
 
      -webkit-flex-grow: 1; 
 
      flex-basis:4em; 
 
      -webkit-flex-basis:4em; 
 
      text-align:right; 
 
      padding: 0.3em 0.5em 0.3em 0.5em; 
 
      /*border: 1px solid blue ;*/ 
 
      }
<ul id="tasklist"> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">And a short one</span> 
 
      <span class="task-time">00:01</span> 
 
     </li> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">Here's a super long long long long long long description that might wrap onto another line</span> 
 
      <span class="task-time">00:08</span> 
 
     </li> 
 
    </ul>

risposta

5

Davvero, si desidera solo il contenuto del testo per avere una larghezza flessibile (il tempo e l'icona dovrebbe avere una larghezza fissa e non ridursi). Questo potrebbe essere facilmente realizzato con tabelle, posizionamento assoluto o flexbox.

Ecco il FlexBox che è necessario sapere:

.task-time: flex: 1 0 4em 
.task-one-line i.fa { flex: 0 0 auto; } 

ul { 
 
     margin:0; 
 
     padding: 0; 
 
    } 
 
    #tasklist{ 
 
     width: 100%; 
 
    } 
 
    
 
     .task-one-line i.fa { flex: 0 0 auto; } 
 
     .task-one-line{ 
 
     display: flex; 
 
     flex-direction:row; 
 
     flex-wrap: nowrap; 
 
     justify-content: space-between; 
 
     align-item: baseline; /*flex-end*/ 
 
     display: -webkit-flex; 
 
     -webkit-flex-direction:row; 
 
     -webkit-flex-wrap: nowrap; 
 
     -webkit-justify-content: space-between; 
 
     -webkit-align-item: baseline; 
 
     border-bottom: 1px solid #d3d3d3; 
 
     width: 100%; 
 
     } 
 
    
 
     .task-one-line i{ 
 
      width:1.5em; 
 
      padding: 0.5em 0.3em 0.5em 0.3em; 
 
      /*border: 1px solid green;*/ 
 
     } 
 
    
 
      span.task-desc{ 
 
      flex-grow: 5; 
 
      -webkit-flex-grow: 5; 
 
      text-align:left; 
 
      padding: 0.3em 0.4em 0.3em 0.4em; 
 
      /*border: 1px solid red;*/ 
 
      } 
 
      
 
      span.task-time{ 
 
      flex: 1 0 4em; 
 
      -webkit-flex: 1 0 4em; 
 
      text-align:right; 
 
      padding: 0.3em 0.5em 0.3em 0.5em; 
 
      /*border: 1px solid blue ;*/ 
 
      }
<ul id="tasklist"> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">And a short one</span> 
 
      <span class="task-time">00:01</span> 
 
     </li> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">Here's a super long long long long long long description that might wrap onto another line long long long long long long description that might wrap onto another line</span> 
 
      <span class="task-time">00:08</span> 
 
     </li> 
 
    </ul>

+0

Grazie per questo @ Adamo - questo funziona in quel il timer ora viene visualizzato sullo schermo ma riporta il testo all'icona, causando un brutto problema di formattazione y il testo è disallineato da una riga a quella successiva: http://imgur.com/VtsaujO Conosci un modo per impedirlo? (Solo una breve nota, il tempo deve essere flessibile in quanto può arrivare fino a 9 caratteri, ma a partire da 5!). Grazie per il tuo aiuto finora. – iteles

+0

Hai un link al tuo codice? Questa linea: '.task-one-line i.fa {flex: 0 0 auto; } 'avrebbe dovuto impedire che si verificasse un problema specifico. In Safari, è necessario anteporre il codice flexbox in modo che 'display: flexbox' diventi' display: -webkit-flexbox' e 'flex: 0 0 auto' diventa' -webkit-flex: 0 0 auto' (e così via). – Adam

+0

Urrà! Sembrerebbe che la mia cache non sia stata cancellata correttamente, quindi l'ho cancellata 3 volte e ora sembra funzionare come previsto. Fantastico, grazie mille per il tuo aiuto. – iteles

3

La mia regola generale per flex è flettere i contenitori che si desidera flettere e non flettere quelli che non. Farei quanto segue al contenitore del tempo.

span.task-time {flex: none;}

+0

Grazie Eugene, ma come ho già detto, il tempo sarà sempre di una lunghezza variabile in quanto può includere ore e quindi essere ovunque tra 5 e 9 caratteri. Un buon consiglio però! – iteles

+1

Ho aggiornato il tuo violino con il suggerimento di cui sopra. Flex none considera il div come un elemento di blocco in linea. Crescerà in base al suo contenuto. http://jsfiddle.net/aestheticdrift/pmdav1eg/2/ – Eugene

0

ho avuto un problema simile, ho creato una penna con la correzione:

https://codepen.io/anon/pen/vRBMMm

<div class="flex"> 
    <div class="a">1st div</div> 
    <div class="b">HELLO2HELLO2 HELLO2HELLO2 2222 HELLO2HELLO 22222</div> 
    <div class="c">3rd div</div> 
</div> 

.flex{ 
    display: flex; 
    padding: 8px; 
    border: 1px solid; 
} 
.a { 
    margin-right: 16px; 
} 
.b { 
    flex: 1; 
    min-width: 0; 
    white-space: nowrap; 
    text-overflow: ellipsis; 
    overflow: hidden; 
} 
.c { 
    flex-shrink: 0; 
} 
Problemi correlati