Wenn 1 px Rahmen zu div hinzugefügt wird, erhöht sich die Div-Größe. Das möchten Sie nicht tun

128

Beim Klicken füge ich hinzu, 1px Rand zu div, so dass Div Größe um 2px X 2px erhöht. Ich möchte nicht, dass die Div-Größe erhöht wird. Gibt es eine einfache Möglichkeit, dies zu tun?

Unordentlich Detaillierte Erklärung
Eigentlich füge ich DIVs mit float: left (gleiche Größe, wie Symbole) zu einem Container-Div hinzu, sodass alle nacheinander gestapelt werden und wenn (Container-Div-Breite 300px) kein Platz mehr in der Breite übrig bleibt Untergeordnete DIVs werden in der nächsten Zeile angezeigt, daher ähnelt dies dem Katalog. Da jedoch nur die ausgewählte DIV-Größe des Rahmens erhöht wird, wird die DIV unter der ausgewählten DIV nach rechts verschoben und ein leerer Bereich unter der ausgewählten DIV erstellt.

BEARBEITEN:
Verringern der Höhe / Breite bei der Auswahl, aber wie man sie wieder erhöht. Verwenden Sie ein Framework von Drittanbietern, haben Sie also kein Ereignis, wenn DIV die Auswahl verliert.

Nachiket
quelle

Antworten:

49

Die Eigenschaft border css erhöht alle "äußeren" Elemente, mit Ausnahme von tds in Tabellen. Auf der Registerkarte HTML-> Layout erhalten Sie eine visuelle Vorstellung davon, wie dies in Firebug ( eingestellt ) funktioniert.

Nur als Beispiel hat ein Div mit einer Breite und Höhe von 10 Pixel und einem Rand von 1 Pixel eine äußere Breite und Höhe von 12 Pixel.

In Ihrem Fall können Sie die Breite und Höhe des Elements um das Doppelte Ihrer Rahmengröße reduzieren, um den Eindruck zu erwecken, dass sich der Rand auf der "Innenseite" des div befindet. In Ihrer ausgewählten CSS-Klasse können Sie das Gleiche tun die Elemente Polsterung.

Z.B:

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

div.navitem .selected
{
    border: 1px solid;
    width: 13px;
    height: 13px;
    /* padding: 4px */
}
Sean Amos
quelle
Danke, ich hatte eine von .dragdrop ausgewählte Klasse, aber sie wurde von allen ziehbaren Objekten verwendet und ich hatte 3 verschiedene Größen (3 verschiedene Typen) von ziehbaren Objekten, also habe ich das Auffüllen in allen 3 beibehalten UND das Auffüllen in .dragdrop ausgewählt. . & es funktionierte. :)
Nachiket
Dies ist keine gute Lösung für reaktionsschnelle Designs. Die Verwendung outlineeines Rahmens mit derselben Farbe wie der Hintergrund (und das Ändern der Farbe in eine andere Farbe bei Auswahl) ist flexibler.
AliBZ
1
Angenommen, Sie müssen vermeiden, die Breite fest zu codieren, um das Element fließen zu lassen oder auf die Breite des Ansichtsfensters zu reagieren: Siehe meine Antwort mitborder-color: transparent
Edward Newell
Diese Berechnungen sind nicht erforderlich. Setzen Sie einfach die Boxgröße auf Border-Box. Siehe die Antwort von ejfrancis unten und diesen Artikel .
4.
Sind Sie sicher über die td in Tabellen? In Chrome scheint es immer noch die Größe zu erhöhen.
Beschützer ein
105

Dies ist auch in diesem Szenario hilfreich. Sie können damit Rahmen festlegen, ohne die Div-Breite zu ändern

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+ */
}

Entnommen aus http://css-tricks.com/box-sizing/

ejfrancis
quelle
4
Box-Sizing: Border-Box sollte wirklich als moderne Best Practice auf alles gesetzt werden. Siehe paulirish.com/2012/box-sizing-border-box-ftw
jbyrd
6
Dies scheint in einigen Fällen nicht zu funktionieren. Ich weiß nicht genau warum. Siehe: codepen.io/anon/pen/QZaBQG
Wilson Biggs
51

Legen Sie einen Rahmen fest, bevor Sie auf die gleiche Farbe wie der Hintergrund klicken.

Wenn Sie dann auf klicken, ändern Sie einfach die Hintergrundfarbe und die Breite ändert sich nicht.

Corymathews
quelle
3
Genial! Ich wünschte, ich hätte selbst daran gedacht.
Rijul Gupta
9
Ja, aber wenn Sie keinen einfarbigen Hintergrund haben? Siehe meine Antwort mitborder-color: transparent
Edward Newell
44

Eine andere gute Lösung ist, outlineanstelle von zu verwenden border. Es wird ein Rahmen hinzugefügt, ohne das Box-Modell zu beeinflussen. Dies funktioniert unter IE8 +, Chrome, Firefox, Opera und Safari.

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

Chowey
quelle
Es ist großartig, aber im Vergleich zum Rand gibt es keine "Gliederung links, ...", nicht für meinen Fall.
Imskull
2
Dann empfehle ich, box-shadowgemäß meiner anderen Antwort eine ähnliche Frage zu verwenden. Es hat nicht die gleiche Browserunterstützung, aber das ist heutzutage weniger ein Problem.
Chowey
Vielen Dank #chowey, gerade erkannt, box-shadowkann auch einseitige Grenze unterstützen, Präfektenlösung.
Imskull
border-color: transparenthat eine bessere browserübergreifende Unterstützung --- siehe meine Antwort ...
Edward Newell
1
Dieser Kommentar ist unterbewertet. Es ist eine großartige Möglichkeit, einen Rahmen um ein Element zu erstellen, ohne dessen Größe zu ändern!
Sebastian Nemeth
42

Versuchen Sie , borderzu outline:

outline: 1px solid black;
panwp
quelle
8
Funktioniert, es sei denn, Sie haben einen Randradius.
Jean-Marie Dalmasso
28

Nachdem ich viele dieser Lösungen verwendet habe, finde ich den Trick des Einstellens border-color: transparentam flexibelsten und am weitesten verbreitet:

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

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

Warum ist es besser:

  • Die Breite des Elements muss nicht fest codiert werden
  • Großartige browserübergreifende Unterstützung (nur IE6 fehlt)
  • Im Gegensatz zu mit outlinekönnen Sie beispielsweise die oberen und unteren Ränder weiterhin separat angeben
  • Im Gegensatz zum Festlegen der Rahmenfarbe als Hintergrundfarbe müssen Sie diese nicht aktualisieren, wenn Sie den Hintergrund ändern, und sie ist mit nicht einfarbigen Hintergründen kompatibel.
Edward Newell
quelle
1
Ich fand, dass dies am besten mit dynamisch bemessenen Elementen in meiner UX funktioniert. Die Größenverschiebung bei MausOver wurde vollständig gestoppt! Vielen Dank, Herr Newell!
d3r3kk
Genial. Danke!
Harald Hoerwick
Das ist der eine!
während wahr
transparentdas ist was für ein Bedürfnis!
Dimpiax
Das brauche ich (Y)
HaxxanRaxa
20

Versuche dies

box-sizing: border-box;
Hoang Trung
quelle
4
Dies sollte die Antwort sein, einfach.
Spets
Warum funktioniert das nicht überall? ZB codepen.io/anon/pen/QZaBQG
Tom
hi @Tom, ich bin mir nicht sicher warum es noch nicht funktioniert. In Ihrem Fall sollten Sie jedoch die Höhe im Behälter entfernen und stattdessen Polster verwenden. Kann dein Problem lösen.
Hoang Trung
17

Normalerweise verwende ich Polsterung, um dieses Problem zu beheben. Die Polsterung wird hinzugefügt, wenn der Rand verschwindet, und entfernt, wenn der Rand angezeigt wird. Beispielcode:

.good-border {
  padding: 1px;
}

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

Geben Sie hier die Bildbeschreibung ein

Sehen Sie sich meinen vollständigen Beispielcode auf JSFiddle an: https://jsfiddle.net/3t7vyebt/4/

Tho
quelle
1
Kannst du mir sagen, was tatsächlich passiert, ich bin verwirrt, warum verschiebt sich der Schwebeflug in einer schlechten Grenze hier nach unten, wenn du darüber schwebst?
Suraj Jain
@SurajJain Da die Größe von "bad border" div geändert wird (1 Pixel Rand hinzufügen), wenn Sie den Mauszeiger darüber halten.
Do
6

Verringern Sie einfach die Breite und Höhe um das Doppelte der Randbreite

Sadat
quelle
3

Sie können einige ausgefallene Dinge mit eingelassenen Schatten tun. Beispiel für das Einfügen eines Rahmens am unteren Rand eines Elements, ohne dessen Größe zu ändern:

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

Manchmal möchten Sie nicht, dass Höhe oder Breite beeinflusst werden, ohne dies explizit festzulegen. In diesem Fall finde ich es hilfreich, Pseudoelemente zu verwenden.

.border-me {
    position: relative;
}

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

Sie können auch viel mehr mit dem Pseudoelement tun, so dass dies ein ziemlich mächtiges Muster ist.

Jack Guy
quelle
1
Ich hatte eine 1px Grenze , dass ich zu 2px, und der einzige Weg , den ich finden konnte ändern wollte , das war zu tun , indem sie die Entfernung widthund heightund das Hinzufügen von ein bottomund leftEigentum zusätzlich zu den topund left, die alle auf der gegenüberliegenden Breite eingestellt werden sollte der ursprüngliche Rand (in meinem Fall -1px). Toller Hack
Chase Sandmann
2

Versuchen Sie, die Randgröße zu verringern, wenn Sie den Rand vergrößern

arun
quelle
2

Ich musste in der Lage sein, jedes Element durch Hinzufügen einer Klasse zu "begrenzen" und ihre Dimensionen nicht zu beeinflussen. Eine gute Lösung für mich war die Verwendung von Box-Shadow. In einigen Fällen war der Effekt jedoch aufgrund anderer Geschwister nicht sichtbar. Also habe ich sowohl typischen Box-Shadow als auch Inset-Box-Shadow kombiniert. Das Ergebnis ist ein Rahmenlook ohne Änderung der Abmessungen.

Durch Komma getrennte Werte. Hier ist ein einfaches Beispiel:

.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

Passen Sie Ihren bevorzugten Look an und los geht's!

Chris
quelle
2

Wir können auch die Funktion css calc () verwenden

width: calc(100% - 2px);

Subtrahieren von 2px für Ränder

Rajeev Singh
quelle
1
.filter_list_button_remove {
    border: 1px solid transparent; 
    background-color: transparent;
}
.filter_list_button_remove:hover {
    border: 1px solid; 
}
Peevo
quelle
1
Ich denke, es wäre hilfreicher für das OP und weitere Besucher, wenn Sie eine Erklärung für Ihre Absicht hinzufügen.
Reporter
1

Sie können das Element mit Rahmen mit derselben Hintergrundfarbe erstellen. Wenn der Rahmen angezeigt werden soll, ändern Sie einfach seine Farbe.

Matt Karatilovly
quelle
1
Ja, aber nehmen wir an, Ihr Hintergrund ist nicht einfarbig ... siehe meine Antwort basierend auf der Verwendung vonborder-color: transparent
Edward Newell
Oder alle zusammen wieul li a{border-bottom:2px solid transparent;} ul li a:hover{border-bottom:2px solid red;}
stackunderflow
0

Wenn der Inhalt von Ihnen divdynamisch gerendert wird und Sie seine Höhe festlegen möchten, können Sie einen einfachen Trick verwenden mit outline:

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

button:hover {
    outline-color: transparent;
}

Beispiel hier: https://codepen.io/Happysk/pen/zeQzaZ

Matúš Šťastný
quelle
Der Umriss hat leider keine abgerundeten Ecken :(
M3RS
0

Sie können einen Box-Shadow-Inset ausprobieren

so etwas wie: box-shadow: Einschub 0px -5px 0px 0px #fff

Fügt am unteren Rand des Elements einen weißen 5-Pixel-Rand hinzu, ohne die Größe zu erhöhen

Mzard31
quelle