Vue React实现Anchor锚点组件

2023-11-10

Vue实现
// 使用: 
// 页面引入 `import Anchor from './../../../components/common/Anchor'`
// <Anchor :title="title" v-if="title.t0"/>
<template>
  <div class="anchor-container">
    <div class="nav-icon common">
      <i class="icon iconfont icon-Voucherarrangement"></i>
    </div>
    <div class="nav-bar common">
      <div class="nav-bar-index">
        <a v-for="(item,index) in nameList"
           :key="index"
           @click="onClick">{{item.name}}</a>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      nameList: []
    };
  },
  props: {
    title: {
      type: Object,
      default() {
        return {};
      }
    }
  },
  created() {
    this.initTitle();
  },
  methods: {
    initTitle() {
    //处理title对象,得到锚点列表对象数组nameList
      let arr = [];
      let obj = this.title;
      Object.keys(obj).forEach((element, index) => {
        arr.push({ name: obj[element] });
      });
      this.nameList = arr;

	//这里实现给每个子表添加id作为标识
      var i;
      for (i = 0; i < this.nameList.length; i++) {
        document
          .getElementsByClassName("card")
          [i + 1].setAttribute("id", this.nameList[i].name);
      }
    },
    onClick(e) {
    //e.target.innerText与id相同
    //获取到元素的offsetTop顶部距离
      let offsetTop = document.getElementById(e.target.innerText).offsetTop;
      //滚动页面的section标签内的部分
      document.getElementsByTagName("section")[0].scrollTo({ top: offsetTop });
    }
  }
};
</script>
<style scope>
.anchor-container {
  z-index: 1000;
  position: absolute;
  top: 0px;
  right: 0px;
}
.anchor-container:hover .nav-bar {
  display: block;
}
.anchor-container i.icon-Voucherarrangement {
  color: #80808082;
  font-size: 33px;
  line-height: 36px;
  text-align: center;
}
.anchor-container .common {
  position: absolute;
  top: 91px;
  right: 25px;
  border: 1px solid rgb(238, 238, 238);
  border-radius: 3px;
  box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 5px;
  background-color: white;
}
.anchor-container .nav-icon {
  width: 34px;
  height: 34px;
}
.anchor-container .nav-bar {
  width: 150px;
  right: 23px;
  top: 88px;
  padding: 17px;
  background-color: #fff;
  display: none;
}
.nav-bar-index {
  width: 70%;
  border-left: 1px solid rgba(0, 0, 0, 0.15);
  vertical-align: top;
  padding-left: 13px;
  line-height: 32px;
}
.nav-bar-index a {
  display: block;
}
html {
  width: 100%;
  height: auto;
  overflow-x: hidden;
}
</style>

实现效果图
在这里插入图片描述

React实现

项目中封的组件总结,在tinper-bee之上封装的锚点组件,实现了功能,但不是最完美的解决方法,仅作记录。

//传入anchorData,content中存放锚点节点的组件
//例如content(<div>组件</div>)
  const anchorData = [
    {
      href: "one",
      id: "first",
      name: "营业执照识别",
      content: ""
    }, {
      href: "two",
      id: "scond",
      name: "子表",
      content: ""
    }
  ]
import './index.less'
import React, { Component } from 'react';
import { Anchor as AnchorBee } from 'tinper-bee';
import '../../style/utils/iconfont.css'
class Anchor extends Component {
  constructor(props) {
    super(props);
    this.state = {
    }
  };

  handleClick(href, e) {
    e.preventDefault();
    let offsetTop = document.getElementById(href).offsetTop;
    window.scroll({ top: offsetTop, behavior: "smooth" });
  };

  render() {
    const { anchorData } = this.props;
    //anchorData中存放锚点
    return (
      <div className="demo1">
        <div className="content">
          {
            anchorData.map((item, index) => {
              return (
                <div id={item.href} key={index}>
                  {item.content}
                </div>
              )
            })
          }
        </div>
        <div className="float-block">
          <AnchorBee nid="aaa" selector="#my-awesome-nav a" className="my-anchorBee">
            <ul id="my-awesome-nav" className="border-style ">
              <div>
                {
                  anchorData.map((item, index) => {
                    return (
                    //添加id为唯一标识
                      <li><a id={item.href} href={`#${item.href}`} onClick={this.handleClick.bind(this, item.href)}>{item.name}</a></li>
                    )
                  })
                }
              </div>
            </ul>
          </AnchorBee>
          <div className="close-block border-style">
            <i className="iconfont close">&#xe626;</i>
          </div>
        </div>
      </div>
    )
  }
}
export default Anchor;

效果图
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue React实现Anchor锚点组件 的相关文章

随机推荐

  • 公众号如何快速接入查题功能

    最近很多同学私信小睿 我不会编程 写代码 我怎么能做一个自己的查题公众号呢 既然这么多同学最近在问 那小睿今天就来告诉大家 调用量瞩目 首先你需要一个查题的接口 然后配置到公众号内就可以了 那么接口从哪儿来呢 当然是找小睿啦 小睿为了使大家
  • 内核自带的基于GPIO的LED驱动学习(二)

    2 分析平台驱动的probe函数 好 既然这个LED驱动使用的是平台驱动框架 当设备和驱动匹配上之后 就会执行指定的probe函数 那接下来的工作就转移到分析对应的probe函数了 为了直观 我把probe函数也粘贴上来 static in
  • 【计算机网络】湖科大微课堂笔记 p2-p3 因特网概述、三种交换方式

    视频 计算机网络已从通信基础设施发展成重要的信息服务基础设施 因特网概述 网络 互联网和因特网的概念 理解 因特网发展的三个阶段 了解 因特网的标准化工作 了解 因特网的组成 理解 网络 互联网和因特网的概念 理解 左图是网络 右图是互联网
  • 转:《C++ Templates》读书笔记

    有三种模板参数 形参 1 类型参数 这是使用得最多的 2 非类型参数 3 模板的模板参数 类型参数 类型参数是通过关键字typename或者class引入 关键字后面必须是一个简单的标识符 后面用逗号来隔开下一个参数声明 等号代表接下来的是
  • U盘病毒 hypertrm.exe 修复

    1 最近电脑中了这种病毒 没有直观的感觉 不会蓝屏 也不会有其他任何异样 恶心的是他在我每次插入U盘的时候会提示INF默认安装 我没有对病毒样本做分析 感觉他只是创建了系统钩子 导致我尽管杀掉了u盘里所有的病毒 再次插上一切还会重来 2 解
  • String转字节数组

    Java语言中字符串类型和字节数组类型相互之间的转换是经常发生的 网上的分析以及代码也比较多 本文将分析分析常规的byte 和String之间的转换 1 String转byte 就是调用String类的getBytes 方法 如果没有带参数
  • 企业微信中授权小程序

    授权的时候先判断当前小程序运行环境 使用企业微信专有接口wx getSystemInfo if res environment wxwork 企业微信环境 wx qy login 获取企业微信派发的临时登录凭证 success res gt
  • PCL 计算点云的主曲率

    目录 一 算法原理 1 算法源码 2 特别提醒 3 曲率显示 二 代码实现 三 结果展示 四 测试数据 一 算法原理 1 算法源码 template
  • 用消息队列实现AB进程随时通信,在共享内存中循环逆置打印字符串

    一 要求实现AB进程随时对话 A进程发送一句话给B进程 B进程接收后打印 B进程回复一句话给A进程 A进程接收后打印 随机重复1 2步骤 当收到quit后 要结束AB进程 A进程 include
  • Python 爬取高校历年分数线

    最近一周一直在帮家里小弟看高考志愿 所以更新的没那么频繁了 请大家见谅 在看各高校的往年分数时 忍不住手痒 想着能不能给它爬下来 哈哈 说干就干 1 流程分析 之前无意中在这个网站发现有各个高校的历年录取分数线 https gkcx eol
  • 绕过过滤的空白字符

  • R语言-用stringr包处理字符串

    1 字符数统计和字符翻译 1 1 nchar和length nchar这个函数简单 统计向量中每个元素的字符个数 注意这个函数和length函数的差别 nchar是向量元素的字符个数 而length是向量长度 向量元素的个数 x lt c
  • python如何将多个文件夹的PNG图片批量转换为jpg图片(无损转换)

    一般不需要后期处理分析的照片无需使用PNG格式 对于普通的风景人物的照片可以无损转换为jpg格式 这个过程只是将原图png格式中保存空白信息的多余通道去掉而已 并不会影响画质 而内存一般可以变为原来的四分之一 对于图片收藏爱好者来说 可以节
  • ES2015数组扩展 - Array.from()

    Array from方法用于把两类对象转为真正的数组 类似数组的对象 array like object 和可遍历 iterable 的对象 包括ES6新增的数据结构Set和Map 下面是一个类似数组的对象 Array from将它转为真正
  • YOLO V6论文精读

    1 Introduction 在论文中 作者通过实证观察了几个促使我们重新提供YOLO框架的重要因素 1 从RepVGG 3 中重新参数化是一种优越的技术 在检测中尚未得到很好的利用 我们还注意到 对RepVGG块进行简单的模型缩放变得不切
  • 开发启动rsync服务的脚本

    rsync服务的重要性不言而喻 但是一般我们都是rsync daemon启动 我们可以启动rsync服务在init d目录下呢 只要我们写个脚本就OK了 root zyj cat etc init d rsyncd bin bash cre
  • 为金融而生的区块链Injective(INJ)

    Injective背景 Injective 是 Binance Labs 2018 年第一期孵化的八个项目之一 已经获得了众多机构的支持 包括全球顶尖的加密货币风险投资公司之一 Pantera Capital Injective 的核心团队
  • 【蓝桥杯学习笔记】2. 最大公约数和最小公倍数

    系列文章目录 蓝桥杯学习笔记 1 入门基本语法及练习题 文章目录 系列文章目录 前言 一 最大公约数 二 最小公倍数 总结 前言 蓝桥本笔记 从入门到放弃 本片文章使用Python语言编写 Now is better than never
  • openEuler软件包加固项目笔记

    项目概要 使用mugen框架对openEuler操作系统的软件包rubygem bacon进行测试 记录issue 涉及到一些保密性 我有些东西不便细述 因此设置了查看权限 一 申请云服务器 openEuler操作系统安装 说明 安装ope
  • Vue React实现Anchor锚点组件

    Vue实现 使用 页面引入 import Anchor from components common Anchor