Thanh bên Mở theo mặc định trên máy tính để bàn, Đóng trên thiết bị di động


9

Tôi đang gặp một số rắc rối thực sự khi cố gắng để nội dung thanh bên / điều hướng (sử dụng Bootstrap) hiển thị (được mở rộng) theo mặc định trên máy tính để bàn và đóng theo mặc định trên thiết bị di động và có biểu tượng chỉ hiển thị trên thiết bị di động. Tôi dường như không thể làm cho điều này để làm việc.

<nav class="menu menu-open" id="theMenu">
      <div class="menu-wrap">
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
          <i class="fa fa-bars menu-close d-lg-none" id="menu-toggle"></i>
            </button>
          <div id="menu-logo">
            <img src="Final_Logo.png" width="210" height="214" alt="">
          </div>
          <div id="navbarToggleExternalContent">
          <ul id="main-menu">
              <a href="#">Home</a>
              <a href="#">About</a>
              <a href="#">Writing</a>
              <a href="#">Events</a>
              <a href="#">Speaking</a>
              <a href="#">Music</a>
          </ul>
          <ul id="social-icons">
              <li class="facebook"><a href="#"><i class="fab fa-facebook fa-2x"></i></a></li>
              <li class="twitter"><a href="#"><i class="fab fa-twitter fa-2x"></i></a></li>
              <li class="instagram"><a href="#"><i class="fab fa-instagram fa-2x"></i></a></li>
          </ul>
        </div>
      </div>
  </nav>

Tôi đã thử sử dụng mã javascript này nhưng không có kết quả:

 $('.menu-close').on('click', function(){
    $('#menuToggle').toggleClass('active');
    $('body').toggleClass('body-push-toright');
    $('#theMenu').toggleClass('menu-open');
    alert("Test");
    });

Hey, tôi đã thêm nhận xét về câu hỏi của bạn với giải pháp chính xác. Đã tạo codepen cho bạn để bạn có thể kiểm tra mã và đầu ra. Xin hãy xem
Priyanka

Bạn có CSS ​​khác không?
Codeply-er

Thêm classvà tạo kiểu đơn giản theo truy vấn phương tiệnwidth:600
Awais

Câu trả lời:



1

Bạn có thể sử dụng CSS Media Query để ẩn / hiển thị nội dung ở các chế độ xem / thiết bị khác nhau.


0

Đây là liên kết những gì bạn cần một cách chính xác. Tôi đã tạo ra bút cho bạn. Xin vui lòng xem liên kết dưới đây.

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<nav class="navbar navbar-expand-lg navbar-light bg-light" id="theMenu">
  <a class="navbar-brand" id="menu-logo">
            <img src="Final_Logo.png" width="210" height="214" alt="">
          </a>      
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
          <ul class="navbar-nav mr-auto" id="main-menu">
            <li class="nav-item"><a class="nav-link" href="#">Home</a></li>
            <li class="nav-item"><a class="nav-link" href="#">About</a></li>
            <li class="nav-item"><a class="nav-link" href="#">Writing</a></li>
            <li class="nav-item"><a class="nav-link" href="#">Events</a></li>
            <li class="nav-item"><a class="nav-link" href="#">Speaking</a></li>
            <li class="nav-item"><a class="nav-link" href="#">Music</a></li>
            <li class="facebook"><a href="#"><i class="fab fa-facebook fa-2x"></i></a></li>
              <li class="twitter"><a href="#"><i class="fab fa-twitter fa-2x"></i></a></li>
              <li class="instagram"><a href="#"><i class="fab fa-instagram fa-2x"></i></a></li>
          </ul>
  </div>
  </nav>

https://codepen.io/pgurav/pen/abbQZJL


0

Tôi đã tạo một ví dụ cho bạn, dựa trên tài liệu bs4 liên quan đến nội dung bên ngoài.

<div class="pos-f-t">
  <div class="collapse" id="navbarToggleExternalContent">
    <div class="bg-dark p-4">
      <h5 class="text-white h4">Collapsed content</h5>
      <span class="text-muted">Toggleable via the navbar brand.</span>
    </div>
  </div>
  <nav class="navbar navbar-dark bg-dark navbar-expand-lg">
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggleExternalContent" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
  </nav>
</div>

Trong ví dụ này, mã sụp đổ từ đầu - thay vì bên phải. Thật ra tôi đang nghỉ phép và sẽ cố gắng hoàn thành ví dụ để phù hợp với nhu cầu của bạn.

JavaScript bổ sung:

var externalContent = $('#navbarToggleExternalContent'),
    execOnResize = function(){
// also the next line was only for use in jsfiddle
// in the real world you need to use window.outerWidth
// 992 pixel is the width of breakpoint corresponding to the class "navbar-expand-lg". Feel free to adapt it to fit your needs.
    if(window.innerWidth >= 992){
        externalContent.addClass('show');
    }else{
        externalContent.removeClass('show');
    }
};
// the next line was only addded for jsfiddle       
execOnResize();

window.onresize = function(event) {
    execOnResize();
};

window.addEventListener('load', function() {
    execOnResize();
})

Tôi cũng đã tạo một fiddle fiddle Để xem nó hoạt động, vui lòng thay đổi kích thước cửa sổ bên trong trong jsfiddle


0

Mã Javascript hiện tại của bạn sẽ luôn chạy, bất kể thiết bị. Những gì bạn cần là một cách để kiểm tra xem thiết bị là máy tính hay điện thoại di động.

Một cách sẽ là sử dụng trình duyệt UserAgent:

$('.menu-close').on('click', function(){
    if(navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/)) {
        //mobile
        $('#menuToggle').toggleClass('active');
        $('body').toggleClass('body-push-toright');
        $('#theMenu').toggleClass('menu-open');
        alert("Test");
    }
});

Hoặc, bạn chỉ có thể dựa vào chiều rộng của cửa sổ (nhưng các cửa sổ nhỏ trên màn hình sẽ được coi như phiên bản di động):

if(window.innerWidth <= 767) { // a certain threshold value, in pixels
    //mobile
    //do something
}

Đánh hơi chuỗi User Agent dẫn đến mã khó duy trì. Truy vấn phương tiện truyền thông tốt hơn nhiều.
bộ

"Khó duy trì" về một chuỗi là gì? Dù sao, bạn có thể bọc kiểm tra này trong một hàm, để bất cứ khi nào bạn cần cập nhật chuỗi, bạn chỉ có một dòng mã để chỉnh sửa.
Anis R.

Ngoài ra, bạn không thể sử dụng các truy vấn phương tiện CSS để chuyển đổi tên lớp như OP muốn
Anis R.

Chuỗi tác nhân người dùng của thiết bị thay đổi theo thời gian khi các thiết bị mới được sản xuất. Điều đó dẫn đến mã bị hỏng mỗi khi một thiết bị mới được giới thiệu. Chắc chắn, bạn có thể gói nó trong một chức năng, nhưng nó vẫn yêu cầu bạn thay đổi nó bất cứ khi nào một thiết bị mới được giới thiệu. Tốt hơn là nhắm mục tiêu các thiết bị theo kích thước của chúng (sử dụng truy vấn phương tiện CSS), chứ không phải chuỗi tác nhân người dùng. Không có cập nhật được yêu cầu khi một thiết bị mới được giới thiệu. OP không nhất thiết muốn chuyển tên lớp; đó là nỗ lực tốt nhất của họ tại một giải pháp và là một giải pháp mà tôi tin là kém hơn các truy vấn truyền thông.
bộ

0

Đầu tiên chỉ là một vài điểm:

  1. Bạn đã nói sidebar, nhưng đánh dấu của bạn không thực sự giống như một sidebar đối với tôi, nó trông giống như một topnav đáp ứng. Tôi sẽ cố gắng hiểu ý nghĩa của nó một cách tốt nhất có thể, và tôi cũng sẽ chứng minh một thanh bên hoạt động tốt, trong trường hợp đó là những gì bạn thực sự muốn.

  2. Các mục menu của bạn nằm trong một <ul>(danh sách không có thứ tự) mà không có bất kỳ <li>(danh sách các mục). Các bootrap js / css có thể cần <li>s để hoạt động chính xác. Về mặt kỹ thuật, <ul>không có bất kỳ <li>html nào là hợp lệ, nhưng nội dung duy nhất được phép trong a <ul><li>các neo (hoặc bất cứ thứ gì khác) bên trong a <ul>phải được chứa trong <li>s để hợp lệ.

  3. Tôi không chắc chính xác những gì bạn đang cố gắng làm với các biểu tượng xã hội vì vậy tôi chỉ điều chỉnh chúng một chút theo cách có vẻ hợp lý.

  4. Tôi đã thêm overflow-y: scroll;vào <html>phần tử để khi bạn mở menu trên màn hình nhỏ, nó sẽ không bị dịch chuyển nếu thanh cuộn được thêm vào. Có thể không cần thiết tùy thuộc vào thiết kế trang web và bố cục nội dung của bạn.


Vì vậy, hãy bắt đầu với một menu đáp ứng rất cơ bản.

Menu đáp ứng cơ bản Bootstrap


Được rồi, có vẻ ổn, nhưng bạn đã có một hình ảnh trong menu. Vì vậy, tôi sẽ đặt một hình ảnh trong menu và cung cấp cho nó một chút css để tạo kiểu cho nó. Sau đó, với hình ảnh, chúng ta sẽ cần thêm một chút CSS để định vị các thành phần menu:

  1. Đặt nút hamburger sao cho nó nằm ở dưới cùng của thanh điều hướng. Tôi sẽ sử dụng 200px của hình ảnh và trừ một vài rem. Bạn có thể thay đổi top: calc(100px - 1rem);để top: 1rem;đưa bánh hamburger trên đầu, hoặc bottom: 1rem;nếu bạn muốn chiếc bánh hamburger để dính vào đáy của nav ngay cả khi mở ra. Hoặc chỉ cần xóa toàn bộ quy tắc đó để sử dụng mặc định bootstrap sẽ đặt hamburger ở giữa dọc.

  2. Định vị các mục menu cũng nằm ở dưới cùng của thanh menu khi không được thu gọn.

  3. định vị các biểu tượng xã hội ở phía dưới nhưng cũng đẩy chúng sang phía bên tay phải.

  4. Các số 2 & 3 ở trên chỉ nên áp dụng trên điểm dừng trung bình khi menu không bị thu gọn vì vậy tôi sẽ đặt chúng vào truy vấn phương tiện để nhắm mục tiêu trên 768px (điểm dừng trung bình của bootstrap). Điều này cũng có thể được thực hiện với các mixins breakpoint bootassps sass, nhưng chúng ta sẽ chỉ sử dụng css đơn giản ở đây. Bạn có thể thấy vị trí của các thành phần này trong quy tắc truy vấn @media trong css, nơi bạn có thể thay đổi nó để đẩy chúng lên đầu thanh. Hoặc chỉ cần loại bỏ các quy tắc đó để hoàn nguyên về mặc định bootstrap, theo chiều dọc trung tâm các thành phần menu và đặt các biểu tượng xã hội bên dưới chúng. Bạn cũng có thể đặt các biểu tượng xã hội vào <li>các thành phần trong menu <ul>nếu bạn chỉ muốn các biểu tượng rơi ngay vào menu như các mục menu khác.

với hình ảnh trong menu


Được rồi, nhưng bạn nói đó là một thanh bên. Tôi không quen thuộc với bootstrap, nhưng tôi tập hợp rằng cả v3 và v4 đều không cung cấp điều hướng thanh bên theo mặc định. Một số hướng dẫn thanh bên bootstrap có thể được tìm thấy ở đây . Tôi chỉ đơn giản là sử dụng phiên bản cơ bản nhất từ ​​các hướng dẫn được liên kết ở trên để tạo một ví dụ ở đây.

Thanh bên có thể thu gọn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.