【发布时间】:2012-08-08 19:53:02
【问题描述】:
每个可视行的块项目的第一个元素是否有一个 CSS 选择器? 也就是说,假设有 20 个块元素,它们跨越多行以适合其父容器;我可以选择每行最左边的项目吗?
在 JavaScript 中可以通过查看所有元素的顶部位置来实现,但在纯 CSS 中是否可行?
【问题讨论】:
标签: css layout css-selectors
每个可视行的块项目的第一个元素是否有一个 CSS 选择器? 也就是说,假设有 20 个块元素,它们跨越多行以适合其父容器;我可以选择每行最左边的项目吗?
在 JavaScript 中可以通过查看所有元素的顶部位置来实现,但在纯 CSS 中是否可行?
【问题讨论】:
标签: css layout css-selectors
是的,它可以通过 CSS 实现,但前提是您可以修复每一行中的元素。
由于你没有提供你的案例,这里是一个例子。
假设您的元素以ul 和li 模式堆叠在一起,并且是三个连续的列表,那么您可以使用以下css sn-p。
li:first-child, li:nth-child(3n+1) {
background: red;
}
【讨论】:
:nth-child(Xn+1) 乘数。
不,没有选择器,您需要使用 JavaScript。
作为参考,下面是 CSS 选择器的一个很好的参考: http://www.w3.org/wiki/CSS/Selectors
【讨论】:
不幸的是,这仅靠 CSS 是不可能的。当我想确保每行上最左边的浮动元素始终从新行开始时,我遇到了这个问题。
我知道您正在寻找 CSS 解决方案,但我编写了这个 jQuery 插件,它识别每个可视行上的第一个元素 并对其应用“clear:left”(您可以对其进行调整)任何东西)。
(function($) {
$.fn.reflow = function(sel, dir) {
var direction = dir || 'both';
//For each conatiner
return this.each(function() {
var $self = $(this);
//Find select children and reset clears
var $elems = sel ? $self.find(sel) : $self.children();
$elems.css('clear', 'none');
if ($elems.length < 2) { return; }
//Reference first child
var $prev = $elems.eq(0);
//Compare each child to its previous sibling
$elems.slice(1).each(function() {
var $elem = $(this);
//Clear if first on visual row
if ($elem.position().top > $prev.position().top) {
$elem.css('clear', direction);
}
//Move on to next child
$prev = $elem;
});
});
};
})(jQuery);
【讨论】:
基于@lukejacksonn 的工作
这个在窗口调整大小时添加或删除一个类。
(function ($) {
$.fn.reflow = function (sel, className) {
if (className == null) throw new Error('className must be set');
//For each conatiner
return this.each(function () {
var $self = $(this);
//Find select children and reset clears
var $elems = sel ? $self.find(sel) : $self.children();
if ($elems.length < 2) {
return;
}
//Reference first child
var $prev = $elems.eq(0);
$elems.each(function () {
$(this).removeClass(className);
});
//Compare each child to its previous sibling
$elems.slice(1).each(function () {
var $elem = $(this);
//Clear if first on visual row
if ($elem.position().top > $prev.position().top) {
$elem.addClass(className);
}
//Move on to next child
$prev = $elem;
});
});
};
const markFirstRowElement = function () {
$(".cd-progress-indicator").reflow('li', 'first-row-element');
}
$(function () {
markFirstRowElement();
$(window).resize(markFirstRowElement);
});
})(jQuery);
【讨论】: