欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

off-canvas:抽屉式页面布局的纯css实现

程序员文章站 2022-06-26 10:18:10
Off-canvas即抽屉式的侧边导航栏布局,导航栏在大尺寸屏幕的时候可以设置无需隐藏,小尺寸屏幕的时候自动隐藏,并出现.off-canvas-toggle用以打开导航栏,打开导航栏的状态下可以点击非导航栏区域来关闭它。以这种描述来看,它的实现概念基本上和之前说的Accordion类似,需要一个可以 ......

off-canvas即抽屉式的侧边导航栏布局,导航栏在大尺寸屏幕的时候可以设置无需隐藏,小尺寸屏幕的时候自动隐藏,并出现.off-canvas-toggle用以打开导航栏,打开导航栏的状态下可以点击非导航栏区域来关闭它。以这种描述来看,它的实现概念基本上和之前说的accordion类似,需要一个可以记载状态的元素或者变量。上次使用了<input type="checkbox">,这次换作使用一个新的伪类,:target。

:target顾名思义就是记录当前焦点是否处于元素上的,而引发target状态只需要点击href指向对应id名的链接就好。也就是说,小尺寸屏幕的时候,让导航栏在target状态下显示,非target状态隐藏,此件的切换正如accordion使用了一个隐藏的checkbox一样,这里也可以利用一个完全透明的a链接,只需要注意链接只在导航栏出现的时候显示,并且链接的z-index小于导航栏即可,实现并不复杂,见代码:

.off-canvas{
  display: flex;
  flex-wrap: nowrap;
  width: 100%;
  height: 100%;
  position: relative;
  .off-canvas-toggle{
    position: absolute;
    top: $layout-spacing;
    z-index: $zindex-0;
    a{
      text-decoration: none;
      &:active{
        outline: none;
      }
    }
    @if $r2l {
      right: $layout-spacing;
    } @else {
      left: $layout-spacing;
    }
  }
  .off-canvas-sidebar{
    position: fixed;
    top: 0;
    width: 100%;
    height: 100%;
    z-index: $zindex-2;
    overflow-y: auto;
    transition: transform 0.25s;
    @if $r2l {
      right: 0;
      transform: translate(100%);
    } @else {
      left: 0;
      transform: translate(-100%);
    }
  }
  .off-canvas-content{
    flex: auto;
    min-width: 0;
    height: 100%;
    padding: $layout-spacing;
  }
  .off-canvas-overlay{
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: transparent;
    border: none;
    display: none;
  }
  // 交互
  .off-canvas-sidebar{
    &:target,
    &.active{
      transform: translate(0);
      ~ .off-canvas-overlay{
        display: block;
        z-index: $zindex-1;
      }
    }
  }
}

代码里并没什么需要特别注意的点,不过要留意.off-canvas-overlay的出现时间和显示样式,另外,隐藏.off-canvas-sidebar是借助translate的,可以看出代码里出现了变量$r2l,其实就是right to left的缩写,这个变量默认是false,决定着导航栏默认出现在哪一侧,默认从哪一侧弹出来,也决定了导航栏隐藏的时候.off-canvas-toggle放在哪一边。

设置大尺寸屏幕显示导航栏就是将导航栏的默认状态设置为和target状态一样的便好,如下:

// 大屏幕的时候可以设置不隐藏侧边栏
@include forlargescreen($off-canvas-breakpoint){
  .off-canvas{
    &.off-canvas-siderbar-show{
      .off-canvas-toggle{
        display: none;
      }
      .off-canvas-sidebar{
        flex: 0 0 auto;
        position: relative;
        transform: none;
        height: auto;
        @if $r2l{
          order: 1;
        } @else {
          order: -1;
        }
      }
      .off-canvas-overlay{
        display: none !important;
      }
    }
  }
}

点击此查看样例