Czy taka rzecz jest możliwa przy użyciu CSS i dwóch tagów DIV z wbudowanym blokiem (lub czymkolwiek) zamiast tabeli?
Wersja tabeli jest następująca (dodano ramki, dzięki czemu można ją zobaczyć):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<table style="width:100%;">
<tr>
<td style="border:1px solid black;width:100px;height:10px;"></td>
<td style="border:1px solid black;height:10px;"></td>
</tr>
</table>
</body>
</html>
Tworzy lewą kolumnę o STAŁEJ SZEROKOŚCI (nie procentowej szerokości) i prawą kolumnę, która rozszerza się, aby wypełnić PRZESTRZEŃ POZOSTAŁĄ w wierszu. Brzmi dość prosto, prawda? Ponadto, ponieważ nic nie jest „unoszone”, wysokość kontenera nadrzędnego odpowiednio powiększa się, aby objąć wysokość zawartości.
- POCZĄTEK RANT
- Widziałem implementacje „clear fix” i „Holy Graal” dla układów wielokolumnowych z kolumną boczną o stałej szerokości, a one są do kitu i są skomplikowane. Odwracają kolejność elementów, używają szerokości procentowych lub używają liczb zmiennoprzecinkowych, marginesów ujemnych, a związek między atrybutami „lewy”, „prawy” i „margines” jest złożony. Co więcej, układy są wrażliwe na subpiksele, więc dodanie nawet jednego piksela ramek, wypełnienia lub marginesów spowoduje uszkodzenie całego układu i przeniesienie zawijania całych kolumn do następnego wiersza. Na przykład błędy zaokrąglania są problemem, nawet jeśli próbujesz zrobić coś prostego, na przykład umieścić 4 elementy w linii, a szerokość każdego z nich wynosi 25%.
--END RANT--
Próbowałem użyć „inline-block” i „white-space: nowrap;”, ale problem polega na tym, że po prostu nie mogę uzyskać drugiego elementu do wypełnienia pozostałego miejsca w linii. Ustawienie szerokości na coś w rodzaju „szerokość: 100% - (LeftColumWidth) px” będzie działać w niektórych przypadkach, ale wykonywanie obliczeń we właściwości width nie jest tak naprawdę obsługiwane.
źródło
display: table-*
konstrukcję, która zadziała, ale nie jest też tak naprawdę „bardziej semantyczna” (jest to straszny przypadekdiv
zupy) i łamie kompatybilność z IE6. Osobiście trzymałbym się tego<table>
, chyba że komuś uda się wymyślić genialny prosty pomysł, który działa bezOdpowiedzi:
Zobacz: http://jsfiddle.net/qx32C/36/
Dlaczego wymienić
margin-left: 100px
zoverflow: hidden
na.right
?EDYCJA: Oto dwa kopie lustrzane powyższego (martwego) linku:
źródło
box-sizing: border-box
nadiv
s. Tylko zgadnij, ponieważ nie dostarczyłeś dema pokazującego opisywane zachowanie. Mając na uwadze powyższe, -na rozwiązanie jest zazwyczaj lepiej . To bardzo stare pytanie, ale myślę, że starałem się unikać cokolwiek wspólnego z tabelami w tym pytaniu ze względu na zachowanie OP.display: table
Nowoczesne rozwiązanie wykorzystujące Flexbox:
http://jsfiddle.net/m5Xz2/100/
źródło
flex: 1
zamiastwidth: 100%
?flex: 1
jest skrótem odflex-grow: 1
. Jest to atrybut kombinacji:flex: <grow> <shrink> <basis>
.flexbugs
, że.Kompatybilny z popularnymi współczesnymi przeglądarkami (IE 8+): http://jsfiddle.net/m5Xz2/3/
źródło
display:table
.inline-block
wypełnić resztę wiersza.Możesz użyć obliczeń (100% - 100px) na elemencie płynnym wraz z wyświetlaczem: blok wstawiany dla obu elementów.
Pamiętaj, że między tagami nie powinno być odstępu, w przeciwnym razie będziesz musiał wziąć to pod uwagę również w swoich kalkulacjach.
Szybki przykład: http://jsfiddle.net/dw689mt4/1/
źródło
Użyłem
flex-grow
nieruchomości, aby osiągnąć ten cel. Będziesz musiał ustawićdisplay: flex
kontener nadrzędny, a następnie ustawflex-grow: 1
blok, który chcesz wypełnić pozostałą przestrzeń, lub takflex: 1
jak tanio wspomniany w komentarzach.źródło
Jeśli nie możesz używać
overflow: hidden
(bo nie chceszoverflow: hidden
) lub jeśli nie lubisz haków / obejść CSS, możesz zamiast tego użyć JavaScript. Pamiętaj, że może nie działać tak dobrze, ponieważ jest JavaScript.http://jsfiddle.net/ys2eogxm/
źródło
Kiedy rezygnujesz z wbudowanych bloków
http://jsfiddle.net/RXrvZ/3731/
(z CSS Float: Przestawianie obrazu po lewej stronie tekstu )
źródło