1. Web Design
  2. HTML/CSS
  3. CSS

Tạo một Menu Điều hướng Dạng trượt cho các Thiết kế Responsive

Scroll to top

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Trong hướng dẫn này, bạn sẽ tạo một side menu có thể mở rộng bằng JavaScript và CSS. Kết quả cuối cùng sẽ như sau:

Sliding Side Navigation MenuSliding Side Navigation MenuSliding Side Navigation Menu

Markup

Để bắt đầu, hãy thêm một số markup cho side menu của chúng ta:

1
  <div id="sideNavigation" class="sidenav">
2
    <a href="javascript:void(0)" class="closebtn" onclick="closeNav()">&times;</a>
3
    <a href="#">About</a>
4
    <a href="#">Features</a>
5
    <a href="#">Contact Us</a>
6
  </div>
7
8
  <nav class="topnav">
9
    <a href="#" onclick="openNav()">
10
      <svg width="30" height="30" id="icoOpen">
11
          <path d="M0,5 30,5" stroke="#000" stroke-width="5"/>
12
          <path d="M0,14 30,14" stroke="#000" stroke-width="5"/>
13
          <path d="M0,23 30,23" stroke="#000" stroke-width="5"/>
14
      </svg>
15
    </a>
16
  </nav>
17
  
18
  <div id="main">
19
  <!-- Add all your websites page content here  -->
20
  </div>

Ở đây bạn có thể thấy chúng ta đã tạo một div cho side menu với class sidenav. Tiếp theo, chúng ta thêm thanh điều hướng top bar thật sự thông qua thẻ <nav> và chúng ta sử dụng SVG cho biểu tượng side menu của chúng ta.

Thuộc tính onclick của biểu tượng và button close sẽ kích hoạt một số JavaScript mà chúng ta sẽ thêm vào tiếp theo.

Hãy nhớ đặt tất cả các nội dung của trang web bên trong container div id="main" để nó sẽ trượt sang bên phải.

JavaScript

Tiếp theo, chúng ta hãy thêm JavaScript để tạo các hàm openNavcloseNav.

1
<script>
2
function openNav() {
3
    document.getElementById("sideNavigation").style.width = "250px";
4
    document.getElementById("main").style.marginLeft = "250px";
5
}
6
7
function closeNav() {
8
    document.getElementById("sideNavigation").style.width = "0";
9
    document.getElementById("main").style.marginLeft = "0";
10
}
11
</script>

CSS

Cuối cùng, chúng ta cần phải tạo kiểu dáng cho trang web của chúng ta với một số CSS cho side menu và các liên kết của chúng ta:

1
/* The side navigation menu */
2
.sidenav {
3
    height: 100%; /* 100% Full-height */
4
    width: 0; /* 0 width - change this with JavaScript */
5
    position: fixed; /* Stay in place */
6
    z-index: 1; /* Stay on top */
7
    top: 0;
8
    left: 0;
9
    background-color: #111; /* Black*/
10
    overflow-x: hidden; /* Disable horizontal scroll */
11
    padding-top: 60px; /* Place content 60px from the top */
12
    transition: 0.5s; /* 0.5 second transition effect to slide in the sidenav */
13
}
14
15
/* The navigation menu links */
16
.sidenav a {
17
    padding: 8px 8px 8px 32px;
18
    text-decoration: none;
19
    font-size: 25px;
20
    color: #818181;
21
    display: block;
22
    transition: 0.3s
23
}
24
25
/* When you mouse over the navigation links, change their color */
26
.sidenav a:hover, .offcanvas a:focus{
27
    color: #f1f1f1;
28
}
29
30
/* Position and style the close button (top right corner) */
31
.sidenav .closebtn {
32
    position: absolute;
33
    top: 0;
34
    right: 25px;
35
    font-size: 36px;
36
    margin-left: 50px;
37
}
38
39
/* Style page content - use this if you want to push the page content to the right when you open the side navigation */
40
#main {
41
    transition: margin-left .5s;
42
    padding: 20px;
43
    overflow:hidden;
44
    width:100%;
45
}
46
body {
47
  overflow-x: hidden;
48
}
49
50
/* Add a black background color to the top navigation */
51
.topnav {
52
    background-color: #333;
53
    overflow: hidden;
54
}
55
56
/* Style the links inside the navigation bar */
57
.topnav a {
58
    float: left;
59
    display: block;
60
    color: #f2f2f2;
61
    text-align: center;
62
    padding: 14px 16px;
63
    text-decoration: none;
64
    font-size: 17px;
65
}
66
67
/* Change the color of links on hover */
68
.topnav a:hover {
69
    background-color: #ddd;
70
    color: black;
71
}
72
73
/* Add a color to the active/current link */
74
.topnav a.active {
75
    background-color: #4CAF50;
76
    color: white;
77
}
78
79
/* On smaller screens, where height is less than 450px, change the style of the sidenav (less padding and a smaller font size) */
80
@media screen and (max-height: 450px) {
81
    .sidenav {padding-top: 15px;}
82
    .sidenav a {font-size: 18px;}
83
}
84
85
a svg{
86
  transition:all .5s ease;
87
88
  &:hover{
89
    #transform:rotate(180deg);
90
  }
91
}
92
93
#ico{
94
  display: none;
95
}
96
97
.menu{
98
  background: #000;
99
  display: none;
100
  padding: 5px;
101
  width: 320px;
102
  @include border-radius(5px);
103
104
  #transition: all 0.5s ease;
105
106
  a{
107
    display: block;
108
    color: #fff;
109
    text-align: center;
110
    padding: 10px 2px;
111
    margin: 3px 0;
112
    text-decoration: none;
113
    background: #444;
114
115
    &:nth-child(1){
116
      margin-top: 0;
117
      @include border-radius(3px 3px 0 0 );
118
    }
119
    &:nth-child(5){
120
      margin-bottom: 0;
121
      @include border-radius(0 0 3px 3px);
122
    }
123
124
    &:hover{
125
      background: #555;
126
    }
127
  }
128
}

Lưu ý: body {overflow-x: hidden;} là cần thiết để đảm bảo thanh cuộn ngang không xuất hiện khi sử dụng nó với CSS hiện có của bạn.

Bây giờ bạn có thể xem thử menu và thử nghiệm nó ở trong trình duyệt của bạn.

Sử dụng jQuery

Nếu bạn muốn tạo side menu JavaScript bằng jQuery, bạn có thể thực hiện việc này bằng cách thay thế code JavaScript mà tôi đã cung cấp trước đó bằng phần code sau đây:

1
$('.topnav a').click(function(){
2
  $('#sideNavigation').style.width = "250px";
3
  $("#main").style.marginLeft = "250px";
4
});
5
6
$('.closebtn').click(function(){
7
  $('#sideNavigation').style.width = "0";
8
  $("#main").style.marginLeft = "0";
9
});

Huỷ bỏ Hiệu ứng trượt

Để làm cho menu xuất hiện mà không có hiệu ứng trượt, chỉ cần thực hiện thay đổi đối với thuộc tính transition của CSS, như minh hoạ ở dạng viết tắt dưới đây:

1
.sidenav {
2
    transition: 0s; 
3
}
4
5
#main {
6
    transition: margin-left 0s;
7
}

Điều này sẽ làm cho nó hiện ra ngay lập tức vì không có delay được xác định trong transition. Mặc định chúng ta sử dụng là 0.5 giây.

Phần tóm tắt

Tạo một side menu chỉ mất vài dòng code và không cần sử dụng nhiều tài nguyên. Ngoài ra, nếu jQuery đã có ở trên trang cho các tác vụ khác, thì công việc có thể được thực hiện với ít code và tùy chỉnh hơn nữa.

Làm cho code đáp ứng với các độ phân giải màn hình khác nhau chỉ đơn thuần là trường hợp sửa đổi CSS bằng cách thêm Media Queries cho các trường hợp cụ thể.

Để cải tiến menu này, bạn có thể trang trí cho menu của mình bằng một framework CSS như Bootstrap hoặc Bulma.