2012-06-21 3 views
13

Quando si utilizza il ridimensionamento della casella: border box in CSS, presumo che la larghezza totale di un elemento sia definita nel suo valore "larghezza". Quindi se dico che la larghezza di una divisione è 20px e il margine destro è 10px, finirò con una scatola che occupa lo spazio di 20px e metà è il bordo destro. Spingendola al punto in cui ho impostato la larghezza a 10px e il bordo destro, anche, come qui:Perché il ridimensionamento della casella: border-box mostra ancora il bordo con una larghezza di 0px?

#box{ 
    overflow: hidden; 
    width: 10px; 
    box-sizing: border-box; 
    height: 100px; 
    background: black; 
    border-right: 10px solid red; 
}​ 

casella consisterà solo il bordo rosso. Cosa dovrebbe succedere quando imposto la larghezza su 0px? Ho pensato che sarebbe rendere il tutto scompare, ma no, il risultato è esattamente lo stesso come quello qui sopra: jsFiddle

La mia domanda è se questo è il comportamento previsto. Sembra incoerente per me. Mi piacerebbe far scomparire una scatola solo manipolando la larghezza/altezza. Grazie per qualsiasi input.

+0

Che browser stai utilizzando? Non tutti i browser supportano il ridimensionamento della scatola direttamente. Alcuni hanno il proprio dimensionamento di riquadri proprietario come '-moz-box-sizing' e' -webkit-box-sizing'. Se vuoi far sparire qualcosa, considera l'uso di 'display: none;' o 'visibility: hidden;' – Jrod

+0

Potrei anche usare un martello per rompere un uovo ... ma sto cercando di non farlo :) Sto scherzando, davvero hai bisogno che l'elemento scompaia in quel modo ... pensa a una fessura ... – Seka

+0

Vuoi dire una specie di animazione in cui lentamente diminuisci la larghezza a zero? Non sei proprio sicuro di cosa intendi con una fessura. Se potessi approfondire esattamente ciò che stai cercando di raggiungere, forse un'altra soluzione più appropriata. Come con la maggior parte delle cose ci sono molti modi per farlo. Forse un artiglio è una scelta sbagliata, ma forse un martello demolitore è proprio il tuo vicolo. – Jrod

risposta

14

L'area del contenuto è tutto a sinistra dopo aver sottratto la larghezza del bordo.

La larghezza e l'altezza contenuti sono calcolati sottraendo il confine e imbottitura larghezze dei rispettivi lati della ‘larghezza’ specificato e proprietà ‘height’.

larghezza specificata = 10 px
larghezza border = 10 px
Content width = larghezza specificata (10 px) - larghezza del bordo (10 px)
larghezza Content 10 - 10 = 0

specificabili larghezza = 0 px
border width = 10 px
width contenuto = larghezza specificata (0 px) - larghezza del bordo (10 px)
larghezza contenuto 0 - 10 = -10 (che eliminerebbe il 10 px utilizzato dal confine)

Ma

Poiché la larghezza del contenuto e l'altezza non può essere negativo ([CSS21], sezione 10.2), questo calcolo è arrotondata a 0.

Specificato width = 0 px
larghezza del riquadro = 10 px
Larghezza del contenuto = larghezza specificata (0 px) - larghezza del bordo (10 px)
Larghezza del contenuto 0 - 10 = 0 (che non rimuove il 10 px utilizzato dal bordo)

Se non si desidera utilizzare o display:none;visibility:hidden;, è necessario impostare sia il width:XX; e border-right:XX; a zero.

+0

Grazie per la risposta; la chiave era capire che il confine rimane a causa del risultato negativo, immagino. Ma, secondo te, pensi che sia un comportamento coerente? Mi chiedo perché, in quest'ultimo caso, border-box e content-box si comportano allo stesso modo e mi sembrano così poco intuitivi. Cosa ne pensi? – Seka

+0

Sono d'accordo, il problema è che non puoi permettere blocchi di dimensioni negative, quindi è così che hanno deciso di affrontarlo. Non riesco a pensare ad un'alternativa migliore. – codewaggle

+1

questo è come si crea un triangolo! https://css-tricks.com/examples/ShapesOfCSS/ –

0

Date un'occhiata a questo screenshot:

box metrics

L'intera scatola è 100x100px come ci si aspetterebbe, ma la larghezza effettiva è 90px + 10px bordo destro. Quindi, quando si imposta la larghezza su 0, la larghezza è ancora 0 (non può avere larghezza negativa), ma si ha ancora il bordo 10px.

+0

Ma perché hai ancora il confine? Perché dopo le specifiche non dovrebbe essere lì: "La larghezza e l'altezza del contenuto sono calcolate sottraendo le larghezze dei bordi e delle spaziature dei rispettivi lati dalle proprietà" larghezza "e" altezza "specificate, poiché la larghezza e l'altezza del contenuto non possono essere negative ([CSS21], sezione 10.2), questo calcolo ha un valore pari a 0. " [vedi border-box] (http://www.w3.org/TR/css3-ui/#box-sizing0) – Seka

+1

Ecco cosa sta succedendo. La larghezza del contenuto (larghezza che non include i bordi o il riempimento) è 0 perché, dopo aver sottratto i bordi e il riempimento, ti rimane una larghezza negativa. La cosa da notare è come definisci il "contenuto". – sachleen

+0

... quindi la "larghezza" totale dell'elemento dovrebbe essere pavimentata a 0, giusto? Se definendo width: 10px e border-right: 10px, ottengo una casella di 10px, dovrei ottenere una casella di 0px se definisco la larghezza a 0px, corretto? Citando Paul Irish: "Se dico che la larghezza è di 200px [0px], accidenti, sarà una casella di 200px [0px], anche se ho 20px di padding [border]." [* {riquadratura riquadro: border-box} FTW] (http://paulirish.com/2012/box-sizing-border-box-ftw/) – Seka