ChatGPT解决这个技术问题 Extra ChatGPT

是否有“前一个兄弟”选择器?

加号 (+) 用于选择下一个兄弟。

是否有前一个兄弟姐妹的等价物?

您不需要它,因为您可以使用通用选择器和下一个兄弟选择器的组合来完成所有操作。
我不确定你是否可以在所有情况下,即使是这样 - 很难阅读和推理,因此应该添加为方便 imo
哪个组合器可以用于父选择器?,@GabrielLinassi
这可以通过以下方式实现: display: flex; flex-direction:行反向;

D
Domenic

不,没有“前一个兄弟”选择器。

在相关说明中,~ 用于一般后继兄弟(意味着元素在此之后,但不一定紧随其后)并且是 CSS3 选择器。 + 用于下一个兄弟,是 CSS2.1。

请参阅 Selectors Level 3 中的 Adjacent sibling combinatorCascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification 中的 5.7 Adjacent sibling selectors


来自 CSS3 标准:两个序列表示的元素在文档树中共享同一个父元素,第一个序列表示的元素在(不一定立即)第二个序列表示的元素之前。
@Lie Ryan:是的,但是 cletus 在他的回答中提出的要点是您没有选择前面的元素。
这是我做的一个例子,看看它可以做什么,不能做什么。 jsfiddle.net/NuuHy/1
对此有用的 jquery 函数是 prev()。例如 $("#the_element").prev().css("background-color", "red")
m
mantish

我找到了一种方法来设置所有以前的兄弟姐妹(与 ~ 相对)的样式,这可能取决于您的需要。

假设您有一个链接列表,当悬停在一个链接上时,之前的所有链接都应该变成红色。你可以这样做:

/* 默认链接颜色为蓝色 */ .parent a { color: blue; } /* prev 兄弟姐妹应该是红色 */ .parent:hover a { color: red; } .parent a:hover, .parent a:hover ~ a { color: blue; }


您可以添加对其工作原理的说明。 (似乎您将样式应用于所有项目和以下项目,但可以明确描述)
是的,但大多数时候需要一个以前的而不是所有以前的!
如果我将鼠标悬停在它们之间的空间上,链接都会变成红色,对我来说。
由于 .parent:hover a 样式,所有标签在悬停在父标签上时都会变为红色,但同时不会将光标悬停在任何子标签上。
@Lynn @JoeVanLeeuwen 是的,此示例仅包含针对先前兄弟姐妹的最少规则。要删除间距,您需要添加更多规则,可能会更改竞争者的 display
Q
Quentin

Selectors level 4 proposes :has()(以前是主题指示符 !),有一天,它允许您选择以前的兄弟姐妹:

previous:has(+ next) {}

… 但在撰写本文时,browser support 实际上不存在

多年来,这个答案吸引了数十条“它仍然不受支持”的评论(现已删除)。请不要再添加了。答案中有一个指向最新浏览器支持图表的链接。


M
Michael Benjamin

考虑 flex 和 grid 布局的 order 属性。

在下面的示例中,我将重点关注 flexbox,但同样的概念也适用于 Grid。

使用 flexbox,可以模拟先前的兄弟选择器。

特别是,flex order 属性可以在屏幕上移动元素。

这是一个例子:

当元素 B 悬停时,您希望元素 A 变为红色。

  • A
  • B

脚步

使 ul 成为一个弹性容器。 ul {显示:弹性; }

颠倒标记中同级的顺序。

  • B
  • A

使用同级选择器来定位元素 A(~ 或 + 可以)。 li:hover + li { 背景颜色:红色; }

使用 flex order 属性来恢复视觉显示上的兄弟姐妹的顺序。 li:last-child { order: -1; }

……瞧!先前的兄弟选择器诞生(或至少模拟)。

这是完整的代码:

ul {显示:弹性; } li:hover + li { 背景颜色:红色; } li:last-child { 顺序:-1; } /* 非必要的装饰风格 */ li { height: 200px;宽度:200px;背景颜色:浅绿色;边距:5px;列表样式类型:无;光标:指针; }

  • B
  • A

来自 flexbox 规范:

5.4.显示顺序:默认情况下,顺序属性 Flex 项目的显示和布局顺序与它们在源文档中出现的顺序相同。 order 属性可用于更改此排序。 order 属性通过将弹性项目分配给序数组来控制弹性项目在弹性容器中出现的顺序。它采用单个 值,它指定弹性项目所属的序数组。

所有弹性项目的初始 order 值为 0。

另见order in the CSS Grid Layout spec

使用 flex order 属性创建的“前一个兄弟选择器”示例。

.container { 显示:弹性; } .box5 { 订单:1; } .box5:hover + .box4 { 背景颜色:橙红色;字体大小:1.5em; } .box6 { 顺序:-4; } .box7 { 顺序:-3; } .box8 { 顺序:-2; } .box9 { 顺序:-1; } .box9:hover ~ :not(.box12):nth-child(-1n+5) { background-color: orangered;字体大小:1.5em; } .box12 { 订单:2; } .box12:hover ~ :nth-last-child(-1n+2) { background-color: orangered;字体大小:1.5em; } .box21 { 顺序:1; } .box21:hover ~ .box { 背景色:橙红色;字体大小:1.5em; } /* 非必要的装饰风格 */ .container { padding: 5px;背景颜色:#888; } .box { 高度:50px;宽度:75px;边距:5px;背景颜色:浅绿色;显示:弯曲;证明内容:中心;对齐项目:居中;文本对齐:居中;光标:指针; }

使用 flex order 属性构造前一个兄弟选择器

1
2
3
HOVER ME
4

悬停我
悬停我
< div class="box box6">6
7
8
10
11

HOVER ME
13
14
15
16
17
18
19
20

jsFiddle

旁注——关于 CSS 的两个过时的信念

Flexbox 正在打破长期以来对 CSS 的看法。

一种这样的信念是a previous sibling selector is not possible in CSS

说这种信念是普遍存在的将是轻描淡写。以下是有关 Stack Overflow 的相关问题示例:

使用选择器在 CSS 中选择元素的前一个兄弟

CSS:选择上一个兄弟

CSS选择上一个兄弟

CSS中的上一个相邻选择器

在悬停时选择以前的兄弟姐妹

CSS选择器获取前面的兄弟

使用 CSS 更改悬停时兄弟元素的颜色

如何使用 selenium css 语法选择前一个兄弟

CSS选择器用于选择另一个元素之前的元素?

如何仅使用 CSS 将样式添加到活动输入的前一个兄弟姐妹

下一个和上一个元素的 CSS 选择器

div悬停时如何影响其他元素

如上所述,这种信念并不完全正确。可以使用 flex order 属性在 CSS 中模拟以前的同级选择器。

z-index 神话

另一个长期存在的信念是 z-index 仅适用于定位元素。

事实上,最新版本的规范 - W3C Editor's Draft - 仍然断言这是真的:

9.9.1 指定堆栈级别:z-index 属性 z-index 值:auto | |继承初始:自动适用于:定位元素继承:无百分比:不适用媒体:视觉计算值:指定(强调添加)

然而,实际上,这些信息已经过时且不准确。

即使 positionstaticflex itemsgrid items 的元素也可以创建堆叠上下文。

4.3. Flex 项目 Z-Ordering Flex 项目的绘制与内联块完全相同,除了使用 order-modified 文档 order 代替原始文档 order,以及 auto 以外的 z-index 值即使 position 是静态的也会创建堆叠上下文。 5.4. Z-axis Ordering:z-index 属性网格项的绘制顺序与内联块完全相同,只是使用 order-modified 文档顺序代替原始文档顺序,并且 z-index 值而不是 auto create a即使位置是静态的,也会堆叠上下文。

以下是 z-index 处理非定位弹性项目的演示:https://jsfiddle.net/m0wddwxs/


order 属性不是解决方案,因为它仅用于更改 visual 顺序,因此它 恢复原始 semantical 顺序您必须更改 HTML 才能使此解决方法起作用。
请记住,您引用的 CSS2.2 ED 本质上仍然是 CSS2。并且 CSS2 中不存在 flexbox 和网格布局,因此就 CSS2 而言,这些信息肯定是正确的。至少,可以更新文本以提及 z-index 可能适用于未来级别的 CSS 中的其他类型的元素,就像它说其他属性可能建立堆叠上下文一样,例如不透明度。
@BoltClock 我的评论与浏览器支持无关。该技术打破了语义,有利于呈现。我相信在服务器端添加一个普通的常规类到以前的兄弟元素中要合理得多。
如果有人无法理解 z-index 何时起作用,即使“天哪,没有指定 position!”,规范中提到了 stacking context 的概念,{ 1}
@Michael_B 不客气!我已经处理了很多没有意识到这一点的前端。我想提的另一件事是,faux previous 同级选择器 也可以很好地与 float: right (或任何其他反转顺序的方法,其中 flex/order 几乎没有(最少?)副作用)。掀起了两个小提琴:demonstrating the float: right approachdemonstrating direction: rtl
B
Bryan Larsen

我有同样的问题,但后来我有一个“呃”的时刻。而不是写

x ~ y

y ~ x

显然这匹配“x”而不是“y”,但它回答“有匹配吗?”问题,简单的 DOM 遍历可能比在 javascript 中循环更有效地让您找到正确的元素。

我意识到最初的问题是一个 CSS 问题,所以这个答案可能完全无关紧要,但其他 Javascript 用户可能会像我一样通过搜索偶然发现这个问题。


我相信当 y 可以很容易地找到时,它会起作用。问题是如果 y 只能相对于 x 找到,并且在反转它时,您找不到 y,因为您必须先找到 x。这当然是指 y 是前面的兄弟而不是下一个的问题,但也可能适用于 y 是后面的兄弟。
你有点苛刻,哈什。 (对不起,无法抗拒。)关键是有时你只需要知道“你存在吗?”。其他时候你可以使用 ":before" 在两个元素之间放置一些东西。最后,如果您必须使用 jQuery,使用 find("y ~ x").prev() 比许多替代方法更容易。
前一个兄弟选择器的想法是它将选择前一个元素。不幸的是,如此处所述,反转它不提供此功能。
感谢@Zenexer 澄清这个答案并没有提供原始问题的实际解决方案,我开始觉得自己愚蠢地思考y ~ x如何解决我的问题
我理解这个答案背后的想法,但是答案中给出的推理并不完全有意义。选择器 y ~ x 没有回答“有匹配项吗?”问题,因为这里给出的两个选择器意味着完全不同的东西。例如,给定子树 <root><x/><y/></root>y ~ x 不可能产生匹配。如果问题是“你存在吗?”那么选择器就是y。如果问题是“给定任意位置的同级 x,y 是否存在?”那么你需要 both 选择器。 (虽然也许我现在只是在吹毛求疵......)
V
Victor Gorban

没有“前一个选择器”,但您可以使用 :not~ 的组合(“后选择器”)。没有逆序,没有javascript。

.parent a{ color: blue } .parent a.active{ color: red } .parent a:not(.parent a.active ~ a){ color: red }

我认为我的方法比“设置所有 div 的样式,而不是删除后 div 的样式”、使用 javascript 或使用相反的顺序更直接。


读者注意事项:请注意,这不是先前的同级选择器,而是“一般的先前同级”选择器,因为它将匹配任何匹配的元素,而不仅仅是前一个(但不会脱离解决方案,这很有创意)。
我使用 .parent a:not(.parent a.active ~ a, a.active, .parent :first-child) { color: red } 只为第二个孩子着色。
T
TylerH

+ 用于下一个兄弟姐妹。是否有前一个兄弟姐妹的等价物?

您可以使用两个斧头选择器:!和 ?

常规 CSS 中有 2 个后续的兄弟选择器:

+ 是紧随其后的兄弟选择器

是任何后续的兄弟选择器

在传统的 CSS 中,没有先前的兄弟选择器。

但是,在 ax CSS 后处理器库中,有 2 个先前的兄弟选择器:

?是前一个兄弟选择器(与 + 相对)

!是任何先前的兄弟选择器(与〜相反)

工作示例:

在下面的示例中:

.any-subsequent:hover ~ div 选择任何后续的 div

.immediate-subsequent:hover + div 选择紧接着的 div

.any-previous:悬停! div 选择任何以前的 div

.immediate-previous:hover ? div 选择前一个 div

div {显示:内联块;宽度:60px;高度:100px;颜色:RGB(255、255、255);背景颜色:rgb(255, 0, 0);文本对齐:居中;垂直对齐:顶部;光标:指针;不透明度:0;过渡:不透明度 0.6s 缓出; } 代码 { 显示:块;边距:4px;字体大小:24px;行高:24px;背景颜色:rgba(0, 0, 0, 0.5); } div:nth-of-type(-n+4) { 背景颜色: rgb(0, 0, 255); } div:nth-of-type(n+3):nth-of-type(-n+6) { 不透明度: 1; .any-subsequent:hover ~ div, .immediate-subsequent:hover + div, .any-previous:hover ! div, .immediate-previous:hover ? div {不透明度:1; }

将鼠标悬停在下面的任何块上

悬停在 ? 选择器上
悬停在 ! 选择器
悬停在 ~ 选择器
悬停在 + 选择器


当我尝试在 Rails 项目中的 sass 上实现它时,这给了我一个语法错误。
ax 是一个 CSS 后处理器。它不使用与 Sass、Less 或 Stylus 等 CSS 预处理器相同的语法。
@Rounin 您介意添加一些文档链接吗?我找不到 ax 后处理器。
@Dionys - 感谢您的关注。 axe 是我在 2016 年底开始的一个项目,当时我还不了解 ES2015,甚至 JS 中的对象对我来说都是非常新的。 GitHub 存储库在此处:github.com/RouninMedia/axe。我非常想在某个时候回到这个话题(我还开发了一种叫做 axe-blades 的东西,它是 javascript 事件的 CSS 等价物),但我需要完成另一个项目的工作(代号为ashiva)。
R
Roko C. Buljan

三个技巧
基本上,在 HTML 中反转元素的 HTML 顺序
以及使用~ 下一个兄弟姐妹操作员:

1. 使用 CSS Flex 和 row-reverse

.reverse { display: inline-flex; flex-direction:行反向; } .reverse span:hover ~ span { /* 在 SPAN 悬停时,目标是它的“先前”元素 */ background:gold; } 将鼠标悬停在 SPAN 上,查看之前的元素样式!

5 4 3 2 1

2.使用带方向的Flex:RTL

.reverse { display: inline-flex;方向:rtl; } .reverse span:hover ~ span { /* 在 SPAN 悬停时,目标是它的“前一个”元素 */ background: red; } 将鼠标悬停在 SPAN 上,查看之前的元素样式!

5 4 3 2 1

3. 使用浮动权

.reverse { 显示:内联块; } .reverse span{ 浮动:对; } .reverse span:hover ~ span { /* 在 SPAN 悬停时,目标是它的“前一个”元素 */ background: red; } 将鼠标悬停在 SPAN 上,查看之前的元素样式!

5 4 3 2 1


V
Vadim Ovchinnikov

另一个 flexbox 解决方案

您可以在 HTML 中使用反转元素的顺序。然后除了在 Michael_B's answer 中使用 order 之外,您还可以根据您的布局使用 flex-direction: row-reverse;flex-direction: column-reverse;

工作样本:

.flex { 显示:弹性; flex-direction:行反向; /* 在“反转”端对齐内容,即开始 */ justify-content: flex-end; } /* 在悬停目标上它的“先前”元素 */ .flex-item:hover ~ .flex-item { background-color:lime; } /* 仅用于演示的样式 */ .flex-item { background-color: orange;白颜色;填充:20px;字体大小:3rem;边界半径:50%; }

5
4
3
2
1


a
allicarn

目前没有官方方法可以做到这一点,但你可以使用一个小技巧来实现这一点!请记住,它是实验性的,并且有一些限制......(如果您担心导航器的兼容性,请检查 this link

您可以做的是使用 CSS3 选择器:名为 nth-child() 的伪类

#list>* { 显示:内联块;填充:20px 28px;右边距:5px;边框:1px 实心#bbb;背景:#ddd;颜色:#444;边距:0.4em 0; } #list :nth-child(-n+4) { 颜色: #600b90;边框:1px 红色虚线;背景:橙色; }

橙子元素是使用 li:nth-child(-n+4) 选择的前一个兄弟 li

1

2

3

4
5

6

7

8

9< /p>

限制

您不能根据下一个元素的类选择上一个元素

这对于伪类也是一样的


为什么它们必须是同一个节点?为什么不直接使用 :nth-child(-n+4)
@Ian 因为 :nth-child(-n+4) 是一个伪类,需要应用于选择器才能正常工作。如果您不相信,请尝试使用我的小提琴叉子进行实验,您会发现它无法正常工作
实际上,您可以使用 * 选择器独立于节点类型,但这是非常糟糕的做法。
实际上,它确实适用于不同的节点:jsfiddle.net/aLhv9r1w/316。请更新您的答案:)
我有一个复杂的选择器,但假设它是 li#someListItem 并且我想要它之前的节点(这就是我解释“上一个”的方式) - 我看不出您提供的信息如何帮助我表达通过 CSS。您只是选择前 n 个兄弟姐妹,并假设我知道 n。基于这个逻辑,任何选择器都可以解决问题并选择我需要的元素(例如 :not() )。
C
Carel

你可以使用双重否定

SELECTOR:not([SELECTOR]FILTER):not([SELECTOR]FILTER + SELECTOR) { ... }

SELECTOR 替换为 TAG.CLASS(使用 #ID 可能过于具体)。将 FILTER 替换为其他一些 :PSUEDO-SELECTOR(我只尝试过 :hover)或 .CLASS(更多用于通过 Javascript 切换)。

由于典型用法可能依赖于悬停(参见下面的示例)

/* Effect only limited when hovering */
TAG.CLASS:not(TAG.CLASS:hover):not(TAG.CLASS:hover + TAG.CLASS) {}
/* Effect only applied when hovering */
PARENT.CLASS:hover > CHILD.CLASS:not(CHILD.CLASS:hover):not(CHILD.CLASS:hover + CHILD.CLASS) {}

/* 解决方案 */ div.parent:hover > div.child:not(:hover):not(:hover ~ .child) { background-color:red;边界半径:1.5em; } div.parent:hover > div.child:not(:hover):not(:hover ~ .child) > div { background-color:yellow; } /* 变得漂亮(有点) */ div.parent { width:9em;高度:9em; /* 布局 */ display:grid;网格模板列:自动自动自动;网格模板行:自动自动; } div.child { /* 尺寸 */ height:3em;宽度:3em; /* 布局 */ position:relative; /* 光标 */ 光标:指针; /* 展示 */ 边框:1px 黑色实心;边界半径:1.5em; } .star { /* 尺寸 */ 宽度:2.5em;高度:2.5em; /* 放置 */ position:absolute;最高:50%;左:50%;变换:翻译(-50%,-50%); /* 几何 */ -webkit-clip-path: polygon( 50% 0%, 63% 38%, 100% 38%, 69% 59%, 82% 100%, 50% 75%, 18% 100%, 31 % 59%, 0% 38%, 37% 38% );剪辑路径:多边形(50% 0%、63% 38%、100% 38%、69% 59%、82% 100%、50% 75%、18% 100%、31% 59%、0% 38% , 37% 38% ); /* 演示文稿 */ background-color: lightgrey; } div.child:hover { /* 展示 */ background-color:yellow;边界半径:1.5em; } div.child:hover > div.star { /* 展示 */ background-color:red; }


S
SherylHohman

不,这是不可能通过 CSS 实现的。它将“级联”牢记在心;-)。

但是,如果您能够将 JavaScript 添加到您的页面,那么一点点 jQuery 就可以帮助您实现最终目标。
您可以使用 jQuery 的 find在您的目标元素/类/id 上执行“前瞻”,然后回溯以选择您的目标。
然后您使用 jQuery 为您的元素重写 DOM (CSS)。

基于 this answer by Mike Brant,以下 jQuery 代码段可能会有所帮助。

$('p + ul').prev('p')

这首先会选择紧跟 <p> 的所有 <ul>
然后它会“回溯”以从该 <ul> 集合中选择所有先前的 <p>

实际上,已通过 jQuery 选择了“上一个兄弟”。
现在,使用 .css 函数为该元素传入您的 CSS 新值。

在我的例子中,我正在寻找一种方法来选择一个 ID 为 #full-width 的 DIV,但前提是它有一个类为 .companies 的(间接)后代 DIV。

我可以控制 .companies 下的所有 HTML,但无法更改它上面的任何 HTML。
而且级联只有一个方向:向下。

因此,我可以选择所有 #full-width
或者我可以选择仅在 #full-width 之后的 .companies
但我可以只选择 < em>继续 .companies

而且,我无法在 HTML 中添加任何更高的 .companies。 HTML 的那部分是在外部编写的,并包装了我们的代码。

但是使用 jQuery,我可以选择所需的 #full-width,然后分配适当的样式:

$("#full-width").find(".companies").parents("#full-width").css( "width", "300px" );

这会找到所有 #full-width .companies,并仅选择那些 .companies,类似于如何使用选择器来定位 CSS 标准中的特定元素。
然后它使用 .parents 来“回溯”并选择 {2 的所有父级},
但过滤这些结果以仅保留 #fill-width 元素,因此最后,
如果它具有 .companies 类后代,它只会选择 #full-width 元素。
最后,它为结果元素分配一个新的 CSS (width) 值。

$(".parent").find(".change-parent").parents(".parent").css("background-color", "darkred"); div {背景颜色:浅蓝色;宽度:120px;高度:40px;边框:1px 纯灰色;填充:5px; } .wrapper { 背景颜色:蓝色;宽度:250px;高度:165px; } .parent { 背景颜色:绿色;宽度:200px;高度:70px; }

"parent" 变成红色
后代:"change-parent"
"parent" 保持绿色 < div class="nope"> 后代:"nope"
目标 "parent" 到转 red
如果它“change-parent”的后代。

(反向级联,向前看,父非后代)

jQuery 参考文档:
$() or jQuery():DOM 元素。
.find:获取当前匹配元素集中每个元素的后代,由选择器、jQuery 对象过滤,或元素。
.parents:获取匹配元素集中每个元素的前一个兄弟元素。如果提供了选择器,则仅当它与该选择器匹配时才检索前一个同级(过滤结果以仅包含列出的元素/选择器)。
.css:为匹配的元素集设置一个或多个 CSS 属性.


这与问题无关。当然,也可以使用 JS,而且您甚至不需要 jQuery(previousElementSibling)。
@FabianvonEllerts 我在回复的第一行直接回答了 OP 的问题。正如我的回答所说,这实际上是不可能通过 CSS 实现的。然后,我使用 CSS 用户可能熟悉并可以使用的技术(JS | JQuery)提供了实现目标的 1 条可能路径。例如,许多 WordPress 网站也有 JQuery,因此它是一个简单的入口点:易于使用、记忆和扩展。简单地回答 NO 而不提供实现目标的替代方法是不负责任的。当我有同样的问题时,我分享了我学到和使用的东西。
previousElementSibling() 对于那些更熟悉原生 JS DOM 功能的人,可以提供另一个非 CSS 路径。
我发现其他 CSS HACKS 非常有趣,但对于我的特定用例,它们要么不起作用(属于警告类别),要么过于复杂。对于其他处于相同情况的人,在上述解决方案失败或难以实施/维护的情况下,分享这种可行的易于使用的方法是公平的。共享了许多 CSS HACK。未涵盖此解决方法。没有一个答案使用 OP 特别要求的 + (不存在)选择器。将此答案视为 JS “hack”。这是为了节省我花在寻找解决方案上的时间。
“它需要“级联”;-)。说得好。你可能就停在那里了。 ;^D
k
kernel

如果您知道确切位置,则基于 :nth-child() 的所有后续同级排除将起作用。

ul li:not(:nth-child(n+3))

这将选择第 3 个之前的所有 li(例如第 1 个和第 2 个)。但是,在我看来,这看起来很难看,而且用例非常紧凑。

您还可以从右到左选择第 n 个子项:

ul li:nth-child(-n+2)

哪个也一样。


M
Megha

在悬停时覆盖下一个兄弟姐妹的样式,以便看起来只有以前的兄弟姐妹在悬停时添加了样式。

ul li { 颜色:红色; } ul:hover li { 颜色: 蓝色; } ul:hover li:hover ~ li{ color: red; }

  • 项目 1
  • 项目 2
  • 项目 3


f
falsarella

根据您的确切目标,有一种方法可以在不使用父选择器的情况下实现父选择器的有用性(即使存在父选择器)......

假设我们有:

<div>
  <ul>
    <li><a>Pants</a></li>
    <li><a>Socks</a></li>
    <ul>
      <li><a>White socks</a></li>
      <li><a>Blue socks</a></li>
    </ul>
  </ul>
</div>

我们可以做些什么来使用间距使 Socks 块(包括袜子颜色)在视觉上突出?

什么会很好但不存在:

ul li ul:parent {
  margin-top: 15px;
  margin-bottom: 15px;
}

存在什么:

li > a {
  margin-top: 15px;
  display: block;
}
li > a:only-child {
  margin-top: 0px;
}

这会将所有锚链接设置为在顶部具有 15px 的边距,并将其重置为 0,以便在 LI 中没有 UL 元素(或其他标签)的链接。


i
isherwood

/* 为所有子元素添加样式,然后将样式撤消到目标和目标的同级子元素。 */ ul>li { 颜色:红色; } ul>li.target, ul>li.target~li { 颜色:继承; }

  • 之前
  • 目标
  • 之后
  • 之后


我认为 stackoverflow.com/a/48952456/1347604 有点相同的方法,但是这个方法使用继承来表示其他元素,这可能有助于将注意力集中在问题的字面要求上一个兄弟的等价性
A
Andrew Leyva

不幸的是,没有“以前的”同级选择器,但您仍然可以通过使用定位(例如向右浮动)获得相同的效果。这取决于你想要做什么。

就我而言,我想要一个主要是 CSS 5 星评级系统。我需要为以前的星星着色(或交换图标)。通过向右浮动每个元素,我基本上得到了相同的效果(因此,星星的 html 必须写为“向后”)。

我在此示例中使用 FontAwesome 并在 fa-star-o 和 fa-star http://fortawesome.github.io/Font-Awesome/ 的 unicode 之间进行交换

CSS:

.fa {
    display: inline-block;
    font-family: FontAwesome;
    font-style: normal;
    font-weight: normal;
    line-height: 1;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

/* set all stars to 'empty star' */
.stars-container {
    display: inline-block;      
}   

/* set all stars to 'empty star' */
.stars-container .star {
    float: right;
    display: inline-block;
    padding: 2px;
    color: orange;
    cursor: pointer;

}

.stars-container .star:before {
    content: "\f006"; /* fontAwesome empty star code */
}

/* set hovered star to 'filled star' */
.star:hover:before{
    content: "\f005"; /* fontAwesome filled star code */
}

/* set all stars after hovered to'filled star' 
** it will appear that it selects all after due to positioning */
.star:hover ~ .star:before {
    content: "\f005"; /* fontAwesome filled star code */
}

HTML: (40)

JSFiddle:http://jsfiddle.net/andrewleyva/88j0105g/


向右浮动,+~ 选择器让我觉得最干净。
k
kyle

我需要一个解决方案来选择前一个兄弟 tr。我使用 React 和 Styled-components 提出了这个解决方案。这不是我的确切解决方案(这是几个小时后的记忆)。我知道 setHighlighterRow 函数存在缺陷。

OnMouseOver 一行会将行索引设置为状态,并使用新的背景颜色重新渲染上一行

class ReactClass extends Component {
  constructor() {
    this.state = {
       highlightRowIndex: null
    }
  }

  setHighlightedRow = (index) => {
    const highlightRowIndex = index === null ? null : index - 1;
    this.setState({highlightRowIndex});
  }

  render() {
    return (
       <Table>
        <Tbody>
           {arr.map((row, index) => {
                const isHighlighted = index === this.state.highlightRowIndex
                return {
                    <Trow 
                        isHighlighted={isHighlighted}
                        onMouseOver={() => this.setHighlightedRow(index)}
                        onMouseOut={() => this.setHighlightedRow(null)}
                        >
                        ...
                    </Trow>
                }
           })}  
        </Tbody>   
       </Table>
    )
  }
}

const Trow = styled.tr`
    & td {
        background-color: ${p => p.isHighlighted ? 'red' : 'white'};
    }

    &:hover {
        background-color: red;
    }
`;

R
Ron16

没有,而且有。

如果必须将标签放在输入之前,只需将标签放在输入之后,并将标签和输入都保留在 div 中,并将 div 设置为以下样式:

.输入框{显示:弹性;弹性方向:列反向; }

现在您可以应用 css 中可用的标准下一个兄弟样式选项,并且看起来您正在使用以前的兄弟样式。


O
Oleg Valter is with Ukraine

没有这样的选择器,但是在 DOM API 中有一个漂亮的只读属性

Node.previousSibling


R
Roma Kim

我找到了最简单的解决方案。它可能仅适用于您正在做的事情。

假设您想将鼠标悬停在“sibling_2”上以更改以下示例中的“sibling_1”:

由于没有先前的元素选择器,您可以简单地切换“sibling_1”和“sibling_2”并应用,因此它们看起来相同。

.parent { 显示:弹性; flex-direction:行反向; }

现在您可以像这样选择它们。

.sibling_1:hover ~ .sibling_2 { #your CSS }


简单又好看,谢谢大哥!
H
Hejar

我有一个类似的问题,发现所有这种性质的问题都可以解决如下:

给你所有的物品一个风格。给你选择的项目一个风格。使用 + 或 ~ 为下一个项目指定样式。

这样,您就可以设置当前、以前的项目(所有项目都被当前和下一个项目覆盖)和下一个项目的样式。

例子:

/* all items (will be styled as previous) */
li {
  color: blue;
}

/* the item i want to distinguish */
li.milk {
  color: red;
}

/* next items */
li ~ li  {
  color: green;
}


<ul>
  <li>Tea</li>
  <li class="milk">Milk</li>
  <li>Juice</li>
  <li>others</li>
</ul>

希望它可以帮助某人。


这与来自同一线程的旧答案基本相同:stackoverflow.com/a/27993987/717732
但与另一个不同,这个麻烦解释它在做什么。
@Teepeemm,我同意。我看到了那个答案,我跳过了它,因为没有很好的解释。只是“看看我做了什么,然后复制我!”
J
Jackal

这是类似问题的链接

CSS select all previous siblings for a star rating

因此,我使用每个人的回复发布我的解决方案,任何人都可以将其用作参考并可能推荐改进。

// 只是为了检查输入值 // Consts const starRadios = document.querySelectorAll('input[name="rating"]'); // EventListeners starRadios.forEach((radio) => radio.addEventListener('change', getStarRadioValue)); // 获取星电台值 function getStarRadioValue(event) { alert(event.target.value) // 用它做点什么 }; .star-rating { 字体大小:1.5rem; unicode-bidi:双向覆盖;方向:rtl;文本对齐:左; } .star-rating.editable 标签:悬停 { 光标:指针; } .star-rating.editable .icon-star:hover, .star-rating.editable .icon-star:hover ~ .icon-star { background-color: #fb2727 !important; } .icon-star { 位置:相对;背景颜色:#72747d;宽度:32px;高度:32px;显示:内联块;过渡:背景颜色 0.3s 缓动; } .icon-star.filled { 背景颜色:#fb2727; } .icon-star > 标签 { display: inline-block;宽度:100%;高度:100%;左:0;顶部:0;位置:绝对; } .icon-star > 标签 > input[type="radio"] { position: absolute;顶部:0;左:0;变换:translateY(50%) translateX(50%);显示:无; }


N
Nerius Jok

对于我的用例,需要在焦点上更改以前的元素样式并悬停在父元素中只有 2 个项目。为此使用了 :focus-within:hover 伪类。

就像这样在发生焦点/悬停事件时选择

.root-element:hover .element-to-style { background-color: red;} .root-element:focus-within .element-to-style { background-color: green;}

TextFocused


这个答案对我来说是行不通的!
佚名

我遇到了同样的问题,当我尝试更改输入焦点上的前置图标填充颜色时,我的代码看起来像这样:

<template #append>
    <b-input-group-text><strong class="text-danger">!</strong></b-input-group-text>
</template>
<b-form-input id="password_confirmation" v-model="form.password_confirmation" type="password" placeholder="Repeat password" autocomplete="new-password" />

问题是我正在使用 vue-bootstrap 插槽来注入前置,所以即使我更改位置仍然会在输入后呈现

好吧,我的解决方案是滑动他们的位置,并添加自定义前置和使用 ~ 符号,因为 css 不支持以前的兄弟姐妹。

<div class="form-input-prepend">
    <svg-vue icon="common.lock" />
</div>
<b-form-input id="password_confirmation" v-model="form.password_confirmation" type="password" placeholder="Repeat password" autocomplete="new-password" />

样式

.form-control:focus ~ .form-input-prepend {
    svg path {
        fill: $accent;
    }
}

所以只要尝试改变它的位置,必要时使用 css order 或 position: absolute;实现你想要的,并避免使用 javascript 来满足这种需求。


L
Leo

我通过将元素放入 flexbox 中然后使用 flex-direction: column-reverse 解决了这个问题。

然后我不得不手动反转 HTML 中的元素(以相反的顺序放置它们),它看起来很正常并且有效!

<div style="display: flex; flex-direction: column-reverse">
  <a class="element2">Element 2</a>
  <a class="element1">Element 1</a>
</div>
...
<style>
  .element2:hover + element1 {
    ...
  }
</style>