Странное поведение при прокрутке в IE с флажками в прокручиваемом div - PullRequest
3 голосов
/ 10 февраля 2010

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

<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, это выглядит ужасно.

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

Спасибо!

UPDATE

Итак, я обнаружил, что если я уберу интересную часть в стиле флажка:

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

Работает нормально. Но я вставил это, чтобы убедиться, что мои метки и флажки выстроены правильно .

О, да, что касается представления совместимости, это 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;
}

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

Ответы [ 3 ]

5 голосов
/ 10 февраля 2010

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

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

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

0 голосов
/ 22 июля 2014

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

0 голосов
/ 10 февраля 2010

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

...