2012-12-11 48 views
1

我正在修改StackOverflow上的一個示例,以取代IE7上不支持一些不錯的CSS佈局的「select」組件。 這個例子沒有滾動條,所以我添加了一個固定大小的div,這樣滾動條就會出現,組件幾乎完成。IE7 + JavaScript appendChild =滾動條錯誤

我的問題:

1 - 在IE7(IE9兼容模式)滾動條不會出現。任何解決這個問題?

2 - 如何才能將「div」定位在該位置上,但保持在其他組件的前方,而不是佔用其全部大小?上的jsfiddle

我的代碼/ HTML:

http://jsfiddle.net/mbarni/nTYWA/ (運行爲 「無包(頭)」)

內嵌代碼/ HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <style type="text/css"> 
    body { 
     font: 80% 'Quicksand-Regular', Verdana, Geneva, sans-serif; 
    } 
    select { 
     display: block; 
     margin: 0 0 10px; 
     width: 300px; 
    } 
    select.replaced { 
     width: 1px; 
     position: absolute; 
     left: -999em; 
    } 
    ul.selectReplacement { 
     background: #10194B; 
     margin: 0 0 10px; 
     padding: 0; 
     height: 1.65em; 
     width: 300px; 
     position: relative; 
     z-index: 1000; 
    } 
    ul.selectFocused { 
     background: #10194B; 
    } 
    ul.selectReplacement li { 
     background: #09C; 
     color: #fff; 
     cursor: pointer; 
     display: none; 
     font-size: 11px; 
     line-height: 1.7em; 
     list-style: none; 
     margin: 0; 
     padding: 1px 12px; 
     width: 276px; 
    } 
    ul.selectOpen li { 
     display: block; 
    } 
    ul.selectReplacement li.selected { 
     background: #10194B; 
     border-bottom: 1px solid #fff; 
     color: #fff; 
     display: block; 
    } 
    ul.selectOpen li.selected { 
     background: #10194B; 
     border: 0; 
     display: block; 
    } 
    ul.selectOpen li:hover, 
    ul.selectOpen li.hover, 
    ul.selectOpen li.selected:hover { 
     background: #10194B; 
     color: #fff; 
    } 
    div.scroll { 
     overflow-y: auto; 
     overflow-x: hidden; 
     height: 100px; 
     width: 300px; 
    } 
    </style> 
    <script type="text/javascript"> 
    function selectReplacement(obj) { 
     obj.className += ' replaced'; 
     var ul = document.createElement('ul'); 
     ul.className = 'selectReplacement'; 
     var div = document.createElement('div'); 
     div.className = 'scroll'; 
     div.appendChild(ul); 

     var opts = obj.options; 
     var selectedOpt = (!obj.selectedIndex) ? 0 : obj.selectedIndex; 
     for (var i=0; i<opts.length; i++) { 
     var li = document.createElement('li'); 
     var txt = document.createTextNode(opts[i].text); 
     li.appendChild(txt); 
     li.selIndex = i; 
     li.selectID = obj.id; 
     li.onclick = function() { 
      selectMe(this); 
     }; 
     if (i == selectedOpt) { 
      li.className = 'selected'; 
      li.onclick = function() { 
      this.parentNode.className += ' selectOpen'; 
      this.onclick = function() { 
       selectMe(this); 
      }; 
      }; 
     } 
     if (window.attachEvent) { 
      li.onmouseover = function() { 
      this.className += ' hover'; 
      }; 
      li.onmouseout = function() { 
      this.className = 
       this.className.replace(new RegExp(" hover\\b"), ''); 
      }; 
     }  
     ul.appendChild(li); 
     } 
     obj.onfocus = function() { 
     ul.className += ' selectFocused'; 
     }; 
     obj.onblur = function() { 
     ul.className = 'selectReplacement'; 
     }; 
     obj.onchange = function() { 
     var idx = this.selectedIndex; 
     selectMe(ul.childNodes[idx]); 
     }; 
     obj.onkeypress = obj.onchange; 
     obj.parentNode.insertBefore(div,obj); 
    } 
    function selectMe(obj) { 
     var lis = obj.parentNode.getElementsByTagName('li'); 
     for (var i=0; i<lis.length; i++) { 
     if (lis[i] != obj) { 
      lis[i].className=''; 
      lis[i].onclick = function() { 
      selectMe(this); 
      }; 
     } else { 
      setVal(obj.selectID, obj.selIndex); 
      obj.className='selected'; 
      obj.parentNode.className = 
      obj.parentNode.className.replace(new RegExp(" selectOpen\\b"), ''); 
      obj.onclick = function() { 
      obj.parentNode.className += ' selectOpen'; 
      this.onclick = function() { 
       selectMe(this); 
      }; 
      }; 
     } 
     } 
    } 
    function setVal(objID,val) { 
     var obj = document.getElementById(objID); 
     obj.selectedIndex = val; 
    } 
    function setForm() { 
     var s = document.getElementsByTagName('select'); 
     for (var i=0; i<s.length; i++) { 
     selectReplacement(s[i]); 
     } 
    } 
    window.onload = function() { 
     (document.all && !window.print) ? null : setForm(); 
    }; 
    </script> 
</head> 
<body> 
    <select id="unidade"> 
     <option value="001">TEST 1</option> 
     <option selected value="002">TEST 2</option> 
     <option value="003">TEST 3</option> 
     <option value="004">TEST 4</option> 
     <option value="005">TEST 5</option> 
     <option value="006">TEST 6</option> 
     <option value="007">TEST 7</option> 
     <option value="008">TEST 8</option> 
    </select> 
</body> 
</html> 
+3

使用jsfiddle來擴展這樣的代碼示例。 – katspaugh

回答

1

你已經運行到IE7 scrolling div bug

刪除position: relativeul.selectReplacement和一切正常。已在IE9的IE7瀏覽器模式下測試in jsfiddle

如果您發現您需要的UI元素的position: relative,重視position: relative到包含div(div.scroll),並且還修復了的東西(relevant jsfiddle)。相對而言,剝離位置似乎不會在chrome或IE7模式下破壞任何內容,但如果您需要ul元素不使用靜態模型,並且不需要div使用靜態,則第二種方法也可以正常工作這兩種情況。

至於第二個問題,您可以position: relativediv.scroll,然後將其包裝在height: 1.5em div,如this jsfiddle所示。包裝div可以根據需要添加定位和z-indexing:請注意,如果您需要內部元素比wrapper div的其他兄弟更高,那麼您將需要在包裝器上使用z-indexing,這是由於IE錯誤與對子元素進行z索引,與對祖先進行同源的元素進行索引。適用於IE7模式和Chrome。

(請注意,如果你想擁有這是一個內聯元素,你可以用通常的警告display: inline-block它 - 適當jsfiddle here和IE7修正了zoom*display:inlineversion here黑客)

編輯: 在線版本通過在兩個不同高度之間切換div來修復以下文本:jsfiddle。請注意,這將需要一些玩ul和li元素的高度/線高度以避免從開始到關閉的高度上的輕微位移,但是基本概念在那裏,儘管是以不優雅的方式(「更好」將是簡單更改div的height屬性,或者隔離另一個類中的高度並僅交換該類)。請注意,選定的元素高度必須減小,並刪除填充以便能夠將div壓縮到基本上單個線條高度。如果需要,進一步降低某些元素的高度將允許進一​​步壓縮滾動div,而不會結束滾動條,即使在關閉狀態下也是如此。

+0

感謝您的回答! – MBarni

+0

很高興幫助!你可以使用包裝div高度和/或邊距來獲得視覺上令人滿意的外觀=)我使用em,以便它可以通過瀏覽器縮放正確縮放。您提供的代碼需要注意的一點是,它不適用於按鍵選擇,僅適用於鼠標。 – taswyn

+0

解決方案存在問題... div是內聯的,但我不能選擇它下面的文本...就好像div文本結束了一樣。對這種情況有幫助嗎? – MBarni