【问题标题】:Style jQuery autocomplete in a Bootstrap input field在 Bootstrap 输入字段中设置 jQuery 自动完成样式
【发布时间】:2015-04-01 21:00:54
【问题描述】:

我已经为 Bootstrap 输入实现了一个 jQuery 自动完成功能。 jQuery 自动完成功能运行良好,但我想将结果视为一个组合,我想它现在正在发生,因为我正在使用 BootStrap。

这是我分配自动完成的字段:

<div class="form-group">
  <label>Employee</label>
  <input class="form-control" name="txtEmployee" placeholder="Trabajador">
</div>
$(this).autocomplete({

  source: function(request, response) {
    $.ajax({
      url: '@Url.Content("~/Employee/SearchEmployee")/',
      type: 'POST',
      contentType: 'application/json',
      dataType: "json",
      data: JSON.stringify({
          employerId: 1,
          searchStr: me.val()
      }),
      success: function(data) {
        if (data.success) {

          response($.map(data.data, function(item) {

            return {
              label: "(" + item.EmployeeNumber + ") " + 
                           item.FirstName + " " + 
                           item.MothersLast + ", " + 
                           item.FathersLast,
              employeeId: item.EmployeeId
            }
          }));
        } 
      }
    });
  },
  minLength: 3
});

显示结果,但如下所示:

如何使用 Bootstrap 设置结果样式,以便像下拉列表一样查看它们?

【问题讨论】:

  • 标签: jquery twitter-bootstrap jquery-autocomplete


    【解决方案1】:

    我找到了以下 css 以便为 jquery 自动完成设置 Bootstrap 输入的样式:

    https://gist.github.com/daz/2168334#file-style-scss

    .ui-autocomplete {
        position: absolute;
        top: 100%;
        left: 0;
        z-index: 1000;
        float: left;
        display: none;
        min-width: 160px;
        _width: 160px;
        padding: 4px 0;
        margin: 2px 0 0 0;
        list-style: none;
        background-color: #ffffff;
        border-color: #ccc;
        border-color: rgba(0, 0, 0, 0.2);
        border-style: solid;
        border-width: 1px;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        border-radius: 5px;
        -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
        -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
        box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
        -webkit-background-clip: padding-box;
        -moz-background-clip: padding;
        background-clip: padding-box;
        *border-right-width: 2px;
        *border-bottom-width: 2px;
    }
    .ui-menu-item > a.ui-corner-all {
        display: block;
        padding: 3px 15px;
        clear: both;
        font-weight: normal;
        line-height: 18px;
        color: #555555;
        white-space: nowrap;
    }
    .ui-state-hover, &.ui-state-active {
          color: #ffffff;
          text-decoration: none;
          background-color: #0088cc;
          border-radius: 0px;
          -webkit-border-radius: 0px;
          -moz-border-radius: 0px;
          background-image: none;
        }
    

    【讨论】:

    • 正是我所需要的。简单的!非常感谢
    【解决方案2】:

    如果您使用 jQuery-UI,您必须包含 jQuery UI CSS 包,否则 UI 组件不知道如何设置样式。

    如果您不喜欢 jQuery UI 样式,那么您必须重新创建它原本会应用的所有样式。

    这是一个示例和一些可能的修复方法。

    Minimal, Complete, and Verifiable example(即损坏)

    这是 Stack Snippets 中的一个演示没有 jquery-ui.css(不起作用)

    $(function() {
      var availableTags = [
        "ActionScript", "AppleScript", "Asp", "BASIC", "C", "C++",
        "Clojure", "COBOL", "ColdFusion", "Erlang", "Fortran",
        "Groovy", "Haskell", "Java", "JavaScript", "Lisp", "Perl",
        "PHP", "Python", "Ruby", "Scala", "Scheme"
      ];
      
      $(".autocomplete").autocomplete({
        source: availableTags
      });
    });
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
    
    <div class="container">
    
      <div class="form-group">
        <label>Languages</label>
        <input class="form-control autocomplete" placeholder="Enter A" />
      </div>
      
      <div class="form-group">
        <label >Another Field</label>
        <input class="form-control">
      </div>
    
    </div>

    修复 #1 - jQuery-UI 样式

    只需包含 jquery-ui.css,一切都应该与最新支持的 jquery 版本一起正常工作。

    $(function() {
      var availableTags = [
        "ActionScript", "AppleScript", "Asp", "BASIC", "C", "C++",
        "Clojure", "COBOL", "ColdFusion", "Erlang", "Fortran",
        "Groovy", "Haskell", "Java", "JavaScript", "Lisp", "Perl",
        "PHP", "Python", "Ruby", "Scala", "Scheme"
      ];
      
      $(".autocomplete").autocomplete({
        source: availableTags
      });
    });
    <link href="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.css" rel="stylesheet"/>
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
    
    <div class="container">
      <div class="form-group">
        <label>Languages</label>
        <input class="form-control autocomplete" placeholder="Enter A" />
      </div>
      
      <div class="form-group">
        <label >Another Field</label>
        <input class="form-control">
      </div>
    </div>

    修复 #2 - 引导主题

    有一个项目为 jQuery-UI 组件创建了一个 Bootstrap 风格的主题,名为 jquery‑ui‑bootstrap。只需从那里获取样式表,您就应该准备就绪。

    $(function() {
      var availableTags = [
        "ActionScript", "AppleScript", "Asp", "BASIC", "C", "C++",
        "Clojure", "COBOL", "ColdFusion", "Erlang", "Fortran",
        "Groovy", "Haskell", "Java", "JavaScript", "Lisp", "Perl",
        "PHP", "Python", "Ruby", "Scala", "Scheme"
      ];
      
      $(".autocomplete").autocomplete({
        source: availableTags
      });
    });
    <link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-ui-bootstrap/0.5pre/css/custom-theme/jquery-ui-1.10.0.custom.css" rel="stylesheet"/>
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
    
    <div class="container">
      <div class="form-group">
        <label>Languages</label>
        <input class="form-control autocomplete" placeholder="Enter A" />
      </div>
      
      <div class="form-group">
        <label >Another Field</label>
        <input class="form-control">
      </div>
    </div>

    修复 #3 - 手动 CSS

    如果您只需要 jQuery-UI 库中的 AutoComplete 小部件,您应该首先进行自定义构建,这样您就不会拉入您不使用的资源。

    之后,您需要自己设置样式。只需查看应用于 jquery 的 autocomplete.csstheme.css 的其他一些样式,即可确定您需要手动替换哪些样式。

    您可以使用 bootstrap 的 dropdowns.less 获得灵感。

    这是一个非常适合 Bootstrap 的默认主题的示例 CSS:

    .ui-autocomplete {
        position: absolute;
        z-index: 1000;
        cursor: default;
        padding: 0;
        margin-top: 2px;
        list-style: none;
        background-color: #ffffff;
        border: 1px solid #ccc;
        -webkit-border-radius: 5px;
           -moz-border-radius: 5px;
                border-radius: 5px;
        -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
           -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
                box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    }
    .ui-autocomplete > li {
      padding: 3px 20px;
    }
    .ui-autocomplete > li.ui-state-focus {
      background-color: #DDD;
    }
    .ui-helper-hidden-accessible {
      display: none;
    }
    

    $(function() {
      var availableTags = [
        "ActionScript", "AppleScript", "Asp", "BASIC", "C", "C++",
        "Clojure", "COBOL", "ColdFusion", "Erlang", "Fortran",
        "Groovy", "Haskell", "Java", "JavaScript", "Lisp", "Perl",
        "PHP", "Python", "Ruby", "Scala", "Scheme"
      ];
      
      $(".autocomplete").autocomplete({
        source: availableTags
      });
    });
    .ui-autocomplete {
        position: absolute;
        z-index: 1000;
        cursor: default;
        padding: 0;
        margin-top: 2px;
        list-style: none;
        background-color: #ffffff;
        border: 1px solid #ccc
        -webkit-border-radius: 5px;
           -moz-border-radius: 5px;
                border-radius: 5px;
        -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
           -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
                box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
    }
    .ui-autocomplete > li {
      padding: 3px 20px;
    }
    .ui-autocomplete > li.ui-state-focus {
      background-color: #DDD;
    }
    .ui-helper-hidden-accessible {
      display: none;
    }
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
    
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
    
    <div class="container">
      <div class="form-group ui-widget">
        <label>Languages</label>
        <input class="form-control autocomplete" placeholder="Enter A" />
      </div>
      
      <div class="form-group ui-widget">
        <label >Another Field</label>
        <input class="form-control" />
      </div>
    </div>

    提示:由于每次检查元素时下拉菜单都会隐藏(即输入失去焦点时),为了更容易调试样式,找到带有.ui-autocomplete的控件并删除display: none;.

    【讨论】:

    • 关于 jquery 下拉样式的最佳答案,没有。 +1
    • StackOverflow 上的最佳答案。诺贝尔奖当之无愧
    • 在 jQuery 1.12 中,ui-state-focusis nowui-state-active。将.ui-autocomplete &gt; li.ui-state-focus 更改为.ui-state-active 会在悬停时正确更改背景颜色。
    【解决方案3】:

    我不知道你是否解决了它,但我确实遇到了同样的问题,最后这是一个愚蠢的事情,我有:

    <script src="jquery-ui/jquery-ui.min.css" rel="stylesheet">
    

    但应该是:

    <link href="jquery-ui/jquery-ui.min.css" rel="stylesheet">
    

    只需将&lt;scrip&gt; 更改为&lt;link&gt; 并将src 更改为href

    【讨论】:

    • 虽然这可能是您的特定情况下的问题,但对于 OP 或其他访问此特定问题的人来说,这不太可能是问题。因此,虽然需要注意样式表应该作为样式表添加是件好事——但这可能不保证完整的帖子这样做。仅供参考
    【解决方案4】:

    试试这个 (demo):

    .ui-autocomplete {
      position: absolute;
      top: 100%;
      left: 0;
      z-index: 1000;
      display: none;
      float: left;
      min-width: 160px;
      padding: 5px 0;
      margin: 2px 0 0;
      list-style: none;
      font-size: 14px;
      text-align: left;
      background-color: #ffffff;
      border: 1px solid #cccccc;
      border: 1px solid rgba(0, 0, 0, 0.15);
      border-radius: 4px;
      -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
      box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
      background-clip: padding-box;
    }
    
    .ui-autocomplete > li > div {
      display: block;
      padding: 3px 20px;
      clear: both;
      font-weight: normal;
      line-height: 1.42857143;
      color: #333333;
      white-space: nowrap;
    }
    
    .ui-state-hover,
    .ui-state-active,
    .ui-state-focus {
      text-decoration: none;
      color: #262626;
      background-color: #f5f5f5;
      cursor: pointer;
    }
    
    .ui-helper-hidden-accessible {
      border: 0;
      clip: rect(0 0 0 0);
      height: 1px;
      margin: -1px;
      overflow: hidden;
      padding: 0;
      position: absolute;
      width: 1px;
    }
    

    【讨论】:

    • 简单漂亮 = 谢谢
    【解决方案5】:

    (引导)输入字段和 jquery-ui 自动完成器之间的差距似乎只出现在 jQuery 版本 >= 3.2

    当使用 jQuery 3.1.1 版本时,它似乎不会发生。

    可能的原因是 v3.2.0 中与 .width().height() 的错误修复相关的显着更新。查看 jQuery 发行说明了解更多详情:v3.2.0 / v3.1.1

    使用了 Bootstrap 3.4.1 版和 jquery-ui 1.12.0 版

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签