CSS 技巧:如何让 div 完美填充 td 高度

引言

一天哈比比突然冒出一个毫无理头的一个问题:

image

本文就该问题进行展开…

原文链接: 昆仑虚F2E

一、需求说明

大致需求如下, 当然这里做了些简化

有如下初始代码:

  • 一个自适应的表格
  • 每个单元格的宽度固定 200px
  • 每个单元格高度则是自适应
  • 每个单元格内是一个 div 标签, div 标签内包裹了一段文本, 文本内容不定

下面是初始代码(为了方便演示和美观, 代码中还加了些背景色、边距、圆角, 这些都是可以忽略):

<table><tr><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td></tr>
</table>
<style>table {background: #f5f5f5;}td {background: #ffccc7;}table, tr, td {padding: 12px;border-radius: 4px;}td > div {padding: 12px;border-radius: 4px;background: #f4ffb8;}
</style>

上面代码的整体效果如下:

image

上面是哈比比目前的现状, 然后需求就是希望, 黄色部分也就是 div 标签能够高度撑满单元格(td), 也就是如下图所示:

image

二、关键问题

这里我第一反应就是, 既然 td 高度是对的(自适应)的那么 div 高度直接设置 100% 不就好了吗? 事实是这样的吗? 我们可以试下:

<table>...
</table>
<style>td > div {
+   height: 100%; }
</style>

实际效果肯定是没有用的, 要不然也就不会有这篇文章了 🐶🐶🐶

image

主要问题: 在 CSS 中如果父元素没有一个明确的高度, 子元素设置 100% 是无法生效的, 至于为啥就不能生效呢, 因为如果可以, 那么必然会进入死循环这里可以参考张鑫旭大大的文章《从 height:100% 不支持聊聊 CSS 中的 “死循环”》

三、方案一(定位)

通过定位来实现, 也是哈比比最初采用的一个方案:

  • td 设置相对定位即: position: relative;
  • td 下的子元素通过相对定位(position: absolute;)撑满
....
<style>...
+ td {
+   position: relative;
+ }+ td:not(:first-child) > div {
+   position: absolute;
+   inset: 0;
+ }
</style>

整体效果如下:

image

上面代码其实我并没有给所有 td 中的 div 设置 position: absolute; 目的是为了留一个内容最多的块, 来将 trtd 撑开, 如果不这么做就会出现下面这种情况:

image

所以, 严格来说该方案是不行的, 但是可能哈比比情况比较特殊, 他只有空值和有内容两种情况, 所以他完全可以通过判断内容是否为空来设置 position: absolute; 即可

四、方案二(递归设置 height 100%)

第二个方案就是给 tabletrtd 设置一个明确的高度即 100%, 这样的话 td 中的子元素 div 再设置高度 100% 就可以生效了

<style>
+ table, tr, td, td > div {
+   height: 100%;}
</style>

效果如下:

image

上面第一个单元格高度其实还是有点问题, 目前也没找到相关研究可以结束这个现象, 要想达到我们要的效果解决办法有两个:

  1. 移除代码中所有 padding, 有关代码和效果图如下:
<style>table, tr, td {
-   padding: 12px;}td > div {
-   padding: 12px;}
</style>

image

  1. 修改 tddivbox-sizing 属性为 border-box, 有关代码和效果图如下:
<style>...td > div  {
+   box-sizing: border-box;}
</style>

image

五、方案三(利用 td 自增加特效, 推荐)

方案三是比较推荐的做法, 其利用了 td 自增加的一个特效, 那么何谓自增加呢? 假设我们给 td 设置可一个高度 1px 但是呢它实际高度实际上是会根据 tr 的高度进行自适应(自动增长), 那么在这种情况下我们给 td 下子元素 div 设置高度 100% 则会奏效, 因为这时的 td 高度是明确的

<table><tr><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td></tr>
</table>
<style>table {background: #f5f5f5;}td {height: 1px; /* 关键代码 */background: #ffccc7;}table, tr, td {padding: 12px;border-radius: 4px;}td > div {height: 100%; /* 关键代码 */padding: 12px;border-radius: 4px;background: #f4ffb8;}
</style>

效果如下:

image

六、补充: td 下 div 内容顶对齐

几天后, 哈比比又来找我了 🐶🐶🐶

image

这次需求就比较简单了, 就是 td 中默认情况下子元素(p)都是居中呈现的, 现想要的就是能否居上(置顶)展示

这里初始代码和上面是一样的:

<table><tr><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td><td width="400"><div>路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面路由器管理页面</div></td></tr>
</table>
<style>table {background: #f5f5f5;}td {background: #ffccc7;}table, tr, td {padding: 12px;border-radius: 4px;}td > div {padding: 12px;border-radius: 4px;background: #f4ffb8;}
</style>

默认效果就是 div 都居中展示:

image

这里我第一反应是用 vertical-align 但是该属性在很多人印象中只针对 行内元素(或文本)才能生效, 但这里是 div块元素 所以哈比比自然就忽略了该 vertical-align 属性

但实际上如果查阅文档会发现 vertical-align 实际用途有两个:

  1. 用来指定行内元素(inline)的垂直对齐方式
  2. 表格单元格(table-cell)元素的垂直对齐方式

所以这个问题就简单了, 一行 CSS 就解决了:

<style>...td {
+   vertical-align: top;}
</style>

完美实现(最终效果):

image

七、参考

  • How to make <div> fill <td> height
  • 从 height:100% 不支持聊聊 CSS 中的 “死循环”

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13850.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

清华、国科大、智谱团队提出LongReward:利用AI反馈改进长文本大语言模型

长文本&#xff08;Long-context&#xff09;大模型性能的优劣&#xff0c;在很大程度上取决于其能否全面理解长上下文场景下的复杂信息。 然而&#xff0c;现有的合成有监督微调&#xff08;SFT&#xff09;数据由于缺少人类核验&#xff0c;往往会影响长文本大模型的性能&am…

2024 年 10 款替代 Postman 的工具,有免费有开源

10 款替代 Postman 的工具&#xff0c;有免费有开源&#xff1a; 工具名称支持的系统是否免费是否开源ApifoxWindows, macOS, Linux免费否Yapi无限制是是InsomniaWindows, macOS, Linux免费版付费版是Hoppscotch浏览器是是SoapUIWindows, macOS, Linux免费版付费版是Katalon S…

IDEA报包不存在,但实际存在

IDEA版本2024.2.1 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可以看到它在左侧外部库里存在。 试过的无效方法 双击ctrl&#xff0c;在弹出框中mvn idea:idea在文件里&#xff0c;清空缓存并重启在右…

从词向量到多模态嵌入:大型语言模型的技术、应用及未来方向

索引词—大型语言模型、词嵌入、上下文嵌入、多模态表示、自然语言处理 摘要—词嵌入和语言模型通过将语言元素表示在连续向量空间中&#xff0c;彻底改变了自然语言处理&#xff08;NLP&#xff09;。本综述回顾了分布假设和上下文相似性等基础概念&#xff0c;追溯了从稀疏表…

超越传统:探索ONLYOFFICE的革命性办公新纪元

目录 &#x1f341;引言 &#x1f341;一、ONLYOFFICE产品简介 &#xff08;一&#xff09;、介绍 &#xff08;二&#xff09;、基本功能简介 &#x1f341;二、核心功能具体介绍 1、编辑操作 2、文本与段落&#xff1a; 3、样式与图形&#xff1a; 4、表格与图表&…

【GESP】C++一级真题(202406)luogu-B4001,立方数

2024年6月GESP一级真题。循环类问题。 题目题解详见&#xff1a;【GESP】C一级真题(202406)luogu-B4001&#xff0c;立方数 | OneCoder https://www.coderli.com/gesp-1-luogu-b4001/https://www.coderli.com/gesp-1-luogu-b4001/ C GESP专项交流频道&#xff1a;GESP学习交…

SAP 创建物料主数据报错:估价范围3010还没有生产式的物料帐簿

通过接口创建物料主数据&#xff08;模拟MM01&#xff09;&#xff0c;报错如图&#xff1a; 处理方案1&#xff1a;&#xff08;我的不行&#xff0c;提示已经是生产的&#xff09; 将评估范围的物料分类账设置为生产 事务码: CKMSTART - 物料分类帐的生产开始 处理方案2&a…

Python | Leetcode Python题解之第560题和为K的子数组

题目&#xff1a; 题解&#xff1a; class Solution:def subarraySum(self, nums: List[int], k: int) -> int:dic{0:1}sums,res0,0for num in nums:sumsnumresdic.get(sums-k,0)dic[sums]dic.get(sums,0)1return res

sql注入之二次注入(sqlilabs-less24)

二阶注入&#xff08;Second-Order Injection&#xff09;是一种特殊的 SQL 注入攻击&#xff0c;通常发生在用户输入的数据首先被存储在数据库中&#xff0c;然后在后续的操作中被使用时&#xff0c;触发了注入漏洞。与传统的 SQL 注入&#xff08;直接注入&#xff09;不同&a…

AOA-LSTM多输入回归预测|算术优化算法-长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、方法原理介绍&#xff1a; 四、完整代码数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平…

认知战认知作战:郑成功收复台湾的认知作战分析与策略

认知战认知作战&#xff1a;郑成功收复台湾的认知作战分析与策略 认知战认知作战&#xff1a;郑成功收复台湾的认知作战分析与策略 关键词&#xff1a;认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认知战争,认知战战术,认知战战略,认知域作战研究,认知…

单细胞技术加持,扩增子测序重回高大上| 一区微生物多组学研究新思路!

俗称“万金油”的扩增子技术已经再难发出好文章了&#xff1f;实则不然!关联高端霸气上档次的单细胞转录组技术&#xff0c;扩增子研究依旧可以焕发新生机&#xff0c;重回高大上。 近日&#xff0c;檀国大学在《communications biology》上最新发表的文章打破了传统微生物组分…

遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型

遗传算法与深度学习实战&#xff08;23&#xff09;——利用遗传算法优化深度学习模型 0. 前言1. 神经进化2. 使用遗传算法作为深度学习优化器小结系列链接 0. 前言 神经进化涵盖了所有用于改进深度学习的进化算法。更具体地说&#xff0c;神经进化用来定义应用于深度学习的特…

Hbase入门

目录 Hbase逻辑结构 一、基础知识 1. Hbase逻辑结构 行键(Rowkey)&#xff1a;唯一标识一行数据&#xff0c;按照字典序(row_key1 < row_key11 < rowkey2)排列.列Col&#xff1a;数据记录的一条属性列族&#xff1a;将多列划分为一类&#xff0c;视为一个列族。例如上图…

三维模型-管道-建模规范

一、阀门模型处理 Max中的阀门模型,备份之前可拆分的阀门模型。 将需要选择的阀门,合并(不打组)成一个模型。 材质在不同模型上,按照需求分好不同的材质 例如:阀门、管道,需要分成不同的材质和相对应的不同模型。 二、管道模型处理 1) 普通管道 默认展开UV ;2) 流…

golang go语言 组建微服务架构详解 - 代码基于开源框架grpc+nacos服务管理配置平台

整体介绍&#xff1a; 本文主要介绍如何用go语言 来组建微服务的框架&#xff0c;grpc服务管理 示例框架 代码由grpcnacos go sdk 组成。 grpc负责将调用序列化并传递到远端&#xff0c;nacos负责服务发现和服务管理。 grpc和nacos都是开源产品。代码复制下来就能跑。 微服…

open3d

open3d open3d用于 3D 数据处理的现代库。 简介 Open3D 是一个开源库&#xff0c;支持快速开发处理 3D 数据的软件。Open3D 前端公开了一组精心挑选的 C 和 Python 数据结构和算法。后端经过高度优化&#xff0c;并设置为并行化。Open3D 是从零开始开发的&#xff0c;具有一更…

一个轻量级RAG文本切块项目Chonkie

**Chonkie&#xff1a;**实用的RAG分块库&#xff0c;轻量级、速度快&#xff0c;可随时对文本进行分块 支持的方法 Chonkie 提供了多个分块器&#xff0c;可高效地为RAG应用程序拆分文本。以下是可用分块器的简要概述&#xff1a; TokenChunker&#xff1a;将文本分割成固定大…

如何通过AB测试找到最适合的Yandex广告内容

想要在Yandex上找到最能吸引目标受众的广告内容&#xff0c;A/B测试是一个不可或缺的步骤。通过对比不同版本的广告&#xff0c;我们可以发现哪些元素最能引起用户的共鸣。首先&#xff0c;设计两个或多个广告版本&#xff0c;确保每个版本在标题、文案、图片等关键元素上有所不…

车载空气净化器语音芯片方案

开发背景&#xff1a; 随着人们生活质量的不断提升和环保意识的日益增强&#xff0c;车内空气质量成为了广大车主关注的焦点。长时间封闭的车厢环境&#xff0c;加之城市空气污染、新车内饰材料释放的有害气体等因素&#xff0c;使得车内空气质量往往不尽如人意&#xff0c;严重…