Angular2 使用html实现右键菜单

Angular2 使用html实现右键菜单

介绍

目前做的项目是接的别的公司的二期,使用的是被的公司做一期时用的架子,还是Angular2。目前有单元格右键的需求,找了半天没实现最后用html的形式实现,记录一下。

实验

看网上说使用ng-zorro-antd来开发,但是看了ng-zorro-antd官网后知道,目前最新的版本是14,而最低的版本是0.5,但是0.5版本只支持Angular4,所以2肯定是不支持的,网上其他大神的Angular2使用ng-zorro-antd是怎么实现的?
在这里插入图片描述
不过抱着试试的态度也进行时实现,首选安装的是0.5的版本,但是安装完成后才发现,此版本没有鼠标右键的功能,看了官网才知道 到0.7版本才加入NzDropdownService,所以切换成0.7版本。
在这里插入图片描述
安装0.7版本运行后报 No provider for Overlay NzDropdownService 的错,但是明明已经将NzDropdownService 添加到provider 了。查询的结果是建议升级Angular到版本4或者版本5。

使用html方式

废话少说,直接上代码:
html中代码:

调用方法:
         <p-autoComplete
                  placeholder="颜色"
                  [style.width]="'100%'" 
                  (contextmenu)="contextMenu($event,'colorTypeName',post['colorTypeName'],rowIndex)"
                  appendTo="body">
                </p-autoComplete>
右键面板:
  <div id="menu" class="menu">
    <app-paper-form-row>
      <button class="btn btn-link button" (click)="openModal('up')">向上填充</button>
    </app-paper-form-row>
    <app-paper-form-row>
      <button class="btn btn-link button" (click)="openModal('down')">向下填充</button>
    </app-paper-form-row>
  </div>

ts文件的

  ngOnInit() {
  //禁用鼠标本身右键
    document.oncontextmenu = function () {
      return false;
    };
  }

  contextMenu(e: MouseEvent, name: String, value: any, index: number) {
    //传过来的值
    this.name = name;
    this.value = value;
    this.index = index;
    //获取右键面板
    const menu = document.getElementById('menu');
    //设置面板位置
    menu.style.left = e.clientX + 'px';
    menu.style.top = (e.clientY - 70) + 'px';
    //添加显示样式
    menu.classList.add('active');
    //关闭右键菜单
    window.addEventListener('click', function () {
      menu.classList.remove('active');
    });
  }

 openModal(item) {
    const num = this._data['materialList'].length;
    if (item === 'up') {
    //向上填充的操作
    } else {
    //向下填充的操作
    }

css代码:

.menu{
  position: absolute;
  top:0px;
  left: 0px;
  background: #fff;
  border: 1px solid #ccc;
  font-size: 18px;
  visibility: hidden;
  height: 50px;
  text-align: center;
  border-radius:5px;
}
.active{
  visibility: visible;
}
.button{
  margin: 10px;
  line-height: 25px;
  font-size:16px;
}

效果图:
样式写的不太好看不过将就能看。
在这里插入图片描述

这还遇到个问题就是 这种获取面板位置的情况不能出现滚动条,有滚动条就会显示的位置不对,所以再定位面板位置的时候需要将滚动条离上边距加上。

试验了很多获取滚动条距离都是0,有人说不同浏览器获取方式不同。

const st = document.documentElement.scrollTop || document.body.scrollTop

这种也获取不到。最后根据鼠标点击事件来获取位置,由于我的鼠标右键只限定表格的单元格,所以表格table离最外层的元素有4层,所以使用点击事件往上找4层然后获取scrollTop

    let scrollTopValue = 0;
    if (e.currentTarget['offsetParent'].offsetParent.offsetParent.offsetParent) {
      scrollTopValue = e.currentTarget['offsetParent'].offsetParent.offsetParent.offsetParent.scrollTop;
    }
    menu.style.top = (e.clientY - 70 + scrollTopValue) + 'px';

这样无论出现多少滚动,面板出现的位置是原来获取的加上滚动条离上边距的高度,就能实现如影随形。

== 完结撒花 ==

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值