Як позбутися від зміщення елемента за допомогою CSS?


88

У мене проблема позиціонування з деякими елементами, оглянувши її IE8 Developer tools, він показує мені це:

Звідки береться офсет?

Зараз я майже впевнений, що моя проблема полягає в тому, що компенсується 12, але як його видалити ? Я не можу знайти жодної згадки про властивість зміщення CSS. Чи потрібен нам компенсація на додаток до маржі?

Ось код, який виробляє це:

 <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


Ваш елемент розміщений? Перевірка leftта topвластивості.
jessegavin

6
Тут був би дуже корисний невеликий код. У CSS не існує правила "зсуву", але IE має тенденцію додавати випадкові пікселі у випадкові місця. Зазвичай це пов’язано з поплавками та позиціонуванням
Олексій

Я б припустив, що "зміщення" - це "пікселі, пов'язані з іншими елементами" - наприклад, поле для попереднього елемента, що штовхає цей вниз. Зараз я не маю часу експериментувати з інструментами розробника IE, щоб це з’ясувати.
Квентін

Я додав код із вбудованим 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;}

Тому, яка б проблема з позиціонуванням у вас не була, це не обов’язково проблема зі зміщенням, хоча ви завжди можете виправити це, граючи з атрибутами верхнього, лівого, правого та нижнього елементів.

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


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.


Це просто переміщує пробіли на іншу сторону елемента.
Квентін

@David Що пробіли? І чому щось інше, окрім цільового вікна, буде переміщено?
Алін Пуркару

Пробіл - це простір, у якому немає нічого. Інші речі, крім цільового вікна, не будуть переміщені, в цьому суть. Якщо у вас є щось на 1 піксель нижче, і ви рухаєтеся вгору на 12 пікселів, то це 13 пікселів нижче замість 1 пікселів.
Квентін

2
@David У нас може бути не однакове визначення пробілу, але я розумію те, що ви намагаєтесь сказати. Я згоден, що розрив буде переміщений на іншу сторону. Я позначив рішення "швидким виправленням", оскільки воно може бути чи не корисним. Це єдине, що я можу запропонувати, поки запитувач не надасть більше деталей.
Алін Пуркару

3

Встановлення для властивостей верхнього та лівого значення негативних значень може бути не найкращим рішенням, якщо ваша проблема полягає лише в тому, що ви перебуваєте в режимі химерності. Це може статися, якщо на сторінці не вистачає <!DOCTYPE>декларації, що спричиняє її рендеринг у химерних режимах в IE8. У IE8 Developer Tools переконайтеся, що в меню «Режим документа» не вибрано «Режим примх». Якщо його вибрано, можливо, вам доведеться додати відповідну <!DOCTYPE>декларацію.


2

Якщо ви використовуєте інструменти розробника IE, переконайтеся, що випадково не залишили їх у старіших налаштуваннях. Я зводив з розуму цю ж проблему, поки не побачив, що для неї встановлено стандарти Internet Explorer 7. Змінив його на Internet Explorer 9 Standards, і все встало на свої місця.


1
У деяких з нас користувачі все ще користуються IE7.
15ee8f99-57ff-4f92-890c-b56153

2

рухомий елемент зверху: -12 пікселів або його розташування абсолютно не вирішує проблему, а лише маскує її

У мене була та сама проблема - перевірте, чи є в вас один елемент обтікання змішаним: плаваючі елементи з неплаваючими - мій неплаваючий елемент спричинив це дивне зміщення до плаваючого


У моєму випадку я намагався зіставити вигляд веб-сайту з виглядом прототипу. У мене був ряд вбудованих блоків div з такою ж шириною, як у прототипу, але мої зсуви були вимкнені на 4. Я виявив, що у мене на веб-сайті є поєднання плаваючих div і non-floating. Зроблення їх усіх плаваючих видалило зайве зміщення. Це особливо бентежило, бо я не міг бачити, як багато іншого відрізняється між CSS.
Clint Brown

1

Визначте поле та відступ для елемента, який стикається з проблемою:

#element_id {margin: 0; padding: 0}  

і подивіться, чи існує проблема. IE робить сторінку з більш небажаним успадкуванням. вам слід зупинити це від цього.


1

Це здається дивним, але ви можете спробувати встановити vertical-align: topзначення CSSдля входів. Це виправляє це принаймні в IE8.


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

У моєму випадку зміщення було додано до користувацького елементу з розташуванням сітки в межах li, тоді як ul був вертикальним флексбоком.

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

Досить простим рішенням було встановити дефініт li як елемент блоку за допомогою

li {
 display: block;
}

І залік пропав

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.