table内容超长自动隐藏,鼠标放置后浮动显示全部内容

本文介绍了一种前端开发中处理表格布局的问题解决方案,通过限制单元格宽度并采用特殊样式处理长内容,实现美观且实用的表格展示,同时探讨了rem单位在响应式设计中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

问题描述

解决思路

相关代码

1.限定td的宽度

2.内容特殊处理

3.全局指定动态指定css样式

4.效果如下

延伸

贴两个关于rem/em/px介绍的参考文献


问题描述

有的时候table作为列表展示记录信息的时候,偶尔会出现某一列数据某一些记录内容变的很长,默认如果没有设置td的宽度话,那界面的样式就丑到爆炸,例如如下这种情况,上一页是正常显示的,第三列的内容长度都差不多,但是第二页的时候,整个样式就完全错乱了,因为第三列存在某些记录的内容太长了。

再点击下一页,显示如下:

这显然是不合适的展示方式。

解决思路

可以比较直观想到的几种种结局方案,如下:

1.第一种是把内容容易边长的一列不显示到列表,在详情展示,这可以解决该问题,但是不能根治,而且有局限性,万一需求就是要求这一列展示到列表中呢?

2.后端进行配合,列表接口中对这一列的数据直接进行截取,超多M个字就省略后面的,并添加...结尾,然后再返回前端去展示。这种方案可以在前端不调整的情况下,直接满足要求,但是也有很大局限性和不足。这样返回的数据,被截取的那一列数据在列表中无法看到完整信息,必须有详情页面,但是假如说,本身列表就没几个字段,这时候再做详情页就略显麻烦,还有一个不足在于,这种问题需要后端配合,还要升级版本,对项目的稳定不太好。

3.前端进行处理,限定每一列的宽度,对于内容不确定可能会变长撑乱结构的那一列数据进行特殊样式处理,超出多少长度或者多少个字的时候自动隐藏,鼠标移动到该td时,会自动浮动出全部信息。完全通过前端的css/js来时限。

综上所述,第三种方案相对来说是比较好的解决思路。

相关代码

1.限定td的宽度

function getTableHtml(index, data, page) {
    var tmp = '<tr>' +
        '<th scope="row">' + (index + 1 + ((page - 1) * 10)) + '</th>' +
        '<td  style="width: 7.5rem;vertical-align: center;">' + valueFilter(data.u_name) + '</td>' +
        '<td  style="width: 5.5rem;vertical-align: center;">' + valueFilter(data.sex) + '</td>' +
        '<td  style="width: 5.5rem;">' + valueFilter(data.age) + '</td>' +
        '<td>' + filterComplaint(data.chief_complaint) + '</td>' +
        '<td  style="width: 14rem;">' + data.add_time + '</td>' +
        '<td style="width: 15rem;">' +
        '<a class="detail-button" href="addmedicsub.html?medic_id=' + data.medic_id + '&mid=' + data.id + '"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>编辑</a>&nbsp;&nbsp;&nbsp;' +
        '<a class="detail-button" href="javascript:delFun(' + data.id + ');"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span>删除</a>&nbsp;&nbsp;&nbsp;' +
        "<a class='detail-button' href='javascript:showDetail(" + JSON.stringify(data) + ");'>" + '<span class="glyphicon glyphicon-th-large" aria-hidden="true"></span>详情</a>' +
        '</td></tr>';
    return tmp;
}

注:对需要要进行特殊截取处理的列不限制宽度,其他列都指定具体宽度。

2.内容特殊处理

function filterComplaint(v) {
    var rstr = '无';
    if (strIsEmpty(v)) {
        return '无';
    } else {
        rstr = '<div class="MHover">' + v + '</div>' +
            '<div class="MALL">' + v + '</div>';
    }
    return rstr;
}

3.全局指定动态指定css样式

function bindClass() {
    $(".MALL").hide();
    $(".MHover").mouseover(function (e) {
        $(this).next(".MALL").css({"position":"absolute","top":e.pageY-150,"left":e.pageX}).show();
    });
    $(".MHover").mousemove(function (e) {
        $(this).next(".MALL").css({ "color": "#FFFFFF","z-index":"1000","width":"45rem","padding":"1.3rem","line-height":": 1rem", "position": "absolute", "opacity": "1", "background-color": "#9F7C5C", "top": e.pageY-155, "left": e.pageX });
    });
    $(".MHover").mouseout(function () {
        $(this).next(".MALL").hide();
    });
}

前面两个都非常简单,最关键的代码就在于bindClass方法,通过对样式的鼠标事件进行绑定,来处理鼠标移入和移出时的样式,通过绝对定位,指定浮动层的位置和大小,方法bindClass在生成table的dom后进行调用,否则不生效

4.效果如下

延伸

在指定td的宽度的时候,我使用的rem,这里也建议前端的开发在尽量使用rem em代替px,rem使一个相对单位,是相对于根元素<html>的font-size,所以,他不是一个固定的值。rem集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。

rem是css3新增的一个相对长度单位,它的出现是为了解决em的缺点,em可以说是相对于父级元素的字体大小,当父级元素字体大小改变时,又得重新计算。rem出现就可以解决这样的问题,rem只相对于根目录,即HTML元素。所以只要在html标签上设置字体大小,文档中的字体大小都会以此为参照标准,一般用于自适应布局

贴两个关于rem/em/px介绍的参考文献

【1】彻底弄懂css中的单位rem、em、px

【2】css中常用单位px、em、rem和%的区别及用法总结

 

### 在 Element UI 的 `el-table` 中实现单元格或表格级别的提示效果 为了在 `el-table` 组件中添加提示功能,可以利用 `tooltip` 组件来增强用户体验。具体来说,在定义表格列时可以通过设置 `slot-scope` 来自定义每一列的内容,并在此基础上嵌入 `el-tooltip`。 对于整个表格的提示,则可以在包裹 `el-table` 外层使用 `el-tooltip` 或者针对特定条件下的整行提供悬浮提示。以下是两种方式的具体实现: #### 单元格级别提示 当鼠标悬停于某个具体的单元格上显示额外的信息作为工具提示。这通常用于展示超出可见宽度被截断的文字或其他关联信息。 ```html <template> <el-table :data="tableData"> <!-- 定义一列 --> <el-table-column label="描述" width="180"> <template slot-scope="scope"> <el-tooltip class="item" effect="dark" :content="scope.row.description" placement="top-start"> <div>{{ scope.row.shortDescription }}</div> <!-- 显示简短版本 --> </el-tooltip> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { description: '这是一个非常长的描述', shortDescription: '这是...' }, // 更多的数据... ] }; } }; </script> ``` 此代码片段展示了如何在一个名为 "描述" 的列里应用 `el-tooltip`[^1]。 #### 行级别提示 如果希望给某一行整体增加提示信息,可以直接将 `el-tooltip` 应用到该行对应的模板区域。这种方式适用于每行都有统一的附加说明场景。 ```html <template> <el-table :data="tableData"> <el-tooltip v-for="(row, index) in tableData" :key="index" effect="light" content="这里是行级提示内容" placement="right"> <el-table-row :row="row">...</el-table-row> </el-tooltip> </el-table> </template> ``` 需要注意的是上述例子中的 `<el-table-row>` 并不是实际存在的标签;它仅用来示意逻辑结构。实际上应该把 `v-for` 和 `el-tooltip` 放置在外围容器内,而内部保持正常的 `el-table-column` 结构[^2]。 另外一种更简洁的方法是在 CSS 上为 `.el-table__body tr:hover` 添加样式触发器,配合伪类`:after`创建浮动框模拟简单的提示效果,但这可能不如直接使用组件灵活可控。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值