Su questo mi trovi perfettamente d'accordo. Il box model di IE 5 (quello che considera padding e border come facenti parte della larghezza) è sbagliato secondo le specifiche, ma è anche il migliore per logicità e utilità. Trovo stupidissimo anche io che impostando una width e un border e/o un padding, questi si aggiungano alla larghezza. Secondo me era molto più logico seguire il box model di IE 5, invece di diventare scemi a calcolare i pixel in più o in meno!
Purtroppo, quello che vorresti tu (e pure io) non è contemplato nei CSS2, ma probabilmente lo sarà nei CSS3. Dovrebbero venire introdotte le proprietà box-width e box-height (e anche box-size) che simulano il comportamento del box model di IE 5. Spero che al W3C si siano resi conto dell'assurdità di determinare la larghezza di un box senza considerare padding e border.
Una soluzione, ma non so se può andarti bene, è usare un sistema del genere.
Imposti il tuo <div> senza padding e solo con i border superiore e inferiore:
codice:
div {
width: 100%;
border-top: 1px solid black;
border-bottom: 1px solid black;
}
Siccome non determini l'altezza, i bordi superiore e inferiore vengono aggiunti "all'esterno" del box allo stesso modo sia in Mozilla che in IE 5/6, ma questo non dovrebbe essere un problema, visto che è la larghezza che ti interessa non sia modificata da padding e border.
Poi, alla regola precedente, aggiungi anche queste dichiarazioni:
codice:
background-image: url(IMMAGINE_SFONDO);
background-repeat: repeat-y;
dove IMMAGINE_SFONDO è un'immagine alta anche 1px e larga quanto il box. L'immagine è dello stesso colore dello sfondo del box e su entrambi i lati destro e sinistro ha 1px nero.
Facendola ripetere verticalmente, ottieni l'effetto di applicare 2 "bordi" neri ai lati verticali del tuo box.
Questo però presuppone che la tua width: 100% sia riferita alla larghezza fissa del box contenitore, altrimenti dovresti per forza annidare un <div> all'interno (in modo da poter applicare due sfondi: uno col bordo destro e uno col bordo sinistro).
Infine, e questo purtroppo lo devi fare, aggiungi un box (<div> o
) dentro il tuo box (magari puoi aggiungerlo "a mano" ai contenuti, senza toccare la servlet). Per questo elemento non imposti nessuna larghezza, ma solo un padding verticale di 10px e uno orizzontale di 11px (per compensare il pixel di "bordo" creato dall'immagine di sfondo).
codice:
div p {
padding: 10px 11px;
}
Dovrebbe funzionare tutto così...