【问题标题】:HTML multiple column drop down with adjusted columns带有调整列的 HTML 多列下拉菜单
【发布时间】:2013-06-18 06:47:16
【问题描述】:

我需要一个包含多列的下拉菜单。我用谷歌搜索并找到了解决方案:

<select name="timezones">
    <option value="1">
        <column>Pacific/Auckland</column>
        <column>+12:00</column>
    </option>
    <option value="2">
        <column>Australia/Brisbane</column>
        <column>+10:00</column>
    </option>
</select>

但是,各列之间并没有相互调整。

外观:

Pacific/Auckland +12:00
Australia/Brisbane +10:00

我想要的样子:

Pacific/Auckland    +12:00
Australia/Brisbane  +10:00

【问题讨论】:

  • 添加&amp;nbsp 将解决您的问题&lt;column&gt;&amp;nbsp&amp;nbsp+12:00&lt;/column&gt;
  • 还有其他更简洁、更自动化的方法吗?
  • 你不能......最好将 text-align:right 属性设置为选择框
  • @suresh.g , &lt;column style="text-align:right;"&gt;+12:00&lt;/column&gt; 没有改变任何东西。
  • @gerrnar &lt;column&gt; 是 HTML 中的有效标签吗?

标签: html


【解决方案1】:

据我所知,选择中的 HTML 不是有效的,但是用 jquery (http://jsfiddle.net/upgradellc/ASR2K/2) 解决这个问题并不难:

html:

<select name="timezones" id="timezones">
    <option value="1">Pacific/Auckland +12:00 </option>
    <option value="2">Australia/Brisbane +10:00 </option>
     <option value="3">Aust +10:00 </option>
    <option value="3">A +10:00 </option>
</select>

javascript:

var spacesToAdd = 5;
var biggestLength = 0;
$("#timezones option").each(function(){
var len = $(this).text().length;
    if(len > biggestLength){
        biggestLength = len;
    }
});
var padLength = biggestLength + spacesToAdd;
$("#timezones option").each(function(){
    var parts = $(this).text().split('+');
    var strLength = parts[0].length;
    for(var x=0; x<(padLength-strLength); x++){
        parts[0] = parts[0]+' '; 
    }
    $(this).text(parts[0].replace(/ /g, '\u00a0')+'+'+parts[1]).text;
});

css,确保字体对齐:

select{
    font-family:"Courier New", Courier, monospace
}

【讨论】:

  • 什么是字符不匹配?
  • @Max 我认为你的代码有缺陷,如果我添加一个 13 个字符的选项,它会失败。试试这个&lt;option value="3"&gt;Aust +10:00 &lt;/option&gt;把它添加到你的html中并检查
  • @user1671639 你是对的 - 虽然我的代码没有这个缺陷,但它与字体更新的答案有关!
  • 这似乎在某个时候停止使用 Chrome。我使用的是 64.0.3282.140 版本,它肯定不起作用。
  • Firefox 中的列未对齐。
【解决方案2】:

这个解决方案不需要特定的字体,它会用你的字体来衡量你的文本。

有一个“幻数”来缩小两列之间的空间,这个数字越大,列越近,但如果它太大,该功能将无法工作(我使用60和我的字体Verdana 12px )。

用你的字体添加 css

.measuring {
    font-size: 12px;
    font-family: Verdana,Arial,sans-serif;
    display:none;
}

在页面中添加跨度

<span id="measuring" class="measuring"></span>

使用函数twoColumnDropDown()

function twoColumnDropDown(dd, separatorChars, magicNumber) {
    var biggestLength = 0;
    $(dd).find('option').each(function () {
        $("#measuring").text($(this).text().replace(separatorChars, ''));
        if ($("#measuring").width() > biggestLength) {
            biggestLength = $("#measuring").width();
        }
    });
    biggestLength = biggestLength - magicNumber;
    $(dd).find('option').each(function () {
        if ($(this).text() != "") {
            var parts = $(this).text().split(separatorChars);
            $("#measuring").text(parts[0]);
            $(this).text(parts[0] + String.fromCharCode(8202).repeat(biggestLength - $("#measuring").width()) + parts[1]);

        }
    });
}

解释:

  • dd = 选择元素
  • separatorChars = 通常"-"
  • magicNumber = 前面解释过

【讨论】:

    【解决方案3】:

    我来这里是为了寻找解决方案。没有什么能满足我的需求,所以我推出了自己的:

    <style>
        .selectedOrder {
            height: 30px; 
            display:none; 
        }
    
        /* class applies to select element itself, not a wrapper element */
        .select-css {
            font-size: 12px;
            font-family: sans-serif;
            font-weight: 700;
            color: #444;
            line-height: 1.3;
            padding: .6em 1.4em .5em .8em;
            /* width: 100%; */
            max-width: 100%; /* useful when width is set to anything other than 100% */
            box-sizing: border-box;
            margin: 0;
            border: 1px solid #aaa;
            box-shadow: 0 1px 0 1px rgba(0,0,0,.04);
            border-radius: .5em;
            -moz-appearance: none;
            -webkit-appearance: none;
            appearance: none;
            background-color: #fff;
            /* note: bg image below uses 2 urls. The first is an svg data uri for the arrow icon, and the second is the gradient. 
                for the icon, if you want to change the color, be sure to use `%23` instead of `#`, since it's a url. You can also swap in a different svg icon or an external image reference
                
            */
            background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),
              linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);
            background-repeat: no-repeat, repeat;
            /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/
            background-position: right .7em top 50%, 0 0;
            /* icon size, then gradient */
            background-size: .65em auto, 100%;
        }
        /* Hide arrow icon in IE browsers */
        .select-css::-ms-expand {
            display: none;
        }
        /* Hover style */
        .select-css:hover {
            border-color: #888;
        }
        /* Focus style */
        .select-css:focus {
            border-color: #aaa;
            /* It'd be nice to use -webkit-focus-ring-color here but it doesn't work on box-shadow */
            box-shadow: 0 0 1px 3px rgba(59, 153, 252, .7);
            box-shadow: 0 0 0 3px -moz-mac-focusring;
            color: #222; 
            outline: none;
        }
    
        /* Set options to normal weight */
        .select-css option {
            font-weight:normal;
        }
    
        /* Support for rtl text, explicit support for Arabic and Hebrew */
        *[dir="rtl"] .select-css, :root:lang(ar) .select-css, :root:lang(iw) .select-css {
            background-position: left .7em top 50%, 0 0;
            padding: .6em .8em .5em 1.4em;
        }
    
        /* Disabled styles */
        .select-css:disabled, .select-css[aria-disabled=true] {
            color: graytext;
            background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),
              linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);
        }
    
        .select-css:disabled:hover, .select-css[aria-disabled=true] {
            border-color: #aaa;
        }
    </style>
    
    <div id="orderSelectContainer">
        <div id="selectedOrder" class="selectedOrder select-css" style="width: 533px; display: block;">
            <div class="currentSelectedOrder" data-value="45536" style="float: left;">
                    <span style="float:left; min-width:200px;">Store 1</span>
                    <span style="float:left; min-width:50px"> 55628</span>
                    <span style="float:left; min-width: 150px;"> Quantity Discrepancy</span>
                    <span style="float:left; min-width:100px">  </span>
        </div>
        </div>
        <div id="orderSelect" class="select-css" style="position: absolute; z-index: 1000; background-image: none; display: none;">
            <div class="orderContainer">
                <div class="order" data-value="45628" style="float: left; background: white;">
                    <span style="float:left; min-width:200px;">Store 1</span>
                    <span style="float:left; min-width:50px"> 55628</span>
                    <span style="float:left; min-width: 150px;"> Quantity Discrepancy</span>
                    <span style="float:left; min-width:100px">  </span>
                </div>
            </div>
            <div class="orderContainer">
                <div class="order" data-value="45536" style="float: left; background: lightblue;">
                    <span style="float:left; min-width:200px;">Store 2</span>
                    <span style="float:left; min-width:50px"> 55536</span>
                    <span style="float:left; min-width: 150px;"> Quantity Discrepancy</span>
                    <span style="float:left; min-width:100px"> Bad UPCs</span>
                </div>
            </div>
            <div class="orderContainer">
                <div class="order" data-value="45682" style="float: left; background: white;">
                    <span style="float:left; min-width:200px;">Store 3</span><span style="float:left; min-width:50px"> 55682</span>
                    <span style="float:left; min-width: 150px;"> Quantity Discrepancy</span>
                    <span style="float:left; min-width:100px"> Bad UPCs</span>
                </div>
            </div>
            <div class="orderContainer">
                <div class="order" data-value="45625" style="float: left; background: white;">
                    <span style="float:left; min-width:200px;">Store 4</span>
                    <span style="float:left; min-width:50px"> 55625</span>
                    <span style="float:left; min-width: 150px;"> Quantity Discrepancy</span>
                    <span style="float:left; min-width:100px">  </span>
                </div>
            </div>
            <div class="orderContainer">
                <div class="order" data-value="45556" style="float: left; background: white;">
                    <span style="float:left; min-width:200px;">Store 5</span>
                    <span style="float:left; min-width:50px"> 55556</span>
                    <span style="float:left; min-width: 150px;"> Quantity Discrepancy</span>
                    <span style="float:left; min-width:100px"> Bad UPCs</span>
                </div>
            </div>
        </div>
        <br style="clear:both"><br>
    </div>
    
    <script>
        $(document).on(`click`, `.order`, function() {
            if ($(this).data(`value`) !== $(`#selectedOrder >.currentSelectedOrder`).data(`value`)) {
                $(`#orderContainer`).html(``);
            }
            $(`#selectedOrder`).html($(this).prop(`outerHTML`)).find(`.order`).removeClass(`order`).css(`background`, ``).addClass(`currentSelectedOrder`);
            $(`.order`).css(`background`, `white`);
            $(this).css(`background`, `lightblue`);
            $(`#selectedOrder`).show();
            $(`#orderSelect`).hide();
        });
    
        $(document).on(`click`, `#selectedOrder`, function() {
            //$(`#selectedOrder`).hide();
            $(`#orderSelect`).toggle();
        });
    
        $(document).on(`mouseenter`, `.order`, function() {
            $(`.order`).css(`background`, `white`);
            $(this).css(`background`, `lightblue`);
        });
    
        $(document).on(`mouseexit`, `.order`, function() {
            $(this).css(`background`, `white`);
        });
    <script>
    

    它看起来像一个选择,它就像一个选择;

    https://jsfiddle.net/schmidtc63/xu8zgpc9/

    【讨论】:

      【解决方案4】:

      这可以通过divcssjquery(http://jsfiddle.net/5hvd6k83/68/) 解决。

      HTML:

      <textarea id="textarea" style="width:250px;height:100px;"></textarea>
      <div class="dropdown">
        <div id="myDropdown" class="dropdown-content">
          <a>
            <div class="container">
              <div class="block word">con</div>
              <div class="block prob">20%</div>
              </div>
          </a>
          <a>
            <div class="container">
              <div class="block word">constant</div>
              <div class="block prob">20%</div>
              </div>
          </a>
        </div>
      </div>
      

      CSS:

      .container {
        display: flex;
        flex-wrap: wrap;
        justify-content: space-between;
        vertical-align: middle;
      }
      
      .block {
        width: 60px;
        height: auto;
        margin: 3px;
        overflow: hidden;
      }
      
      
      
      .word {
        text-align: left;
      }
      
      .prob {
        text-align: right;
      }
      
      
      .dropdown-content {
        display: none;
        background-color: #f1f1f1;
        width: 300px;
        height: auto;
        overflow: auto;
        box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.5);
        z-index: 1;
      }
      
      .dropdown-content a {
        color: black;
        display: block;
      }
      
      // .dropdown a:hover { background-color: #ddd; }
      .show { display: block; }
      

      Javascript:

      const items = document.querySelectorAll("#myDropdown > a");
      
      var preItem, currItem;
      
      var tabCnt = 0;
      const itemLen = items.length;
      
      document.getElementById("myDropdown").classList.toggle("show");
      
      
      $(document).delegate('#textarea', 'keydown', function(e) {
          var keyCode = e.keyCode || e.which;
        if (keyCode == 9) {
          e.preventDefault();
          currItem = items[tabCnt % itemLen];
          currItem.style.backgroundColor = 'lightblue';
          tabCnt += 1;
          if (preItem) {
              preItem.style.backgroundColor = '';
          }
          var word = $(currItem).find('.word');
          $('#textarea').text($(word).text());
          preItem = currItem;
        }
      });
      
      

      结果:

      【讨论】:

      • 我是为 Jupyter Notebook 中的一个代码补全插件做的,所以我使用TAB 在项目之间切换。
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多