2012-12-11 46 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