Wie entferne ich den Offset eines Elements mithilfe von CSS?

88

Ich habe ein Positionierungsproblem mit einigen Elementen. Bei der Überprüfung der IE8 Developer-Tools wird Folgendes angezeigt:

Woher kommt der Offset?

Jetzt bin ich mir ziemlich sicher, dass mein Problem der Versatz von 12 ist, aber wie entferne ich ihn ? Ich kann keine Erwähnung einer CSS-Offset-Eigenschaft finden. Benötigen wir zusätzlich zur Marge einen Offset?

Hier ist der Code, der dies erzeugt:

 <div id="wahoo" style="border: solid 1px black; height:100px;">

    <asp:TextBox ID="inputBox" runat="server" />

    <input id="btnDropDown" type="button" style="width:26px; height:26px; background-position: center center; border-left-color: buttonface; background-image: url(Images/WebResource.gif); border-bottom-color: buttonface; border-top-color: buttonface; background-repeat: no-repeat; border-right-color: buttonface;"  tabindex="99" />

    <div id="ListboxWrapper" style="display:none; position:absolute; onfocusout="this.style.display = 'none'"">
       <asp:ListBox ID="lstBoxCompany" runat="server" AutoPostBack="True" OnSelectedIndexChanged="lstBoxCompany_SelectedIndexChanged" style="z-index: 100;" Width="300px" />               
    </div>

</div>

Das Element mit dem Versatz ist inputBox

m.edmondson
quelle
Ist Ihr Element positioniert? Check leftund topEigenschaften.
Jessegavin
6
Ein kleiner Code wäre hier sehr nützlich. Es gibt keine 'Versatz'-Regel in CSS, aber der IE neigt dazu, zufällige Pixel an zufälligen Stellen hinzuzufügen. Es hat normalerweise mit Schwimmern und Positionierung zu tun
Alex
Ich würde annehmen, dass 'Versatz' 'Pixel sind, die sich auf andere Elemente beziehen' - wie ein Rand eines vorherigen Elements, der dieses nach unten drückt. Ich habe jetzt keine Zeit, mit IE-Entwicklertools zu experimentieren, um dies herauszufinden.
Quentin
Ich habe den Code komplett mit Inline-CSS hinzugefügt, damit wir sehen können, was los ist
m.edmondson
Gibt es ein Webseitenbeispiel, das wir uns ansehen können - zum Beispiel, damit wir Firebug darauf richten und die breitere Seite verstehen können. Erbt Ihr Eingabesteuerelement beispielsweise den Rand oder das Auffüllen von einer anderen CSS-Definition?
Kris C

Antworten:

43

Dieser Versatz ist im Grunde die x, y-Position, die der Browser für das Element basierend auf seinem Positions-CSS-Attribut berechnet hat. Wenn Sie also ein <br>davor oder ein anderes Element einfügen, ändert sich der Versatz. Zum Beispiel könnten Sie es auf 0 setzen, indem Sie:

#inputBox{position:absolute;top:0px;left:0px;}

oder

#inputBox{position:relative;top:-12px;left:-2px;}

Daher ist jedes Positionierungsproblem, das Sie haben, nicht unbedingt ein Problem mit dem Versatz, obwohl Sie es jederzeit beheben können, indem Sie mit den Attributen oben, links, rechts und unten spielen.

Ist Ihr Problem mit dem Browser nicht kompatibel?

Neo
quelle
2
Bitte beachten Sie auch Stony's Kommentar zur vertikalen Ausrichtung. Das Korrigieren der Ausrichtungseinstellung scheint dem gewaltsamen Überschreiben der Browserpositionierung des Elements vorzuziehen.
Jeremy Condit
33

Für mich war es vertical-align: baselinevs vertical-align: top, das den oberen Versatz verursachte.

Versuchen Sie zu setzen vertical-align: top

Richard
quelle
2
Dies ist besser als die absolute Positionierung
Benutzer1
2
Ihre Antwort ist fantastisch. Die Tatsache, dass ich die vertikale Ausrichtung einstellen muss, wenn ich 4 Inline-Block-Divs habe, die sich nicht ausrichten lassen, ist bull. Sie haben die Arbeitsstunden beendet. Danke dir.
Corey Ogburn
Arbeitete mit einem <button>in ein <li>Element eingebetteten .
Amessihel
9

Schnelle Lösung:

position: relative;
top: -12px;
left: -2px;

Dies sollte diese Offsets ausgleichen, aber vielleicht sollten Sie sich Ihr gesamtes Layout ansehen und sehen, wie diese Box mit anderen Boxen interagiert.

Wie für Terminologie left, right, topund bottomsind CSS - Offset - Eigenschaften. Sie werden zum Positionieren von Elementen an einer bestimmten Stelle verwendet (bei Verwendung mit absoluteoderfixed Positionierung) oder zum Verschieben relativ zu ihrer Standardposition (bei Verwendung mit relativePositionierung) verwendet. Ränder hingegen geben Lücken zwischen Feldern an und fallen manchmal zusammen, sodass sie nicht zuverlässig als Offsets verwendet werden können.

Beachten Sie jedoch, dass in Ihrem Fall dieser Offset möglicherweise nicht (ausschließlich) aus CSS-Offsets berechnet wird.

Alin Purcaru
quelle
Dadurch wird das Leerzeichen nur auf die andere Seite des Elements verschoben.
Quentin
@ David Welches Leerzeichen? Und warum sollte etwas anderes als die Zielbox verschoben werden?
Alin Purcaru
Leerzeichen sind Räume, in denen nichts enthalten ist. Andere Dinge als die Zielbox würden nicht bewegt, das ist der Punkt. Wenn Sie etwas 1px unten haben und 12px nach oben gehen, dann ist es 13px unten statt 1px.
Quentin
2
@ David Wir haben vielleicht nicht die gleiche Definition von Leerzeichen, aber ich verstehe, was Sie sagen wollen. Ich bin damit einverstanden, dass die Lücke auf die andere Seite verschoben wird. Ich habe die Lösung als "schnelle Lösung" bezeichnet, da sie möglicherweise verwendet werden kann oder nicht. Es ist das einzige, was ich vorschlagen kann, bis der Fragesteller mehr Details liefert.
Alin Purcaru
3

Das Setzen der oberen und linken Eigenschaften auf negative Werte ist möglicherweise keine gute Lösung, wenn Ihr Problem einfach darin besteht, dass Sie sich im Mackenmodus befinden. Dies kann passieren, wenn auf der Seite eine <!DOCTYPE>Deklaration fehlt und diese im IE8 im Mackenmodus gerendert wird. Stellen Sie in den IE8-Entwicklertools sicher, dass unter "Dokumentmodus" nicht "Quirks-Modus" ausgewählt ist. Wenn es ausgewählt ist, müssen Sie möglicherweise die entsprechende <!DOCTYPE>Deklaration hinzufügen .

normalmike
quelle
2

Wenn Sie die IE-Entwicklertools verwenden, stellen Sie sicher, dass Sie sie nicht versehentlich in einer älteren Einstellung belassen haben. Ich machte mich mit demselben Problem verrückt, bis ich sah, dass es auf Internet Explorer 7-Standards eingestellt war. Es wurde in Internet Explorer 9-Standards geändert und alles rastete ein.

Tom McGee
quelle
1
Einige von uns haben noch Benutzer auf IE7.
15ee8f99-57ff-4f92-890c-b56153
2

bewegliches Element oben: -12px oder Positionieren löst das Problem absolut nicht, sondern maskiert es nur

Ich hatte das gleiche Problem - prüfen Sie, ob Sie in einem Wrapping-Element gemischt haben: schwebende Elemente mit nicht schwebenden Elementen - mein nicht schwebendes Element verursachte diesen seltsamen Versatz zum schwebenden

Picard
quelle
In meinem Fall habe ich versucht, das Aussehen einer Website mit dem eines Prototyps in Einklang zu bringen. Ich hatte eine Reihe von Inline-Block-Divs mit der gleichen Breite wie der Prototyp, aber meine Offsets waren um 4 versetzt. Ich stellte fest, dass ich auf der Website eine Mischung aus schwebenden Divs und nicht schwebenden Divs hatte. Wenn Sie sie alle schweben lassen, wird der zusätzliche Versatz entfernt. Das war besonders verwirrend, weil ich nicht viel anderes zwischen den CSS sehen konnte.
Clint Brown
1

Rand definieren und Auffüllen für das Element ist mit dem Problem konfrontiert:

#element_id {margin: 0; padding: 0}  

und prüfen Sie, ob ein Problem vorliegt. IE rendert die Seite mit mehr unerwünschter Vererbung. Sie sollten es daran hindern.

Pmpr
quelle
1

Dies scheint seltsam, aber Sie können versuchen, vertical-align: topdie CSSfür die Eingänge einzustellen. Das behebt es zumindest in IE8.

BrainCoder
quelle
1

Ich hatte das gleiche Problem auf unserer .NET-basierten Website, die auf DotNetNuke (DNN) lief, und was es für mich löste, war im Grunde ein einfaches Zurücksetzen des Randes des Formular-Tags. .NET-basierte Websites werden häufig in ein Formular eingeschlossen. Ohne Zurücksetzen des Randes wird manchmal der seltsame Versatz angezeigt, vor allem, wenn einige Skripte enthalten sind.

Wenn Sie also versuchen, dieses Problem auf Ihrer Website zu beheben, geben Sie dies in Ihre CSS-Datei ein:

form {
  margin: 0;
}
Vlastique
quelle
Ich hatte das gleiche Problem und das Ändern des Formularrandes funktionierte auch für mich.
David Derman
0

Sie können ein Reset-CSS anwenden, um diese 'Standardeinstellungen' zu entfernen. Hier ist ein Beispiel für ein Zurücksetzen von CSS http://meyerweb.com/eric/tools/css/reset/ . Wenden Sie einfach die Rücksetzstile VOR Ihren eigenen Stilen an.

sawe
quelle
0

Ich hatte das gleiche Problem. Der Offset wurde nach der Aktualisierung von UpdatePanel angezeigt. Die Lösung bestand darin, vor dem UpdatePanel ein leeres Tag wie folgt hinzuzufügen:

<div></div>

...

mitkob
quelle
1
UpdatePanel ist eine ASP.NET-Sache, oder? Weil dies keine ASP.NET-Frage zu sein scheint.
Joe Mabel
Wenn Sie das Code-Snippet in der Frage anzeigen, werden Sie feststellen, dass es sich um eine ASP.NET-Frage handelt.
Mitkob
Ah. Sorry, nur überflogen, habe die asp: TextBox nicht bemerkt. FWIW, das Problem ist kein ASP.NET- Problem . Wenn dieses Problem auftritt, bedeutet dies in der Regel, dass der betreffende Versatz darauf zurückzuführen ist, dass ein anderes Element größer ist. Wenn dies zu einem schlechten Layout führt, besteht der Schlüssel normalerweise darin, den Rand, den Abstand oder den Rand eines anderen Elements zu verringern das gleiche Elternteil div.
Joe Mabel
0

Setzen Sie den Umriss einfach so

[Kennung] {Gliederung: keine; }}

Daniel Barde
quelle
0

In meinem Fall wurde der Versatz einem benutzerdefinierten Element mit Rasterlayout innerhalb eines Li hinzugefügt, während die Ul eine vertikale Flexbox war.

Geben Sie hier die Bildbeschreibung ein

Die ziemlich einfache Lösung bestand darin, das Definieren des Li als Blockelement mit festzulegen

li {
 display: block;
}

Und der Offset war weg

Th3S4mur41
quelle