• 【源码分享】jquery+css实现侧边导航栏


    jquery+css实现侧边导航栏

        最近做项目的时候,突然想用一个侧边导航栏,网上找了几个插件,有的太丑而且不太符合我的预期。与其修改别人的代码,不如自己来写一个了。废话不多说先上图,感兴趣的请继续看下去。

        

        

    1效果图   


      当有顶部导航栏的时候侧边导航栏会消失。

     

      响应式方面,同样的顶部导航栏消失后右下角的图标才出现。点击出现导航,选中后消失;

      这里是个demo ,没有做平滑滚动,需要的可以自己加上。

      

      大体就介绍这么多吧,下面上代码。

      

        

    2css代码

        这里是css代码,详情请看注释

      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- 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- 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代码   

      
     
        这里是html代码,很简单没什么好说的。
         
     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:转载请注明出处!!

      

  • 相关阅读:
    LeetCode 461. Hamming Distance
    LeetCode 442. Find All Duplicates in an Array
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode Find the Difference
    LeetCode 415. Add Strings
    LeetCode 445. Add Two Numbers II
    LeetCode 438. Find All Anagrams in a String
    LeetCode 463. Island Perimeter
    LeetCode 362. Design Hit Counter
    LeetCode 359. Logger Rate Limiter
  • 原文地址:https://www.cnblogs.com/zheshiyigemanong/p/6986767.html
Copyright © 2020-2023  润新知