【问题标题】:Rendering a hierarchy of "OPTION"s in a "SELECT" tag在“SELECT”标签中呈现“OPTION”的层次结构
【发布时间】:2009-07-18 05:28:54
【问题描述】:

我的问题是 HTML 和 CSS 相关的。我有一个层次结构类型结构,我想在列表中显示。层次结构包含国家、州和城市(深度为三层)。

我想在选择列表中显示列表,每个项目类型(国家、州、城市)都必须是可选的。项目应缩进为:

United States
- Hawaii
-- Kauai
- Washington
-- Seattle
-- Chelan

问题在于缩进。我正在尝试使用 margin-left 或 padding-left 来缩进标签,这在 FireFox 中显示正确但在 IE7 中不正确。这是生成的选择列表的示例:

<select name="Something">
<option style="padding-left: 0">United States</option>
<option style="padding-left: 20px">Hawaii</option>
<option style="padding-left: 40px">Kauai</option>
<option style="padding-left: 20px">Washington</option>
<option style="padding-left: 40px">Seattle</option>
<option style="padding-left: 40px">Chelan</option>
</select>

我想在不使用 CSS hack 的情况下实现跨浏览器的一致缩进。

【问题讨论】:

标签: html css html-select


【解决方案1】:

SELECT 元素的呈现很大程度上取决于浏览器,您对它们的呈现几乎没有影响。某些浏览器显然允许您比其他浏览器进行更多的自定义,而 IE 恰好允许的很少(gasp,谁会有 thunk ;))。如果您需要非常自定义的 SELECT 元素,则需要使用 JavaScript 或重新创建行为类似于 SELECT 但由一堆 DIVs 和复选框或其他扩展组成的东西。

话虽如此,我想你要找的是OPTGROUPs

<select>
  <optgroup label="xxx">
    <option value="xxxx">xxxx</option>
    ....
  </optgroup>
  <optgroup label="yyy">
    ...
  </optgroup>
</select>

每个浏览器都会以不同的方式显示它们,但它们会以一种或另一种方式以独特的方式显示。请注意,虽然在 HTML4 中,您不能嵌套 OPTGROUPs。

【讨论】:

  • 作为备用方案,您始终可以像在示例中那样显示它们,使用破折号--缩进它们。
  • @deceze 从问题中引用:“每个项目类型(国家、州、城市)必须是可选的”。我怀疑 optgroup 是可选的。
  • 确实如此。然后他需要对它们进行不同的分组并使用组标签作为标签,或者直接跳过我答案的第二部分。
  • 嗯... optgroups 不能嵌套我想,我的意思是,我可能将 optgroups 用于国家/地区级别,但我不能将它们用于州。
【解决方案2】:

deceze 方式要好得多,这是我的第一个想法。作为一种替代方法,如果这不起作用,您可以在标记值中使用不间断空格:

<select>
    <option>select me</option>
    <option>&nbsp;me indented</option>
    <option>&nbsp;&nbsp;even more indentation</option>
</select>

它远非漂亮,但如果 optgroup 不漂亮,它可能对你有用。

【讨论】:

  • 恐怕这确实是最可靠的解决方案。
  • 这不是好的解决方案,因为按字母搜索不起作用。
  • 如果“按字母搜索”是指通过打字来获得结果,那么我认为这不应该是一个非常大的动力。该特性/功能在其工作方式和 IMO 方面非常特定于浏览器,普通用户并未广泛使用。如果这不是你所指的,那我恐怕不知道你在说什么。
  • 似乎 Chrome 忠实地呈现了  逐字。我不得不使用连字符
  • &amp;nbsp; 在 Chrome 中的缩进很小,也呈现为选定的值。如果这是不可取的,请尝试&amp;emsp;
【解决方案3】:

为了访问者,我觉得我应该分享我设计的这个解决方案:http://jsfiddle.net/n9qpN/

用关卡类装饰选项

<select name="hierarchiacal">
<option class="level_1">United States</option>
    <option class="level_2">Hawaii</option>
        <option class="level_3">Kauai</option>
    <option class="level_2">Washington</option>
        <option class="level_3">Seattle</option>
        <option class="level_3">Chelan</option>
</select>

我们现在可以使用 jQuery 重新格式化 select 元素的内容

$(document).ready(
function(){
   $('.level_2').each(
        function(){
            $(this).text('----'+$(this).text());
        }
   );

   $('.level_3').each(
        function(){
            $(this).text('---------'+$(this).text());
        }
   );

 }
);

这可以扩展到任何级别

【讨论】:

  • 这是最优雅的解决方案。
【解决方案4】:

尝试使用  

<select name="Something">
  <option>United States</option>
  <option>&#160;Hawaii</option>
  <option>&#160;&#160;Kauai</option>
  <option>&#160;Washington</option>
  <option>&#160;&#160;Seattle</option>
  <option>&#160;&#160;Chelan</option>
</select>

【讨论】:

    【解决方案5】:

    这种分组方法不是带来的问题多于解决的问题吗?作为用户,我应该选择哪一个?选择比国家更具体的东西有什么好处吗?

    如果问题是您只有一个数据库字段可以存储它们,为什么不使用三个单独的选择框(使 2 或 3 个可选)并只存储最具体的?:

    <select name="country">
        <option>Choose a country</option>
        <option>United States</option>
    </select>
    <select name="state">
        <option>Choose a state</option>
        <option>Hawaii</option>
    </select>
    <select name="city">
        <option>Choose a city</option>
        <option>Kauai</option>
    </select>
    

    【讨论】:

    • 我必须做一个级联的“onchange=populate_next_select();”以此目的。此外,我想要的是一口气呈现整个列表。
    • @Salman A:为什么会这样?无论如何,您已经完全填充了单选框,那么为什么不完全填充所有 3 个?但是,您关于一次提供整个列表的观点是公平的。
    • >> “为什么?”客户是这么说的:(
    • 嗨,我来自 2017 年。客户仍然“永远正确”。
    【解决方案6】:

    我能够使用 NO-BREAK SPACE unicode 字符来完成此操作。 http://www.fileformat.info/info/unicode/char/00a0/index.htm

    将该页面中的字符复制粘贴到代码中,然后瞧: https://jsfiddle.net/fwillerup/r9ch988h/

    &amp;nbsp; 对我不起作用,因为我使用了一个用于花哨的选择框的库,可以逐字注入它们。)

    【讨论】:

      【解决方案7】:

      前置不间断空格 (&nbsp) 对我不起作用。

      我添加了以下内容:

      String.fromCharCode(8194);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多