Jak pozbyć się przesunięcia elementu za pomocą CSS?

88

Mam problem z pozycjonowaniem niektórych elementów, po sprawdzeniu go Narzędzia programistyczne IE8 pokazuje mi to:

Skąd się bierze offset?

Teraz jestem prawie pewien, że moim problemem jest przesunięcie 12, ale jak to usunąć ? Nie mogę znaleźć żadnej wzmianki o właściwości przesunięcia CSS. Czy oprócz marży potrzebujemy przesunięcia?

Oto kod, który to tworzy:

 <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>

Element z odsunięciem to inputBox

m.edmondson
źródło
Czy twój element jest ustawiony? Sprawdź lefti topwłaściwości.
jessegavin
6
Przydałby się tutaj mały kod. W CSS nie ma reguły „przesunięcia”, ale IE ma tendencję do dodawania losowych pikseli w przypadkowych miejscach. Zwykle ma to związek z pływakami i pozycjonowaniem
Alex
Zakładam, że „przesunięcie” to „piksele powiązane z innymi elementami” - na przykład margines na poprzednim elemencie przesuwający ten w dół. Nie mam teraz czasu na eksperymentowanie z narzędziami deweloperskimi IE, aby się tego dowiedzieć.
Quentin,
Dodałem kod w komplecie z wbudowanym CSS, abyśmy mogli zobaczyć, co się dzieje
m.edmondson
Czy istnieje przykład strony internetowej, na którą moglibyśmy spojrzeć - na przykład, abyśmy mogli wskazać na niego firebuga i zrozumieć szerszą stronę. Np. Czy kontrolka wejściowa dziedziczy margines lub wypełnienie z innej definicji CSS?
Kris C,

Odpowiedzi:

43

To przesunięcie jest w zasadzie pozycją x, y, którą przeglądarka obliczyła dla elementu na podstawie jego atrybutu pozycji css. Więc jeśli umieścisz <br>przed nim lub jakikolwiek inny element, zmieni to przesunięcie. Na przykład możesz ustawić ją na 0 przez:

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

lub

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

Dlatego też każdy problem z pozycjonowaniem niekoniecznie jest problemem z przesunięciem, chociaż zawsze możesz go naprawić, grając z atrybutami góra, lewo, prawo i dół.

Czy Twój problem jest niezgodny z przeglądarką?

Neo
źródło
2
Zobacz również komentarz Stony na temat wyrównywania w pionie. Poprawienie ustawienia wyrównania wydaje się lepsze niż wymuszenie nadpisywania pozycji elementu w przeglądarce.
Jeremy Condit
33

Dla mnie to vertical-align: baselinevs vertical-align: topbyło przyczyną górnego przesunięcia.

Spróbuj ustawić vertical-align: top

Richard
źródło
2
Jest to lepsze niż używanie pozycjonowania bezwzględnego
użytkownik1
2
Twoja odpowiedź jest niesamowita, fakt, że muszę ustawić wyrównanie w pionie, gdy mam 4 elementy DIV w bloku, które odmawiają wyrównania, to byk. Skończyłeś godziny pracy. Dziękuję Ci.
Corey Ogburn,
Pracował z <button>osadzonym <li>elementem.
Amessihel
9

Szybka naprawa:

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

powinno to zrównoważyć te przesunięcia, ale może powinieneś przyjrzeć się całemu układowi i zobaczyć, jak to pudełko współdziała z innymi ramkami.

Jeśli chodzi o terminologię, left, right, topi bottomsą CSS przesunięcie właściwości. Służą do pozycjonowania elementów w określonej lokalizacji (gdy są używane z pozycjonowaniem absolutelub fixed) lub do przenoszenia ich względem ich domyślnego położenia (w przypadku używania z relativepozycjonowaniem). Z drugiej strony marginesy określają przerwy między polami i czasami się zwijają, więc nie można ich niezawodnie wykorzystać jako przesunięcia.

Pamiętaj jednak, że w twoim przypadku to przesunięcie może nie być obliczane (wyłącznie) z offsetów CSS.

Alin Purcaru
źródło
To po prostu przenosi białe znaki na drugą stronę elementu.
Quentin,
@David Jakie białe znaki? I dlaczego cokolwiek innego niż docelowe pole miałoby zostać przeniesione?
Alin Purcaru,
Biała spacja to przestrzeń, w której nic nie ma. Rzeczy inne niż docelowe pudełko nie zostaną przeniesione, o to chodzi. Jeśli masz coś 1 piks. Poniżej i przesuniesz się w górę o 12 piks., To będzie to 13 piks. Poniżej zamiast 1 piksela.
Quentin
2
@David Być może nie mamy takiej samej definicji białych znaków, ale rozumiem, co próbujesz powiedzieć. Zgadzam się, że luka zostanie przesunięta na drugą stronę. Określiłem to rozwiązanie jako „szybką poprawkę”, ponieważ może być użyteczne lub nie. To jedyne, co mogę zasugerować, dopóki pytający nie poda więcej szczegółów.
Alin Purcaru
3

Ustawienie właściwości top i left na wartości ujemne może nie być dobrym obejściem, jeśli problem polega po prostu na tym, że jesteś w trybie dziwactw. Może się tak zdarzyć, jeśli na stronie brakuje <!DOCTYPE>deklaracji, co powoduje, że jest ona renderowana w trybie dziwactw w IE8. W Narzędziach dla programistów IE8 upewnij się, że „Tryb osobliwości” nie jest zaznaczona w opcji „Tryb dokumentu”. Jeśli jest zaznaczona, może być konieczne dodanie odpowiedniej <!DOCTYPE>deklaracji.

regularmike
źródło
2

Jeśli używasz narzędzi programistycznych IE, upewnij się, że przypadkowo nie zostawiłeś ich w starszym ustawieniu. Szalałem z powodu tego samego problemu, dopóki nie zobaczyłem, że jest ustawiony na Internet Explorer 7 Standards. Zmieniłem go na standardy Internet Explorera 9 i wszystko wróciło na swoje miejsce.

Tom McGee
źródło
1
Niektórzy z nas mają użytkowników nadal IE7.
15ee8f99-57ff-4f92-890c-b56153
2

przesuwanie elementu góra: -12px lub pozycjonowanie go absolutnie nie rozwiązuje problemu, a jedynie go maskuje

Miałem ten sam problem - sprawdź czy masz w jednym zawijaniu mieszane elementy: elementy pływające z niepływającymi - mój niepływający element spowodował dziwne przesunięcie względem pływającego

Picard
źródło
W moim przypadku starałem się dopasować wygląd strony do wyglądu prototypu. Miałem rząd elementów div typu inline-block o tej samej szerokości co prototyp, ale moje przesunięcia były przesunięte o 4. Odkryłem, że w witrynie jest mieszanka pływających i niepływających elementów div. Sprawienie, by wszystkie unosiły się na wodzie, usunęło dodatkowe przesunięcie. Było to szczególnie kłopotliwe, ponieważ nie widziałem wiele innych różnic między CSS.
Clint Brown
1

zdefiniuj margines i wypełnienie elementu, którego dotyczy problem:

#element_id {margin: 0; padding: 0}  

i zobacz, czy istnieje problem. IE renderuje stronę z bardziej niechcianym dziedziczeniem. powinieneś to powstrzymać.

Pmpr
źródło
1

To wydaje się dziwne, ale można spróbować ustawienia vertical-align: topw CSSodniesieniu do wejść. To przynajmniej rozwiązuje problem w IE8.

BrainCoder
źródło
1

Miałem ten sam problem na naszej stronie internetowej opartej na .NET, działającej na DotNetNuke (DNN) i tym, co go dla mnie rozwiązało, było po prostu proste zresetowanie marginesu tagu formularza. Witryny oparte na platformie .NET są często opakowane w formę i bez resetowania marginesów można czasem zobaczyć dziwne przesunięcie, głównie wtedy, gdy są dołączone jakieś skrypty.

Jeśli więc próbujesz rozwiązać ten problem w swojej witrynie, spróbuj wpisać to w pliku CSS:

form {
  margin: 0;
}
Vlastique
źródło
Miałem ten sam problem i zmiana marginesu formularza również działała dla mnie.
David Derman
0

Możesz zastosować reset css, aby pozbyć się tych „domyślnych”. Oto przykład resetowania css http://meyerweb.com/eric/tools/css/reset/ . Po prostu zastosuj resetowane style PRZED własnymi stylami.

pił
źródło
0

Miałem ten sam problem. Przesunięcie pojawiło się po odświeżeniu UpdatePanel. Rozwiązaniem było dodanie pustego tagu przed UpdatePanel w następujący sposób:

<div></div>

...

mitkob
źródło
1
UpdatePanel to rzecz ASP.NET, prawda? Ponieważ nie wydaje się to być kwestią ASP.NET.
Joe Mabel
W rzeczywistości, jeśli zobaczysz fragment kodu w pytaniu, zauważysz, że jest to pytanie ASP.NET.
mitkob
Ach. Przepraszamy, właśnie przejrzałem, nie zauważyłem asp: TextBox. FWIW, problem nie dotyczy ASP.NET . Kiedy pojawia się ten problem, zwykle oznacza to, że omawiane przesunięcie jest spowodowane tym, że jakiś inny element jest większy, a jeśli powoduje to zły układ, kluczem jest zwykle zmniejszenie marginesu, wypełnienia lub obramowania innego elementu wewnątrz ten sam nadrzędny div.
Joe Mabel
0

Po prostu ustaw kontur na żaden w ten sposób

[Identyfikator] {zarys: brak; }

Daniel Barde
źródło
0

W moim przypadku przesunięcie zostało dodane do niestandardowego elementu z układem siatki w li, podczas gdy ul był pionowym flexboxem.

wprowadź opis obrazu tutaj

Dość prostym rozwiązaniem było ustawienie zdefiniowania li jako elementu blokowego za pomocą

li {
 display: block;
}

A offset zniknął

Th3S4mur41
źródło