1. 程式人生 > >ie9 scrollbar bug(IE9父容器overflow:auto時,子容器狀態更改導致滾動條下出現額外空間)

ie9 scrollbar bug(IE9父容器overflow:auto時,子容器狀態更改導致滾動條下出現額外空間)

轉自文章  http://www.jackness.org/2011/10/18/ie9-scrollbar-bug/

當我們製作表單的時候,有時候會遇到資料過長,表單列數過多,需要橫向滾動條的需求,我們一般的做法是 給這個表格的外層加一個 scroll_auto 的 div 並設定:

?
1 2 /*css document*/ .scroll_auto{ width:100%; overflow:auto;}

套在table的外層

?
1 2 3 4 5 6 7 8 <!-- html element --> <div class="scroll_auto"> <table> <tr> <td></td> </tr> </table> </div>

如果碰巧 你給這個 table 或者table裡面的元素 設定了 :hover 的偽類(最常見的是滑鼠移到table中對應的行數,該行高亮) 並在裡面寫有屬性,那恭喜 專屬於 ie9 的 bug出現了(經測試,直到ie10預覽版第二版,這個bug都還沒修復)。

靜看是好的,可是,當我們滑鼠移動到 table裡面的時候,悲劇出現了。
在 ie9 中 ,我們可以看到每當我們在table內部促發hover偽類的時候, 黑色的塊級元素 就會往下掉,直到掉到瀏覽器視窗的底部又跳回原來的位置,周而復始…

bug 觸發條件:

經測試發現,這個bug的出現 有2個條件:

  1. 父級設定 overflow:auto(準確來說 應該是 overflow-x:auto),並且裡面的元素寬度超出父級導致橫向滾動條出現
  2. 父級元素的任意子元素設有:hover偽類並且裡面有屬性設定(與原有的屬性不一樣即可)

滿足這2個條件,當你觸發父級裡面的 :hover 偽類的時候,bug就會出現。

解決方案:

知道了觸發條件,自然解決方案就能得知。

根據觸發條件得到的解決方案是:

  1. 給父級別設定 overflow-x:scroll,即:

    ?
    1 2 3 /*css document*/ .scroll_auto{ width:100%; overflow-x:scroll;}
  2. 保證這個父級裡面的元素不超出 父級的寬度。

  3. 保證這個父級裡面的元素沒有:hover 偽類(