首页 > 其他分享 >CSS:table单实线边框的实现方案与浏览器兼容性验证

CSS:table单实线边框的实现方案与浏览器兼容性验证

时间:2023-08-25 14:05:14浏览次数:30  
标签:方案 兼容性 collapse 单元格 边框 table border CSS

摘要
本文主要探讨table单实线边框的几种实现方案,以及各个方案的浏览器兼容性验证(Chrome、Edge、Firefox、IE)。

引子

项目上希望业务表单在填写时,展现形式可以做成该表单实际打印出来的样子,而不是Element UI等前端框架所提供的form样式。

CSS:table单实线边框的实现方案与浏览器兼容性验证_CSS

在使用table做表单时,Chrome出现了表格边框粗细不一的情况(IE下表现正常),由此引出了本文的课题。

CSS:table单实线边框的实现方案与浏览器兼容性验证_实线_02

问题溯源

当前table是通过border-collapse: collapse属性,来设置边框合并为单一边框的。

在上网查阅资料时,看到这样一种说法:border-collapse: collapse在与单元格合并(colspan/rowspan)同时使用时,就会造成此问题。但经过实际的测试,即使没有单元格合并,Chrome依旧会出现边框粗细不一的现象。

Chrome开发团队对此错误报告有如下回复:

It's a known (old) issue in our table code. Collapsing borders are determined based on adjacent cells and our code doesn't deal correctly with spanning cells (we only consider the cell adjoining the first row / column in a row / column span). On top of that, our border granularity is determined by the cell's span.

To fix this bug, we would need to overhaul our collapsing border code, which is a big undertaking.

翻译如下:

这是table代码的一个老问题了。合并边框是基于相邻单元格来确定的,我们的代码不能正确地处理跨度较大的单元格(目前我们只考虑了与第一行/列相邻的跨度仅为1的单元格)。最重要的是,我们的边框粒度是由单元格的跨度决定的。

想要修复这个bug,我们需要彻底地检查合并边框的相关代码,这是一项十分艰巨的任务。

既然Chrome没有修复这个问题,我们只能寻求其他单实线边框的实现方案了。

单实线边框的实现方案对比

包括Chrome上出现问题(还能容忍)的方案在内,本文一共会介绍3.5个实现单实线边框的方案(其中0.5代表着有一种方案效果实在不能接受,将作为反面案例做相关的说明)。

每一种方案将会在4种主流浏览器上做测试,测试所用浏览器的类型及版本如下:

浏览器

版本号

Google Chrome

97.0.4692.71

Microsoft Edge

97.0.1072.62

Microsoft Internet Explorer

11.0.19041.1202

Mozilla Firefox

96.0.1

方案1

  • table设置为边框合并模式(border-collapse: collapse
  • 单元格设置全边框
table {
    border-collapse: collapse;
}
th, td {
    border: 1px solid #868686;
}

此方案从语义、逻辑的角度上看是最为合理的,可惜的是,在Chrome和Edge上均会出现边框粗细不一的问题(在IE与Firefox下没有问题)。

方案2(推荐)

  • table在默认的边框分离模式(border-collapse: separate)下,将边框间距设置为0
  • 所有单元格,添加且仅添加右边框与下边框
  • table添加左边框与上边框,以此来补齐单元格所缺失的边框
table {
    border-collapse: separate; /* default */
    border-spacing: 0; 
    border-top: 1px solid #868686; 
    border-left: 1px solid #868686;
}
th, td {
    border-right: 1px solid #868686; 
    border-bottom: 1px solid #868686;
}

此方案的核心思想就是任何位置均仅绘制单边框,确保不存在合并边框的情况。虽然逻辑上没有那么直接,但可以实实在在的解决问题,在Chrome、Edge、IE和Firefox下,均能完美运行。

方案3

  • table在默认的边框分离模式(border-collapse: separate)下,将边框间距设置为1px
  • 不添加实际的边框,给table与单元格设置不同的背景色,通过背景色的差异形成边框的效果
table {
    border-collapse: separate; /* default */
    border-spacing: 1px;
    background-color: #868686; 
}
th, td {
    background-color: #ffffff;
}

此方案有些剑走偏锋的味道,想要通过给单元格之间留出1px的间距并设置背景色,来形成伪边框。从思路上看感觉是没有太大的问题,但实际测试情况不尽人意,浏览器的兼容性与方案1刚好相反,在IE和Firefox上会出现边框粗细不一的问题,而Chrome和Edge没有问题。

方案3.5(这是一个反面示例!)

  • table在默认的边框分离模式(border-collapse: separate)下,将边框间距设置为0
  • table与单元格均设置全边框
table {
    border-collapse: separate; /* default */
    border-spacing: 0; 
    border: 1px solid #868686;
}
th, td {
    border: 1px solid #868686;
}

此方案考虑的是,不做边框合并的操作,相邻的两个边框因为没有设置边距,而看起来像是一个加粗的单一边框。且不说加粗显示的体验不是很好,此方案最大的硬伤在于,table在不同的宽度设置下,在各种浏览器上都有可能出现table边框与单元格边框出现间距的问题(使用浏览器的放大功能,这个问题十分容易复现)。

CSS:table单实线边框的实现方案与浏览器兼容性验证_css_03

总结

上述3个实现table单实线边框的可用方案,在不同浏览器下的兼容性表现总结如下:

浏览器

版本号

方案1:collapse

方案2:仅绘制单边框

方案3:背景色伪边框

Google Chrome

97.0.4692.71

×



Microsoft Edge

97.0.1072.62

×



Microsoft Internet Explorer

11.0.19041.1202



×

Mozilla Firefox

96.0.1



×

综上,推荐使用方案2。在具备一定容忍度的情况下,方案1与方案3也是可用的。

标签:方案,兼容性,collapse,单元格,边框,table,border,CSS
From: https://blog.51cto.com/u_15167487/7230081

相关文章

  • iOS开发之--TableViewCell重用机制避免重复显示问题
    常规配置如下当超过tableView显示的范围的时候后面显示的内容将会和前面重复//这样配置的话超过页面显示的内容会重复出现-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{//定义唯一标识staticNSStrin......
  • 三河凡科科技飞讯教学篇:红外成像仪开发难点的兼容性问题
    三河凡科科技飞讯教学篇:红外成像仪开发难点的兼容性问题红外成像技术是一种用于对物体表面进行无接触式测量得先进技术。它是基于物体与环境之间的热辐射,通过测量这种热辐射来实现对物体的成像。红外成像技术已经成为现代科技领域中一个不可或缺的工具,广泛应用于军事、医疗、安防......
  • [转]vue中的css深度选择器 :deep(<inner-selector>)、/deep/、>>>、::v-deep 到底是什
    原文地址:vue中的css深度选择器:deep(<inner-selector>)、/deep/、>>>、::v-deep到底是什么?-掘金vue中的css深度选择器概念与作用当<style>标签有scoped属性时,它的CSS只作用于当前组件中的元素,父组件的样式将不会渗透到子组件。如果你希望scoped样式中的一个选......
  • centos系统firewalld&iptables常用命令
    firewalld添加规则:firewall-cmd--permanent--add-rich-rule="rulefamily="ipv4"sourceaddress="192.168.142.166"portprotocol="tcp"port="5432"accept" 允许192.168.142.166访问5432端口firewall-cmd--add-port=80/t......
  • 从SAP TableControl中读取数据
    classSapGuiTableControl:"""读取GuiTableControl对象的数据。"""@staticmethoddefget_data(session,_id,columns=None):"""获取指定列的数据,索引从0开始。:paramsession:SAP的GuiSession......
  • 关于C#里IFormatProvider与IFormattable的一些思考
    一,从时间(DateTime)出发先上一段处理时间格式化的代码。该代码在Net6.0框架下运行。vartime=newDateTime(2023,8,24);Console.WriteLine(time);Console.WriteLine(string.Format("{0:yyyyMMdd}",time));//写法1......
  • h5(html5)+css3前端笔记五
    盒子模型网页布局本质网页布局过程先准备好相关的网页元素,网页元素基本都是盒子Box。利用CSS设置好盒子样式,然后摆放到相应位置PS基本操作综合案例圆角边框盒子阴影文字阴影......
  • CSS基础-背景
    background-color背景颜色,可以使用十六进制、rgb、rgba表示。语法/**selector背景元素的原则去*//**color背景颜色的值,可以是颜色名称、十六进制值、RGB、RGBA*/selector{background-color:color;}示例/**设置body标签背景为白色*/body{background-......
  • element+Sortable 实现表格拖拽
    <template><divclass="draggable"style="padding:20px"><el-tablerow-key="id":data="state.tableData"style="width:100%"><el-table-columnv-for="(item,......
  • StableVideo:使用Stable Diffusion生成连续无闪烁的视频
    使用StableDiffusion生成视频一直是人们的研究目标,但是我们遇到的最大问题是视频帧和帧之间的闪烁,但是最新的论文则着力解决这个问题。本文总结了Chai等人的论文《StableVideo:Text-drivenconsistency-awareDiffusionVideoEditing》,该论文提出了一种新的方法,使扩散模型能......