使用css的transition属性实现抽屉功能

需求

使用css手写一个抽屉,并且不能遮挡住原来的页面

效果:(录的gif有点卡,实际情况很丝滑)

实现代码:

<template>
  <div class="dashboard-container">
    <div class="mainBox"></div>
    <div id="drawerRight">
      <div class="iconDiv" @click="expandFn">展开</div>
    </div>
  </div>
</template>

<script>
export default {
  name: "drawer",
  data() {
    return {};
  },
  methods: {
    expandFn() {
      var Div = document.querySelector("div#drawerRight");
      var Btn = document.querySelector(".iconDiv");
      var mainDiv = document.querySelector(".mainBox");
      if (Btn.innerHTML === "展开") {
        Btn.innerHTML = "收起";
        Div.style.right = "0";
        mainDiv.style.width = "80%";
      } else if (Btn.innerHTML === "收起") {
        Div.style.right = "-15.5%";
        Btn.innerHTML = "展开";
        mainDiv.style.width = "95%";
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.dashboard {
  &-container {
    margin: 30px;
    height: calc(100vh - 60px);
  }
  &-text {
    font-size: 30px;
    line-height: 46px;
  }
}
.mainBox {
  width: 95%;
  height: 80%;
  position: absolute;
  border: 1px dashed #0c99e6;
  transition: width linear 0.5s;

}
#drawerRight {
  position: relative;
  width: 16%;
  height: 80%;
  background-color: rgb(225, 216, 233) !important;
  padding: 20px;
  border-radius: 4px;
  position: absolute;
  right: -15.5%;
  transition: right linear 0.5s;
  .iconDiv {
    position: absolute;
    right: 100%;
    top: 45%;
    width: 30px;
    height: 80px;
    text-align: center;
    padding: 20px 5px;
    background-color: #0c99e6;
    color: #ffffff;
    border-radius: 4px;
    text-align: center;
    transition: right linear 0.5s;
    cursor: pointer;
    i {
      position: relative;
      top: 50%;
    }
  }
}
</style>

知识点:

1、这里主要使用了transition属性,transition属性是css3中的一个重要属性,可以为一个元素在不同样式之间变化添加补间动画。只需要定义开始状态和结束状态,就可以为我们添加补间动画。相较于传统的js实现的动画,transition属性实现的动画效果更细腻而且内存开销小。

2、transition属性有4个基本要素,分别是要过度的属性,动画时长,动画演变速度,延迟时间

3、transition可以过渡的属性有:

(1)所有数值属性都可以参与过度,比如width,height,left,top,border-radius
(2)背景颜色和文字颜色都可以过渡
(3)所有变形(包括2D和3D变换)都可以过渡

4、这里还使用了js原生写法,具体讲解可以看另一篇文章:前端基础知识--Document的常用属性和常用函数_document选择器-CSDN博客

可以通过CSS3中的transform和transition属性实现抽屉效果。 首先,我们需要为抽屉容器设置一些基本的样式: ```css .drawer { position: fixed; top: 0; bottom: 0; left: 0; width: 300px; background-color: #fff; transform: translateX(-300px); transition: transform 0.3s ease-out; } ``` 这里将抽屉容器的位置设置为fixed,宽度为300px,背景色为白色,并且通过transform属性将其向左平移了300px,即隐藏在屏幕外。 接下来,我们需要为打开抽屉的按钮添加点击事件,触发抽屉展开: ```css .drawer-toggle { position: fixed; top: 20px; left: 20px; width: 40px; height: 40px; background-color: #ccc; cursor: pointer; } .drawer-toggle:hover { background-color: #999; } .drawer-toggle:before { content: ""; display: block; position: absolute; top: 50%; left: 50%; width: 20px; height: 2px; background-color: #fff; transform: translate(-50%, -50%); } .drawer-toggle:after { content: ""; display: block; position: absolute; top: 50%; left: 50%; width: 2px; height: 20px; background-color: #fff; transform: translate(-50%, -50%); } .drawer-toggle.open:before { transform: translate(-50%, -50%) rotate(45deg); } .drawer-toggle.open:after { transform: translate(-50%, -50%) rotate(90deg); } ``` 这里创建了一个按钮,通过CSS3的伪元素before和after来实现按钮的图标。同时,给按钮添加了:hover和.open两个状态的样式,用于展示按钮的交互效果。 最后,我们需要为打开抽屉的按钮添加一个点击事件,并且通过JavaScript来控制抽屉容器的transform属性,来实现抽屉展开和关闭: ```javascript var drawerToggle = document.querySelector('.drawer-toggle'); var drawer = document.querySelector('.drawer'); drawerToggle.addEventListener('click', function() { drawer.classList.toggle('open'); }); ``` 这里使用了classList.toggle方法来切换抽屉容器的.open类,从而触发抽屉展开和关闭效果。 完整的示例代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>抽屉效果</title> <style> .drawer { position: fixed; top: 0; bottom: 0; left: 0; width: 300px; background-color: #fff; transform: translateX(-300px); transition: transform 0.3s ease-out; } .drawer-toggle { position: fixed; top: 20px; left: 20px; width: 40px; height: 40px; background-color: #ccc; cursor: pointer; } .drawer-toggle:hover { background-color: #999; } .drawer-toggle:before { content: ""; display: block; position: absolute; top: 50%; left: 50%; width: 20px; height: 2px; background-color: #fff; transform: translate(-50%, -50%); } .drawer-toggle:after { content: ""; display: block; position: absolute; top: 50%; left: 50%; width: 2px; height: 20px; background-color: #fff; transform: translate(-50%, -50%); } .drawer-toggle.open:before { transform: translate(-50%, -50%) rotate(45deg); } .drawer-toggle.open:after { transform: translate(-50%, -50%) rotate(90deg); } </style> </head> <body> <div class="drawer"> <p>这是抽屉内容</p> </div> <div class="drawer-toggle"></div> <script> var drawerToggle = document.querySelector('.drawer-toggle'); var drawer = document.querySelector('.drawer'); drawerToggle.addEventListener('click', function() { drawer.classList.toggle('open'); }); </script> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值