Les suggestions typeahead.js de Twitter ne sont pas stylisées (sans bordure, arrière-plan transparent, etc.)


182

J'utilise Twitter de typeahead.js 0.9.3 et il semble que mes suggestions ne sont pas de style du tout.

J'obtiens ceci:

bogue typeahead

Au lieu de quelque chose comme ceci: (tiré de la page d'exemples )

typehead idéal

JavaScript activant la tête de frappe:

$('.search-typeahead').typeahead({
    name: 'videos',
    remote: {
        url: '/api/v1/internal/videos/typeahead?text=%QUERY'
    }
});

Élément d'entrée HTML:

<input type="text" value="" id="search_keywords" class="no-clear search-typeahead"/>

Notes complémentaires:

Le site sur lequel je travaille a jQuery 1.10.1 et n'utilise pas le bootstrap Twitter. Il y a un tas de CSS que je n'ai pas écrit et que je ne connais donc pas et que je crains d'interférer, mais il semble que le plugin ajoute ses propres styles (il n'y a pas de fichier .css qui l'accompagne) donc il ne devrait pas théoriquement remplacer les choses ? Je ne comprends pas pourquoi mes styles fonctionnent, mais ceux ajoutés par le plugin ne le font pas, ce qui entraîne des suggestions avec des arrière-plans transparents, sans bordures, etc.

Réponses:


212

Donc, en regardant dans les documents, je vois maintenant:

Par défaut, le menu déroulant créé par typeahead.js aura l'air moche et vous voudrez le styliser pour vous assurer qu'il s'intègre dans le thème de votre page Web.

Ma solution a donc été de copier le style de l'exemple que je souhaitais reproduire:

.tt-query, /* UPDATE: newer versions use tt-input instead of tt-query */
.tt-hint {
    width: 396px;
    height: 30px;
    padding: 8px 12px;
    font-size: 24px;
    line-height: 30px;
    border: 2px solid #ccc;
    border-radius: 8px;
    outline: none;
}

.tt-query { /* UPDATE: newer versions use tt-input instead of tt-query */
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}

.tt-hint {
    color: #999;
}

.tt-menu { /* UPDATE: newer versions use tt-menu instead of tt-dropdown-menu */
    width: 422px;
    margin-top: 12px;
    padding: 8px 0;
    background-color: #fff;
    border: 1px solid #ccc;
    border: 1px solid rgba(0, 0, 0, 0.2);
    border-radius: 8px;
    box-shadow: 0 5px 10px rgba(0,0,0,.2);
}

.tt-suggestion {
    padding: 3px 20px;
    font-size: 18px;
    line-height: 24px;
}

.tt-suggestion.tt-is-under-cursor { /* UPDATE: newer versions use .tt-suggestion.tt-cursor */
    color: #fff;
    background-color: #0097cf;

}

.tt-suggestion p {
    margin: 0;
}

19
Pour une raison quelconque, ma modification suggérée a été rejetée, mais notez que la tt-is-under-cursorclasse semble avoir été renommée tt-cursor. Documentation ici .
Joe Freeman

6
Il y a aussi un tt-inputau lieu du tt-query(comme pour 0.10.5)
Filip Spiridonov

7
Ne serait-il pas préférable d'avoir les anciennes versions dans les commentaires?
worldsayshi

3
.tt-dropdown-menu est maintenant .tt-menu
bkwdesign

1
Ajoutez cursor: pointer;à .tt-is-under-cursorpour avoir un curseur approprié qui indique à l'utilisateur qu'il doit cliquer.
Laurent W.

124

Ainsi, les styles suivants vous donneront ce look & feel. Il est basé sur le CSS que j'ai extrait du site Web officiel d'exemples Typeahead.

entrez la description de l'image ici

CSS:

.tt-query {
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}

.tt-hint {
  color: #999
}

.tt-menu {    /* used to be tt-dropdown-menu in older versions */
  width: 422px;
  margin-top: 4px;
  padding: 4px 0;
  background-color: #fff;
  border: 1px solid #ccc;
  border: 1px solid rgba(0, 0, 0, 0.2);
  -webkit-border-radius: 4px;
     -moz-border-radius: 4px;
          border-radius: 4px;
  -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
     -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
          box-shadow: 0 5px 10px rgba(0,0,0,.2);
}

.tt-suggestion {
  padding: 3px 20px;
  line-height: 24px;
}

.tt-suggestion.tt-cursor,.tt-suggestion:hover {
  color: #fff;
  background-color: #0097cf;

}

.tt-suggestion p {
  margin: 0;
}

Cela suppose que votre entrée aura la form-controlclasse. Pour mon exemple, c'est comme ça:

<input class="typeahead form-control" type="text" placeholder="States of USA">

4
A travaillé pour moi avec un tweak. Apparaît .tt-dropdown-menuest maintenant .tt-menu. Merci de répondre.
groundh0g

33

https://github.com/bassjobsen/typeahead.js-bootstrap-css/blob/master/typeaheadjs.css

Les autres n'avaient pas l'air super, celui-ci ressemble le plus à Bootstrap.


1
Fonctionne très bien avec Bootstrap
Jose Cherian

Cela a parfaitement fonctionné sans changement dans Rails 4.2 et bootstrap-sass (3.3.7) autoprefixer-rails (> = 5.2.1) sass (> = 3.3.4) C'est aussi un peu plus réactif que certaines des autres solutions. De plus, cela signifie que votre zone de saisie peut avoir une largeur de 100% et devrait donc fonctionner avec la plupart des mises en page.
rmcsharry

Bien que si votre entrée soit plus large que 162 (la largeur minimale utilisée ici), vous voudrez peut-être également ajouter une largeur: 100%; à la première section pour le tt-menu / tt-dropdown
rmcsharry

19

Typeahead a changé certains de leurs noms de classe et les exemples ci-dessus sont maintenant incorrects.

Par exemple:

  • Au lieu d' .tt-suggestion.tt-is-under-cursor utiliser.tt-suggestion:hover
  • Au lieu de .tt-dropdown-menu, utilisez.tt-menu

Si vous souhaitez emprunter le style de la page d'exemples , vous pouvez voir leur feuille de style ici :

.typeahead,
.tt-query,
.tt-hint {
  width: 396px;
  height: 30px;
  padding: 8px 12px;
  font-size: 24px;
  line-height: 30px;
  border: 2px solid #ccc;
  -webkit-border-radius: 8px;
     -moz-border-radius: 8px;
          border-radius: 8px;
  outline: none;
}

.typeahead {
  background-color: #fff;
}

.typeahead:focus {
  border: 2px solid #0097cf;
}

.tt-query {
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}

.tt-hint {
  color: #999
}

.tt-menu {
  width: 422px;
  margin: 12px 0;
  padding: 8px 0;
  background-color: #fff;
  border: 1px solid #ccc;
  border: 1px solid rgba(0, 0, 0, 0.2);
  -webkit-border-radius: 8px;
     -moz-border-radius: 8px;
          border-radius: 8px;
  -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
     -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
          box-shadow: 0 5px 10px rgba(0,0,0,.2);
}

.tt-suggestion {
  padding: 3px 20px;
  font-size: 18px;
  line-height: 24px;
}

.tt-suggestion:hover {
  cursor: pointer;
  color: #fff;
  background-color: #0097cf;
}

.tt-suggestion.tt-cursor {
  color: #fff;
  background-color: #0097cf;

}

.tt-suggestion p {
  margin: 0;
}

Voici une démo dans Stack Snippets


2
Est-il possible d'empêcher la tête de frappe de rendre la largeur si petite?
Rune Jeppesen

13

C'est le code qui fonctionne pour moi:

.twitter-typeahead .tt-query,
.twitter-typeahead .tt-hint {
    margin-bottom: 0;
}
.tt-hint {
    display: block;
    width: 100%;
    padding: 8px 12px;
    font-size: 14px;
    line-height: 1.428571429;
    color: #999;
    vertical-align: middle;
    background-color: #ffffff;
    border: 1px solid #cccccc;
    border-radius: 4px;
    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
    -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
}
.tt-dropdown-menu {
    min-width: 160px;
    margin-top: 2px;
    padding: 5px 0;
    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;

}
.tt-suggestion {
    display: block;
    padding: 3px 20px;
}
.tt-suggestion.tt-is-under-cursor {
    color: #fff;
    background-color: #dfdfdf;
}
.tt-suggestion.tt-is-under-cursor a {
    color: #fff;
}
.tt-suggestion p {
    margin: 0;
}

1
Cette solution fonctionne quelle que soit la largeur de l'entrée. Merci!
Spaceuitdiver

Fonctionne parfaitement pour moi avec typeahead.js + BS3 + datatable sur le même écran. Merci
Mike Castro Demaria

3

Depuis que j'ai un environnement moins avec BS3 inclus, j'ai pris le code CSS Zugwalt (je l'ai placé dans une hiérarchie plus lisible) et l'ai rempli avec le style du menu déroulant de bs3. Il s'agit simplement de suivre vos variables (personnalisées).

    .twitter-typeahead {
      display: block;
      width: 100%; //BS 3 needs this to inherit this for children

      .tt-query,
      .tt-hint {
        margin-bottom: 0;
      }

      .tt-dropdown-menu {
        z-index: @zindex-dropdown;
        min-width: 326px;
        padding: 5px 0;
        margin: 2px 0 0; // override default ul
        font-size: @font-size-base;
        text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
        background-color: @dropdown-bg;
        border: 1px solid @dropdown-fallback-border; // IE8 fallback
        border: 1px solid @dropdown-border;
        border-radius: @border-radius-base;
        .box-shadow(0 6px 12px rgba(0, 0, 0, .175));
        background-clip: padding-box;

        .tt-suggestions {

          .tt-suggestion {
            padding: 3px 12px;
            font-weight: normal;
            line-height: @line-height-base;
            color: @dropdown-link-color;
            white-space: nowrap; // prevent links from randomly breaking onto new lines
          }

          .tt-suggestion.tt-cursor {
            color: @dropdown-link-hover-color;
            background-color: @dropdown-link-hover-bg;
          }

          .tt-suggestion p {
            margin: 0;
          }
        }
      }
    }

1

Voici une scssversion qui s'appuie autant que possible sur les variables / déclarations de bootstrap. Malheureusement, vous ne pouvez pas étendre les sélecteurs imbriqués dans sass, sinon il serait plus petit:

@mixin typeahead-active() {
  // mimics  @extend .dropdown-menu > .active > a;
  color: $dropdown-link-active-color;
  text-decoration: none;
  outline: 0;
  background-color: $dropdown-link-active-bg;
}

//https://github.com/corejavascript/typeahead.js/blob/master/doc/jquery_typeahead.md#class-names
span.twitter-typeahead {

  // this is the suggested matches dropdown
  .tt-menu {
    @extend .dropdown-menu;
  }

  .tt-hint {
    color: #999
  }

  // Added to suggestion elements.
  .tt-suggestion {

    // mimic .dropdown-menu > li > a
    padding: 3px 20px;
    line-height: $line-height-base;

    // Added to suggestion element when menu cursor moves to said suggestion.
    &.tt-cursor {
      @include typeahead-active;
    }

    // Hover/focus on suggestion
    &:hover,
    &:focus {
      @include typeahead-active;
    }

    p {
      margin: 0;
    }
  }

  .input-group & {
    display: block !important;
    .tt-dropdown-menu {
      top: 32px !important;
    }
  }
  .input-group.input-group-lg & {
    .tt-dropdown-menu {
      top: 44px !important;
    }
  }
  .input-group.input-group-sm & {
    .tt-dropdown-menu {
      top: 28px !important;
    }
  }
}

1

Si vous utilisez Bootstrap 4, il suffit de le faire:

span.twitter-typeahead
  width: 100%

.tt-input
  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075)

.tt-menu
  @extend .list-group
  box-shadow: 0 5px 10px rgba(0,0,0,.2)
  width: 100%

.tt-suggestion
  @extend .list-group-item

.tt-selectable
  @extend .list-group-item-action

0

Dans mon cas particulier, le positionnement absolu l'a résolu. Le positionnement relatif poussait vers le bas d'autres éléments de bootstrap lorsque la liste de suggestions (tt-menu) était ouverte.

.tt-menu { 
    z-index: 2147483647;
    position: absolute;    
}

Vous pouvez ajouter ceci à la réponse ci-dessus https://stackoverflow.com/a/26934329/1225421

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.