Come posso sbarazzarmi dell'offset di un elemento usando i CSS?


88

Ho un problema di posizionamento con alcuni elementi, dopo averlo ispezionato Strumenti per sviluppatori IE8 mi mostra questo:

Da dove viene l'offset?

Ora sono abbastanza sicuro che il mio problema sia quell'offset 12, ma come lo rimuovo ? Non riesco a trovare alcuna menzione di una proprietà offset CSS. Abbiamo bisogno di un offset oltre al margine?

Ecco il codice che produce questo:

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

L'elemento con l'offset è inputBox


Il tuo elemento è posizionato? Verifica lefte topproprietà.
jessegavin

6
Un piccolo codice sarebbe molto utile qui. Non esiste una regola di "offset" nei CSS, ma IE ha la tendenza ad aggiungere pixel casuali in posizioni casuali. Di solito ha a che fare con i galleggianti e il posizionamento
Alex

Presumo che "offset" sia "pixel relativi ad altri elementi", ad esempio un margine su un elemento precedente che spinge questo verso il basso. Non ho tempo per sperimentare con gli strumenti di sviluppo di IE ora per scoprirlo.
Quentin

Ho aggiunto il codice completo di CSS in linea così possiamo vedere cosa sta succedendo
m.edmondson

C'è un esempio di pagina web che possiamo esaminare di questo - per esempio in modo da poter puntare Firebug su di esso e capire la pagina più ampia. Ad esempio, il tuo controllo di input eredita il margine o il riempimento da un'altra definizione CSS?
Kris C

Risposte:


43

Quell'offset è fondamentalmente la posizione x, y che il browser ha calcolato per l'elemento in base al suo attributo css di posizione. Quindi, se metti un <br>prima di esso o qualsiasi altro elemento, cambierà l'offset. Ad esempio, puoi impostarlo su 0 da:

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

o

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

Pertanto, qualunque problema di posizionamento tu abbia, non è necessariamente un problema di offset, anche se puoi sempre risolverlo giocando con gli attributi in alto, a sinistra, a destra e in basso.

Il tuo problema è l'incompatibilità del browser?


2
Si prega di vedere anche il commento di Stony sull'allineamento verticale. La correzione dell'impostazione di allineamento sembra preferibile rispetto alla forzatura forzata del posizionamento dell'elemento da parte del browser.
Jeremy Condit

33

Per me, era vertical-align: baselinevs vertical-align: topche stava causando l'offset superiore.

Prova a impostare vertical-align: top


2
È meglio che utilizzare il posizionamento assoluto
utente1

2
La tua risposta è fantastica, il fatto che devo impostare l'allineamento verticale quando ho 4 div inline-block che si rifiutano di allineare è toro. Hai finito le ore di lavoro. Grazie.
Corey Ogburn

Ha lavorato con un <button>incorporato in un <li>elemento.
Amessihel

9

Soluzione rapida:

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

questo dovrebbe bilanciare questi offset, ma forse dovresti dare un'occhiata all'intero layout e vedere come quella scatola interagisce con altre scatole.

Per quanto riguarda la terminologia, left, right, tope bottomsono CSS compensate proprietà. Vengono utilizzati per posizionare gli elementi in una posizione specifica (se utilizzati con absoluteo fixedposizionamento) o per spostarli rispetto alla loro posizione predefinita (se utilizzati con il relativeposizionamento). I margini d'altra parte specificano gli spazi tra i riquadri e talvolta collassano, quindi non possono essere utilizzati in modo affidabile come offset.

Ma nota che nel tuo caso tale offset potrebbe non essere calcolato (esclusivamente) da offset CSS.


Questo sposta semplicemente lo spazio bianco sull'altro lato dell'elemento.
Quentin

@David Quali spazi bianchi? E perché sarebbe stato spostato qualcosa di diverso dalla casella mirata?
Alin Purcaru

Lo spazio bianco è uno spazio che non contiene nulla. Cose diverse dalla scatola mirata non verrebbero spostate, questo è il punto. Se hai qualcosa di 1px sotto e sali di 12px, allora è 13px sotto invece di 1px.
Quentin

2
@David Potremmo non avere la stessa definizione di spazio bianco, ma capisco quello che stai cercando di dire. Sono d'accordo che il divario verrà spostato dall'altra parte. Ho etichettato la soluzione come "soluzione rapida" perché potrebbe essere utilizzabile o meno. È l'unica cosa che posso suggerire fino a quando il richiedente non fornirà maggiori dettagli.
Alin Purcaru,

3

L'impostazione delle proprietà in alto e a sinistra su valori negativi potrebbe non essere una buona soluzione alternativa se il tuo problema è semplicemente che sei in modalità stranezze. Ciò può accadere se la pagina manca di una <!DOCTYPE>dichiarazione, causando il rendering in modalità quirks in IE8. In IE8 Developer Tools, assicurati che "Quirks Mode" non sia selezionato in "Document Mode". Se è selezionato, potrebbe essere necessario aggiungere la <!DOCTYPE>dichiarazione appropriata .


2

Se stai utilizzando gli strumenti per sviluppatori di IE, assicurati di non averli lasciati accidentalmente su un'impostazione precedente. Mi stavo facendo impazzire con questo stesso problema finché non ho visto che era impostato su Internet Explorer 7 Standards. L'ho modificato in Internet Explorer 9 Standard e tutto è scattato al suo posto.


1
Alcuni di noi hanno ancora utenti su IE7.
15ee8f99-57ff-4f92-890c-b56153

2

moving element top: -12px o posizionarlo assolutamente non risolve il problema ma lo maschera solo

Ho avuto lo stesso problema: controlla se hai in un unico elemento di avvolgimento misto: elementi fluttuanti con elementi non fluttuanti - il mio elemento non fluttuante ha causato questo strano offset a quello flottante


Nel mio caso stavo cercando di abbinare l'aspetto di un sito web a quello di un prototipo. Avevo una riga di div inline-block con la stessa larghezza del prototipo, ma i miei offset erano scostati di 4. Ho scoperto di avere un mix di div floating e non floating sul sito web. Rendendoli tutti fluttuanti ha rimosso l'offset aggiuntivo. Ciò era particolarmente sconcertante perché non riuscivo a vedere molto altro che differiva tra i CSS.
Clint Brown

1

definire il margine e il riempimento per l'elemento sta affrontando il problema:

#element_id {margin: 0; padding: 0}  

e vedere se il problema esiste. IE esegue il rendering della pagina con un'eredità più indesiderata. dovresti impedirgli di farlo.


1

Sembra strano, ma puoi provare a impostare vertical-align: topin CSSper gli input. Questo lo risolve almeno in IE8.


1

Ho avuto lo stesso problema sul nostro sito Web basato su .NET, in esecuzione su DotNetNuke (DNN) e ciò che lo ha risolto per me è stato fondamentalmente un semplice ripristino del margine del tag del modulo. I siti Web basati su .NET sono spesso racchiusi in un modulo e senza reimpostare il margine a volte è possibile vedere lo strano offset apparire, soprattutto quando sono inclusi alcuni script.

Quindi, se stai cercando di risolvere questo problema sul tuo sito, prova a inserirlo nel tuo file CSS:

form {
  margin: 0;
}

Ho avuto lo stesso problema e la modifica del margine del modulo ha funzionato anche per me.
David Derman


0

Ho avuto lo stesso problema. L'offset è apparso dopo l'aggiornamento di UpdatePanel. La soluzione era aggiungere un tag vuoto prima di UpdatePanel in questo modo:

<div></div>

...


1
UpdatePanel è una cosa ASP.NET, giusto? Perché questa non sembra essere una domanda ASP.NET.
Joe Mabel

In effetti, se si visualizza il frammento di codice nella domanda, si noterà che si tratta di una domanda ASP.NET.
mitkob

Ah. Spiacente, appena scremato, non ho notato l'asp: TextBox. FWIW, il problema non è un problema di ASP.NET . Quando si presenta questo problema, in genere ciò significa che l'offset in questione è dovuto a un altro elemento più grande e, se si verifica un layout errato, la chiave è normalmente ridurre il margine, il riempimento o il bordo su qualche altro elemento all'interno lo stesso div genitore.
Joe Mabel

0

Basta impostare il contorno su nessuno come questo

[Identificatore] {schema: nessuno; }


0

Nel mio caso l'offset è stato aggiunto a un elemento personalizzato con layout a griglia all'interno di un li mentre l'ul era un flexbox verticale.

inserisci qui la descrizione dell'immagine

La soluzione piuttosto semplice era impostare la definizione di li come elemento di blocco con

li {
 display: block;
}

E l'offset era sparito

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.