element-plus折叠面板如何结合锚点(锚点不用组件)

  1. 折叠面板:去网站复制代码到自己的文件官网

  2. 锚点:用菜单组件做布局

  3. 绑定

    1. 在菜单组件设置
      :default-active="activeSection"写菜单组件里面
      
      
      const activeSection = ref('1');定义

      default-active 用于设置组件加载时哪个面板是展开状态。 

       @select="handleSelect"

      绑定事件

    2. 折叠面板设置
      v-model="activeNames"
      复制的都有这个
      要定义哟
      const activeNames = ref([]);
       <el-collapse-item 
                          name="2"
                          id="2"
                      >
      绑上id和name,锚点功能靠id,展开功能靠name
    3. 设置handleSelect
      1. const handleSelect = (key) => {
          activeNames.value = [key];
        }

        实现点击锚点菜单展开

      2. const handleSelect = (key) => {
          activeNames.value = [key];//展开
          const element = document.getElementById(key);//获取是哪个面板
          if (element) {
            element.scrollIntoView({ behavior: 'smooth', block: 'nearest' });//滚动
        }
        element.scrollIntoView({ behavior: 'smooth', block: 'nearest' });

        behavior: 'smooth':表示滚动将以平滑的方式进行,而不是瞬间跳转。block: 'nearest':如果目标元素已经在可视区域内,它将尽量只滚动到最近的位置,避免多余的滚动,除了这个还有center,start

  4. 锚点定位其他面板不关闭 

  • 到上一步已经实现功能了,但点击锚点之前打开的面板要关闭是因为activeNames.value = [key]只设置了一个key值
  • 实现:
  1. 设置 添加activeNames.value的值
    activeNames.value.push(key); 

    这里设置了就实现了,但效果不好

  2.       设置延时等待dom更新
  • 原因:由于dom没更新导致锚点功能无法到理想的位置,需要再点击一下
  • 解决:设置nextTick
    1. nextTick:这个函数会等待下一个 DOM 更新周期,确保在调用 scrollIntoView 时元素的状态已经更新。
      import { nextTick } from 'vue';
      
      const handleSelect = async (key) => {
        activeNames.value.push(key); // 展开面板
        await nextTick(); // 等待 DOM 更新
      
        const element = document.getElementById(key); // 获取元素
        if (element) {
          element.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // 滚动到该元素
        }
      };
  •              使用 setTimeout: 

  • 完整代码

    1. import { nextTick } from 'vue';
      
      const handleSelect = async (key) => {
        // 展开面板
        activeNames.value.push(key);
        
        await nextTick(); // 等待 DOM 更新
        
        const element = document.getElementById(key); // 获取元素
        if (element) {
          // 添加一定的延迟,确保元素在 DOM 中可见
          setTimeout(() => {
            element.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
          }, 100); // 100ms 的延迟
        }
      };

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML中实现锚点定位并具有滚动效果的方法有多种。一种常见的方法是使用CSS的scroll-behavior属性和a标签的href属性。首先,在CSS中设置scroll-behavior属性为smooth,这将使得滚动条在滚动时具有平滑的效果。然后,在a标签中的href属性中设置目标位置的id值,例如#section。当点击该链接时,页面将会平滑滚动到相应的目标位置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [HTML锚点定位+平滑滚动](https://blog.csdn.net/m0_64520392/article/details/128941349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [微信小程序-scroll-view滚动到指定位置(类似锚点)](https://download.csdn.net/download/weixin_38601878/16213063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例](https://download.csdn.net/download/weixin_38665822/13982520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值