3

У меня есть элемент управления «multiselect», который выглядит следующим образом (извините за длинные имена идентификаторов, они генерируются автоматически, потому что вся эта вещь генерируется специальным тегом):Странное поведение прокрутки в IE с флажками в прокручиваемом div

<div class="default-skin-outer" id="myMapSelect_multiSelectOuterDiv"> 
    <div class="default-control" id="myMapSelect_multiSelectControlDiv"> 
     <span class="default-icon-check-text" id="myMapSelect_multiSelectControlCheckWrapperSpan"> 
      <span class="default-icon default-icon-check" id="myMapSelect_multiSelectControlCheckIconSpan"></span><span class="default-icon default-icon-text" id="myMapSelect_multiSelectControlCheckTextSpan">Check All</span> 
     </span> 
     <span class="default-icon-uncheck-text" id="myMapSelect_multiSelectControlUncheckWrapperSpan"> 
      <span class="default-icon default-icon-uncheck" id="myMapSelect_multiSelectControlUncheckIconSpan"></span><span class="default-icon default-icon-text" id="myMapSelect_multiSelectControlUncheckTextSpan">Uncheck All</span> 
     </span> 
    </div> 
    <div class="default-skin-inner" id="myMapSelect_multiSelectInnerDiv"> 
      <ul class="default-multiselect"> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="0" class="default-checkbox" id="myMapSelect0" name="myMapSelect"> Zero 
          </label> 
         </li> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="1" class="default-checkbox" id="myMapSelect1" name="myMapSelect"> One 
          </label> 
         </li> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="2" class="default-checkbox" id="myMapSelect2" name="myMapSelect"> Two 
          </label> 
         </li> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="3" class="default-checkbox" id="myMapSelect3" name="myMapSelect"> Three 
          </label> 
         </li> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="4" class="default-checkbox" id="myMapSelect4" name="myMapSelect"> Four 
          </label> 
         </li> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="5" class="default-checkbox" id="myMapSelect5" name="myMapSelect"> Five 
          </label> 
         </li> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="6" class="default-checkbox" id="myMapSelect6" name="myMapSelect"> Six 
          </label> 
         </li> 
         <li class="default-multiselect"> 
          <label class="default-label"> 
           <input type="checkbox" value="7" class="default-checkbox" id="myMapSelect7" name="myMapSelect"> Seven 
          </label> 
         </li> 
      </ul> 
    </div> 
</div> 

CSS-за всей этой вещи:

div.default-skin-outer { 
    -moz-border-radius: 5px; 
    -webkit-border-radius: 5px; 
    width: 300px; 
    height: auto; 
    padding: 2px; 
    background-color: #f0f0f0; 
    border: 1px solid #999999; 
} 

div.default-skin-inner { 
    overflow: auto; 
    width: 300px; 
    height: 100px; 
} 

div.default-control { 
    -moz-border-radius: 5px; 
    -webkit-border-radius: 5px; 
    width: auto; 
    border: 1px solid #555555; 
    background-color: #999999; 
    color: #f0f0f0; 
    vertical-align: middle; 
    padding: 2px; 
    margin-bottom: 2px; 
    font-weight: bold; 
    overflow: hidden; 
} 

ul.default-multiselect { 
    padding: 0px; 
    margin: 0px; 
    white-space: nowrap; 
} 

ul.default-with-padding { 
    padding: 0px; 
    padding-left: 20px; 
    margin: 0px; 
    white-space: nowrap; 
} 

li.default-multiselect { 
    list-style-type: none; 
} 

label.default-label { 
    display: block; 
    padding: 2px; 
} 

input.default-checkbox { 
    width: 13px; 
    height: 13px; 
    padding: 0; 
    margin: 0; 
    vertical-align: bottom; 
    position: relative; 
    top: -1px; 
    *overflow: hidden; 
} 

span.default-icon { 
    background-image: url("/resources/authoring/jqueryui/custom-theme/images/ui-icons_ffffff_256x240.png"); 
    display: inline-block; 
    height: 16px; 
    width: 16px; 
    overflow: hidden; 
} 

span.default-icon-text { 
    width: auto; 
    background: none; 
} 

span.default-icon-text:hover { 
    text-decoration: underline; 
    cursor: pointer; 
} 

span.default-icon-check-text { 
    float: left; 
} 

span.default-icon-uncheck-text { 
    float: right; 
} 

span.default-icon-check { 
    background-position: -64px -144px; 
} 

span.default-icon-uncheck { 
    background-position: -96px -128px; 
} 

Это прекрасно работает в Firefox. Флажки прокручиваются без каких-либо проблем в прокручиваемом div. Но когда я смотрел на это в IE8, это выглядело ужасно.

Во-первых, дополнительные флажки выходят за пределы основного div. Во-вторых (и это действительно странно), когда я использую полосу прокрутки, прокрутки текста, , но флажки не. Они просто остаются на месте, пока текст прокручивается. Я пробовал искать решение, но ничего не смог придумать.

Спасибо!

UPDATE

Так я узнал, что если я удалю фанк часть в окошке стайлинга:

vertical-align:bottom; 
position:relative; 
top: -1px; 
*overflow: hidden; 

Он отлично работает. Но я поставил это, чтобы убедиться, что мой labels and checkboxes are lined up properly.

О да, что касается представления совместимости, это IE8 работает в режиме совместимости.

В ответ на замечания о наследуемых стилей, вот стили, что флажок наследует:

input { 
    border:1px solid #CFCFCF; 
    color:#000000; 
    font-family:Arial,Verdana,Sans-Serif; 
    font-size:12px; 
    padding-left:4px; 
} 


li.default-multiselect { 
    list-style-type:none; 
} 

ul.default-with-padding { 
    white-space:nowrap; 
} 

table { 
    empty-cells:show; 
} 

html, body { 
    line-height:16px; 
} 

Я не вижу ничего, что могло потенциально помешать ...

+0

Не для меня. Работает ли IE 8 в режиме совместимости? Он делает это автоматически по умолчанию, когда вы просматриваете сайт интрасети. – Jacob

+0

Я тоже пробовал, и он выглядит отлично в IE8.Также отлично работает в режиме совместимости. – Ray

+0

Не похоже, что в режиме совместимости для меня тоже. Возможно, проблема связана с CSS или HTML вне вашего вопроса. – Jacob

ответ

5

Кажется, что существует некоторое странное взаимодействие между наследуемыми стилями и стилями, которые я определил. Это ясно из комментариев Джейкоба и Рэя, так как они смогли пощекотать этот код на странице и заставить его отлично обрабатывать IE без каких-либо проблем.

Я смог заставить его вести себя правильно, удалив position:relative из input.default-checkbox.

Я предполагаю, что какое-то странное взаимодействие заставляет флажки думать, что они расположены статически или абсолютно (или что-то), из-за которых они не прокручиваются. По крайней мере I думаю вот в чем причина; кто-то может дать лучшую причину и пролить свет на это. Во всяком случае, удалив position:relative, я смог остановить странное прокручивание. Спасибо, что помогли мне понять это!

+0

Рад это услышать. Это определенно странно. –

+2

Другим решением является добавление позиции: по сравнению с стилем прокрутки div. – rossisdead

+1

Благодарим вас за сообщение об этом исправлении. Я столкнулся с одной и той же проблемой в старом IE, и она также сменилась стилем «position: relative». В итоге я применил 'position: relative' к элементу прокрутки, как это было предложено rossisdead. –

0

Убедитесь, что вы не» t имеют position: fixed, установленные на ваших флажках в любых других таблицах стилей.

+0

Спасибо, но он, кажется, не наследует это нигде. –

0

Как предложил @rossisdead, добавление position: relative к элементу прокрутки решает проблему. Мне также пришлось добавить position: relative родительскому элементу элемента прокрутки.