Wykonaj DIV, wypełniając całą komórkę tabeli


163

Widziałem to pytanie i trochę googlowałem , ale jak dotąd nic nie zadziałało. Myślę, że teraz jest rok 2010 (te pytania / odpowiedzi są stare i bez odpowiedzi) i mamy CSS3! Czy istnieje sposób, aby za pomocą CSS element div wypełnił całą szerokość i wysokość komórki tabeli?

Nie wiem, jaka będzie szerokość i / lub wysokość komórki, a ustawienie szerokości i wysokości div na 100% nie działa.

Ponadto potrzebuję elementu div, ponieważ muszę bezwzględnie umieścić niektóre elementy poza komórką i position: relativenie ma to zastosowania do tds, więc potrzebuję opakowującego elementu div.


Czy sam pojemnik ma określoną wysokość? Czy tabela obejmuje widoczny obszar strony?
meder omuraliev

4
To naprawdę dziwne, że ustawienie wysokości i szerokości na 100% nie działa. To powinno sprawić, że element div będzie miał pełną szerokość i wysokość tagu nadrzędnego. Może to nie działa z powodu względnego pozycjonowania. Ciekawi mnie rozwiązanie, gdy ktoś je znajdzie.
Marcin

@meder dane w tabeli są dynamiczne, więc nigdy nie poznam wysokości. szerokość wypełnia ekran, tak.
Jason,

1
Możesz rzucić okiem na to pytanie: stackoverflow.com/questions/2841484/…
Gert Grenander

3
@Marcin Jeśli wysokość komórki tabeli (tj. Kontenera) nie jest wyraźnie określona, ​​wówczas wysokość pc% wewnętrznego DIV jest faktycznie obliczana jako „auto” - zgodnie ze specyfikacją.
MrWhite,

Odpowiedzi:


48

Poniższy kod działa w przeglądarce IE 8, trybie zgodności IE 8 z IE 7 i Chrome (gdzie indziej nie testowano):

<table style="width:100px"> <!-- Not actually necessary; just makes the example text shorter -->
   <tr><td>test</td><td>test</td></tr>
   <tr>
      <td style="padding:0;">
         <div style="height:100%; width:100%; background-color:#abc; position:relative;">
            <img style="left:90px; position:absolute;" src="../Content/Images/attachment.png"/>
            test of really long content that causes the height of the cell to increase dynamically
         </div>
      </td>
      <td>test</td>
   </tr>
</table>

Mówiłeś, że w pierwotnym pytaniu, że ustawienie widthi heightaby 100%nie działał, choć, co sprawia, że podejrzewam, że jest jakaś inna zasada nadpisanie go. Czy sprawdziłeś obliczony styl w Chrome lub Firebug, aby zobaczyć, czy reguły szerokości / wysokości są rzeczywiście stosowane?

Edytować

Jaki jestem głupi! Rozmiar divbył zgodny z tekstem, a nie z td. Możesz to naprawić w Chrome, tworząc div display:inline-block, ale to nie działa w IE. To okazuje się trudniejsze ...


westchnij ... dobra okazja do sprawdzenia, czy zastosowano inne style. najwyraźniej miałem pewne reguły dopełniające, które uniemożliwiały mojemu elementowi div obejmowanie całej komórki tabeli. kiedy się ich pozbyłem, nie miałem żadnych problemów. byłem zaciekawiony, ponieważ mój kod wygląda tak samo jak twój (używając oczywiście klas), ale kiedy poszedłem dalej w łańcuchu, patrz i oto dopełnienie. dzięki za pomoc.
Jason,

6
spróbuj tego przykładu: jsfiddle.net/2K2tG zwróć uwagę, że komórka z obrazem jest czerwona, a nie #abc. szerokość / wysokość 100% nic nie robi
Jason

dzięki za ten artykuł;
Ionut Flavius ​​Pogacian,

4
Jak zauważył Jason, wysokość: 100% nic nie robi… to nie rozwiązuje problemu. Dziękuję za edycję, chociaż wspomniał o inline-block.
Matt Browne,

3
Tak, to działa z Chrome, ale niestety nie dla Firefoksa ... jsfiddle.net/38Ngn/1
Pluto

66

div height = 100% w komórce tabeli zadziała tylko wtedy, gdy tabela ma sam atrybut wysokości.

<table border="1" style="height:300px; width: 100px;">
 <tr><td>cell1</td><td>cell2</td></tr>
 <tr>
   <td>
     <div style="height: 100%; width: 100%; background-color:pink;"></div>
   </td>
   <td>long text long text long text long text long text long text</td>
 </tr>
</table>

UPD w FireFox należy również ustawić height=100%wartość na TDelement nadrzędny


59
to jest takie dziwne. głupie, że jest rok 2012 i ten błąd nie został jeszcze naprawiony
zdylanizowałem

2
iz tego powodu płacimy więcej
Ionut Flavius ​​Pogacian

Dobra sztuczka, ale działała tylko na Chromium. Przeglądarki IE9 i Firefox 19 nie mogą rozciągnąć elementu div.
Martin

1
zamiast używać wysokości w pikselach, użyłem 100% wysokości i min-wysokości: 1px.
andrea.spot.

1
Jeśli ustawisz również tdwysokość zawierającą 100%, powinno to działać w FF. To jest poprawna odpowiedź.
HartleySan,

58

Musiałem ustawić fałszywą wysokość na <tr>i wzrost: dziedziczenie dla<td>s

tr ma height: 1px(i tak jest ignorowane)

Następnie ustaw td height: inherit

Następnie ustaw div na height: 100%

To działało dla mnie w IE Edge i Chrome:

<table style="width:200px;">
    <tr style="height: 1px;">
        <td style="height: inherit; border: 1px solid #000; width: 100px;">
            <div>
              Something big with multi lines and makes table bigger
            </div>
        </td>
        <td style="height: inherit; border: 1px solid #000; width: 100px;">
            <div style="background-color: red; height: 100%;">
                full-height div
            </div>
        </td>
    </tr>
</table>


Nie wiem, czy to zawsze działa, ale działało dla mnie w IE 11.
Joe Maffei

7
Potrzebowałem tylko td { height: 1px }Chrome.
Chris Happy,

Wielkie dzięki! Pomogło mi to z tabelą html i składnikiem Angular jako zawartością komórki.
Felix Lemke

15

Jeśli powodem, dla którego chcesz mieć 100% element div wewnątrz komórki tabeli, była możliwość rozciągnięcia koloru tła do pełnej wysokości, ale nadal można mieć odstępy między komórkami, możesz nadać mu <td>kolor tła i użyć CSS border-spacing, aby utworzyć margines między komórkami.

Jeśli jednak naprawdę potrzebujesz elementu div o wysokości 100%, tak jak wspominali inni tutaj, musisz albo przypisać stałą wysokość do elementu div, <table>albo użyć JavaScript.


1
możesz rozmieścić komórkę za pomocą border-spacing:5pxelementu ed "table", ale zgadzam się, że użycie DIV wewnątrz komórek jest znacznie bardziej eleganckie i ogólnie lepsze.
vsync

dzięki za sugestię, działa dobrze. pamiętaj tylko, aby zastosować border-collapse: separatesię do stołu, w przeciwnym razie nie przyniesie to żadnego efektu. +1
katzenhut

border-collapse: separatejest wartością domyślną, ale tak, to dobra wskazówka.
Matt Browne,

12

Tak więc, ponieważ wszyscy publikują swoje rozwiązanie i żadne nie było dla mnie dobre, oto moje (testowane na Chrome i Firefox).

table { height: 1px; }
tr { height: 100%; }
td { height: 100%; }
td > div { height: 100%; }

Skrzypce: https://jsfiddle.net/nh6g5fzv/


1
Ty, panie lub pani, zasługujesz na złotą gwiazdę. To doprowadzało mnie do szału.
tylertrotter

6

Ponieważ każda inna przeglądarka (w tym IE 7, 8 i 9) position:relativepoprawnie i tylko obsługuje komórkę tabeli Firefox źle to robi, najlepiej jest użyć podkładki JavaScript. Nie powinieneś musieć zmieniać swojego DOM dla jednej nieudanej przeglądarki. Ludzie używają podkładek cały czas, gdy IE coś źle działa, a wszystkie inne przeglądarki robią to dobrze.

Oto fragment kodu z adnotacjami. JavaScript, HTML i CSS wykorzystują w moim przykładzie elastyczne praktyki projektowania stron internetowych, ale nie musisz tego robić, jeśli nie chcesz. (Elastyczny oznacza, że ​​dostosowuje się do szerokości przeglądarki).

http://jsfiddle.net/mrbinky3000/MfWuV/33/

Oto sam kod, ale bez kontekstu nie ma to sensu, więc odwiedź powyższy adres URL jsfiddle. (Pełny fragment zawiera również wiele komentarzy zarówno w CSS, jak i JavaScript.)

$(function() {
    // FireFox Shim
    if ($.browser.mozilla) {
        $('#test').wrapInner('<div class="ffpad"></div>');
        function ffpad() {
            var $ffpad = $('.ffpad'),
                $parent = $('.ffpad').parent(),
                w, h;
            $ffpad.height(0);
            if ($parent.css('display') == 'table-cell') {               
                h = $parent.outerHeight();
                $ffpad.height(h);
            }
        }
        $(window).on('resize', function() {
            ffpad();
        });
        ffpad();
    }
});

2
Chociaż to była dobra odpowiedź, nie kopiuj / wklejaj tego kodu. Biblioteka $ .browser stała się przestarzała od wersji jQuery 1.8 i została usunięta w wersji 1.9. Więcej informacji: api.jquery.com/jQuery.browser
cmegown.

Podoba mi się również ta odpowiedź, ale jak powiedział @cmegown, $ .browser jest teraz przestarzałe. Zamiast tego osobiście bym zrobił (spróbuję - nie jestem w 100% pewien, że to zadziała), to zmienić położenie elementu ze statycznego na bezwzględne (lub odwrotnie) i sprawdzić, czy jest zmiana położenia elementu w stosunku do okna. Powinno to działać tylko wtedy, gdy element ma top:0; left: 0;.
Nikola Ivanov Nikolov

Mogę potwierdzić, że to zadziałało - otrzymuję .offset () elementu, a następnie zmieniam go na pozycję bezwzględną i ponownie otrzymuję przesunięcie (), a jeśli nie jest to to samo, zamykam go w pozycji: względny div. To działa tylko dlatego, że kiedy ustawiony jest absolutnie, nie oczekuję, że mój element zmieni swoje położenie (ponieważ jest na górze: 0; po lewej: 0;)
Nikola Ivanov Nikolov

7
Firefox nie „robi tego źle”. Względne pozycjonowanie komórki tabeli jest niezdefiniowane w specyfikacji CSS. ( link )
user2867288

Teraz działa bez javascript nawet w Firefoksie (26). Ponadto jest to jak dotąd jedyna odpowiedź, która mi
pomogła

4

Proponuję rozwiązanie wykorzystujące eksperymentalny Flexbox do symulacji układu tabeli, który pozwoli elementowi zawartości komórki zapełnić pionowo komórkę nadrzędną:

Próbny

.table{ display:flex; border:2px solid red; }
.table > *{ flex: 1; border:2px solid blue; position:relative; }
.fill{ background:lightgreen; height:100%; position:absolute; left:0; right:0; }

/* Reset */
*{ padding:0; margin:0; }
body{ padding:10px; }
<div class='table'>
  <aside><div class='fill'>Green should be 100% height</div></aside>
  <aside></aside>
  <aside>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas odio, vitae scelerisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Mauris ante ligula, facilisis sed ornare eu, lobortis in odio. Praesent convallis urna a lacus interdum ut hendrerit risus congue. Nunc sagittis dictum nisi, sed ullamcorper ipsum dignissim ac. In at libero sed nunc venenatis imperdiet sed ornare turpis. Donec vitae dui eget tellus gravida venenatis. Integer fringilla congue eros non fermentum. Sed dapibus pulvinar nibh tempor porta. Cras ac leo purus. Mauris quis diam velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas odio, vitae scelerisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Mauris ante ligula, facilisis sed ornare eu, lobortis in odio. Praesent convallis urna a lacus interdum ut hendrerit risus conguet.</p>
  </aside>
</div>


3

po kilku dniach wyszukiwania znalazłem możliwe rozwiązanie tego problemu.

 <!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>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin título</title>
</head>

<body style="height:100%">
<!-- for Firefox and Chrome compatibility set height:100% in the containing TABLE, the TR parent and the TD itself. -->
<table width="400" border="1" cellspacing="0" cellpadding="0" style="height:100%;">  
  <tr>
    <td>whatever</td>
    <td>whatever</td>
    <td>whatever</td>
  </tr>
  <tr style="height:100%;">
    <td>whatever dynamic height<br /><br /><br />more content
</td>
    <td>whatever</td>

    <!-- display,background-color and radius properties in TD BELOW could be placed in an <!--[if IE]> commentary If desired.
    This way TD would remain as display:table-cell; in FF and Chrome and would keep working correctly.    
    If you don't place the properties in IE commentary it will still work in FF and Chorme with a TD display:block;

    The Trick for IE is setting the cell to display:block; Setting radius is only an example of whay you may want a DIV 100%height inside a Cell.
    -->

    <td style="height:100%; width:100%; display:block; background-color:#3C3;border-radius: 0px 0px 1em 0px;">

    <div style="width:100%;height:100%;background-color:#3C3;-webkit-border-radius: 0px 0px 0.6em 0px;border-radius: 0px 0px 0.6em 0px;">
    Content inside DIV TAG
    </div>
     </td>
  </tr>
</table>
</body>
</html>

Język hiszpański: El truco es establishment la Tabla, el TR y el TD a wysokość: 100%. Esto lo hace kompatybilny z FireFox y Chrome. Internet Explorer ignora eso, por lo que ponemos la etiqueta TD como block. De esta forma Explorer sí toma la altura máxima.

Angielskie wyjaśnienie: w komentarzach do kodu


3

jeśli <table> <tr> <td> <div>wszystkie zostały height: 100%;ustawione, element div wypełni dynamiczną wysokość komórki we wszystkich przeglądarkach.


1

Ok, nikt o tym nie wspomniał, więc pomyślałem, że opublikuję tę sztuczkę:

.tablecell {
    display:table-cell;
}
.tablecell div {
    width:100%;
    height:100%;
    overflow:auto;
}

przepełnienie: automatyczne włączanie tego elementu div kontenera w komórce załatwia sprawę za mnie. Bez tego element div nie wykorzystuje całej wysokości.


1

Jeśli komórka tabeli ma żądany rozmiar, po prostu dodaj tę klasę css i przypisz ją do swojego elementu div:

.block {
   height: -webkit-calc(100vh);
   height: -moz-calc(100vh);
   height: calc(100vh);
   width: 100%;
}

Jeśli chcesz, aby komórka tabeli również wypełniała rodzica, przypisz klasę również do komórki tabeli. Mam nadzieję, że to pomoże.


1

trochę za późno na imprezę, ale oto moje rozwiązanie:

<td style="padding: 0; position: relative;">
   <div style="width: 100%; height: 100%; position: absolute; overflow: auto;">
     AaaaaaaaaaaaaaaaaaBBBBBBBbbbbbbbCCCCCCCCCccccc<br>
     DDDDDDDddddEEEEEEEEdddfffffffffgggggggggggggggggggg
   </div>
</td>

1

Ponieważ nie mam wystarczającej reputacji, aby opublikować komentarz, chcę dodać kompletne rozwiązanie dla różnych przeglądarek, które łączy podejście @Madeorsk i @ Saadat z niewielkimi modyfikacjami! (Testowane w Chrome, Firefox, Safari, IE i Edge na dzień 2.10.2020)

table { height: 1px; }
tr { height: 100%; }
td { height: 100%; }
td > div { 
   height: -webkit-calc(100vh);
   height: -moz-calc(100vh);
   height: calc(100%);
   width: 100%;
    background: pink;  // This will show that it works!
} 

Jeśli jednak jesteś podobny do mnie, to chcesz również kontrolować wyrównanie w pionie, aw takich przypadkach lubię używać flexboksa:

td > div {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: flex-end;
}

0

Myślę, że najlepszym rozwiązaniem byłoby użycie JavaScript.

Ale nie jestem pewien, czy musisz to zrobić, aby rozwiązać problem umieszczania elementów na <td>zewnątrz komórki. W tym celu możesz zrobić coś takiego:

<div style="position:relative">
    <table>
        <tr>
            <td>
                <div style="position:absolute;bottom:-100px">hello world</div>
            </td>
        </tr>
    </table>
</div>

Oczywiście nie w tekście, ale z klasami i identyfikatorami.


Dzięki za odpowiedzi. Działa to, jeśli muszę umieścić coś względem stołu . Muszę umieścić coś poza pojedynczą komórką, w której lokalizacja komórki jest nieznana.
Jason,

czy możesz rozwinąć zawartość tej tabeli? a co to jest 100% szerokość / wysokość?
meder omuraliev

0

Aby wysokość: 100% działało dla wewnętrznego div, musisz ustawić wysokość dla td rodzica. W moim konkretnym przypadku działało przy użyciu wysokości: 100%. To sprawiło, że wewnętrzna wysokość div rozciągnęła się, podczas gdy inne elementy stołu nie pozwoliły, aby td stał się zbyt duży. Możesz oczywiście użyć innych wartości niż 100%

Jeśli chcesz, aby komórka tabeli miała również stałą wysokość, aby nie powiększała się w zależności od zawartości (aby przewinąć wewnętrzny element div lub ukryć przepełnienie), to znaczy, że nie masz wyboru, ale wykonaj kilka sztuczek js. Nadrzędny td będzie musiał mieć wysokość określoną w jednostce nie względnej (nie%). I najprawdopodobniej nie będziesz miał innego wyjścia, jak tylko obliczyć tę wysokość za pomocą js. Wymagałoby to również ustawienia table-layout: fixed style dla elementu table


0

Często napotykam podobne problemy i zawsze używam po prostu table-layout: fixed;na tableelemencie i height: 100%;na wewnętrznym div.


0

Ostatecznie nie znalazłem nic, co działałoby we wszystkich moich przeglądarkach i wszystkich trybach renderowania DocTypes / przeglądarki, z wyjątkiem używania jQuery. Oto co wymyśliłem.
Uwzględnia nawet rowspan.

function InitDivHeights() {
    var spacing = 10; // <-- Tune this value to match your tr/td spacing and padding.
    var rows = $('#MyTable tr');
    var heights = [];
    for (var i = 0; i < rows.length; i++)
        heights[i] = $(rows[i]).height();
    for (var i = 0; i < rows.length; i++) {
        var row = $(rows[i]);
        var cells = $('td', row);
        for (var j = 0; j < cells.length; j++) {
            var cell = $(cells[j]);
            var rowspan = cell.attr('rowspan') || 1;
            var newHeight = 0;
            for (var k = 0; (k < rowspan && i + k < heights.length); k++)
                newHeight += heights[i + k];
            $('div', cell).height(newHeight - spacing);
        }
    }
}
$(document).ready(InitDivHeights);

Przetestowano w IE11 (tryb Edge), FF42, Chrome44 +. Nie testowano z tabelami zagnieżdżonymi.


cóż, teraz jest to łatwe dzięki flexbox. to jest stare pytanie!
Jason

@Jason dzięki, ale potrzebowaliśmy go również do pracy w IE10 / IE11, które mają częściową / wadliwą obsługę flexbox zgodnie z caniuse.com/#feat=flexbox, a także github.com/philipwalton/flexbugs . Może później ...
Peter B

0

możesz to zrobić tak:

<td>
  <div style="width: 100%; position: relative; float: left;">inner div</div>
</td>

0

Jeśli pozycjonowany element i jego element ojczysty nie mają szerokości i wysokości, ustaw

padding: 0;

w swoim pierwiastku ojczystym,


0

To prawdopodobnie nie jest zalecane.

Znalazłem obejście, które działa, jeśli Twój element div nie zawiera tekstu i ma jednolite tło.

display: 'list-item'

nadaje elementowi div żądaną wysokość i szerokość, ale z dużym minusem wypunktowania elementu listy. Ponieważ element div ma jednolity kolor tła, pozbyłem się punktora w tych stylach:

list-style-position: 'inside',
color: *background-color*,

-1

Nie jestem pewien, co chcesz zrobić, ale możesz spróbować tego:

<td width="661" valign="top"><div>Content for New Div Tag Goes Here</div></td>


-1

Poniższe powinny działać. Musisz ustawić wysokość komórki nadrzędnej. https://jsfiddle.net/nrvd3vgd/

<table style="width:200px; border: 1px solid #000;">
    <tr>
        <td style="height:100px;"></td>
    </tr>
    <tr>
        <td style="height:200px;">
            <div style="height:100%; background: #f00;"></div>
        </td>
    </tr>
</table>

-1

Spróbuj tego:

<td style="position:relative;">
    <div style="position:absolute;top:0;bottom:0;width:100%;"></div>
</td>

-2

Spróbuj umieścić blok display: table wewnątrz komórki


1
Co masz na myśli mówiąc „display: table block”? Proszę rozważyć zmianę i sformatowanie odpowiedzi
Pmpr

-2

Nie oglądam tutaj starej sztuczki CSS dla < div > inside < td >. Dlatego przypominam: po prostu ustaw jakąś minimalną wartość szerokości , ale czego potrzebujesz dla minimalnej szerokości . Na przykład:

<div style="width: 3px; min-width: 99%;">

W takim przypadku szerokość td zależy od Ciebie.


-9

To jest moje rozwiązanie na rozszerzenie 100% wysokości i 100% szerokości w html <td>

jeśli usuniesz pierwszą linię w kodzie, możesz to naprawić ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

ponieważ ten typ dokumentu nie zezwala w niektórych plikach na użycie 100% procent wewnątrz <td>, ale jeśli usuniesz tę linię, treść nie rozszerza tła do 100% wysokości i 100% szerokości, więc znalazłem to, DOCTYPEco rozwiązuje problem

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">

ten DOCTYPE pozwala ci rozszerzyć tło w twoim ciele na 100% wysokości i 100% szerokości, i pozwala ci wziąć wszystkie 100% wysokości i 100% szerokości do <td>


3
Lepiej nie zadzierać z typem dokumentu. Wydaje się, że nie jesteś świadomy wszystkich konsekwencji. Zmiana Doctypów może mieć wiele skutków ubocznych (podobnie jak większość rzeczy w świecie CSS, niestety).
Rolf
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.