Jak sprawić, by obramowania zwinęły się (na DIV)?


81

Załóżmy, że mam znaczniki takie jak: http://jsfiddle.net/R8eCr/1/

<div class="container">
    <div class="column">
        <div class="cell"></div>
        <div class="cell"></div>
        <div class="cell"></div>
    </div>
    <div class="column">
        <div class="cell"></div>
        <div class="cell"></div>
        <div class="cell"></div>
    </div>
    <div class="column">
        <div class="cell"></div>
        <div class="cell"></div>
        <div class="cell"></div>
    </div>
    ...
</div>

Następnie CSS

.container {
    display: table;
    border-collapse: collapse;
}
.column {
    float: left;
    overflow: hidden;
    width: 120px;
}
.cell {
    display: table-cell;
    border: 1px solid red;
    width: 120px;
    height: 20px;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

Mam zewnętrzny element div zi display: table; border-collapse: collapse;komórki zdisplay: table-cell dlaczego nadal się nie zwijają? Czego tu brakuje?

Nawiasem mówiąc, może być zmienna liczba komórek w kolumnie, więc nie mogę mieć obramowań tylko z jednej strony.


Dlaczego nie użyjesz <table>i przyjaciół do stołów?
mu jest za krótkie

@muistooshort, ponieważ może być różna liczba komórek, a ja wolę nie mieć pustych komórek w konkretnym projekcie
Jiew Meng

Odpowiedzi:


36

tutaj jest demo

najpierw musisz poprawić błąd składniowy its

display: table-cell;

nie diaplay: table-cell;

   .container {
    display: table;
    border-collapse:collapse
}
.column {
    display:table-row;
}
.cell {
    display: table-cell;
    border: 1px solid red;
    width: 120px;
    height: 20px;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

Hmm w rzeczywistym kodzie, mam to poprawnie napisane ... hmm ... myślę, że to musi być coś innego w rzeczywistym kodzie, który nie działa ... Spróbuję dowiedzieć się, co może być przyczyną tego
Jiew Meng

poprawiłem swój błąd, to prawda, sprawdziłem twoją odpowiedź, ale
usunąłem

1
@ Hushme yeah, wiele osób wie, ale czasami rozłączają się z małym problemem, nie? w każdym razie kontynuuj, nie mam problemu.
Bhojendra Rauniyar

1
system głosowania nie ma na mnie wpływu, ale mogę się cieszyć, gdy ktoś mi pomoże.
Bhojendra Rauniyar

nie jesteś jedyną osobą, która ma zdolność CSS, sprawdź mój profil Mam 7 lat doświadczenia jako programista front-end
Hushme

94

Użyj prostego ujemnego marginesu zamiast tabeli wyświetlania.

Zaktualizowano w skrzypcach JS Fiddle

.container { 
    border-style: solid;
    border-color: red;
    border-width: 1px 0 0 1px;
    display: inline-block;
}
.column { 
    float: left; overflow: hidden; 
}
.cell { 
    border: 1px solid red; width: 120px; height: 20px; 
    margin:-1px 0 0 -1px;
}
.clearfix {
    clear:both;
}

83

Zamiast borderużywać box-shadow:

  box-shadow: 
    2px 0 0 0 #888, 
    0 2px 0 0 #888, 
    2px 2px 0 0 #888,   /* Just to fix the corner */
    2px 0 0 0 #888 inset, 
    0 2px 0 0 #888 inset;

Demo: http://codepen.io/Hawkun/pen/rsIEp


5
jest to właściwie najlepsze rozwiązanie, jakie znalazłem. Rozwiązuje problem, jeśli dane są generowane dynamicznie i nie gwarantuje doskonałości, powiedzmy, 9 elementów w siatce, ale zamiast tego 2, które, jeśli masz to z innymi rozwiązaniami, brakuje ci granic. Dobra robota !
Unsparing

3
Dobra sztuczka dla responsywnych układów, unikająca zmiany właściwości wyświetlania.
kosmos

3
Działa to dobrze w przypadku multimediów ekranowych. Ale na nośnikach drukowanych cień pola jest traktowany jako tło i nie jest drukowany.
Marcello Nuccio

U mnie to działało dobrze, ale zauważ, że te pierwsze trzy cienie można uzyskać za pomocą: 1px 1px 0 1px # 888 Rozłożenie i przesunięcie dbają o rogi.
Matt Schuette,

1
box-shadowjest ignorowany (znika) podczas korzystania z motywów o wysokim kontraście w systemie Windows, dlatego zawsze należy zapewnić alternatywę, jeśli zależy Ci na dostępności.
tomasz86

5

Musisz użyć display: table-rowzamiast float: left;do swojej kolumny i oczywiście jako @Hushme popraw swoje diaplay: table-cellnadisplay: table-cell;

 .container {
    display: table;
    border-collapse: collapse;
}
.column {
    display: table-row;
    overflow: hidden;
    width: 120px;
}
.cell {
    display: table-cell;
    border: 1px solid red;
    width: 120px;
    height: 20px;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

próbny


tutaj sprawdź link, którego już używałem , ale zapomniałem usunąć float: po lewej stronie jsfiddle.net/R8eCr/2 zobacz numer linku
Hushme

tak, w porządku. po prostu bądź tak blisko.
Bhojendra Rauniyar

4

Możesz także użyć ujemnych marginesów:

.column {
  float: left;
  overflow: hidden;
  width: 120px;
}
.cell {
  border: 1px solid red;
  width: 120px;
  height: 20px;
  box-sizing: border-box;
}
.cell:not(:first-child) {
  margin-top: -1px;
}
.column:not(:first-child) > .cell {
  margin-left: -1px;
}
<div class="container">
  <div class="column">
    <div class="cell"></div>
    <div class="cell"></div>
    <div class="cell"></div>
  </div>
  <div class="column">
    <div class="cell"></div>
    <div class="cell"></div>
    <div class="cell"></div>
  </div>
  <div class="column">
    <div class="cell"></div>
    <div class="cell"></div>
    <div class="cell"></div>
  </div>
  <div class="column">
    <div class="cell"></div>
    <div class="cell"></div>
    <div class="cell"></div>
  </div>
  <div class="column">
    <div class="cell"></div>
    <div class="cell"></div>
    <div class="cell"></div>
  </div>
</div>


1
Użyłem tej samej metody, tylko z border-top/left: 0;. Marginesy tworzą przesunięcia.
toster-cx

@ toster-cx Przypuszczam, że to nawet lepsze niż nakładanie się granic. Dobre myślenie :-)
mpen


0

Przykład użycia border-collapse: oddzielne;tak jak

  • kontener wyświetlany jako tabela:

    ol[type="I"]>li{
      display: table;
      border-collapse: separate;
      border-spacing: 1rem;
    }
    
  • 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.