2016-05-13 11 views
1

Ich habe einen Flex-Box-Container (.search-bar) mit zwei Text-divs (.title) innen. Ich möchte, dass das zweite Kind den gesamten zusätzlichen Platz einnimmt und das letzte Kind wird, wenn der Platz begrenzt wird. h. das erste Kind sollte wie erforderlich ellipsen, um das zweite Kind vollständig angezeigt zu halten, und das zweite Kind sollte nur dann ellipsen, wenn das erste Kind nicht mehr sichtbar ist.Flexbox Ellipsize erstes Kind vor Sekunde

Demo:

.search-bar { 
 
    flex: 1; 
 
    display: flex; 
 
    align-items: center; 
 
    overflow: hidden; 
 
    width: 500px; 
 
    background: white; 
 
} 
 

 
.title { 
 
    text-overflow: ellipsis; 
 
    white-space: nowrap; 
 
    overflow: hidden; 
 
    flex-shrink: 1; 
 
} 
 

 
.title:last-of-type { 
 
    flex: 1; 
 
    flex-shrink: 0; 
 
} 
 

 
.title + .title::before { 
 
    content: '>'; 
 
    margin: 0 10px; 
 
}
<div class='search-bar'> 
 
    <div class='title'> 
 
    Doop Doop Doop Doop Doop Doop Doop 
 
    </div> 
 
    <div class='title'> 
 
    Doge Doge Doge Doge Doge Doge Doge 
 
    </div> 
 
</div>

Die flex-shrink: 0 am letzten-of-Typ Titel scheint nicht, etwas zu tun, und das letzte Kind ist immer derjenige, der ellipsized ist.

Gibt es eine Möglichkeit, den ersten Titel Ellipsize vor dem zweiten zu haben?

Hier ist eine Geige https://jsfiddle.net/6fs9gc00/

+0

Ist das zweite '.title' das letzte Tag seines Typs in' .search-bar'? ': * - type 'Selektoren gelten nur für Tags, nicht für Klassennamen. – Shaggy

+0

Bitte ein MCVE, Andrew. Es wird einfacher sein, durchzulaufen und Ihnen dabei zu helfen. – TylerH

+0

@Shaggy, yeah der Selektor wird richtig auf die letzte '.title' angewendet. – Andrew

Antwort

1

Dies, es zu tun scheint

.title { 
    text-overflow: ellipsis; 
    white-space: nowrap; 
    overflow: hidden; 
} 
.title.first { 
    flex: 0 1 auto; 
} 
.title.last { 
    flex: 1 0 auto; 
} 

Geige: https://jsfiddle.net/6nbzkkjg/4/

Edit: aktualisiert mit @ Andrews Änderungen in den Kommentaren

+0

Das einzige Problem damit ist, dass der zweite Titel niemals ellipsen wird: https://jsfiddle.net/6nbzkkjg/3/ – Andrew

+0

Ich war in der Lage, Ihr Beispiel zu ändern, um zu bekommen, wonach ich gesucht habe: https://jsfiddle.net/6nbzkkjg/4/ – Andrew

+0

Sieht nicht so aus, als ob das tatsächlich aktualisiert wurde.Wenn du es mit meinen Änderungen aktualisierst, werde ich deine Antwort als akzeptiert markieren :) – Andrew

0

Scheint, wie Sie können erreichen Sie dies, indem Sie flex: 1; zuhinzufügen. Wenn Sie die Breite beispielsweise auf 400 px ändern, können Sie sehen, dass das zweite div immer noch in Auslassungspunkten abgeschnitten wird, das erste div jedoch zuerst abgeschnitten wird.

.search-bar { 
 
    display: flex; 
 
    overflow: hidden; 
 
    width: 500px; 
 
    background: #cfcfcf; /* Changed for visibility in Stack Snippet */ 
 
} 
 

 
.title { 
 
    text-overflow: ellipsis; 
 
    white-space: nowrap; 
 
    overflow: hidden; 
 
    flex: 1; 
 
    flex-shrink: 1; 
 
} 
 

 
.title:last-of-type { 
 
    flex: 1; 
 
    flex-shrink: 0; 
 
} 
 

 
.title + .title::before { 
 
    content: '>'; 
 
    margin: 0 10px; 
 
}
<div class='search-bar'> 
 
    <div class='title'> 
 
     Doop Doop Doop Doop Doop Doop Doop 
 
    </div> 
 
    <div class='title'> 
 
     Doge Doge Doge Doge Doge 
 
    </div> 
 
</div>

I entfernt flex: 1; und align-content: center; von .search-bar {} da sie nichts zu tun wurden.

+0

Das funktioniert nicht ganz so wie ich ' Wenn Sie '.search-bar' auf eine Breite von 400px setzen, werden beide Kinder gleichzeitig ellipsentiert.Es ist mir gelungen, eine Lösung zu finden, die auf der Antwort von C14L basiert: https://jsfiddle.net/ 6nbzkkjg/4/ – Andrew

+0

@Andrew Ah, ich verstehe. Ich habe die letzte Zeile Ihrer Frage vor der Demo verpasst. Sieht so aus, als hättest du es herausgefunden! – TylerH