bagaimana cara membuat submenu bootstrap twitter terbuka di sisi kiri?

93

Saya mencoba membuat submenu bootstrap twitter di menu dropdown, tetapi saya mendapat masalah: Saya memiliki menu dropdown di sudut kanan atas halaman dan menu itu memiliki satu submenu lagi. Namun, saat submenu terbuka - submenu tidak muat di jendela dan terlalu banyak ke kanan, sehingga pengguna hanya dapat melihat huruf pertama. Bagaimana cara membuat submenu itu terbuka bukan ke kanan, tapi ke kiri?

kovpack
sumber
6
Posting kode cuplikan.
Shankar Cabus
2
Dalam Bootstrap 4, tambahkan .pull-rightpada .dropdownwadah.
jbyrd

Jawaban:

109

Cara termudah adalah dengan menambahkan pull-leftkelas kedropdown-submenu

<li class="dropdown-submenu pull-left">

jsfiddle: DEMO

Schmalzy
sumber
Jawaban ini bersama dengan jawaban Matt untuk di tingkat UL adalah cara yang benar untuk mengimplementasikan ini saat menggunakan bootstrap.
KeyOfJ
1
Pertanyaan OP dan jawaban saya adalah dari agustus 2012. Sementara itu, Bootstrap diubah, jadi sekarang Anda memiliki kelas .pull-left. Saat itu, jawaban saya benar. Sekarang Anda tidak perlu menyetel css secara manual, Anda memiliki kelas .pull-left itu.
Miljan Puzović
1
Ini berfungsi dengan baik untuk beberapa kasus, tetapi rusak jika item di menu utama terlalu panjang, seperti di biola ini: jsfiddle.net/szx4Y/446 Ada yang punya ide cepat untuk memperbaikinya?
Aaron Lifshin
2
@AaronLifshin .dropdown-submenu.pull-left>.dropdown-menu { width: 100%; } Bukan solusi yang elegan, tetapi tampaknya berhasil jsfiddle.net/r1v90tas
Schmalzy
1
@Schmalzy melihatnya lebih jauh, width: 100% menyebabkan masalah yang berbeda dengan item yang panjang di submenu jsfiddle.net/r1v90tas/1 dan itu diperbaiki dengan menggunakan min-width: 100%, seperti di sini: jsfiddle.net/ r1v90tas / 2
Aaron Lifshin
118

Jika saya memahami hak ini, bootstrap menyediakan kelas CSS hanya untuk kasus ini. Tambahkan 'pull-right' ke menu 'ul':

<ul class="dropdown-menu pull-right">

..dan hasil akhirnya adalah bahwa opsi menu muncul rata kanan, sejalan dengan tombol drop-down.

Matt
sumber
2
Tambahan yang bagus, Matt di level UL.
KeyOfJ
3
Tentu saja, saya membutuhkan menu utama, bukan submenu untuk pindah. jadi saya perlu menargetkan elemen <ul>. itu membingungkan karena Anda ingin memindahkannya ke kiri, bagaimanapun Anda menggunakan pull-rightkelas untuk mencapai ini.
FireDragon
1
Jawaban ini valid untuk Bootstrap 3.x, jadi, sepertinya itu yang paling benar saat ini.
alx
1
Jawaban yang diterima tidak berfungsi untuk saya dan Bootstrap 3, tetapi yang ini berhasil!
Josh Bilderback
1
Ini benar. tambahkan .pull-right dan dropdown Anda tidak akan pergi dari sisi kanan layar!
slindsey3000
26

Kelas saat ini .dropdown-submenu > .dropdown-menumemiliki left: 100%;. Jadi, jika Anda ingin membuka submenu di sisi kiri, ganti pengaturan tersebut ke posisi kiri negatif. Sebagai contohleft: -95%; . Sekarang Anda akan mendapatkan submenu di sisi kiri, dan Anda dapat mengubah pengaturan lain untuk mendapatkan pratinjau yang sempurna.

Disini adalah DEMO

EDIT: Pertanyaan OP dan jawaban saya adalah dari Agustus 2012. Sementara itu, Bootstrap berubah, jadi sekarang Anda memiliki kelas .pull-left. Saat itu, jawaban saya benar. Sekarang Anda tidak perlu menyetel css secara manual, Anda memiliki kelas .pull-left itu.

EDIT 2: Demo tidak berfungsi, karena Bootstrap mengubah URL-nya. Ubah saja sumber daya eksternal di jsfiddle dan ganti dengan yang baru.

Miljan Puzović
sumber
Terima kasih. Hampir persis seperti yang saya butuhkan, bagaimanapun, harus ada left: -90%;(cara lain saya tidak bisa memindahkan mouse saya ke submenu itu, karena itu menghilang).
kovpack
Seperti saya katakan, itu hanya ide apa yang perlu Anda lakukan. Senang saya dibantu :)
Miljan Puzović
Contoh Anda hanya berfungsi untuk kasus-kasus tertentu. Lihat di sini: jsfiddle.net/mQnv2/305
Alexandru R
Ini bukan jawaban yang benar karena kelas bootstrap harus digunakan seperti yang disebutkan dalam posting Schmalzy dan Matt.
KeyOfJ
1
Posting ini satu tahun lebih tua. Sementara itu, bootstrap diubah agar jawaban Schmalzy lebih elegan. Saat itu, Bootstrap tidak memiliki kelas tarik kiri.
Miljan Puzović
20

Jika Anda menggunakan bootstrap v4, ada cara baru untuk melakukannya.

Anda harus menggunakan .dropdown-menu-rightpada .dropdown-menuelemen.

<div class="btn-group">
  <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    Right-aligned menu
  </button>
  <div class="dropdown-menu dropdown-menu-right">
    <button class="dropdown-item" type="button">Action</button>
    <button class="dropdown-item" type="button">Another action</button>
    <button class="dropdown-item" type="button">Something else here</button>
  </div>
</div>

Tautan ke kode: https://getbootstrap.com/docs/4.0/components/dropdowns/#menu-items

Felipe Miosso
sumber
Ini juga berfungsi untuk versi boostrap> = 3.1 ... periksa stackoverflow.com/a/19253730/3354228
The.Bear
1
pasti jawaban termudah
crodev
Ini agak benar untuk versi 4. Sintaksnya telah berubah menjadi dropleftdan droprighttetapi konteks jawabannya benar. Terima kasih!
cfnerd
12

Cara yang benar untuk melakukan tugas tersebut adalah:

/* Submenu placement itself */
.dropdown-submenu > .dropdown-menu { left: auto; right: 100%; }
/* Arrow position */
.dropdown-submenu { position: relative; }
.dropdown-submenu > a:after { position: absolute; left: 7px; top: 3px; float: none; border-right-color: #cccccc; border-width: 5px 5px 5px 0; }
.dropdown-submenu:hover > a:after { border-right-color: #ffffff; }
Ruslan Sukhar
sumber
Lebih dari preferensi .dropdown-submenu { position: relative; text-align:right; }Untuk memposisikan teks ke kanan saat panah ke kiri.
Arvind
4

Saya telah membuat fungsi javascript yang terlihat jika dia memiliki cukup ruang di sisi kanan. Jika sudah, dia akan menampilkannya di sisi kanan, kalau tidak dia akan menampilkannya di sisi kiri

Diuji di:

  • Firefox (mac)
  • Chorme (mac)
  • Safari (mac)

Javascript:

$(document).ready(function(){
    //little fix for the poisition.
    var newPos     = $(".fixed-menuprofile .dropdown-submenu").offset().left - $(this).width();
    $(".fixed-menuprofile .dropdown-submenu").find('ul').offset({ "left": newPos });

    $(".fixed-menu .dropdown-submenu").mouseover(function() {
        var submenuPos = $(this).offset().left + 325;
        var windowPos  = $(window).width();
        var oldPos     = $(this).offset().left + $(this).width();
        var newPos     = $(this).offset().left - $(this).width();

        if( submenuPos > windowPos ){
            $(this).find('ul').offset({ "left": newPos });
        } else {
            $(this).find('ul').offset({ "left": oldPos });
        }
    });
});

karena saya tidak ingin menambahkan perbaikan ini pada setiap item menu yang saya buat kelas baru di atasnya. tempatkan menu tetap di ul:

<ul class="dropdown-menu fixed-menu">

Saya harap ini berhasil untuk Anda.

ps. bug kecil di safari dan chrome, hover pertama akan menempatkannya ke mutch ke kiri akan memperbarui posting ini jika saya memperbaikinya.

Mitchel Verschoof
sumber
+1: Saya membuat beberapa perubahan, tetapi ini mengarahkan saya ke solusi yang berfungsi.
zimdanen
Solusi luar biasa!
arefin2k
4

Jika Anda hanya memiliki satu tingkat dan Anda menggunakan bootstrap 3 add pull-rightke ulelemen

<ul class="dropdown-menu pull-right" role="menu">
Mauro
sumber
2

Sebenarnya - jika Anda baik-baik saja dengan mengapung dropdownpembungkusnya - saya merasa itu semudah menambahkan navbar-rightkedropdown .

Ini sepertinya curang, karena tidak ada di bilah navigasi, tetapi berfungsi dengan baik untuk saya.

<div class="dropdown navbar-right">
...
</div>

Anda kemudian dapat menyesuaikan floating lebih lanjut dengan pull-leftlangsung di dropdown...

<div class="dropdown pull-left navbar-right">
...
</div>

... atau sebagai pembungkus di sekitarnya ...

<div class="pull-left">
  <div class="dropdown navbar-right">
  ...
  </div>
</div>
zeroasterisk
sumber
1

Jika Anda menggunakan LESS CSS, saya menulis sedikit mixin untuk memindahkan dropdown dengan panah penghubung:

.dropdown-menu-shift( @num-pixels, @arrow-position: 10px ) {  // mixin to shift the dropdown menu
    left: @num-pixels;
    &:before { left: -@num-pixels + @arrow-position; }        // triangle outline
    &:after  { left: -@num-pixels + @arrow-position + 1px; }  // triangle internal
}

Kemudian untuk memindahkan a .dropdown-menudengan id dropdown-menu-xmisalnya, Anda dapat melakukan:

#dropdown-menu-x {
    .dropdown-menu-shift( -100px );
}
isapir
sumber
1

Saya telah membuat fungsi javascript yang terlihat jika dia memiliki cukup ruang di sisi kanan. Jika sudah, dia akan menampilkannya di sisi kanan, kalau tidak dia akan menampilkannya di sisi kiri. Sekali lagi jika memiliki cukup ruang di sisi kanan, itu akan menunjukkan sisi kanan. itu adalah lingkaran ...

$(document).ready(function () {

$('body, html').css('overflow', 'hidden');
var screenWidth = $(window).width();
$('body, html').css('overflow', 'visible');

if (screenWidth > 767) {

    $(".dropdown-submenu").hover(function () {

        var dropdownPosition = $(this).offset().left + $(this).width() + $(this).find('ul').width();
        var newPosition = $(this).offset().left - $(this).find('ul').width();
        var windowPosition = $(window).width();

        var oldPosition = $(this).offset().left + $(this).width();
        //document.title = dropdownPosition;
        if (dropdownPosition > windowPosition) {
            $(this).find('ul').offset({ "left": newPosition });
        } else {
            $(this).find('ul').offset({ "left": oldPosition });
        }
    });

}

});

SUAT SUPHI
sumber
berhasil! Tapi mari kita batasi: var newPosition = Math.max (10, ...);
djdance
0

Apakah Anda menggunakan bootstrap versi terbaru? Saya telah mengadaptasi html dari contoh Fluid Layout seperti yang ditunjukkan di bawah ini. Saya menambahkan drop down dan meletakkannya terjauh ke sisi kanan dengan menambahkan pull-rightkelas. Saat mengarahkan kursor ke menu drop-down, maka secara otomatis ditarik ke kiri dan tidak ada yang disembunyikan - semua teks menu terlihat. Saya belum pernah menggunakan css khusus.

<div class="navbar navbar-inverse navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <a class="brand" href="#">Project name</a>
      <div class="nav-collapse collapse">
        <ul class="nav pull-right">
          <li class="active"><a href="#">Home</a></li>
          <li><a href="#about">About</a></li>
          <li><a href="#contact">Contact</a></li>
          <li class="dropdown open">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
            <ul class="dropdown-menu">
              <li><a href="#">Action</a></li>
              <li><a href="#">Another action</a></li>
              <li><a href="#">Something else here</a></li>
              <li class="divider"></li>
              <li class="nav-header">Nav header</li>
              <li><a href="#">Separated link</a></li>
              <li><a href="#">One more separated link</a></li>
            </ul>
          </li>
        </ul>
        <p class="navbar-text pull-right">
          Logged in as <a href="#" class="navbar-link">Username</a>
        </p>
      </div><!--/.nav-collapse -->
    </div>
  </div>
</div>
Nick
sumber
Ini bukan yang saya butuhkan. Ini hanya dropdown (saya juga menggunakan pull-right atau pull-left). Tetapi saya perlu membuka submenu DI SUBMENU dan membuatnya terbuka ke kiri (di dropdown harus ada panah yang menunjukkan keberadaan submenu yang harus terbuka ke kiri, tetapi tidak ke kanan, seperti yang dilakukan standar).
kovpack
0

Satu-satunya hal yang harus Anda lakukan adalah

 <ul style='left:-100%'> 

dari menu yang ingin Anda tampilkan di sisi KANAN.

Manoj Jain
sumber