Как избавиться от смещения элемента с помощью CSS?

88

У меня проблема с позиционированием некоторых элементов, после проверки инструментов IE8 Developer он показывает мне следующее:

Откуда берется смещение?

Теперь я почти уверен, что моя проблема в смещении 12, но как его удалить ? Я не могу найти упоминания о свойстве смещения CSS. Нужен ли нам Offset в дополнение к марже?

Вот код, который это производит:

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

Элемент со смещением: inputBox

m.edmondson
источник
Ваш элемент расположен? Проверить leftи topсвойства.
jessegavin
6
Здесь будет очень полезно немного кода. В CSS нет правила «смещения», но IE имеет тенденцию добавлять случайные пиксели в случайных местах. Обычно это связано с поплавками и позиционированием
Алекс
Я бы предположил, что «смещение» - это «пиксели, относящиеся к другим элементам» - например, маржа на предыдущем элементе, толкающая этот вниз. У меня сейчас нет времени экспериментировать с инструментами разработки IE, чтобы выяснить это.
Quentin
Я добавил код вместе со встроенным CSS, чтобы мы могли видеть, что происходит
m.edmondson
Есть ли пример веб-страницы, на который мы можем взглянуть - например, чтобы мы могли указать на нее firebug и понять более широкую страницу. Например, ваш элемент управления вводом наследует поля или отступы от другого определения css?
Kris C

Ответы:

43

Это смещение - это в основном позиция x, y, которую браузер рассчитал для элемента на основе его атрибута css позиции. Таким образом, если вы поставите <br>перед ним или любым другим элементом, это изменит смещение. Например, вы можете установить его на 0:

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

или

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

Следовательно, какая бы проблема с позиционированием у вас ни возникала, это не обязательно проблема со смещением, хотя вы всегда можете исправить ее, поиграв с атрибутами top, left, right и bottom.

Ваша проблема несовместима с браузером?

Нео
источник
2
См. Также комментарий Стоуни о вертикальном выравнивании. Фиксация настройки выравнивания кажется предпочтительнее принудительной переопределения позиционирования элемента в браузере.
Джереми Кондит,
33

Для меня это был vertical-align: baselinevs, vertical-align: topкоторый стал причиной максимального смещения.

Попробуйте установить vertical-align: top

Ричард
источник
2
Это лучше, чем использование абсолютного позиционирования
user1
2
Ваш ответ потрясающий, тот факт, что мне нужно установить вертикальное выравнивание, когда у меня есть 4 встроенных блока div, которые отказываются выравниваться, - это бык. Вы закончили часы работы. Спасибо.
Кори Огберн,
Работал со <button>встроенным <li>элементом.
Амессихель
9

Быстрая починка:

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

это должно сбалансировать эти смещения, но, возможно, вам стоит взглянуть на весь макет и посмотреть, как этот блок взаимодействует с другими блоками.

Что касается терминологии, left, right, topи bottomявляются CSS смещение свойства. Они используются для позиционирования элементов в определенном месте (при использовании с позиционированием absoluteили fixed) или для перемещения их относительно их местоположения по умолчанию (при использовании сrelative позиционированием). С другой стороны, поля определяют промежутки между блоками, и они иногда сворачиваются, поэтому их нельзя надежно использовать в качестве смещений.

Но обратите внимание, что в вашем случае это смещение не может быть вычислено (исключительно) из смещений CSS.

Алин Пуркару
источник
Это просто перемещает пробел на другую сторону элемента.
Quentin
@ Дэвид Какие пробелы? И почему было перемещено что-либо, кроме целевого поля?
Алин Пуркару
Пробел - это пространство, в котором ничего нет. Вещи, кроме целевого поля, не будут перемещены, в этом суть. Если у вас есть что-то на 1 пиксель ниже, и вы перемещаетесь на 12 пикселей вверх, то это на 13 пикселей ниже, а не на 1 пиксель.
Quentin
2
@David У нас может быть другое определение пробелов, но я понимаю то, что вы пытаетесь сказать. Я согласен с тем, что разрыв будет перенесен на другую сторону. Я назвал это решение «быстрым исправлением», потому что оно может или не может быть использовано. Это единственное, что я могу предложить, пока спрашивающий не предоставит более подробную информацию.
Алин Пуркару
3

Установка отрицательных значений для свойств top и left может быть не лучшим решением, если ваша проблема просто в том, что вы находитесь в режиме причуд. Это может произойти, если на странице отсутствует <!DOCTYPE>объявление, из-за чего оно отображается в режиме совместимости в IE8. В инструментах разработчика IE8 убедитесь, что «Quirks Mode» не выбран в «Document Mode». Если он выбран, вам может потребоваться добавить соответствующее <!DOCTYPE>объявление.

регулярный майк
источник
2

Если вы используете инструменты разработчика IE, убедитесь, что вы случайно не оставили для них более старые настройки. Я сводил себя с ума от этой же проблемы, пока не увидел, что она соответствует стандартам Internet Explorer 7. Изменил его на стандарты Internet Explorer 9, и все встало на свои места.

Том МакГи
источник
1
Некоторые из нас все еще используют IE7.
15ee8f99-57ff-4f92-890c-b56153
2

перемещение элемента вверху: -12px или его позиционирование абсолютно не решает проблему, а только маскирует ее

У меня была такая же проблема - проверьте, смешаны ли у вас в одном элементе обертывания: плавающие элементы с неплавающими - мой неплавающий элемент вызвал это странное смещение к плавающему

Пикард
источник
В моем случае я пытался сопоставить внешний вид веб-сайта с видом прототипа. У меня был ряд встроенных блоков div с той же шириной, что и у прототипа, но мои смещения были на 4. Я обнаружил, что у меня на веб-сайте есть сочетание плавающих и неплавающих div. Когда они все плавают, лишнее смещение устранено. Это вызывало особенное недоумение, потому что я не видел особой разницы между CSS.
Клинт Браун
1

Определите поля и отступы для элемента, столкнувшись с проблемой:

#element_id {margin: 0; padding: 0}  

и посмотрите, существует ли проблема. IE отображает страницу с более нежелательным наследованием. вы должны прекратить это делать.

Pmpr
источник
1

Это кажется странным, но вы можете попробовать настройки vertical-align: topв CSSдля входов. По крайней мере, это исправляет это в IE8.

BrainCoder
источник
1

У меня была такая же проблема на нашем веб-сайте на основе .NET, работающем на DotNetNuke (DNN), и для меня ее решила простая установка полей тега формы. Веб-сайты на базе .NET часто оборачиваются в форму, и без сброса поля вы можете иногда видеть странное смещение, в основном, когда включены некоторые скрипты.

Поэтому, если вы пытаетесь решить эту проблему на своем сайте, попробуйте ввести это в свой файл CSS:

form {
  margin: 0;
}
Властик
источник
У меня была такая же проблема, и изменение поля формы также помогло мне.
Дэвид Дерман
0

Вы можете применить сброс css, чтобы избавиться от этих «значений по умолчанию». Вот пример сброса css http://meyerweb.com/eric/tools/css/reset/ . Просто примените стили сброса ПЕРЕД своими собственными стилями.

пилить
источник
0

У меня такая же проблема. Смещение появилось после обновления UpdatePanel. Решением было добавить пустой тег перед UpdatePanel следующим образом:

<div></div>

...

миткоб
источник
1
UpdatePanel - это вещь ASP.NET, верно? Потому что это не похоже на вопрос ASP.NET.
Joe Mabel
Фактически, если вы просмотрите фрагмент кода в вопросе, вы заметите, что это вопрос ASP.NET.
mitkob
Ах. К сожалению, бегло просмотрел, не заметил asp: TextBox. FWIW, то вопрос не является ASP.NET вопрос . Когда эта проблема появляется, обычно это означает, что рассматриваемое смещение связано с тем, что какой-то другой элемент больше, и если это приводит к плохой компоновке, ключ обычно заключается в уменьшении поля, заполнения или границы на каком-либо другом элементе внутри тот же родительский div.
Джо Мэйбл
0

Просто установите нулевой контур, как это

[Идентификатор] {схема: нет; }

Даниэль Барде
источник
0

В моем случае смещение было добавлено к настраиваемому элементу с макетом сетки внутри li, в то время как ul был вертикальным гибким боксом.

введите описание изображения здесь

Довольно простым решением было установить определение li как блочного элемента с помощью

li {
 display: block;
}

И смещение пропало

Th3S4mur41
источник