创建指令

ng g d drap-table-column

import {AfterViewInit, Directive, ElementRef, Input} from '@angular/core';@Directive({selector: '[appDrapTableColumn]'
})export class DrapTableColumnDirective implements AfterViewInit {@Input('appDrapTableColumn') columnWidths: string[];@Input() usePixel = false;constructor(private $element: ElementRef<HTMLTableElement>) {}ngAfterViewInit() {const el = (() => {let result = this.$element.nativeElement;if (result.tagName === 'NZ-TABLE') {result = result.querySelector('table');}if (result.tagName !== 'TABLE') {throw new TypeError('Must be a TABLE element');}if (!result.tHead) {throw new TypeError('Must have a THEAD element');}return result;})();el.classList.add('table-resizable');const tr = el.tHead.rows[0];if (!tr) {throw new TypeError('Must have at least one TR element inside THEAD element');}setTimeout(() => {const ths = Array.from(tr.cells) as HTMLTableHeaderCellElement[];if (ths.length <= 1) { return; }--ths.length; // 最后一个方格总是自动列宽的(用于占满整行)if (!Array.isArray(this.columnWidths)) {this.columnWidths = new Array(ths.length).fill('');} else {this.columnWidths.length = ths.length;this.columnWidths.forEach((x, i, arr) => {if (!x) {arr[i] = '';}});}ths.forEach(th => {if (th.classList.contains('no-resize')) {return;}if (this.columnWidths[th.cellIndex]) {th.width = this.columnWidths[th.cellIndex];}const i = document.createElement('i');i.classList.add('resize-indicator');th.appendChild(i);i.addEventListener('mousedown', e => {if (e.button === 1) { // 鼠标中键th.width = '';return;}if (e.button !== 0) {return;}const startX = e.pageX;const startThWidth = th.clientWidth;document.body.classList.add('table-resizing');let mousemoveHandler;document.body.addEventListener('mousemove', mousemoveHandler = e => {if (e.button !== 0) {return;}const pixel = e.pageX - startX + startThWidth;if (this.usePixel) {th.width = pixel + '';} else {th.width = pixel / tr.offsetWidth * 100 + '%';}this.columnWidths[th.cellIndex] = th.width;});document.body.addEventListener('mouseup', e => {if (e.button !== 0) {return;}document.body.removeEventListener('mousemove', mousemoveHandler);document.body.classList.remove('table-resizing');}, { once: true });});});});}
}

缩放样式

.table-resizable th {position: relative;
}body.table-resizing {cursor: col-resize !important;user-select: none;
}.resize-indicator {display: block;position: absolute;top: 0;right: -5px;width: 9px;height: 100%;cursor: col-resize;
}

在app.module.ts中引入自定义指令

import {NgModule} from '@angular/core';
import {DrapTableColumnDirective} from './drap-table-column.directive';@NgModule({declarations: [DrapTableColumnDirective],exports: [DrapTableColumnDirective],providers: []
})
export class DirectiveModule { }

在app.module.ts中引入自定义指令

imports: [DirectiveModule
],

使用

<nz-table [appDrapTableColumn]></nz-table>

ngzorro 自定义指令操作 nz-table 列拖动缩放相关推荐

  1. oracle adf 自定义lov,Oracle ADF table列自定义过滤组件的方法

    shortDesc="#{bindings.Pay0detailVO1.hints.Vsource.tooltip}" id="soc41" contentSt ...

  2. bootstrap table 列拖动变宽

    需要导入 colResizable-1.6.min.js /**_ _____ _ _ _ | | __ \ (_) | | | | ___ ___ | | |__) |___ ___ _ _____ ...

  3. angular ngzorro 表格用自定义指令实现自由缩放列宽

    版本 "@angular/core": "~10.0.3" "ng-zorro-antd": "^10.2.2" 实现思 ...

  4. vue 图片拖动加载 类似于地图_前端性能优化之图片懒加载(附vue自定义指令)...

    作者:lzg9527 链接:https://juejin.cn/post/6903774214780616718 在类电商类项目,往往存在大量的图片,如 banner 广告图,菜单导航图,美团等商家列 ...

  5. Bootstrap Table列宽拖动的方法

    Bootstrap Table可拖动列,需要用到它的Resizable扩展插件 需要引入 bootstrap-table扩展插件 bootstrap-table-resizable.js 这个插件还依 ...

  6. iview 自定义指令实现Table左右横向拖拽

    有时候表格内容会很多,需要横向滚动查看右边的内容,又不想到底部拖动滚动条,如果能直接在内容中拖动就好了,这个时候就可以用 vue 的自定义指令来实现了. 为了以后扩展指令方便,创建 directive ...

  7. VUE使用自定义指令对普通 DOM 元素进行底层操作

    使用vue的自定义指令来整合某个重复使用的底层操作 举个聚焦输入框的例子,如下: 当页面加载时,该元素将获得焦点 (注意:autofocus 在移动版 Safari 上不工作).事实上,只要你在打开这 ...

  8. Vue自定义指令原来这么简单

    本篇学习目标 能够了解组件进阶知识 能够掌握自定义指令创建和使用 能够完成tabbar案例的开发 1. 组件进阶 1.0 组件进阶 - 动态组件 目标: 多个组件使用同一个挂载点,并动态切换,这就是动 ...

  9. Day06_动态组件_插槽_自定义指令_tabbar案例

    Day06_动态组件_插槽_自定义指令_tabbar案例 文章目录 Day06_动态组件_插槽_自定义指令_tabbar案例 知识点自测 今日学习目标 1. 组件进阶 1.0 组件进阶 - 动态组件 ...

最新文章

  1. 8Manage:如何变革性的加强企业采购管理?
  2. python 魔法函数 运行时_16个python常用魔法函数
  3. bn层Expected more than 1 value per channel when training, got input size torch.Size
  4. 设置Network id:      5777 in MetaMask
  5. 关于.NET参数传递方式的思考
  6. zigbee vs 433
  7. PAT1048 数字加密 (20 分)
  8. 寺库商用区块链落地,联盟链为每件奢侈品发“×××”
  9. Elasticsearch实践(四):IK分词
  10. 2021-09-13冷启动问题主要分为 3 类,用户冷启动,即如何给新用户做个性化推荐物品冷启动,即如何将新的物品推荐给可能对它感兴趣的用户系统冷启动,即如何在一个新开发的网站
  11. 得把这东西留起来,经常看看
  12. 计算机绘图cad2016,帮忙用cad画图计算机绘图线下形考册2016秋
  13. [转载]拥抱Jini:从Starter Kit 2.0开始(第一部分)
  14. SuperMap 产品安全白皮书
  15. 人工智能物联网开发的目录
  16. pta 哥尼斯堡的“七桥问题”
  17. 真没想到,疫情让我实现了远程办公的夙愿
  18. 让bootstrap兼容ie6 ie7 ie8 ie9 ie10 ie11的解决方法
  19. python数据分析-线性回归选择基金
  20. 不能初始化Photoshop 因为暂存盘已满

热门文章

  1. video标签 设置背景图片
  2. dwmac/stmmac/eqos 远程唤醒(WOL) 驱动
  3. 如何用Xshell快速连接远程电脑
  4. 一行神奇的javascript代码
  5. 【ZCMU1411】喜闻乐见的a+b(20进制a+b)
  6. 关于类似“石头、剪刀、布”游戏,需要循环判断的,判断条件设计技巧
  7. APP启动页隐私弹窗实现说明
  8. 关于程序员的几个小段子
  9. HttpGET和POST的详细区别
  10. 关于1M=1024K 和1M=1000K的主要使用区别