Como faço para me livrar do deslocamento de um elemento usando CSS?


88

Eu tenho um problema de posicionamento com alguns elementos, ao inspecionar as ferramentas do desenvolvedor do IE8 ele me mostra o seguinte:

De onde vem a compensação?

Agora tenho quase certeza de que meu problema é esse deslocamento de 12, mas como faço para removê-lo ? Não consigo encontrar qualquer menção de uma propriedade de deslocamento CSS. Precisamos de um Offset além da margem?

Aqui está o código que está produzindo isso:

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

O elemento com o deslocamento é inputBox


Seu elemento está posicionado? Verifique lefte toppropriedades.
jessegavin

6
Um pequeno código seria muito útil aqui. Não existe uma regra de 'deslocamento' no CSS, mas o IE tem uma tendência a adicionar pixels aleatórios em lugares aleatórios. Geralmente tem a ver com flutuadores e posicionamento
Alex

Eu presumiria que 'deslocamento' é 'pixels relacionados a outros elementos' - como uma margem em um elemento anterior empurrando este para baixo. Não tenho tempo para experimentar as ferramentas de desenvolvimento do IE agora para descobrir.
Quentin

Eu adicionei o código completo com CSS inline para que possamos ver o que está acontecendo
m.edmondson

Existe um exemplo de página da web que podemos ver disso - por exemplo, para que possamos apontar o firebug para ele e entender a página mais ampla. Por exemplo, seu controle de entrada está herdando margem ou preenchimento de outra definição de css?
Kris C

Respostas:


43

Esse deslocamento é basicamente a posição x, y que o navegador calculou para o elemento com base em seu atributo css de posição. Portanto, se você colocar um <br>antes dele ou de qualquer outro elemento, o deslocamento será alterado. Por exemplo, você pode defini-lo como 0 por:

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

ou

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

Portanto, qualquer problema de posicionamento que você tenha, não é necessariamente um problema de deslocamento, embora você sempre possa corrigi-lo brincando com os atributos superior, esquerdo, direito e inferior.

O seu problema com o navegador é incompatível?


2
Consulte também o comentário de Stony sobre o alinhamento vertical. Corrigir a configuração de alinhamento parece preferível a substituir forçosamente o posicionamento do navegador do elemento.
Jeremy Condit,

33

Para mim, era o vertical-align: baselinevs vertical-align: topque estava causando o deslocamento superior.

Tente definir vertical-align: top


2
Isso é melhor do que usar o posicionamento absoluto
usuário1

2
Sua resposta é incrível, o fato de eu ter que definir o alinhamento vertical quando tenho 4 divs inline-block que se recusam a alinhar é touro. Você encerrou o horário de trabalho. Obrigado.
Corey Ogburn

Trabalhou com um <button>embutido em um <li>elemento.
Amessihel

9

Conserto rápido:

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

isso deve equilibrar esses offsets, mas talvez você deva dar uma olhada em todo o layout e ver como essa caixa interage com outras caixas.

Quanto à terminologia, left, right, tope bottomsão CSS compensar propriedades. Eles são usados ​​para posicionar elementos em um local específico (quando usados ​​com absoluteou fixedposicionamento), ou para movê-los em relação ao seu local padrão (quando usados ​​com relativeposicionamento). As margens, por outro lado, especificam lacunas entre as caixas e às vezes se fecham, portanto, não podem ser usadas de maneira confiável como compensações.

Mas observe que, no seu caso, esse deslocamento não pode ser calculado (somente) a partir dos deslocamentos CSS.


Isso apenas move o espaço em branco para o outro lado do elemento.
Quentin de

@David Que espaço em branco? E por que qualquer coisa diferente da caixa direcionada seria movida?
Alin Purcaru

O espaço em branco é o espaço que não contém nada. Coisas diferentes da caixa de destino não seriam movidas, esse é o ponto. Se você tem algo 1px abaixo e move para cima 12px, então é 13px abaixo em vez de 1px.
Quentin

2
@David Podemos não ter a mesma definição de espaço em branco, mas entendi o que você está tentando dizer. Eu concordo que a lacuna será movida para o outro lado. Eu rotulei a solução de "solução rápida" porque ela pode ou não ser utilizável. É a única coisa que posso sugerir até que o autor da pergunta forneça mais detalhes.
Alin Purcaru

3

Definir as propriedades superior e esquerda com valores negativos pode não ser uma boa solução alternativa se o seu problema for simplesmente que você está no modo peculiares. Isso pode acontecer se a página não tiver uma <!DOCTYPE>declaração, fazendo com que ela seja renderizada no modo quirks no IE8. Nas Ferramentas de desenvolvedor do IE8, certifique-se de que "Modo peculiares" não esteja selecionado em "Modo documento". Se estiver selecionado, pode ser necessário adicionar a <!DOCTYPE>declaração apropriada .


2

Se você estiver usando as ferramentas de desenvolvedor do IE, certifique-se de não as ter deixado acidentalmente em uma configuração mais antiga. Eu estava ficando louco com esse mesmo problema até que vi que ele estava configurado para os padrões do Internet Explorer 7. Mudou para os padrões do Internet Explorer 9 e tudo se encaixou perfeitamente.


1
Alguns de nós ainda têm usuários no IE7.
15ee8f99-57ff-4f92-890c-b56153

2

mover o elemento superior: -12px ou posicioná-lo absolutamente não resolve o problema, apenas o mascara

Eu tive o mesmo problema - verifique se você tem um elemento de envolvimento misturado: elementos flutuantes com não flutuantes - meu elemento não flutuante causou este estranho deslocamento para o flutuante


No meu caso, eu estava tentando combinar a aparência de um site com a de um protótipo. Eu tinha uma linha de divs inline-block com a mesma largura do protótipo, mas meus offsets estavam errados em 4. Eu descobri que tinha uma mistura de divs flutuantes e não flutuantes no site. Torná-los todos flutuantes removeu o deslocamento extra. Isso foi especialmente desconcertante porque eu não conseguia ver muitas outras diferenças entre o CSS.
Clint Brown de

1

definir margem e preenchimento para o elemento está enfrentando o problema:

#element_id {margin: 0; padding: 0}  

e veja se existe problema. O IE renderiza a página com mais herança indesejada. você deve impedir que isso aconteça.


1

Isso parece estranho, mas você pode tentar configuração vertical-align: topno CSSpara as entradas. Isso corrige no IE8, pelo menos.


1

Tive o mesmo problema em nosso site baseado em .NET, rodando em DotNetNuke (DNN) e o que resolveu para mim foi basicamente uma redefinição de margem simples da tag do formulário. Os sites baseados em .NET geralmente são agrupados em um formulário e, sem redefinir a margem, você pode ver o estranho deslocamento aparecendo às vezes, principalmente quando há alguns scripts incluídos.

Portanto, se você está tentando corrigir esse problema em seu site, tente inserir isso em seu arquivo CSS:

form {
  margin: 0;
}

Eu tive o mesmo problema e alterar a margem do formulário também funcionou para mim.
David Derman

0

Você pode aplicar um CSS de redefinição para se livrar desses 'padrões'. Aqui está um exemplo de um css de redefinição http://meyerweb.com/eric/tools/css/reset/ . Basta aplicar os estilos de redefinição ANTES de seus próprios estilos.


0

Eu tive o mesmo problema. O deslocamento apareceu após a atualização do UpdatePanel. A solução foi adicionar uma tag vazia antes do UpdatePanel assim:

<div></div>

...


1
UpdatePanel é uma coisa ASP.NET, certo? Porque essa não parece ser uma questão ASP.NET.
Joe Mabel

Na verdade, se você visualizar o trecho de código da pergunta, notará que é uma pergunta ASP.NET.
mitkob

Ah. Desculpe, apenas dei uma olhada, não notei o asp: TextBox. FWIW, o problema não é um problema do ASP.NET . Quando esse problema aparece, normalmente o que significa é que o deslocamento em questão é devido a algum outro elemento ser maior e, se estiver resultando em um layout ruim, a chave normalmente é reduzir a margem, preenchimento ou borda em algum outro elemento dentro o mesmo div pai.
Joe Mabel

0

Basta definir o contorno para nenhum como este

[Identificador] {esboço: nenhum; }


0

No meu caso, o deslocamento foi adicionado a um elemento personalizado com layout de grade dentro de um li enquanto o ul era um flexbox vertical.

insira a descrição da imagem aqui

A solução bastante simples foi definir o definir o li como elemento de bloco com

li {
 display: block;
}

E o deslocamento foi embora

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.