根据所选选项的宽度调整选择元素的宽度

Nad*_*dia 2 javascript jquery html-select twitter-bootstrap twitter-bootstrap-3

我希望select元素的默认选项值的宽度更短.当用户选择另一个选项时,select元素应调整自身大小,以便整个文本始终在元素中可见.

我已经在问题中找到了一个解决方案,根据选择的OPTION宽度自动调整SELECT元素的大小,但它不能用于bootstrap,我不知道为什么.

这是我的尝试:

$(document).ready(function() {
  $('select').change(function(){
    $("#width_tmp").html($('select option:selected').text());
    // 30 : the size of the down arrow of the select box 
    $(this).width($("#width_tmp").width()+30); 
  });
});
Run Code Online (Sandbox Code Playgroud)
.btn-select {
  color: #333;
  background-color: #f5f5f5;
  border-color: #ccc;
  padding:7px;
}
select {
  width: 60px;
}

#width_tmp{
  display : none;
}
Run Code Online (Sandbox Code Playgroud)
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
<link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>

<div class="form-group">
  <div class="input-group">

    <span class="input-group-btn">
      <select class="btn btn-select align-left">
        <option>All</option>
        <option>Longer</option>
        <option>A very very long string...</option>
      </select>
      <span id="width_tmp"></span>
    </span>

    <input type="text" class="form-control" placeholder="Search by...">

    <span class="input-group-btn">
      <button class="btn btn-default" type="button">
        <i class="fa fa-search"></i>
      </button>
    </span>

  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Kyl*_*Mit 8

出现此问题的原因#width_tmp.input-group-btn它嵌套在下面,因此它font-size: 0;从引导程序继承该属性.因此,元素的计算宽度始终为零:

截图

要解决此问题,只需移动<span id="width_tmp"></span>它,使其不在输入组内.

插件时间

更好的选择是使用插件来处理整个操作的开始.这是我刚刚掀起的一个.

该插件动态创建并销毁span它,因此它不会使你的HTML混乱.这有助于分离关注点,并允许您将该功能委派给另一个文件,并轻松地在多个页面中重复使用多个元素.

(function($, window){
  var arrowWidth = 30;

  $.fn.resizeselect = function(settings) {  
    return this.each(function() { 

      $(this).change(function(){
        var $this = $(this);

        // create test element
        var text = $this.find("option:selected").text();
        var $test = $("<span>").html(text);

        // add to body, get width, and get out
        $test.appendTo('body');
        var width = $test.width();
        $test.remove();

        // set select width
        $this.width(width + arrowWidth);

        // run on start
      }).change();

    });
  };

  // run by default
  $("select.resizeselect").resizeselect();                       

})(jQuery, window);
Run Code Online (Sandbox Code Playgroud)

您可以通过以下两种方式之一初始化插件:

  1. HTML - 将类添加.resizeselect到任何select元素:

    <select class="btn btn-select resizeselect">
      <option>All</option>
      <option>Longer</option>
      <option>A very very long string...</option>
    </select>
    
    Run Code Online (Sandbox Code Playgroud)
  2. JavaScript - 调用.resizeselect()任何jQuery对象:

    $("select").resizeselect()
    
    Run Code Online (Sandbox Code Playgroud)

这是Stack Snippets中的演示:

(function($, window){
  var arrowWidth = 30;

  $.fn.resizeselect = function(settings) {  
    return this.each(function() { 

      $(this).change(function(){
        var $this = $(this);

        // create test element
        var text = $this.find("option:selected").text();
        var $test = $("<span>").html(text);

        // add to body, get width, and get out
        $test.appendTo('body');
        var width = $test.width();
        $test.remove();

        // set select width
        $this.width(width + arrowWidth);

        // run on start
      }).change();

    });
  };

  // run by default
  $("select.resizeselect").resizeselect();                       

})(jQuery, window);
Run Code Online (Sandbox Code Playgroud)
.btn-select {
  color: #333;
  background-color: #f5f5f5;
  border-color: #ccc;
  padding:7px;
}
Run Code Online (Sandbox Code Playgroud)
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
<link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>

<div class="form-group">
  <div class="input-group">

    <span class="input-group-btn">
      <select class="btn btn-select resizeselect">
        <option>All</option>
        <option>Longer</option>
        <option>A very very long string...</option>
      </select>
    </span>

    <input type="text" class="form-control" placeholder="Search by...">

    <span class="input-group-btn">
      <button class="btn btn-default" type="button">
        <i class="fa fa-search"></i>
      </button>
    </span>

  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 第一行需要从 `(function($, window){` 更改为 `$(function($, window){` 这相当于说 `$( document ).ready() { (function($ , window){` 否则你的类属性只会在页面上的链接被点击后才会改变(因为文档会在脚本执行后加载) (2认同)
  • 我建议将行 `var $test = $("&lt;span&gt;").html(text);` 更改为 `var $test = $("&lt;span style=\"font-size:"+$this. css("font-size")+"\"&gt;").html(text);`以确保创建的临时跨度的字体大小与选择元素的字体大小匹配。如果 span 的字体大小更小或更大,则动态调整大小将被大小差异所抵消。 (2认同)