加号 (+
) 用于选择下一个兄弟。
是否有前一个兄弟姐妹的等价物?
不,没有“前一个兄弟”选择器。
在相关说明中,~
用于一般后继兄弟(意味着元素在此之后,但不一定紧随其后)并且是 CSS3 选择器。 +
用于下一个兄弟,是 CSS2.1。
请参阅 Selectors Level 3 中的 Adjacent sibling combinator 和 Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification 中的 5.7 Adjacent sibling selectors。
我找到了一种方法来设置所有以前的兄弟姐妹(与 ~
相对)的样式,这可能取决于您的需要。
假设您有一个链接列表,当悬停在一个链接上时,之前的所有链接都应该变成红色。你可以这样做:
/* 默认链接颜色为蓝色 */ .parent a { color: blue; } /* prev 兄弟姐妹应该是红色 */ .parent:hover a { color: red; } .parent a:hover, .parent a:hover ~ a { color: blue; }
.parent:hover a
样式,所有标签在悬停在父标签上时都会变为红色,但同时不会将光标悬停在任何子标签上。
display
Selectors level 4 proposes :has()
(以前是主题指示符 !
),有一天,它允许您选择以前的兄弟姐妹:
previous:has(+ next) {}
… 但在撰写本文时,browser support 实际上不存在。
多年来,这个答案吸引了数十条“它仍然不受支持”的评论(现已删除)。请不要再添加了。答案中有一个指向最新浏览器支持图表的链接。
考虑 flex 和 grid 布局的 order 属性。
在下面的示例中,我将重点关注 flexbox,但同样的概念也适用于 Grid。
使用 flexbox,可以模拟先前的兄弟选择器。
特别是,flex order
属性可以在屏幕上移动元素。
这是一个例子:
当元素 B 悬停时,您希望元素 A 变为红色。
脚步
使 ul 成为一个弹性容器。 ul {显示:弹性; }
颠倒标记中同级的顺序。
使用同级选择器来定位元素 A(~ 或 + 可以)。 li:hover + li { 背景颜色:红色; }
使用 flex order 属性来恢复视觉显示上的兄弟姐妹的顺序。 li:last-child { order: -1; }
……瞧!先前的兄弟选择器诞生(或至少模拟)。
这是完整的代码:
ul {显示:弹性; } li:hover + li { 背景颜色:红色; } li:last-child { 顺序:-1; } /* 非必要的装饰风格 */ li { height: 200px;宽度:200px;背景颜色:浅绿色;边距:5px;列表样式类型:无;光标:指针; }
来自 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
属性构造前一个兄弟选择器
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 | |继承初始:自动适用于:定位元素继承:无百分比:不适用媒体:视觉计算值:指定(强调添加)
然而,实际上,这些信息已经过时且不准确。
即使 position
为 static
,flex items 或 grid 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 才能使此解决方法起作用。
z-index
何时起作用,即使“天哪,没有指定 position
!”,规范中提到了 stacking context 的概念,{ 1}
float: right
(或任何其他反转顺序的方法,其中 flex/order
几乎没有(最少?)副作用)。掀起了两个小提琴:demonstrating the float: right
approach和demonstrating direction: rtl
我有同样的问题,但后来我有一个“呃”的时刻。而不是写
x ~ y
写
y ~ x
显然这匹配“x”而不是“y”,但它回答“有匹配吗?”问题,简单的 DOM 遍历可能比在 javascript 中循环更有效地让您找到正确的元素。
我意识到最初的问题是一个 CSS 问题,所以这个答案可能完全无关紧要,但其他 Javascript 用户可能会像我一样通过搜索偶然发现这个问题。
y ~ x
如何解决我的问题
y ~ x
没有回答“有匹配项吗?”问题,因为这里给出的两个选择器意味着完全不同的东西。例如,给定子树 <root><x/><y/></root>
,y ~ x
不可能产生匹配。如果问题是“你存在吗?”那么选择器就是y
。如果问题是“给定任意位置的同级 x,y 是否存在?”那么你需要 both 选择器。 (虽然也许我现在只是在吹毛求疵......)
没有“前一个选择器”,但您可以使用 :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 }
只为第二个孩子着色。
+ 用于下一个兄弟姐妹。是否有前一个兄弟姐妹的等价物?
您可以使用两个斧头选择器:!和 ?
常规 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; }
?
选择器上!
选择器~
选择器+
选择器
三个技巧:
基本上,在 HTML 中反转元素的 HTML 顺序,
以及使用~
下一个兄弟姐妹操作员:
1. 使用 CSS Flex 和 row-reverse
.reverse { display: inline-flex; flex-direction:行反向; } .reverse span:hover ~ span { /* 在 SPAN 悬停时,目标是它的“先前”元素 */ background:gold; } 将鼠标悬停在 SPAN 上,查看之前的元素样式!
2.使用带方向的Flex:RTL
.reverse { display: inline-flex;方向:rtl; } .reverse span:hover ~ span { /* 在 SPAN 悬停时,目标是它的“前一个”元素 */ background: red; } 将鼠标悬停在 SPAN 上,查看之前的元素样式!
3. 使用浮动权
.reverse { 显示:内联块; } .reverse span{ 浮动:对; } .reverse span:hover ~ span { /* 在 SPAN 悬停时,目标是它的“前一个”元素 */ background: red; } 将鼠标悬停在 SPAN 上,查看之前的元素样式!
另一个 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%; }
目前没有官方方法可以做到这一点,但你可以使用一个小技巧来实现这一点!请记住,它是实验性的,并且有一些限制......(如果您担心导航器的兼容性,请检查 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
2
3
6
7
8
9< /p>
限制
您不能根据下一个元素的类选择上一个元素
这对于伪类也是一样的
:nth-child(-n+4)
?
:nth-child(-n+4)
是一个伪类,需要应用于选择器才能正常工作。如果您不相信,请尝试使用我的小提琴叉子进行实验,您会发现它无法正常工作
*
选择器独立于节点类型,但这是非常糟糕的做法。
li#someListItem
并且我想要它之前的节点(这就是我解释“上一个”的方式) - 我看不出您提供的信息如何帮助我表达通过 CSS。您只是选择前 n 个兄弟姐妹,并假设我知道 n。基于这个逻辑,任何选择器都可以解决问题并选择我需要的元素(例如 :not() )。
你可以使用双重否定
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; }
不,这是不可能通过 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; }
jQuery 参考文档:
$() or jQuery():DOM 元素。
.find:获取当前匹配元素集中每个元素的后代,由选择器、jQuery 对象过滤,或元素。
.parents:获取匹配元素集中每个元素的前一个兄弟元素。如果提供了选择器,则仅当它与该选择器匹配时才检索前一个同级(过滤结果以仅包含列出的元素/选择器)。
.css:为匹配的元素集设置一个或多个 CSS 属性.
previousElementSibling
)。
previousElementSibling()
对于那些更熟悉原生 JS DOM 功能的人,可以提供另一个非 CSS 路径。
+
(不存在)选择器。将此答案视为 JS “hack”。这是为了节省我花在寻找解决方案上的时间。
如果您知道确切位置,则基于 :nth-child()
的所有后续同级排除将起作用。
ul li:not(:nth-child(n+3))
这将选择第 3 个之前的所有 li
(例如第 1 个和第 2 个)。但是,在我看来,这看起来很难看,而且用例非常紧凑。
您还可以从右到左选择第 n 个子项:
ul li:nth-child(-n+2)
哪个也一样。
在悬停时覆盖下一个兄弟姐妹的样式,以便看起来只有以前的兄弟姐妹在悬停时添加了样式。
ul li { 颜色:红色; } ul:hover li { 颜色: 蓝色; } ul:hover li:hover ~ li{ color: red; }
根据您的确切目标,有一种方法可以在不使用父选择器的情况下实现父选择器的有用性(即使存在父选择器)......
假设我们有:
<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 元素(或其他标签)的链接。
/* 为所有子元素添加样式,然后将样式撤消到目标和目标的同级子元素。 */ ul>li { 颜色:红色; } ul>li.target, ul>li.target~li { 颜色:继承; }
不幸的是,没有“以前的”同级选择器,但您仍然可以通过使用定位(例如向右浮动)获得相同的效果。这取决于你想要做什么。
就我而言,我想要一个主要是 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/
+
或 ~
选择器让我觉得最干净。
我需要一个解决方案来选择前一个兄弟 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;
}
`;
没有,而且有。
如果必须将标签放在输入之前,只需将标签放在输入之后,并将标签和输入都保留在 div 中,并将 div 设置为以下样式:
.输入框{显示:弹性;弹性方向:列反向; }
现在您可以应用 css 中可用的标准下一个兄弟样式选项,并且看起来您正在使用以前的兄弟样式。
我找到了最简单的解决方案。它可能仅适用于您正在做的事情。
假设您想将鼠标悬停在“sibling_2”上以更改以下示例中的“sibling_1”:
由于没有先前的元素选择器,您可以简单地切换“sibling_1”和“sibling_2”并应用,因此它们看起来相同。
.parent { 显示:弹性; flex-direction:行反向; }
现在您可以像这样选择它们。
.sibling_1:hover ~ .sibling_2 { #your CSS }
我有一个类似的问题,发现所有这种性质的问题都可以解决如下:
给你所有的物品一个风格。给你选择的项目一个风格。使用 + 或 ~ 为下一个项目指定样式。
这样,您就可以设置当前、以前的项目(所有项目都被当前和下一个项目覆盖)和下一个项目的样式。
例子:
/* 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>
希望它可以帮助某人。
这是类似问题的链接
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%);显示:无; }
对于我的用例,需要在焦点上更改以前的元素样式并悬停在父元素中只有 2 个项目。为此使用了 :focus-within
和 :hover
伪类。
就像这样在发生焦点/悬停事件时选择
.root-element:hover .element-to-style { background-color: red;} .root-element:focus-within .element-to-style { background-color: green;}
我遇到了同样的问题,当我尝试更改输入焦点上的前置图标填充颜色时,我的代码看起来像这样:
<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 来满足这种需求。
我通过将元素放入 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>