标题导航点击导航滑动到指定位置&滑动到指定位置选中对应导航vue3

菜单导航栏点击导航滑动到指定位置&滑动到指定位置选中对应导航

效果

在这里插入图片描述

实现

话不多说直接上代码,有用素质三连(点赞、评论、加关注)

import { defineComponent, onBeforeUnmount, onMounted, reactive, ref } from "vue";
import { map } from "lodash";
import { css } from "@emotion/css";
export default defineComponent({
  setup: () => {
    const scrollRef = ref();
    const state = reactive({
      current: 1,
      list: [
        { num: 1, title: "将军令" },
        { num: 2, title: "将军令" },
        { num: 3, title: "将军令" },
        { num: 4, title: "将军令" },
        { num: 5, title: "将军令" },
      ],
    });

    const handleScroll = (e) => {
      state.list.forEach((item) => {
        let scrollTopNum = document.getElementById(`anchor_${item.num}`).offsetTop - 200;
        if (e.target.scrollTop >= scrollTopNum) {
          state.current = item.num;
        }
      });
    };

    const toAnchor = (item) => {
      let scrollTopNum = document.getElementById(`anchor_${item.num}`).offsetTop - 200;
      scrollRef.value.scrollTop = scrollTopNum;
      state.current = item.num;
    };

    onMounted(() => {
      state.current = 1;
      scrollRef.value.addEventListener("scroll", handleScroll, true);
    });
    onBeforeUnmount(() => {
      scrollRef.value && scrollRef.value.removeEventListener && scrollRef.value?.removeEventListener("scroll");
    });

    return () => {
      return (
        <div
          class={css({
            display: "flex",
            alignItems: "center",
            p: {
              color: "#666",
            },
            ".content": {
              width: 500,
              height: 300,
              overflowY: "scroll",
              marginLeft: 300,
              marginRight: 20,
            },
          })}>
          <div className="content" ref={scrollRef}>
            {map(state.list, (item) => {
              return (
                <div id={`anchor_${item.num}`}>
                  <div className="title">{item.title + item.num}</div>
                  <div>
                    <p>歌曲名 将军令 歌手名 吴克群</p>
                    <p>作词:吴克群</p>
                    <p>作曲:吴克群</p>
                    <p>我知道对有什么不对</p>
                    <p>我知道将军说的话不一定对</p>
                    <p>我知道对或错我自己能分辨</p>
                    <p>请你安静点请你安静点</p>
                    <p>Yeah</p>
                    <p>我知道对有什么不对</p>
                    <p>我知道外国的月亮没比较圆</p>
                    <p>我知道yo yo yo</p>
                    <p>不是我的语言</p>
                    <p>请你安静点请你安静点</p>
                    <p>Yeah</p>
                    <p>我是个小兵我绷紧了神经</p>
                    <p>在战场上</p>
                    <p>拼命听谁在发号施令</p>
                    <p>将军在微醺他方向分不清</p>
                    <p>西方人念经他全都听</p>
                    <p>不同的肤色说不同的话语</p>
                    <p>相同的节奏有不同的旋律</p>
                    <p>自己的文化要自己来说明</p>
                    <p>自己的舞台有我们自己顶</p>
                    <p>我知道对有什么不对</p>
                    <p>我知道将军说的话不一定对</p>
                    <p>我知道对或错我自己能分辨</p>
                    <p>请你安静点请你安静点</p>
                  </div>
                </div>
              );
            })}
          </div>

          <el-steps direction="vertical" class={css({ height: "500px !important" })}>
            {map(state.list, (item) => {
              return (
                <el-step
                  status={state.current == item.num ? "finish" : ""}
                  onClick={() => toAnchor(item)}
                  class={css({
                    cursor: "pointer",
                  })}
                />
              );
            })}
          </el-steps>
        </div>
      );
    };
  },
});

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值