Почему плавающий элемент управления <input> в плавающем элементе сдвигается слишком далеко вправо в IE7, но не в Firefox?

Надеюсь, изображение стоит тысячи строк кода, потому что я не хочу отбрасывать весь код ASP.Net, HTML, JavaScript и CSS, чтобы предоставить пример (но я предоставлю то, что могу, по запросу. если кто-то не говорит: «О, я видел это раньше! Попробуйте это ...») [На самом деле, я опубликовал некоторый код и CSS - см. нижнюю часть вопроса].

Вот часть страницы формы, отображаемой в Firefox: Почему плавающий элемент управления &lt;input&gt; в плавающем элементе сдвигается слишком далеко вправо в IE7, но не в Firefox?

Синие прямоугольники - это временные стили тега <label>, а оранжевые линии - временные стили границ тегов <div> (чтобы я мог видеть, где они расширяются и ломаются). <label> стилизованы под float: left, как и <div справа. Вдобавок, дочерние элементы управления <div> также являются чисто float:left, поэтому они будут выстраиваться в верхней части <div> (поскольку есть некоторые более высокие элементы управления, такие как многострочные текстовые поля внизу).

Радиокнопки генерируются элементом управления ASP, поэтому они заключены в <span> - также перемещаются влево, поскольку он является потомком <div>.

Вот та же часть экрана, отображаемая в IE7: Почему плавающий элемент управления &lt;input&gt; в плавающем элементе сдвигается слишком далеко вправо в IE7, но не в Firefox?

Есть несколько незначительных отличий в рендеринге, но самая большая, которая сводит меня с ума, - это лишнее белое пространство рядом с элементами управления <input>! Обратите внимание, что на <span> переключатели и флажки расположены правильно.

Хотя они не отображаются, то же самое происходит с раскрывающимися списками и списками. Я не пробовал обернуть элементы управления вводом в <span>, но это может сработать. Однако это уродливый хакер.

Я пробовал несколько обходных путей IE7 для проблем с коробками, и я редактировал CSS, пока не перешел в чистый режим вуду (то есть внесение случайных изменений в надежде, что что-то сработает). Как я уже сказал, я надеюсь, что кто-то посмотрит на это и скажет: «Я видел это раньше! Попробуйте это ...»

Кто-нибудь?

Последующее наблюдение 1:

Я использую XHTML 1.0 Transitional <DOCTYPE>, поэтому должен работать в стандартном режиме.

Последующее наблюдение 2:

Вот небольшой фрагмент сгенерированного кода для вышеуказанного (первый элемент управления и последний элемент управления). Обратите внимание, что этот код был сгенерирован ASP.Net, а затем динамически отредактирован JavaScript / jQuery.

 <fieldset id = "RequestInformation">
   <legend>Request Information</legend>
   <ol>
     <li>
       <label id = "ctl00_ContentPlaceHolder1_txtRequestDate_L" class = "stdLabel" 
         for = "ctl00_ContentPlaceHolder1_txtRequestDate">Request Date:</label>
       <div class = "FormGroup">
         <input id = "ctl00_ContentPlaceHolder1_txtRequestDate" class = "RSV DateTextBox hasDatepicker" 
           type = "text" value = "10/05/2004" name = "ctl00$ContentPlaceHolder1$txtRequestDate"/>
         <img class = "ui-datepicker-trigger" src = "/PROJECT/images/Calendar_scheduleHS.png" alt = "..." title = "..."/>
         <span id = "txtRequestDate_error"/>
       </div>
     </li>
     --STUFF DELETED HERE--
     <li>
       <label id = "ctl00_ContentPlaceHolder1_chkAppealed_L" class = "stdLabel" 
         for = "ctl00_ContentPlaceHolder1_chkAppealed"> Request Appealed?</label>
       <div class = "FormGroup">
         <span class = "stdCheckBox">
           <input id = "ctl00_ContentPlaceHolder1_chkAppealed" type = "checkbox" name = "ctl00$ContentPlaceHolder1$chkAppealed"/>
         </span>
       </div>
     </li>
   </ol>
 </fieldset>

Вот соответствующая часть CSS (я дважды проверил, чтобы убедиться, что это дублирует проблему):

div
{
    border-style: solid;
    border-width: thin;
    border-color:Orange;
}

label
{
    border-style: solid;
    border-width: thin;
    border-color:Blue;
}

.FormGroup
{
    float:left;
    margin-left: 1em;
    clear: right;
    width: 75em;
}

.FormGroup > *
{
    float:left;
    background-color: Yellow;
}

fieldset ol
{
    list-style: none;
} 

fieldset li
{
    padding-bottom: 0.5em;
} 

li > label:first-child
{
    display: block;
    float: left;
    width: 10em;
    clear: left;
    margin-bottom: 0.5em;
}

em
{
    color: Red;
    font-weight: bold;
}

Решение!

Мэтью указал мне на эту страницу на IE / Win унаследованные поля в элементах формы, и в этом была проблема. Поля ввода унаследовали левые поля всех содержащихся в них элементов. Решение, которое я выбрал, заключалось в том, чтобы обернуть каждый элемент <input> в нестилизованный <span>. Я пытался сохранить структуру HTML как можно более семантически обоснованной, поэтому решил это с помощью команды jQuery в функции $(document).ready():

//IE Margin fix: 
//  http://www.positioniseverything.net/explorer/inherited_margin.html
jQuery.each(jQuery.browser, function(i) {
    if ($.browser.msie){
        $(":input").wrap("<span></span>");
    }
});

Обратите внимание, что это только добавит глупые <span> в IE ...

StackOverflow снова приходит на помощь!

Хотелось бы увидеть источник, созданный ASP.

Mike Cornell 22.10.2008 07:19

я могу только выразить свои соболезнования.

nickf 22.10.2008 07:20

@Mike: Да, причина, по которой трудно опубликовать источник, заключается в том, что у меня есть код ASP.Net, сгенерированный код из серверных элементов управления ASP, затем я использую jQuery, чтобы добавить динамический HTML для группировок и средств выбора календаря, и т.д. Firebug - единственный способ увидеть "настоящий" источник, и к тому времени он уже ужасен.

CMPalmer 22.10.2008 07:26

Хорошо, я сломал и извлек / добавил сгенерированный код и CSS ...

CMPalmer 22.10.2008 07:55

Убедитесь, что вы используете правильный тип документа.

John Boker 22.10.2008 07:20

Примечание: новые веб-страницы не нуждаются в переходном типе документа. Все новые сайты должны использовать строго.

Rob 14.12.2011 17:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
6
754
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

input наследует поля от окружающих div и ol. Если вы окружите его другим тегом, например span или div, это должно решить вашу проблему.

Редактировать: Вы можете найти дополнительную информацию и обходные пути на http://www.positioniseverything.net/explorer/inherited_margin.html

Я попробую, но я уже пробовал это: .FormGroup> * {margin: 0 0 0 0; плыть налево; background-color: Yellow;}, чтобы переопределить поле родительского <div>, и это не сработало. Я попробую дополнительный диапазон или div, но, надеюсь, есть способ получше.

CMPalmer 22.10.2008 08:11

Ссылка выглядит отлично - завтра попробую и выложу свои результаты. Хотя, похоже, правильный ответ после прочтения статьи!

CMPalmer 22.10.2008 08:17

Другие вопросы по теме