Mam układ podobny do:
<div>
<table>
</table>
</div>
Chciałbym, div
aby rozszerzyło się tylko na tak szerokie, jak się table
staje.
Mam układ podobny do:
<div>
<table>
</table>
</div>
Chciałbym, div
aby rozszerzyło się tylko na tak szerokie, jak się table
staje.
Odpowiedzi:
Rozwiązaniem jest ustawienie div
na display: inline-block
.
span
lub a div
lub ul
cokolwiek innego, ważną częścią jest to, że kontener, który ma być minimalnej szerokości, ma właściwość CSSdisplay: inline-block
display: inline-block
ustawieniu właściwości margin: 0 auto;
nie będzie działać zgodnie z oczekiwaniami. W takim przypadku, jeśli kontener macierzysty ma, text-align: center;
wówczas inline-block
element zostanie wyśrodkowany w poziomie.
inline-block
NIE działało dla mnie, ale NIE inline-flex
.
Chcesz elementu blokowego, który ma to, co CSS nazywa kurczącą się, aby dopasować szerokość, a specyfikacja nie zapewnia błogosławionego sposobu na uzyskanie takiej rzeczy. W CSS2 dopasowanie do kurczenia się nie jest celem, ale oznacza radzenie sobie z sytuacją, w której przeglądarka „musi” uzyskać szerokość powietrza. Te sytuacje to:
gdy nie określono szerokości. Słyszałem, że myślą o dodaniu tego, co chcesz w CSS3. Na razie skorzystaj z jednego z powyższych.
Decyzja, aby nie ujawniać funkcji bezpośrednio, może wydawać się dziwna, ale jest dobry powód. To jest drogie. Zmniejsz dopasuj oznacza formatowanie co najmniej dwa razy: nie możesz rozpocząć formatowania elementu, dopóki nie poznasz jego szerokości i nie możesz obliczyć szerokości bez przejścia przez całą zawartość. Co więcej, nie trzeba elementu kurczliwego dopasowywać tak często, jak mogłoby się wydawać. Dlaczego potrzebujesz dodatkowego diva przy stole? Może podpis tabeli jest wszystkim, czego potrzebujesz.
inline-block
jest dokładnie do tego przeznaczony i doskonale rozwiązuje problem.
content-box, max-content, min-content, available, fit-content, auto
fit-content
słowo kluczowe (nieistniejące, gdy ta odpowiedź została napisana po raz pierwszy i nadal nie jest w pełni obsługiwane ) pozwala jawnie zastosować wymiarowanie „zmniejsz do dopasowania” do elementu, eliminując potrzebę jakiegokolwiek z sugerowanych tu hacków, jeśli jesteś na tyle, że mogę celować tylko w przeglądarki z obsługą. Niemniej jednak +1; te pozostają na razie przydatne!
float
zrobiłem to, co musiałem zrobić!
Myślę, że za pomocą
display: inline-block;
działałoby, jednak nie jestem pewien kompatybilności przeglądarki.
Innym rozwiązaniem byłoby zawinięcie div
w inne div
(jeśli chcesz zachować zachowanie bloku):
HTML:
<div>
<div class="yourdiv">
content
</div>
</div>
CSS:
.yourdiv
{
display: inline;
}
*display: inline; *zoom: 1;
. Nie testowałem tej konkretnej sytuacji, ale zawsze w przeszłości zawsze stwierdziłem, że hack hasLayout jest wymagany tylko dla IE7 lub IE8 w trybie IE7 (lub IE8 w dziwactwach!).
inline-block
display: inline-block
dodaje dodatkowy margines do elementu.
Poleciłbym to:
#element {
display: table; /* IE8+ and all other modern browsers */
}
Bonus: Możesz teraz z łatwością wyśrodkować ten wymyślny nowy #element
, dodając go margin: 0 auto
.
position: absolute
jest niezbędny dla <IE8.
display: inline-block
nie dodaje żadnych marginesów. Ale CSS obsługuje białe znaki, które mają być wyświetlane między elementami wbudowanymi.
position: absolute
Możesz spróbować fit-content
(CSS3):
div {
width: fit-content;
/* To adjust the height as well */
height: fit-content;
}
Dla mnie działa:
display: table;
w div
. (Testowany na Firefox i Google Chrome ).
border-collapse: separate;
styl. Jest to domyślne w wielu przeglądarkach, ale często frameworki css, takie jak bootstrap, resetują wartość do collapse
.
Istnieją dwa lepsze rozwiązania
display: inline-block;
LUB
display: table;
Z tych dwóch display:table;
jest lepiej, ponieważ display: inline-block;
dodaje dodatkowy margines.
Dla display:inline-block;
można użyć metody ujemny margines, aby ustalić dodatkową przestrzeń
display:table
jest lepiej?
display:table
pozostawia element w kontekście formatowania bloku, dzięki czemu można kontrolować jego pozycję z marginesami itp. Jak zwykle. display:-inline-*
, z drugiej strony, umieszcza element w kontekście formatowania Inline, powodując, że przeglądarka tworzy wokół niego anonimowe opakowanie bloków, zawierające pole linii z odziedziczonymi ustawieniami czcionki / wysokości linii, i wstawia blok do tego pola linii (wyrównując domyślnie pionowo w stosunku do linii bazowej). Wymaga to więcej „magii”, a zatem potencjalnych niespodzianek.
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
Foo Hack - obsługa wielu przeglądarek dla stylizacji wbudowanej (2007-11-19) .
-moz-inline-stack
Nie wiedząc w jakim kontekście to pojawi się, ale wierzę, że właściwość CSS stylu float
albo left
czy right
będzie miał ten efekt. Z drugiej strony będzie miał również inne skutki uboczne, takie jak narzucanie tekstu.
Jeśli jednak się mylę, popraw mnie, nie jestem w 100% pewien i obecnie nie mogę tego samodzielnie przetestować.
Odpowiedź na twoje pytanie leży w przyszłości, mój przyjacielu ...
mianowicie „intrinsic” nadchodzi z najnowszą aktualizacją CSS3
width: intrinsic;
niestety IE jest opóźniony, więc jeszcze go nie obsługuje
Więcej informacji na ten temat: CSS Intrinsic & Extrinsic Sizing Module Level 3 and Can I Use? : Wymiarowanie wewnętrzne i zewnętrzne .
Na razie musisz być zadowolony <span>
lub <div>
ustawiony na
display: inline-block;
intrinsic
ponieważ wartość jest niestandardowa. Tak naprawdę jest width: max-content
. Zobacz stronę MDN na tym lub już połączonym projekcie.
width:1px;
white-space: nowrap;
działa dobrze dla mnie :)
OK, w wielu przypadkach nawet nie musisz nic robić, jak domyślnie div ma height
i width
jako auto, ale jeśli to nie twoja sprawa, zastosowanie inline-block
wyświetlania będzie dla ciebie działać ... spójrz na kod, który dla ciebie stworzyłem i robi to czego szukasz:
div {
display: inline-block;
}
<div>
<table>
<tr>
<td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
<td>Nunc auctor aliquam est ac viverra. Sed enim nisi, feugiat sed accumsan eu, convallis eget felis. Pellentesque consequat eu leo nec pharetra. Aenean interdum enim dapibus diam.</td>
<td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
</tr>
</table>
</div>
Zostało to wspomniane w komentarzach i trudno znaleźć w jednej z odpowiedzi, więc:
Jeśli używasz display: flex
z jakiegokolwiek powodu, możesz zamiast tego użyć:
div {
display: inline-flex;
}
Jest to również szeroko obsługiwane w różnych przeglądarkach.
display: flex;
Możesz używać inline-block
jako @ user473598, ale uważaj na starsze przeglądarki ..
/* Your're working with */
display: inline-block;
/* For IE 7 */
zoom: 1;
*display: inline;
/* For Mozilla Firefox < 3.0 */
display:-moz-inline-stack;
Mozilla w ogóle nie obsługuje wbudowanego bloku, ale ma -moz-inline-stack
to mniej więcej to samo
Niektóre inline-block
atrybuty wyświetlania w różnych przeglądarkach :
https://css-tricks.com/snippets/css/cross-browser-inline-block/
Niektóre testy z tym atrybutem można zobaczyć w: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/
inline-block
od 3.0 (2008). Źródło: developer.mozilla.org/en-US/docs/Web/CSS/…
Po prostu umieść styl w swoim pliku CSS
div {
width: fit-content;
}
-moz-fit-content
dla FF, prawdopodobnie inne prefiksy dostawców pozwolą na ich własne ...
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<div id="content_lalala">
this content inside the div being inside a table, needs no inline properties and the table is the one expanding to the content of this div =)
</div>
</td>
</tr>
</table>
Wiem, że ludzie czasem nie lubią stołów, ale muszę wam powiedzieć, że próbowałem hacków inline css, a oni trochę działali w niektórych divach, ale w innych nie, więc naprawdę łatwiej było dołączyć rozszerzającą się div w tabela ... i ... może mieć właściwość inline lub nie, a mimo to tabela może pomieścić całkowitą szerokość zawartości. =)
Działające demo jest tutaj
.floating-box {
display:-moz-inline-stack;
display: inline-block;
width: fit-content;
height: fit-content;
width: 150px;
height: 75px;
margin: 10px;
border: 3px solid #73AD21;
}
<h2>The Way is using inline-block</h2>
Supporting elements are also added in CSS.
<div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
</div>
Moje rozwiązanie flexbox CSS3 w dwóch wariantach: jeden na górze zachowuje się jak rozpiętość, a ten na dole zachowuje się jak div, biorąc całą szerokość za pomocą opakowania. Ich klasy to odpowiednio „góra”, „dół” i „bottomwrapper”.
body {
font-family: sans-serif;
}
.top {
display: -webkit-inline-flex;
display: inline-flex;
}
.top, .bottom {
background-color: #3F3;
border: 2px solid #FA6;
}
/* bottomwrapper will take the rest of the width */
.bottomwrapper {
display: -webkit-flex;
display: flex;
}
table {
border-collapse: collapse;
}
table, th, td {
width: 280px;
border: 1px solid #666;
}
th {
background-color: #282;
color: #FFF;
}
td {
color: #444;
}
th, td {
padding: 0 4px 0 4px;
}
Is this
<div class="top">
<table>
<tr>
<th>OS</th>
<th>Version</th>
</tr>
<tr>
<td>OpenBSD</td>
<td>5.7</td>
</tr>
<tr>
<td>Windows</td>
<td>Please upgrade to 10!</td>
</tr>
</table>
</div>
what you are looking for?
<br>
Or may be...
<div class="bottomwrapper">
<div class="bottom">
<table>
<tr>
<th>OS</th>
<th>Version</th>
</tr>
<tr>
<td>OpenBSD</td>
<td>5.7</td>
</tr>
<tr>
<td>Windows</td>
<td>Please upgrade to 10!</td>
</tr>
</table>
</div>
</div>
this is what you are looking for.
display: inline-flex;
. BTW działa to bez prefiksu dla Chrome 62, Firefox 57 i Safari 11
<div class="parentDiv" style="display:inline-block">
// HTML elements
</div>
Spowoduje to, że nadrzędna szerokość div będzie taka sama jak największa szerokość elementu.
Spróbować display: inline-block;
. Aby był kompatybilny z wieloma przeglądarkami, użyj poniższego kodu css.
div {
display: inline-block;
display:-moz-inline-stack;
zoom:1;
*display:inline;
border-style: solid;
border-color: #0000ff;
}
<div>
<table>
<tr>
<td>Column1</td>
<td>Column2</td>
<td>Column3</td>
</tr>
</table>
</div>
Manipulując przy Firebug, znalazłem wartość właściwości, -moz-fit-content
która dokładnie robi to, czego chciał OP, i może być używana następująco:
width: -moz-fit-content;
Chociaż działa tylko w przeglądarce Firefox, nie mogłem znaleźć odpowiednika dla innych przeglądarek, takich jak Chrome.
fit-content
. Firefox obsługuje tylko szerokość. Inne przeglądarki dobrze to obsługują.
Możesz wypróbować ten kod. Postępuj zgodnie z kodem w sekcji CSS.
div {
display: inline-block;
padding: 2vw;
background-color: green;
}
table {
width: 70vw;
background-color: white;
}
<div>
<table border="colapsed">
<tr>
<td>Apple</td>
<td>Banana</td>
<td>Strawberry</td>
</tr>
<tr>
<td>Apple</td>
<td>Banana</td>
<td>Strawberry</td>
</tr>
<tr>
<td>Apple</td>
<td>Banana</td>
<td>Strawberry</td>
</tr>
</table>
</div>
Rozwiązałem podobny problem (gdzie nie chciałem używać, display: inline-block
ponieważ element był wyśrodkowany), dodając span
znacznik wewnątrz div
znacznika i przenosząc formatowanie CSS z zewnętrznego div
znacznika na nowy span
znacznik wewnętrzny . Po prostu rzucenie tego jako kolejny alternatywny pomysł, jeśli display: inline block
nie jest dla ciebie odpowiednią odpowiedzią.
Jeśli masz linie podziału kontenerów, po godzinach szukając dobrego rozwiązania CSS i nie znajdując żadnego, używam teraz jQuery:
$('button').click(function(){
$('nav ul').each(function(){
$parent = $(this).parent();
$parent.width( $(this).width() );
});
});
nav {
display: inline-block;
text-align: left; /* doesn't do anything, unlike some might guess */
}
ul {
display: inline;
}
/* needed style */
ul {
padding: 0;
}
body {
width: 420px;
}
/* just style */
body {
background: #ddd;
margin: 1em auto;
}
button {
display: block;
}
nav {
background: #bbb;
margin: 1rem auto;
padding: 0.5rem;
}
li {
display: inline-block;
width: 40px;
height: 20px;
border: solid thin #777;
margin: 4px;
background: #999;
text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>fix</button>
<nav>
<ul>
<li>3</li>
<li>.</li>
<li>1</li>
<li>4</li>
</ul>
</nav>
<nav>
<ul>
<li>3</li>
<li>.</li>
<li>1</li>
<li>4</li>
<li>1</li>
<li>5</li>
<li>9</li>
<li>2</li>
<li>6</li>
<li>5</li>
<li>3</li>
<li>5</li>
</ul>
</nav>
Zmieniono (działa, jeśli masz wiele dzieci): Możesz użyć jQuery (spójrz na link JSFiddle)
var d= $('div');
var w;
d.children().each(function(){
w = w + $(this).outerWidth();
d.css('width', w + 'px')
});
Nie zapomnij dołączyć jQuery ...