在table中tr的display:block显示布局错乱问题

本文讨论了一个在使用AJAX交互显示<tr>标签时遇到的问题,即在Firefox浏览器中出现的布局错乱现象。通过分析不同浏览器的行为,提出了解决方案,包括使用display:table-row属性、JS兼容性处理和不加任何display属性的简单方法。文章旨在提供解决跨浏览器兼容性问题的思路。

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

最近在作项目的时候碰到一个问题,就是需要AJAX来交互显示<tr></tr>标签内的东西,按照常理,对于某一单元行需要显示时,使用:display:block属性,不需要显示时使用display:none属性,而且这样做在IE浏览器中显示正常,没有任何问题。

但是当用Firefox浏览时却出现了布局错乱的问题,然后通FireBug去看了下源码,调试下了,发现是display:block属性搞的鬼。

1、当表格为多列的情况下,属性为"display:block"行的内容宽度仅与第一列宽度相同,也就是说无论你使colspan的属性值为多少,剩余列的空间都不进行解析。
2、同一行反复的在"display:none;"与"display:block;"两个状态间切换时,表格的底部会持续的产生多余的空白空间以至于造成页面布局的扭曲。

解决方法:
1、用display:table-row属性来调试,发现者FireFox下正常了,但IE是不支持改属性的,怎么办呢?用JS来做判断,然后做兼容吧。

2、另外一个很简单也很可行的方法,就是用 display:' '这个属性dispaly后面不加任何的东西,很奇怪,这样就兼容了Firefox和IE了。具体原因有待牛人分析。

文章转载于:http://blog.sina.com.cn/s/blog_5b6c4f550100yk4x.html

<template> <div class="factory-container"> <div v-for="factory in pageList" :key="factory.fact" class="factory-table"> <h2>Factory: {{ factory.fact }}</h2> <div class="table-wrapper"> <table class="data-table"> <!-- 表头 --> <thead> <tr class="header-row"> <th rowspan="2">Factory</th> <th rowspan="2">Season</th> <th colspan="2"> <div class="two-line-header"> <span>Golf</span> <span>(CLUB SPORTS)</span> </div> </th> <th colspan="2"> <div class="two-line-header"> <span>Jordan</span> <span>(Jordan W's/Mens)</span> </div> </th> <th colspan="3"> <div class="two-line-header"> <span>Kids</span> <span>(Jordan GS/PS/TD)</span> </div> </th> <th colspan="3"> <div class="two-line-header"> <span>Sports lifestyle</span> <span>(ACG/BOOTS,CLASSICS,SPORTSTYLE INNOVATION)</span> </div> </th> <th rowspan="2">總計</th> <th rowspan="2">TOTAL ALL 聯名款</th> </tr> <tr class="sub-header-row"> <th> <div class="two-line-header"> <span>JD Golf</span> <span>Golf</span> </div> </th> <th> <div class="two-line-header"> <span>GOLF</span> <span>Golf</span> </div> </th> <th> <div class="two-line-header"> <span>JD</span> <span>JD 聯名款</span> </div> </th> <th> <div class="two-line-header"> <span>JD</span> <span>JD 成人鞋</span> </div> </th> <th> <div class="two-line-header"> <span>JD GS</span> <span>JD大童</span> </div> </th> <th> <div class="two-line-header"> <span>JD PS</span> <span>JD中童</span> </div> </th> <th> <div class="two-line-header"> <span>JD TD</span> <span>JD小童</span> </div> </th> <th> <div class="two-line-header"> <span>Inline</span> <span>NSW普通款</span> </div> </th> <th> <div class="two-line-header"> <span>NSW FUEL</span> <span>NSW聯名款</span> </div> </th> <th> <div class="two-line-header"> <span>SLT/SP/GEL/FUL</span> <span>快速訂單</span> </div> </th> </tr> </thead> <!-- 表体 --> <tbody> <template v-for="season in getSeasons(factory.infoList)" :key="season" > <tr class="data-row"> <td rowspan="2">{{ factory.fact }}</td> <td rowspan="2">{{ season }}</td> <!-- Golf --> <td> {{ getValue(factory.infoList, season, "JD GOLF 高尔夫") }} </td> <td>{{ getValue(factory.infoList, season, "GOLF") }}</td> <!-- Jordan --> <td>{{ getValue(factory.infoList, season, "JD 聯名款") }}</td> <td>{{ getValue(factory.infoList, season, "JD 成人鞋") }}</td> <!-- Kids --> <td> {{ getValue(factory.infoList, season, "JD大童") }} </td> <td> {{ getValue(factory.infoList, season, "JD 中童") }} </td> <td> {{ getValue(factory.infoList, season, "JD小童") }} </td> <!-- Sports lifestyle --> <td> {{ getValue(factory.infoList, season, "NSW 普通款") }} </td> <td>{{ getValue(factory.infoList, season, "NSW 聯名款") }}</td> <td> {{ getValue( factory.infoList, season, "SLT/SP/GEL/FUEL 快速訂單" ) }} </td> <!-- 总计 --> <td rowspan="2"> {{ getSeasonTotal(factory.infoList, season) }} </td> <td rowspan="2"> {{ getTotalUnion(factory.infoList, season) }} </td> </tr> <tr class="data-row"> <!-- 第二行数据可以根据需要添加 --> </tr> </template> </tbody> </table> </div> </div> </div> </template> <script setup> import { ref } from "vue"; import { financeClassifyList } from "@/api/planning/page"; const pageList = ref([]); const loading = ref(true); function getList() { loading.value = true; financeClassifyList().then((response) => { pageList.value = response.data; loading.value = false; }); } // 获取所有季节列表(保持原始顺序) const getSeasons = (infoList) => { if (!infoList) return []; const seasons = []; const seenSeasons = new Set(); infoList.forEach((item) => { if (item.season && !seenSeasons.has(item.season)) { seenSeasons.add(item.season); seasons.push(item.season); } }); return seasons; }; // 分类名称规范化函数(处理空格和简繁体) const normalizeClassify = (classify) => { if (!classify) return ''; return classify .replace(/\s+/g, '') // 移除所有空格 .replace(/聯名款/g, '联名款') // 统一简繁体 .replace(/普通款/g, '普通款'); // 保持一致性(虽然简繁体相同) }; const getValue = (infoList, season, classify) => { if (!infoList) return "0"; const normalizedTarget = normalizeClassify(classify); const item = infoList.find(i => i.season == season && i.financeClassify && normalizeClassify(i.financeClassify) === normalizedTarget ); return item ? item.total : "0"; }; // 获取某个季节所有联名款的总计 const getTotalUnion = (infoList, season) => { if (!infoList) return 0; const unionClasses = ["JD 聯名款", "NSW 聯名款"]; return infoList .filter( (item) => item.season == season && unionClasses.includes(item.financeClassify) ) .reduce((sum, item) => sum + (parseInt(item.total) || 0), 0); }; const getSeasonTotal = (infoList, season) => { if (!infoList) return 0; const unionClasses = [ "JD Golf Golf", "GOLF Golf", "JD 成人鞋", "JD 聯名款", "NSW 聯名款", "SLT/SP/GEL/FUEL 快速訂單", "Inline NSW普通款", "JD TD JD小童", "JD PS JD中童", "JD GS JD大童", ]; return infoList .filter( (item) => item.season == season && unionClasses.includes(item.financeClassify) ) .reduce((sum, item) => sum + (parseInt(item.total) || 0), 0); }; getList(); </script> <style scoped> .factory-container { display: flex; flex-direction: column; gap: 30px; padding: 20px; } .factory-table { border: 1px solid #ddd; border-radius: 4px; overflow: hidden; } .factory-table h2 { background-color: #f5f5f5; padding: 10px; margin: 0; border-bottom: 1px solid #ddd; } .table-wrapper { overflow-x: auto; } .data-table { width: 100%; border-collapse: collapse; font-size: 14px; } .data-table th, .data-table td { border: 1px solid #ddd; padding: 8px 12px; text-align: center; } .header-row { background-color: #f2f2f2; font-weight: bold; } .sub-header-row { background-color: #e6e6e6; } .data-row:nth-child(even) { background-color: #f9f9f9; } .data-row:hover { background-color: #f1f1f1; } .two-line-header { display: flex; flex-direction: column; line-height: 1.2; } .two-line-header span { display: block; } /* 调整表头行高以适应两行文本 */ .data-table th { padding: 4px 8px; line-height: 1.2; } .sub-header-row th { height: 50px; /* 根据需要调整高度 */ vertical-align: bottom; } </style> 分析以上代码,当前我需要在显示列表中加一些总计行,把数据行根据季节进行分组,然后每一组的下一行就是添加总计行的位置,季节分组的规则是以SU/FA/HO/SP连续的数据行,比如SU21/FA21/HO21/SP22这样为一组,SU22/FA22/HO22/SP23为下一组,SU23/FA23/HO23/SP24为下一组,以此类推
最新发布
08-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值