详解Vue回到顶部

Vue回到顶部是一个非常常见的需求,一般来说,我们需要满足以下几个要求:1)实现一个线性的回到顶部的过程,2)点击按钮能够快速回到顶部,3)滚动到一定高度后才显示回到顶部按钮。

一、基础实现

首先,我们需要实现一个基础的回到顶部功能,不考虑按钮显示和逐步滑动效果。

// template

<template>
  <div class="scroll-wrap" @scroll="scroll">
    <div class="scroll-content">
      <div class="content">  // 省略其他内容
        // 点击回到顶部的按钮
        <div class="back-to-top" @click="backToTop">Top</div>
      </div>
    </div>
  </div>
</template>

// script

<script>
export default {
  data() {
    return {
      scrollTop: 0,
    };
  },
  mounted() {
    this.$refs.scrollWrap.addEventListener('scroll', this.scroll);
  },
  methods: {
    backToTop() {
      this.$refs.scrollWrap.scrollTop = 0;
    },
    scroll() {
      this.scrollTop = this.$refs.scrollWrap.scrollTop;
    }
  }
};
</script>

// style

<style>
.scroll-wrap {
  height: 300px;
  overflow-y: scroll;
}

.back-to-top {
  position: fixed;
  bottom: 20px;
  right: 20px;
  background-color: #333333;
  color: #ffffff;
  font-size: 14px;
  padding: 10px 20px;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.3s;
}

.back-to-top.show {
  opacity: 1;
}
</style>

在这个实现中,我们在mounted中监听scroll事件,设置scrollTop的值,实现了一个基本的滚动效果。点击back-to-top按钮时,设置scrollTop为0,即可实现基本的回到顶部效果。

二、逐步回到顶部

为了让用户可以更加自然地回到顶部,我们可以添加逐步回到顶部效果。

// template(与上面相同)

// script

<script>
export default {
  data() {
    return {
      scrollTop: 0,
    };
  },
  mounted() {
    this.$refs.scrollWrap.addEventListener('scroll', this.scroll);
  },
  methods: {
    backToTop() {
      let currentScrollTop = this.$refs.scrollWrap.scrollTop;
      let step = currentScrollTop / 20;  // 分为20步
      let countDown = setInterval(() => {
        if (this.$refs.scrollWrap.scrollTop <= 0) {
          clearInterval(countDown);
        } else {
          this.$refs.scrollWrap.scrollTop -= step;
        }
      }, 10);
    },
    scroll() {
      this.scrollTop = this.$refs.scrollWrap.scrollTop;
    }
  }
};
</script>

// style(与上面相同)

在这个实现中,我们添加了逐步回到顶部效果。通过分为20步,每一步设置scrollTop值减少1/20,实现了一个平滑逐步回到顶部的效果。

三、显示/隐藏按钮

为了让用户更加方便地使用回到顶部功能,我们可以在滚动高度超过一定值时,显示回到顶部按钮。

// template(与上面相同)

// script

<script>
export default {
  data() {
    return {
      scrollTop: 0,
      showButton: false,
    };
  },
  mounted() {
    this.$refs.scrollWrap.addEventListener('scroll', this.scroll);
  },
  methods: {
    backToTop() {
      let currentScrollTop = this.$refs.scrollWrap.scrollTop;
      let step = currentScrollTop / 20;  // 分为20步
      let countDown = setInterval(() => {
        if (this.$refs.scrollWrap.scrollTop  100) {
        this.showButton = true;
      } else {
        this.showButton = false;
      }
    }
  }
};
</script>

// style

<style>
.scroll-wrap {
  height: 300px;
  overflow-y: scroll;
}

.back-to-top {
  position: fixed;
  bottom: 20px;
  right: 20px;
  background-color: #333333;
  color: #ffffff;
  font-size: 14px;
  padding: 10px 20px;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.3s;
}

.back-to-top.show {
  opacity: 1;
}
</style>

在这个实现中,我们添加了一个showButton属性,当滚动高度超过100时,将showButton设为true,使得back-to-top按钮的class加上show类,从而显示出来。当滚动高度小于等于100时,将showButton设为false,使得back-to-top按钮的class去掉show类,从而隐藏起来。

四、动态判断按钮位置

为了让回到顶部按钮可以根据页面布局自动调整位置,我们需要实现动态判断按钮的位置。

// template

<template>
  <div class="scroll-wrap" @scroll="scroll">
    <div class="scroll-content">
      <div class="content">
        // 点击回到顶部的按钮
        <div class="back-to-top" :class="{show: showButton}" @click="backToTop">Top</div>
      </div>
    </div>
    <div class="sidebar">
      // 省略其他内容
      <div class="sidebar-back-to-top" :class="{show: showButton}" @click="backToTop">Top</div>
    </div>
  </div>
</template>

// script

<script>
export default {
  data() {
    return {
      scrollTop: 0,
      showButton: false,
      sidebarTop: 0,
      sidebarHeight: 0,
    };
  },
  mounted() {
    this.$refs.scrollWrap.addEventListener('scroll', this.scroll);
    // 获取侧边栏的位置信息
    this.sidebarTop = this.$refs.sidebar.offsetTop;
    this.sidebarHeight = this.$refs.sidebar.offsetHeight;
  },
  methods: {
    backToTop() {
      let currentScrollTop = this.$refs.scrollWrap.scrollTop;
      let step = currentScrollTop / 20;  // 分为20步
      let countDown = setInterval(() => {
        if (this.$refs.scrollWrap.scrollTop  100 && this.scrollTop + window.innerHeight < this.sidebarTop + this.sidebarHeight) {
        this.showButton = true;
      } else {
        this.showButton = false;
      }
    }
  }
};
</script>

// style

<style>
.scroll-wrap {
  display: flex;
}

.back-to-top {
  position: fixed;
  bottom: 20px;
  right: 20px;
  background-color: #333333;
  color: #ffffff;
  font-size: 14px;
  padding: 10px 20px;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.3s;
}

.back-to-top.show {
  opacity: 1;
}

/* 侧边栏样式 */
.sidebar {
  width: 20%;
  background-color: #f5f5f5;
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  overflow-y: scroll;
}

.sidebar-back-to-top {
  background-color: #333333;
  color: #ffffff;
  font-size: 14px;
  padding: 10px 20px;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.3s;
}

.sidebar-back-to-top.show {
  opacity: 1;
}
</style>

在这个实现中,我们首先新增了一个sidebar侧边栏,将back-to-top按钮也添加到了侧边栏中,作为一个备选方案(如果页面布局看不到back-to-top按钮,用户可以通过侧边栏的back-to-top按钮进行操作)。然后,我们在mounted中获取侧边栏的位置信息(top和height),在scroll回调中,判断scrollTop+窗口高度是否小于sidebar的底部位置,从而确定back-to-top按钮是否可以显示。

五、总结

至此,我们对Vue回到顶部进行了详细的阐述。在实现过程中,我们需要注意以下几点:

1、基本实现:监听scroll事件,动态设置scrollTop的值,然后点击back-to-top按钮时将scrollTop设为0即可。

2、逐步回到顶部:分为20步,每一步设置scrollTop值减少1/20,实现平滑逐步回到顶部的效果。

3、显示/隐藏按钮:当scrollTop>100时,显示back-to-top按钮;否则,隐藏back-to-top按钮。

4、动态判断按钮位置:当scrollTop+窗口高度小于sidebar的底部位置时,显示back-to-top按钮,并将back-to-top按钮放置在侧边栏中,作为备选方案。

以上实现仅供参考,实际功能还需要根据具体业务情况进行调整。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/306587.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-02 12:01
下一篇 2025-01-02 12:01

相关推荐

  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • Vue3的vue-resource使用教程

    本文将从以下几个方面详细阐述Vue3如何使用vue-resource。 一、安装Vue3和vue-resource 在使用vue-resource前,我们需要先安装Vue3和vue…

    编程 2025-04-27
  • ThinkPHP6 + Vue.js: 不使用Fetch的数据请求方法

    本文将介绍如何在ThinkPHP6和Vue.js中进行数据请求,同时避免使用Fetch函数。 一、AJAX:XMLHttpRequest的基础使用 在进行数据请求时,最基础的方式就…

    编程 2025-04-27
  • Vue模拟按键按下

    本文将从以下几个方面对Vue模拟按键按下进行详细阐述: 一、Vue 模拟按键按下的场景 在前端开发中,我们常常需要模拟按键按下的场景,比如在表单中填写内容后,按下“回车键”提交表单…

    编程 2025-04-27
  • 开发前端程序,Vue是否足够?

    Vue是一个轻量级,高效,渐进式的JavaScript框架,用于构建Web界面。开发人员可以使用Vue轻松完成前端编程,开发响应式应用程序。然而,当涉及到需要更大的生态系统,或利用…

    编程 2025-04-27
  • 如何在Vue中点击清除SetInterval

    在Vue中点击清除SetInterval是常见的需求之一。本文将介绍如何在Vue中进行这个操作。 一、使用setInterval和clearInterval 在Vue中,使用set…

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25

发表回复

登录后才能评论