您是否曾经想过要绝对或相对定位表格单元格?好吧,我帮不了你。表格单元格元素就是不会接受这些定位值。因此,您也不能在这些元素的 上下文中 绝对定位元素。我可以帮你解决这个问题。
答案是在表格单元格内创建一个通用的包装元素(与表格单元格大小完全相同),并将其用作相对定位上下文。非语义化?是的,但我们会用 JavaScript 将该标记包含进去,因此这不是什么大问题。笨拙的修复?你知道的。它有效吗?当然有效。
之前
<table>
<tr>
<td>
<img src="yay.jpg" alt="">
</td>
</tr>
</table>
之后
<table>
<tr>
<td>
<div class="innerWrapper"> <!-- appended with JavaScript -->
<img src="yay.jpg" alt=""> <!-- original content of cell -->
</div>
</td>
</tr>
</table>
jQuery 插件
您可以根据需要插入内部 div 包装器,但使用 JavaScript/jQuery 来做这件事很有吸引力,因为 1) 它非常容易,2) 它可以保持您的标记相同/干净。
我们将在此处创建一个快速 jQuery 插件,以便它可以被任何任意元素集调用。
$.fn.iWouldLikeToAbsolutelyPositionThingsInsideOfFrickingTableCellsPlease = function() {
var $el;
return this.each(function() {
$el = $(this);
var newDiv = $("<div />", {
"class": "innerWrapper",
"css" : {
"height" : $el.height(),
"width" : "100%",
"position": "relative"
}
});
$el.wrapInner(newDiv);
});
};
此插件遍历传递给它的每个元素,创建一个具有相对定位的 <div>
,其高度和宽度与父单元格相同,然后将该单元格的内部内容包装在自身内。
请记住,我没有使用所有普遍认为聪明的插件约定, 比如这个插件。
用法
加载 jQuery。然后运行上述插件代码。然后像这样使用插件,可以在网页底部或 DOM 就绪语句中使用。
$("th, td").iWouldLikeToAbsolutelyPositionThingsInsideOfFrickingTableCellsPlease();
这会将内部包装器附加到所有表格单元格(<th>
和 <td>
元素),尽管如您所见,您可以将其应用于任何任意元素集。
不错的函数名 :)
最近一直在考虑表格样式,关于如何在移动设备上合理地显示它们。所有常用的流体宽度或垂直排列元素的东西都不能真正应用,特别是如果表格有很多列。大多数情况下,表格最终会被裁剪,或者用户必须在各个方向上进行大量滚动。
我还没有看到合适的解决方案,甚至 W3C 也将其视为不可能。
我想知道某种绝对定位是否会有所帮助,因为据推测,使用此技术,您可以强制元素移动到其包含单元格之外?
“非语义化?是的,但我们会用 JavaScript 将该标记包含进去,因此这不是什么大问题。”在初始源代码中放置该 DIV 元素与稍后使用 Javascript 添加它之间完全没有区别。如果您需要它,则使用它。“HTML 验证”只是一个工具,而不是要破解的东西。
通过 javascript 进行操作可以使静态标记保持干净以供日后使用,但在总体方案中 - 是的,你是对的。
我,我没有静态标记 - 我所有的标记都是通过 php 生成的 - 所以我不会使用 javascript。
使用 PHP 与 JS 进行操作之间存在差异 - 使用 JS,禁用 JavaScript 的屏幕阅读器只会看到语义标记,而如果它是用 PHP 完成的,他们则无法避免它。
非常正确。没有考虑到这一点。
是否可以通过这种方法在没有 JavaScript 的情况下实现?我们是否有任何替代方案来仅使用 CSS 完成此技巧?
一些缺失的信息
测试您在没有 JavaScript 的情况下制作的内容。如果您可以在 JavaScript 开启和关闭的情况下使其看起来不错,请使用 JavaScript 方法。为什么?好吧,您在 上添加了类,如果将来可以使用语义 CSS 获取样式,那么您就不会在文件中留下非语义标签。
此外,如果您保留缓存的函数并将语义 HTML 作为唯一下载的部分,则可能会提高文件大小的性能。特别是如果您在每个页面上都使用它,并且每个用户的页面浏览量很多。当然,如果您只在几个页面上使用它,或者用户只查看几个页面然后离开,那么这部分是错误的,您可以使用服务器端语言(如 PHP)来实现,就像 Thaq 所做的那样。
现在没有人使用 或 ,使用 标签工作是很好的。
我喜欢 jquery 插件类的名称!
与文章相反,您可以绝对定位表格行,并且在 IE7+ 和符合标准的浏览器中可以正常工作。
我们有一个内部工具,它基本上是一个简化的数据库编辑器,它根据 MySQL 表格中出现的顺序显示给定 MySQL 表格中的字段作为 HTML 表格。
我想以不同的顺序查看行并按颜色对它们进行分组,但我无法访问编辑器的源代码,只能访问页面的 CSS。因此,我使用 CSS 和绝对定位将表格行定位在不同的位置。因此,至少表格本身以外的一个表格元素可以被绝对定位。
您也可以固定定位行,这很方便。我将更新文章的措辞,使其更准确。
精彩的文章和关于编写 jQuery 函数的优秀教程。
你为什么总是要表现得那么悲惨?感谢你的提示;D
感谢你的提示,我现在就试试!
很棒的发现,但恕我直言,这不是最佳解决方案。有一种更容易、更快捷的方法可以使用 CSS 来实现,甚至不需要使用你的 jquery 技巧(这实际上是什么),因此,当人们没有打开 JS 时,你基本上就无法使用此效果。
无论如何,这就是我想出的(必须在我们其中一个项目中实现相同的效果,我希望有更好的方法来解决它,因为我们在我们的大多数 WordPress 网站中使用表格进行布局,更容易使侧边栏和内容更灵活,所以花了我一段时间,但它运行完美)
我试图做的是有一个跨越 2 行的单元格,其中所有主要元素都对齐到顶部,并且最后一个部件(推荐)每次单元格高度随另一个单元格(内容)变长而调整大小时都“粘贴”到单元格底部
例如。
[表格] /* 我们的结构表格;CSS:position:relative; display:block; height:100% */ 而不是 display:cell-table(这是默认值),如果您的表格有父 div 容器,也必须使用 100%,以便它也适合其中,而不是仅仅自动调整大小
[TR]
[TD colspan=2 valign=top][/TD] 我们的内容单元格,当它调整大小时,单元格向下增长
[TD rowspan=2 valign=top height=100%] 右侧边栏“所有元素都应该浮动到顶部,高度会根据整个表格的高度调整,而不仅仅是单元格内的元素”*/
…..
[div class=testimonial][/div] /* CSS:display:block; bottom:0; width:200px; height:auto; position:absolute;
[/TD]
[TR]
完成了,这对我很有效,试试看
[TR]
….
[TR]
[/表格]
jQuery 插件类的酷名称 :) 感谢你的提示