vue底部分页利用position: fixed固定,切换时闪动问题

为什么切换tab的时候固定底部会抖动

当元素祖先的 transform、perspective、filter 或 backdrop-filter 属性非 none 时,容器由视口改为该祖先。既切换页面/tab时元素有一个销毁到重建的过程 在此期间元素的父元素被销毁 父元素切换为顶级元素(窗口),切换到另一个页面后 父元素由顶级元素变为创建好的父元素,所以导致抖动。

方法1 自定义一个InBody组件,将里面所有的元素放到body里面

<template>
  <div>
    <slot></slot>
  </div>
</template>
<script>
export default {
  name: 'InBody',
  mounted() {
    const node = this.$mount().$el
    document.body.appendChild(node)//将里面所有的元素放到body里面
  },
  destroyed() {
    const node = this.$mount().$el
    node.remove()
  }
}
</script>

使用

<InBody>
      <pagination class="footer-global" v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
                  :limit.sync="queryParams.pageSize" @pagination="getList" />
    </InBody>

解释
vue组件的mounted生命周期钩子函数中执行的操作。
1.mountedvue实例挂载到DOM元素上之后执行,表示组件已经被渲染并插入到页面中
2.const node=this.$mount().$el:$mount() 用于手动将vue实例挂在到DOM元素上。调用$mount()方法并获取其返回值的$el属性,将组件挂载到一个虚拟的DOM节点上
3.document.body.appendChild(node).document.body表示页面的<body>元素。appendChild()是用于将指定的节点添加到父节点的子节点列表的末尾。这里是将之前挂在的组件节点(node)添加到<body>元素中,实现将组件的内容插入到页面中的效果。

综合来说: 这段代码是将vue组件的内容渲染并插入到页面的<body>元素中,在组件的mounted钩子函数先将组件挂载到一个虚拟的DOM节点上,然后通过appendChild()方法将该节点添加到<body>元素中,使得组件的内容在页面中显示出来

方法2 在父元素上添加 style="transform: none"

解决方案:如果fixed的元素的父级元素有任意一个的 transform、perspective、filter 或 backdrop-filter不为空,则会基于这个容器而定位,而不是浏览器窗口了。
其中element-admin在切换tab的时候,会有一个动画效果,是基于transform来实现的。

  <div style="transform: none">
    <div class="pagination-class">
      <el-pagination
        small
        background
        :total="total"
        :page-size="per_num"
        layout="total,prev, pager, next"
        @current-change="handleCurrentChange"
        v-model:current-page="currentPage"
      ></el-pagination>
    </div>
  </div>
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值