Quando il bordo di 1 px viene aggiunto al div, la dimensione Div aumenta, non voglio farlo


128

Al clic sto aggiungendo 1px bordo a div, quindi la dimensione Div aumenta di 2px X 2px. Non voglio aumentare la dimensione del div. C'è un modo semplice per farlo?

Spiegazione dettagliata disordinata
In realtà sto aggiungendo DIV con float: left (stessa dimensione, come le icone) a un container-div, quindi tutti si accumulano uno dopo l'altro, e quando (la larghezza del container-div è di 300px) non c'è spazio lasciato in larghezza così i DIV secondari vengono visualizzati nella riga successiva, quindi il suo catalogo simile, ma a causa del bordo viene aumentata solo la dimensione DIV selezionata, DIV sotto DIV selezionato va a destra e crea uno spazio vuoto sotto DIV selezionato.

EDIT:
Diminuendo Altezza / Larghezza sulla selezione, ma come aumentarlo indietro. Usando un framework di terze parti, quindi non avere eventi quando DIV perde la selezione.


Risposte:


49

La proprietà border css aumenterà la dimensione "esterna" di tutti gli elementi, ad eccezione di tds nelle tabelle. Puoi avere un'idea visiva di come funziona in Firebug ( fuori produzione ), nella scheda layout html->.

Ad esempio, un div con una larghezza e un'altezza di 10px e un bordo di 1px, avrà una larghezza esterna e un'altezza di 12px.

Nel tuo caso, per far sembrare che il bordo si trovi "all'interno" del div, nella classe CSS selezionata, puoi ridurre la larghezza e l'altezza dell'elemento raddoppiando la dimensione del bordo, oppure puoi fare lo stesso per l'imbottitura degli elementi.

Per esempio:

div.navitem
{
    width: 15px;
    height: 15px;
    /* padding: 5px; */
}

div.navitem .selected
{
    border: 1px solid;
    width: 13px;
    height: 13px;
    /* padding: 4px */
}

grazie, avevo una classe .dragdrop-selezionata ma era usata da tutti gli oggetti trascinabili e avevo 3 dimensioni diverse (3 tipi diversi) di oggetto trascinabile, quindi ho continuato a riempire lo stesso in tutti e 3 e ho impostato la spaziatura in .dragdrop-selezionato. . & ha funzionato. :)
Nachiket,

Questa non è una buona soluzione per progetti reattivi. Usare outlineo un bordo con lo stesso colore dello sfondo (e cambiarne il colore in qualcos'altro quando è selezionato) è più flessibile.
AliBZ

1
Ma supponiamo che tu abbia bisogno di evitare di codificare a fondo la larghezza, per consentire all'elemento di fluire o rispondere alla larghezza della porta di visualizzazione: vedi la mia risposta usandoborder-color: transparent
Edward Newell

Non è necessario per questi calcoli, basta impostare il ridimensionamento della casella su border-box. Vedi la risposta di ejfrancis di seguito e leggi questo articolo .
jbyrd,

Sei sicuro del TD nelle tabelle? In Chrome sembra ancora aggiungere alla dimensione.
Protector un

105

Questo è utile anche in questo scenario. ti permette di impostare i bordi senza cambiare la larghezza div

textarea { 
  -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
  -moz-box-sizing: border-box;    /* Firefox, other Gecko */
  box-sizing: border-box;         /* Opera/IE 8+ */
}

Tratto da http://css-tricks.com/box-sizing/


4
dimensionamento delle scatole: border-box dovrebbe davvero essere impostato su tutto come una buona pratica moderna. Vedi paulirish.com/2012/box-sizing-border-box-ftw
jbyrd

6
Questo non sembra funzionare in alcuni casi; non sono esattamente sicuro del perché. Vedi: codepen.io/anon/pen/QZaBQG
Wilson Biggs,

51

imposta un bordo prima di fare clic per avere lo stesso colore dello sfondo.

Quindi, quando fai clic, cambia il colore di sfondo e la larghezza non cambierà.


3
Ingegnoso! vorrei averci pensato da solo.
Rijul Gupta,

9
Sì, ma se non hai uno sfondo a tinta unita? Vedi la mia risposta usandoborder-color: transparent
Edward Newell il

44

Un'altra buona soluzione è usare outlineinvece di border. Aggiunge un bordo senza influire sul modello di riquadro. Funziona su IE8 +, Chrome, Firefox, Opera, Safari.

( https://stackoverflow.com/a/8319190/2105930 )


È fantastico, ma rispetto al bordo, non c'è "contorno-sinistra, ...", non per il mio caso.
Imskull

2
Quindi raccomando di utilizzare box-shadowper l'altra mia risposta su una domanda simile. Non ha lo stesso supporto del browser, ma al giorno d'oggi è meno problematico.
Chowey,

Grazie #chowey, appena realizzato box-shadowpuò supportare anche il bordo unilaterale, soluzione perfetta.
Imskull

border-color: transparentha un migliore supporto cross-browser --- vedi la mia risposta ...
Edward Newell

1
Questo commento è sottovalutato. È un ottimo modo per ottenere un bordo attorno a un elemento senza ridimensionarlo!
Sebastian Nemeth,


28

Avendo utilizzato molte di queste soluzioni, trovo che il trucco dell'impostazione border-color: transparentsia il più flessibile e ampiamente supportato:

.some-element {
    border: solid 1px transparent;
}

.some-element-selected {
    border: solid 1px black;
}

Perché è meglio:

  • Non è necessario codificare a fondo la larghezza dell'elemento
  • Ottimo supporto cross-browser (mancava solo IE6)
  • A differenza di outline, è ancora possibile specificare, ad esempio, i bordi superiore e inferiore separatamente
  • A differenza dell'impostazione del colore del bordo in modo che corrisponda a quello dello sfondo, non è necessario aggiornarlo se si cambia lo sfondo ed è compatibile con sfondi di colore non solido.

1
Ho scoperto che funziona meglio con oggetti di dimensioni dinamiche nella mia UX. Ho fermato completamente lo spostamento delle dimensioni su MouseOver! Grazie signor Newell!
d3r3kk,

Genial. Grazie!
Harald Hoerwick,

È lui!
mentre vero

transparentquesto è ciò di cui hai bisogno!
dimpiax,

Questo è quello di cui ho bisogno (Y)
HaxxanRaxa,

20

Prova questo

box-sizing: border-box;

4
Questa dovrebbe essere la risposta, sporco semplice.
Spets

Perché questo non funziona ovunque? Ad esempio codepen.io/anon/pen/QZaBQG
Tom

ciao @ Tom, non sono sicuro del perché non funzioni ancora. Ma nel tuo caso, considera di rimuovere l'altezza nel contenitore e utilizzare invece l'imbottitura. Può risolvere il tuo problema.
Hoang Trung,

17

Di solito uso il riempimento per risolvere questo problema. L'imbottitura verrà aggiunta quando il bordo scompare e rimossa quando appare il bordo. Codice di esempio:

.good-border {
  padding: 1px;
}

.good-border:hover {
  padding: 0px;
  border: 1px solid blue;
}

inserisci qui la descrizione dell'immagine

Visualizza il mio codice di esempio completo su JSFiddle: https://jsfiddle.net/3t7vyebt/4/


1
Puoi dirmi cosa sta realmente succedendo, sono confuso, perché in un brutto passaggio del mouse qui si sposta verso il basso quando ci si passa sopra?
Suraj Jain,

@SurajJain Perché la dimensione del div "bordo cattivo" verrà modificata (aggiungi 1px di bordo) quando ci passi sopra.
Giovedì

6

Basta ridurre la larghezza e l'altezza del doppio della larghezza del bordo


3

Puoi fare alcune cose fantasiose con le ombre inserite. Esempio per mettere un bordo sul fondo di un elemento senza modificarne le dimensioni:

.bottom-border {
  box-shadow:inset 0px -3px 0px #000;
}

3

A volte non si desidera che l'altezza o la larghezza vengano influenzate senza l'impostazione esplicita. In tal caso, trovo utile usare gli pseudo elementi.

.border-me {
    position: relative;
}

.border-me::after {
    content: "";
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    border: solid 1px black;
}

Puoi anche fare molto di più con l'elemento pseudo, quindi questo è un modello abbastanza potente.


1
Avevo un bordo 1px che volevo cambiare in 2px, e l'unico modo in cui sono riuscito a trovarlo è stato rimuovendo widthe heighte aggiungendo una proprietà bottome leftin aggiunta a tope left, il che dovrebbe essere impostato sulla larghezza opposta di il bordo originale (nel mio caso -1px). Grande hack però
Chase Sandmann il

2

Prova a ridurre la dimensione del margine quando aumenti il ​​bordo


2

Avevo bisogno di essere in grado di "bordare" qualsiasi elemento aggiungendo una classe e non influenzarne le dimensioni. Una buona soluzione per me era usare box-shadow. Ma in alcuni casi l'effetto non era visibile a causa di altri fratelli. Così ho combinato sia il box-shadow tipico che il box-shadow interno. Il risultato è un aspetto del bordo senza cambiare alcuna dimensione.

Valori separati da virgola. Ecco un semplice esempio:

.add_border {
    box-shadow:-1px 0 1px 1px rgba(0, 0, 0, 0.75), inset -1px 0 0 1px rgba(0, 0, 0, 0.75);
}

jsfiddle

Regola il tuo look preferito e sei a posto!


2

Possiamo anche usare la funzione css calc ()

width: calc(100% - 2px);

sottraendo 2px per i bordi


1
.filter_list_button_remove {
    border: 1px solid transparent; 
    background-color: transparent;
}
.filter_list_button_remove:hover {
    border: 1px solid; 
}

1
Penso che sarebbe più utile per l'OP e altri visitatori, quando aggiungi qualche spiegazione per la tua intenzione.
Reporter,

1

Puoi creare l'elemento con bordo con lo stesso colore dello sfondo, quindi quando vuoi che il bordo mostri, basta cambiarne il colore.


1
Sì, ma supponiamo che il tuo sfondo non sia un colore a tinta unita ... vedi la mia risposta basata sull'usoborder-color: transparent
Edward Newell

O tutti insieme comeul li a{border-bottom:2px solid transparent;} ul li a:hover{border-bottom:2px solid red;}
stackunderflow

0

Nel caso in cui il contenuto del tuo divsia reso in modo dinamico e desideri impostarne l'altezza, puoi usare un semplice trucco con outline:

button {
    padding: 10px;
    border: 4px solid blue;
    border-radius: 4px;
    outline: 2px solid white;
    outline-offset: -4px;
}

button:hover {
    outline-color: transparent;
}

Esempio qui: https://codepen.io/Happysk/pen/zeQzaZ


Purtroppo il contorno non ha angoli arrotondati :(
M3RS,

0

Puoi provare un riquadro box-shadow

qualcosa del genere: box-shadow: inset 0px -5px 0px 0px #fff

aggiunge un bordo bianco 5px nella parte inferiore dell'elemento senza aumentare le dimensioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.