Saran typeahead.js Twitter tidak ditata (tidak memiliki batas, latar belakang transparan, dll.)


182

Saya menggunakan typeahead.js twitter 0.9.3 dan sepertinya saran saya tidak ditata sama sekali.

Saya mendapatkan ini:

bug typeahead

Alih-alih sesuatu seperti ini: (diambil dari halaman contoh )

ideal untuk mengetik

JavaScript mengaktifkan typeahead:

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

Elemen masukan HTML:

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

Catatan tambahan:

Situs yang saya kerjakan memiliki jQuery 1.10.1 dan tidak menggunakan bootstrap twitter. Ada banyak CSS yang tidak saya tulis dan karena itu saya tidak terbiasa dengan yang saya khawatir mengganggu, namun sepertinya plugin menambahkan gaya sendiri (tidak ada file .css yang menyertainya) jadi seharusnya tidak secara teoritis menimpa hal-hal ? Saya bingung mengapa gaya saya berfungsi, tetapi yang ditambahkan oleh plugin tidak, menghasilkan saran dengan latar belakang transparan, tanpa batas, dll.

Jawaban:


212

Jadi melihat dokumen yang sekarang saya lihat:

Secara default, menu dropdown yang dibuat oleh typeahead.js akan terlihat jelek dan Anda akan ingin mengubahnya agar sesuai dengan tema halaman web Anda.

Solusi saya adalah menyalin gaya dari contoh yang ingin saya tiru:

.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
Untuk beberapa alasan edit yang saya sarankan ditolak, tetapi perhatikan bahwa tt-is-under-cursorkelas sepertinya telah diubah namanya menjadi tt-cursor. Dokumentasi di sini .
Joe Freeman

6
Ada juga yang tt-inputbukan tt-query(seperti untuk 0.10.5)
Filip Spiridonov

7
Bukankah lebih baik memiliki versi lama di komentar?
worldsayshi

3
.tt-dropdown-menu sekarang .tt-menu
bkwdesign

1
Tambahkan cursor: pointer;untuk .tt-is-under-cursormemiliki kursor yang tepat yang memberi tahu pengguna bahwa ia perlu mengklik.
Laurent W.

124

Jadi, gaya berikut akan memberi Anda tampilan & nuansa ini. Ini didasarkan pada CSS yang saya ekstrak dari situs web contoh Typeahead resmi.

masukkan deskripsi gambar di sini

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;
}

Ini mengasumsikan input Anda akan memiliki form-controlkelas. Sebagai contoh saya, ini seperti ini:

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

4
Bekerja untuk saya dengan satu tweak. Muncul .tt-dropdown-menusekarang .tt-menu. Terima kasih atas jawabannya.
groundh0g

33

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

Yang lain tidak tampak hebat, yang ini paling mirip Bootstrap.


1
Bekerja hebat dengan Bootstrap
Jose Cherian

Ini bekerja dengan sempurna tanpa perubahan dalam Rails 4.2 dan bootstrap-sass (3.3.7) autoprefixer-rails (> = 5.2.1) sass (> = 3.3.4) Ini juga sedikit lebih ramah responsif dari beberapa solusi lainnya. Plus itu berarti kotak input Anda dapat menjadi lebar 100% sehingga harus bekerja dengan sebagian besar tata letak.
rmcsharry

Meskipun jika input Anda lebih lebar dari 162 (lebar minimum yang digunakan di sini) maka Anda mungkin ingin menambahkan lebar: 100%; ke bagian pertama untuk tt-menu / tt-dropdown
rmcsharry

19

Typeahead telah mengubah beberapa nama kelas mereka dan contoh di atas sekarang salah.

Misalnya:

  • Alih-alih .tt-suggestion.tt-is-under-cursor digunakan.tt-suggestion:hover
  • Alih-alih .tt-dropdown-menu, gunakan.tt-menu

Jika Anda ingin meminjam style dari halaman contoh , Anda dapat melihat stylesheet mereka di sini :

.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;
}

Ini Demo di Stack Snippets


2
Apakah mungkin untuk mencegah typeahead membuat lebar jadi kecil?
Rune Jeppesen

13

Ini adalah kode yang berfungsi untuk saya:

.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
Solusi ini berfungsi berapa pun lebar input. Terima kasih!
Spaceuitdiver

Bekerja sempurna untuk saya dengan typeahead.js + BS3 + datatable di layar yang sama. Terima kasih
Mike Castro Demaria

3

Karena saya memiliki lingkungan yang kurang dengan BS3 termasuk saya mengambil kode css Zugwalt (menempatkannya dalam hierarki yang lebih mudah dibaca) dan mengisinya dengan styling dari menu drop-down bs3. Ini hanya mengikuti variabel (khusus) Anda.

    .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

Berikut adalah scssversi yang bergantung pada variabel / deklarasi bootstrap sebanyak mungkin. Sayangnya Anda tidak dapat memperpanjang pemilih bersarang dalam sass, jika tidak akan lebih kecil:

@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

Jika Anda menggunakan Bootstrap 4, cukup lakukan ini:

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

Dalam kasus khusus saya, positioning absolut menyelesaikannya. Penentuan posisi relatif menekan elemen bootstrap lainnya ketika daftar saran (tt-menu) terbuka.

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

Anda dapat menambahkan ini ke jawaban di atas https://stackoverflow.com/a/26934329/1225421

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.