Почему плавающий элемент управления <input>в плавающем элементе скользит слишком далеко вправо в IE7, но не в Firefox? - PullRequest
5 голосов
/ 22 октября 2008

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

Вот часть страницы формы, отображаемая в Firefox: alt text

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

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

Вот та же часть экрана, отображаемая в IE7: alt text

Есть несколько незначительных отличий в рендеринге, но большое, что сводит меня с ума, это лишние пробелы рядом с <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 Inherited Margins для элементов формы , и это было проблемой. Поля ввода наследовали левые поля всех содержащих их элементов. Решение, которое я выбрал, состояло в том, чтобы обернуть каждый элемент <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 снова на помощь!

1 Ответ

2 голосов
/ 22 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...