jquery+css實現側邊導航欄css
最近作項目的時候,忽然想用一個側邊導航欄,網上找了幾個插件,有的太醜並且不太符合個人預期。與其修改別人的代碼,不如本身來寫一個了。廢話很少說先上圖,感興趣的請繼續看下去。html
1效果圖 jquery
當有頂部導航欄的時候側邊導航欄會消失。web
響應式方面,一樣的頂部導航欄消失後右下角的圖標纔出現。點擊出現導航,選中後消失;編程
這裏是個demo ,沒有作平滑滾動,須要的能夠本身加上。數組
大致就介紹這麼多吧,下面上代碼。瀏覽器
2css代碼app
這裏是css代碼,詳情請看註釋ide
1 <style> 2 3 /*重置一些樣式*/ 4 *, *::after, *::before { 5 box-sizing: border-box; 6 /*padding: 0;*/ 7 margin: 0; 8 font-size: 14px; 9 } 10 .cd-vertical-nav ul{ 11 list-style: none; 12 } 13 a { 14 color: #c0a672; 15 text-decoration: none; 16 } 17 18 .nav{ 19 height: 80px; 20 } 21 22 .cd-image-replace { 23 /* 小屏顯示的圖標 */ 24 display: inline-block; 25 overflow: hidden; 26 text-indent: 100%; 27 white-space: nowrap; 28 color: transparent; 29 } 30 31 /* -------------------------------- 32 33 小屏時的圖標樣式,和小圖標響應式的顯示與隱藏 34 35 -------------------------------- */ 36 .cd-nav-trigger { 37 display: block; 38 position: fixed; 39 z-index: 2; 40 bottom: 30px; 41 right: 5%; 42 height: 44px; 43 width: 44px; 44 border-radius: 0.25em; 45 background: rgba(9, 150,90, 0.9); 46 /* reset button style */ 47 cursor: pointer; 48 -webkit-appearance: none; 49 -moz-appearance: none; 50 -ms-appearance: none; 51 -o-appearance: none; 52 appearance: none; 53 border: none; 54 outline: none; 55 } 56 .cd-nav-trigger span { 57 position: absolute; 58 height: 4px; 59 width: 4px; 60 background-color: #3a2c41; 61 border-radius: 50%; 62 left: 50%; 63 top: 50%; 64 bottom: auto; 65 right: auto; 66 transform: translateX(-50%) translateY(-50%); 67 } 68 .cd-nav-trigger span::before, .cd-nav-trigger span::after { 69 content: ''; 70 position: absolute; 71 left: 0; 72 height: 100%; 73 width: 100%; 74 background-color: #3a2c41; 75 border-radius: inherit; 76 } 77 .cd-nav-trigger span::before { 78 top: -9px; 79 } 80 .cd-nav-trigger span::after { 81 bottom: -9px; 82 } 83 84 @media only screen and (min-width: 768px) { 85 .cd-nav-trigger { 86 display: none; 87 } 88 } 89 90 /* -------------------------------- 91 92 導航條的背景等屬性 93 94 -------------------------------- */ 95 /*移動優先原則 這裏是小屏時的導航*/ 96 .cd-vertical-nav { 97 position: fixed; 98 z-index: 1; 99 right: 5%; 100 bottom: 30px; 101 width: 90%; 102 max-width: 400px; 103 max-height: 90%; 104 overflow-y: auto; 105 transform: scale(0); 106 transform-origin: right bottom; 107 transition: transform 0.2s; 108 border-radius: 0.25em; 109 background-color: rgba(9, 9, 9, 0.9); 110 } 111 .cd-vertical-nav li{ 112 height:auto; 113 } 114 .cd-vertical-nav a { 115 display: block; 116 padding: 1em; 117 color: #3a2c41; 118 font-weight: bold; 119 border-bottom: 1px solid rgba(58, 44, 65, 0.1); 120 } 121 .cd-vertical-nav a.active { 122 color: #c0a672; 123 } 124 .cd-vertical-nav.open { 125 transform: scale(1); 126 z-index: 10; 127 -webkit-overflow-scrolling: touch; 128 } 129 .cd-vertical-nav.open + .cd-nav-trigger { 130 background-color: transparent; 131 } 132 .cd-vertical-nav.open + .cd-nav-trigger span { 133 background-color: rgba(58, 44, 65, 0); 134 } 135 .cd-vertical-nav.open + .cd-nav-trigger span::before, .cd-vertical-nav.open + .cd-nav-trigger span::after { 136 /* 給點擊後的按鈕作叉號(×)樣式 */ 137 height: 3px; 138 width: 20px; 139 border-radius: 0; 140 left: -8px; 141 } 142 .cd-vertical-nav.open + .cd-nav-trigger span::before { 143 -webkit-transform: rotate(45deg); 144 -moz-transform: rotate(45deg); 145 -ms-transform: rotate(45deg); 146 -o-transform: rotate(45deg); 147 transform: rotate(45deg); 148 top: 1px; 149 } 150 .cd-vertical-nav.open + .cd-nav-trigger span::after { 151 -webkit-transform: rotate(135deg); 152 -moz-transform: rotate(135deg); 153 -ms-transform: rotate(135deg); 154 -o-transform: rotate(135deg); 155 transform: rotate(135deg); 156 bottom: 0; 157 } 158 @media only screen and (min-width: 768px) { 159 .cd-vertical-nav { 160 /* pc端展現的效果,首先重置一下樣式 */ 161 right: 0; 162 top: 0; 163 bottom: auto; 164 text-align: center; 165 166 /*這裏的vh是相對可視屏幕的高度,100vh表示高度始終等於瀏覽器但是高度*/ 167 height: 100vh; 168 width: 90px; 169 max-width: none; 170 max-height: none; 171 transform: scale(1); 172 background-color: transparent; 173 overflow: hidden; 174 /* 下面經過flex彈性盒子,讓內容的主軸線編程垂直的。 175 而後經過修改主軸的元素排列方式讓他們居中*/ 176 display: flex; 177 flex-direction: column; 178 justify-content: center; 179 } 180 181 /*下面經過調節內容的縮放比和padding,margin等屬性來調節個選項間的距離,實現動畫效果*/ 182 .cd-vertical-nav::before { 183 /* 背景色 */ 184 content: ''; 185 position: absolute; 186 top: 0; 187 left: 0; 188 width: 100%; 189 height: 100%; 190 background: rgba(0, 0, 0, 0.8); 191 transform: translateX(100%); 192 transition: transform 0.4s; 193 } 194 195 .cd-vertical-nav:hover::before { 196 -webkit-transform: translateX(0); 197 -moz-transform: translateX(0); 198 -ms-transform: translateX(0); 199 -o-transform: translateX(0); 200 transform: translateX(0); 201 } 202 203 .cd-vertical-nav ul { 204 vertical-align: middle; 205 text-align: center; 206 padding-left: 15px; 207 } 208 209 .cd-vertical-nav a { 210 position: relative; 211 padding: 0.5em 0 0; 212 margin:0 auto; 213 border-bottom: none; 214 font-size: 1.2rem; 215 color: #eaf2e3; 216 transition: all .5s; 217 } 218 219 .cd-vertical-nav a.active i{ 220 background-color: #00a58c; 221 color: #ffffff; 222 } 223 .cd-vertical-nav a.active span{ 224 color: #00a58c; 225 } 226 .cd-vertical-nav a.active::before, .cd-vertical-nav a:hover::before { 227 background-color: #c0a672; 228 } 229 .cd-vertical-nav .label { 230 display: block; 231 opacity: 0; 232 transform: translateX(150%); 233 height: 0; 234 transition: all 0.5s; 235 } 236 237 .cd-vertical-nav:hover .label { 238 height:auto; 239 opacity: 1; 240 transform: translateX(0); 241 padding-top: 5px; 242 } 243 .cd-vertical-nav:hover a { 244 padding: 1em 0 0; 245 margin-top: 0.8em; 246 margin-right: 15px; 247 } 248 .cd-vertical-nav i{ 249 display: inline-block; 250 width: 32px; 251 height: 32px; 252 font-size: 18px; 253 line-height: 30px; 254 -webkit-border-radius: 50%; 255 -moz-border-radius: 50%; 256 border-radius: 50%; 257 color: #0a9dc7; 258 background-color: #fff; 259 transform: scale(0.3); 260 transition: all 0.3s; 261 } 262 .cd-vertical-nav:hover i{ 263 transform: scale(1); 264 } 265 266 } 267 /*配合頁面css*/ 268 section{ 269 height: 100vh; 270 } 271 section:nth-of-type(2n){ 272 background-color: #ff0000; 273 } 274 section:nth-of-type(2n+1){ 275 background-color: #ffff00; 276 } 277 </style>
3html代碼 flex
1 <div class="nav">這是頂部的導航</div> 2 3 <nav class="cd-vertical-nav navbar collapse"> 4 <ul> 5 <li><a data-scroll href="#tab1" class="active"><i class="iconfont icon-shouyeshouye"></i><span class="label">首頁</span></a></li> 6 <li><a data-scroll href="#tab2"><i class="iconfont icon-guanyu"></i><span class="label">關於</span></a></li> 7 <li><a data-scroll href="#tab3"><i class="iconfont icon-jineng"></i><span class="label">技能</span></a></li> 8 <li><a data-scroll href="#tab4"><i class="iconfont icon-gongzuojingyan"></i><span class="label">工做經驗</span></a></li> 9 </ul> 10 </nav> 11 <button class="cd-nav-trigger cd-image-replace">Open navigation<span aria-hidden="true"></span></button> 12 13 <section id="tab1"></section> 14 <section id="tab2"></section> 15 <section id="tab3"></section> 16 <section id="tab4"></section>
4js代碼
下面咱們看下js代碼。註釋很詳細,就很少說了。
1 <script src="js/jquery-1.10.2.min.js"></script><!--導入jquery庫--> 2 <script> 3 $(function(){ 4 var a =$("section"); //獲取每一個大塊的元素 5 var b = []; 6 for (i=0;i< a.length;i++){ 7 b[i]=a[i].offsetTop; //把每一個大塊距離頁面最頂部的距離,賦給b數組 8 } 9 var c = $(window).scrollTop();//頁面刷新是獲取滾動條的位置 10 if(c>=80){ //頂部導航欄高80;頂部導航消失的時候讓側邊導航出來 11 $(".cd-vertical-nav").show(); 12 if(window.innerWidth<768){ //小屏的狀況下讓按鈕隱藏/出現 13 $(".cd-nav-trigger").show();} 14 }else { //不然讓它隱藏 15 $(".cd-vertical-nav").hide(); 16 if(window.innerWidth<768) { 17 $(".cd-nav-trigger").hide(); 18 } 19 } 20 21 $(window).scroll(function(){ //監聽滾動條的滾動事件 22 c = $(window).scrollTop(); //實時監聽滾動條位置 23 if(c>=80){ //頁面滾動時,判斷滾動條位置,控制側邊導航的隱顯 24 $(".cd-vertical-nav").show(); 25 if(window.innerWidth<768){ 26 $(".cd-nav-trigger").show();} 27 }else { 28 29 $(".cd-vertical-nav").hide(); 30 $(".cd-nav-trigger").hide(); 31 } 32 33 //下面是判斷頁面所處位置,實時更新導航條,是導航欄選項跟頁面同步 34 for (i=0;i< a.length;i++){ 35 var d =c-b[i]; //c是滾動條位置,b是元素到頁面頂部的距離,d表示當前瀏覽器頂部所處的位置。 36 var e = a[i].offsetHeight; //獲取元素的高度 37 var f = a[i].id; //獲取元素的id 38 var g = $(".cd-vertical-nav a[href='#"+f+"']"); //拼接字符串,經過屬性選擇器找到當前所處頁面對應的超連接 39 if (d>=0&&d<e){ 40 if(g.hasClass("active")){ //若是當前元素本就處於激活狀態直接break 41 break; 42 } 43 44 //若是當前頁面沒有處於激活狀態,就將正在激活的移出激活的樣式表 45 $(".cd-vertical-nav .active").removeClass("active"); 46 g.addClass("active"); //給當前須要激活的屬性添加激活樣式表 47 break; 48 } 49 } 50 }); 51 }) 52 53 //下面爲小屏時經過點擊按鈕開關導航欄, 54 $(".cd-nav-trigger").on("click",function(){ 55 //處於open狀態,就關閉 56 if($(".cd-vertical-nav").hasClass("open")) $(".cd-vertical-nav").removeClass("open"); 57 //反之打開 58 else $(".cd-vertical-nav").addClass("open"); 59 }) 60 //選中導航某一項後,關閉導航欄 61 $(".cd-vertical-nav a").on("click",function(){ 62 $(".cd-vertical-nav").removeClass("open"); 63 64 }) 65 </script>
今天的分享就到這裏了,你們有什麼意見儘管提,但願能對你們有所幫助。
本次分享就到這裏
謝謝你們的觀看
但願能對你們有所啓發
有更好的方法或不一樣的意見請在留言區跟我交流
PS:轉載請註明出處!!