实现超过多少行的判断方法很多,统一写了一个公用的通用方法。逻辑是在body中插入一个dom节点,然后把判断行的行数,字体样式,拿过来赋值到新增dom节点进行对比判断。

    运用场景, 例:文字超过三行出现 … 和tooltip提示 等等。

    具体实现方法:

    1. export const isElementCollision = (ele, rowCount = 1, cssStyles, removeChild) => {
    2. if (!ele) {
    3. return false;
    4. }
    5. const clonedNode = ele.cloneNode(true);
    6. // 给clone的dom增加样式
    7. clonedNode.style.overflow = 'visible';
    8. clonedNode.style.display = 'inline-block';
    9. clonedNode.style.width = 'auto';
    10. clonedNode.style.whiteSpace = 'nowrap';
    11. clonedNode.style.visibility = 'hidden';
    12. // 将传入的css字体样式赋值
    13. if (cssStyles) {
    14. Object.keys(cssStyles).forEach((item) => {
    15. clonedNode.style[item] = cssStyles[item];
    16. });
    17. }
    18. // 给clone的dom增加id属性
    19. const containerID = 'collision_node_id';
    20. clonedNode.setAttribute('id', containerID);
    21. let tmpNode = document.getElementById(containerID);
    22. let newNode = clonedNode;
    23. if (tmpNode) {
    24. document.body.replaceChild(clonedNode, tmpNode);
    25. } else {
    26. newNode = document.body.appendChild(clonedNode);
    27. }
    28. // 新增的dom宽度与原dom的宽度*限制行数做对比
    29. const differ = newNode.offsetWidth - ele.offsetWidth * rowCount;
    30. if (removeChild) {
    31. document.body.removeChild(newNode);
    32. }
    33. return differ > 0;
    34. };

    调用方法

    1. **** this.rootElement // 要判断的dom container
    2. **** rowCount // 限制行数
    3. **** cssStyles // 原dom 字体样式(fontSize,fontWeight,letterSpacing)
    4. **** const cssStyles = { fontSize: '26px', fontWeight: 'bold' };
    5. **** removeChild // 计算完成后是否删除clone的dom -- 一般都要删除掉
    6. // 调用方法
    7. isElementCollision(this.rootElement, rowCount, cssStyles, removeChild);diao yo