前端实现div标签p标签等吸顶效果【Vue+原生JS组合写法】

在这里插入图片描述


💌 作者简介

  1. 📖 个人介绍:小伙伴们,大家好!我是水香木鱼,【前端领域创作者】😜
  2. 📜 CSDN主页:水香木鱼
  3. 📑 个人博客:陈春波
  4. 🎨 系列专栏:后台管理系统
  5. 🌹 一键四连:关注💋+点赞👍+收藏⭐+留言📝
  6. 📢 人生箴言:即使没有万全准备,也要勇敢迈出第一步。

1、吸顶效果演示

在这里插入图片描述

2、代码实现

①放置吸顶内容

template放置吸顶的内容

<template>
    <!--此处的id="outerDivWidth" 为外层div的宽度-->
    <div id="outerDivWidth">
       <!--此处的id="CeilingType" 为获取元素的dom-->
      <div id="CeilingType" :class="{ CeilingType: fixed }">
        <!-- 需要吸顶效果的内容 -->
        <img width="30px" src="../assets/logo.png" alt="" />
        <span> 水香木鱼</span>
      </div>
    </div>
</template>

②css样式

/* 外层盒子的吸顶固定位置 */
.CeilingType {
  position: fixed;
  top: 2%;
}

③定义控件属性

  data() {
    return {
      offsetTop: 0, //上层控件的位置
      offsetWidth: 0, //控件的宽度
      outerDivWidth: 0, //外层div
      fixed: false, //固定状态
    };
  },

④初始化加载

mounted 生命周期钩子中 初始化 对页面的操作更新 mounted() {}

对整个页面滚轮进行监听,每发生一次滚轮事件,调用一次吸顶方法initHeight()

  window.addEventListener("scroll", this.initHeight);

对浏览器窗口大小触发事件进行监听【对id 绑定的元素 outerDivWidthCeilingType进行监听】

   window.onresize = () => {
      //宽度借用,赋值
      this.outerDivWidth = document.getElementById("outerDivWidth");
      this.offsetWidth = this.outerDivWidth - 15;
      document.getElementById("CeilingType").style.width =this.offsetWidth + "px";
    };

DOM异步更新 对未来更新后的视图进行操作更新后执行

  this.$nextTick(() => {
      //获取页面顶端的属性值
      var height = document.getElementById("CeilingType");
      this.offsetTop = height.offsetTop + 60;
      //获取标签的宽度
      this.offsetWidth = height.offsetWidth;
      console.log(this.offsetWidth, "当前标签的宽度");
    });

⑤获取页面的滚动距离initHeight()

  methods: {
    initHeight() {
      //1、适配浏览器的兼容性,从而获取页面的滚动距离
      var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
      //2、判断滚动距离是否大于元素到顶端距离
      this.fixed = scrollTop > this.offsetTop ? true : false;
      //3、将标签的宽度进行赋值
      document.getElementById("CeilingType").style.width = this.offsetWidth + "px";
    },

⑥移除监听事件

  destroyed() {
    //移除监听
    window.removeEventListener("scroll", this.initHeight);
  },

3、源码:

<template>
  <div class="ceiling">
    <div id="outerDivWidth">
      <div id="CeilingType" :class="{ CeilingType: fixed }">
        <!-- 内容 -->
        <img width="30px" src="../assets/logo.png" alt="" />
        <span> 水香木鱼</span>
      </div>
    </div>
    <section style="width: 300px">
      <p>八月十五夜赠张功曹</p>
      <p>
        纤云四卷天无河,清风吹空月舒波。 沙平水息声影绝,一杯相属君当歌。
        君歌声酸辞且苦,不能听终泪如雨。 洞庭连天九疑高,蛟龙出没猩鼯号。
        十生九死到官所,幽居默默如藏逃。 下床畏蛇食畏药,海气湿蛰熏腥臊。
        昨者州前捶大鼓,嗣皇继圣登夔皋。 赦书一日行万里,罪从大辟皆除死。
        迁者追回流者还,涤瑕荡垢清朝班。 州家申名使家抑,坎轲只得移荆蛮。
        判司卑官不堪说,未免捶楚尘埃间。 同时辈流多上道,天路幽险难追攀。
        君歌且休听我歌,我歌今与君殊科。 一年明月今宵多,人生由命非由他。
        有酒不饮奈明何。
      </p>
      <br />
      <p>
        纤云四卷天无河,清风吹空月舒波。 沙平水息声影绝,一杯相属君当歌。
        君歌声酸辞且苦,不能听终泪如雨。 洞庭连天九疑高,蛟龙出没猩鼯号。
        十生九死到官所,幽居默默如藏逃。 下床畏蛇食畏药,海气湿蛰熏腥臊。
        昨者州前捶大鼓,嗣皇继圣登夔皋。 赦书一日行万里,罪从大辟皆除死。
        迁者追回流者还,涤瑕荡垢清朝班。 州家申名使家抑,坎轲只得移荆蛮。
        判司卑官不堪说,未免捶楚尘埃间。 同时辈流多上道,天路幽险难追攀。
        君歌且休听我歌,我歌今与君殊科。 一年明月今宵多,人生由命非由他。
        有酒不饮奈明何。
      </p>
      <br />
      <p>
        纤云四卷天无河,清风吹空月舒波。 沙平水息声影绝,一杯相属君当歌。
        君歌声酸辞且苦,不能听终泪如雨。 洞庭连天九疑高,蛟龙出没猩鼯号。
        十生九死到官所,幽居默默如藏逃。 下床畏蛇食畏药,海气湿蛰熏腥臊。
        昨者州前捶大鼓,嗣皇继圣登夔皋。 赦书一日行万里,罪从大辟皆除死。
        迁者追回流者还,涤瑕荡垢清朝班。 州家申名使家抑,坎轲只得移荆蛮。
        判司卑官不堪说,未免捶楚尘埃间。 同时辈流多上道,天路幽险难追攀。
        君歌且休听我歌,我歌今与君殊科。 一年明月今宵多,人生由命非由他。
        有酒不饮奈明何。
      </p>
      <p>
        纤云四卷天无河,清风吹空月舒波。 沙平水息声影绝,一杯相属君当歌。
        君歌声酸辞且苦,不能听终泪如雨。 洞庭连天九疑高,蛟龙出没猩鼯号。
        十生九死到官所,幽居默默如藏逃。 下床畏蛇食畏药,海气湿蛰熏腥臊。
        昨者州前捶大鼓,嗣皇继圣登夔皋。 赦书一日行万里,罪从大辟皆除死。
        迁者追回流者还,涤瑕荡垢清朝班。 州家申名使家抑,坎轲只得移荆蛮。
        判司卑官不堪说,未免捶楚尘埃间。 同时辈流多上道,天路幽险难追攀。
        君歌且休听我歌,我歌今与君殊科。 一年明月今宵多,人生由命非由他。
        有酒不饮奈明何。
      </p>
    </section>
  </div>
</template>
<script>
export default {
  data() {
    return {
      offsetTop: 0, //上层控件的位置
      offsetWidth: 0, //控件的宽度
      outerDivWidth: 0, //外层div
      fixed: false, //固定状态
    };
  },
  mounted() {
    //1、对整个页面滚轮进行监听,每发生一次滚轮事件,执行一次方法
    window.addEventListener("scroll", this.initHeight);

    //2、对浏览器窗口大小触发事件进行监听
    window.onresize = () => {
      //3、宽度借用,赋值
      this.outerDivWidth = document.getElementById("outerDivWidth");
      this.offsetWidth = this.outerDivWidth - 15;
      document.getElementById("CeilingType").style.width =
        this.offsetWidth + "px";
    };

    // DOM异步更新 对未来更新后的视图进行操作 在更新后执行
    this.$nextTick(() => {
      //获取页面顶端的属性值
      var height = document.getElementById("CeilingType");
      this.offsetTop = height.offsetTop + 60;
      //获取标签的宽度
      this.offsetWidth = height.offsetWidth;
      console.log(this.offsetWidth, "当前标签的宽度");
    });
  },
  methods: {
    initHeight() {
      //1、适配浏览器的兼容性,从而获取页面的滚动距离
      var scrollTop =
        window.pageYOffset ||
        document.documentElement.scrollTop ||
        document.body.scrollTop;
      //2、判断滚动距离是否大于元素到顶端距离
      this.fixed = scrollTop > this.offsetTop ? true : false;
      //3、将标签的宽度进行赋值
      document.getElementById("CeilingType").style.width =
        this.offsetWidth + "px";
    },
  },

  destroyed() {
    //移除监听
    window.removeEventListener("scroll", this.initHeight);
  },
};
</script>
<style scoped>
.CeilingType {
  position: fixed;
  top: 2%;
}
.ceiling {
  display: flex;
}
#outerDivWidth {
  width: 190px;
}
img {
  vertical-align: middle;
}
</style>


📖 博主致谢

感谢大家阅读到结尾,本次的文章就分享到这里,总结了前端实现div标签p标签等吸顶效果【Vue+原生JS组合写法】,希望可以帮到大家,谢谢。

如果您觉得这篇文章有帮助到您的的话不妨【关注+点赞+收藏+评论+转发 】支持一下哟~~😛您的支持就是我更新的最大动力。👇👇👇👇👇👇
在这里插入图片描述


🛩往期精彩:

史上最全的Vue生命周期钩子函数11个

一文图解前端WebSocket 实时通信

如何使用csdn里的自定义模块管理专栏,看这一篇就够了。

码云(gitee)配置ssh密钥的步骤?与解决git每次提交用户名的问题

Visual Studio Code插件-前端工程师开发必备

<think>好的,用户想要在Vue2中实现锚点功能的组件代码。首先,我得确认锚点功能的基本实现方式。在传统的HTML中,锚点通过id和a标签的href属性来实现,比如点击链接跳转到对应id的元素位置。但在Vue中,尤其是单页面应用,可能需要处理路由和滚动行为。不过用户提到的是页面内的锚点跳转,所以应该不需要涉及路由,而是同一页面的滚动。 接下来,我需要考虑平滑滚动效原生的scrollIntoView方法可以通过设置behavior: 'smooth'来实现平滑滚动。不过,可能有些旧浏览器不支持这个参数,但用户可能更倾向于使用现代浏览器的特性,或者需要兼容性处理。另外,Vue的组件化开发需要将锚点功能封装成可复用的组件,比如一个锚点菜单组件和对应的内容区域。 然后,查看用户提供的引用内容,里面有提到Vue3的实现,但用户需要的是Vue2的示例代码。需要将Vue3的语法转换为Vue2兼容的写法,比如使用Options API,以及Vue2的事件绑定方式。例如,在Vue3中使用<script setup>,而Vue2中需要导出组件选项对象。 另外,引用中提到了吸顶,即锚点菜单固定在顶部。这可以通过CSS的position: sticky或者监听滚动事件动态添加类名来实现。这里可能需要使用Vue的指令或者计算属性来处理滚动时的样式变化。 用户可能还需要处理点击锚点后的滚动行为,并高亮当前所在的章节。这可以通过监听滚动事件,检测各章节的位置,并更新当前激活的锚点来实现。可以使用Vue的响应式数据来管理当前激活的索引,并结合v-bind:class来动态添加高亮样式。 在代码结构上,可能需要两个组件:一个锚点菜单组件,包含多个链接;多个内容区块,每个区块有对应的id。当点击菜单中的链接时,页面平滑滚动到对应的区块。同时,当用户手动滚动页面时,菜单的高亮项应自动更新。 还需要考虑性能问题,比如滚动事件的节流处理,避免频繁触发导致页面卡顿。可以使用lodash的throttle函数或者自定义节流逻辑。 最后,要确保示例代码的完整性和可运行性,包括模板部分、脚本部分和样式部分。同时,代码中需要注释说明关键步骤,帮助用户理解实现原理。</think>### Vue2实现锚点跳转组件示例 #### 基本实现原理 在Vue2中实现锚点定位主要依赖原生DOM操作和滚动控制。通过`document.querySelector`定位目标元素,使用`scrollIntoView`实现平滑滚动[^2]。 ```vue <template> <div class="anchor-container"> <!-- 锚点菜单 --> <div class="anchor-menu"> <button v-for="(item, index) in sections" :key="index" @click="scrollTo(item.id)" :class="{ active: activeIndex === index }" > {{ item.title }} </button> </div> <!-- 内容区域 --> <div v-for="(item, index) in sections" :key="index" :id="item.id" class="content-section" > <h2>{{ item.title }}</h2> <p>{{ item.content }}</p> </div> </div> </template> <script> export default { data() { return { activeIndex: 0, sections: [ { id: 'section1', title: '章节一', content: '...' }, { id: 'section2', title: '章节二', content: '...' }, { id: 'section3', title: '章节三', content: '...' } ] } }, mounted() { window.addEventListener('scroll', this.handleScroll) }, beforeDestroy() { window.removeEventListener('scroll', this.handleScroll) }, methods: { scrollTo(id) { const element = document.querySelector(`#${id}`) if (element) { element.scrollIntoView({ behavior: 'smooth', block: 'start' }) } }, handleScroll() { const sections = this.sections.map(item => document.querySelector(`#${item.id}`) ) sections.forEach((el, index) => { const rect = el.getBoundingClientRect() if (rect.top <= 100 && rect.bottom >= 100) { this.activeIndex = index } }) } } } </script> <style scoped> .anchor-menu { position: sticky; top: 0; background: white; z-index: 100; } .active { color: #409EFF; font-weight: bold; } .content-section { height: 800px; padding: 20px; border-bottom: 1px solid #eee; } </style> ``` #### 功能亮点 1. 平滑滚动动画:使用`scrollIntoView`的behavior参数实现 2. 自动高亮当前章节:通过`getBoundingClientRect`检测元素位置 3. 吸顶菜单:CSS的`position: sticky`实现固定定位
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水香木鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值