加号选择器(+)用于选择下一个相邻同级。
前一个兄弟姐妹是否有同等的?
加号选择器(+)用于选择下一个相邻同级。
前一个兄弟姐妹是否有同等的?
当前回答
我需要一个解决方案来选择上一个兄弟tr。我使用React和Styled组件提出了这个解决方案。这不是我的确切解决方案(这是几小时后的记忆)。我知道setHighlighterRow函数存在缺陷。
OnMouseOver一行会将行索引设置为state,并使用新的背景色重新阅读前一行
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;
}
`;
其他回答
不。这不可能通过CSS实现。它将“级联”放在心上;-)。
然而,如果您能够将JavaScript添加到页面中,那么一点点jQuery可以帮助您实现最终目标。您可以使用jQuery的find对目标元素/class/id执行“前瞻”,然后回溯选择目标。然后使用jQuery重新编写元素的DOM(CSS)。
根据迈克·布兰特的回答,下面的jQuery片段可能会有所帮助。
$('p + ul').prev('p')
这首先选择紧跟在<p>后面的所有<ul>。然后,它“回溯”从这组<ul>s中选择所有以前的<p>s。
实际上,通过jQuery选择了“上一个兄弟姐妹”。现在,使用.css函数为该元素传递css新值。
在我的例子中,我想找到一种方法来选择一个id为#full-width的DIV,但前提是它有一个(间接的)子代DIV,其类为.companies。
我已经控制了.companies下的所有HTML,但无法更改上面的任何HTML。级联只朝着一个方向:向下。
因此,我可以选择所有#全宽。或者,我可以选择只遵循#全宽度的公司。但我不能只选择#继续的全宽度。公司。
再次,我无法在HTML中添加任何更高级别的公司。HTML的这部分是外部编写的,并封装了我们的代码。
但是使用jQuery,我可以选择所需的#全宽,然后分配适当的样式:
$("#full-width").find(".companies").parents("#full-width").css( "width", "300px" );
这将查找所有的#full-width.companies,并只选择那些.companie,类似于CSS中选择器用于针对标准中的特定元素的方式。然后,它使用.parents“回溯”并选择.acompany的所有父级,但是过滤这些结果以仅保留#填充宽度元素,它只选择一个full-width元素,如果它有一个.companies类后代。最后,它为结果元素分配一个新的CSS(宽度)值。
$(“.parent”).find(“.change parent”).parents(“.parint”).css(“背景色”,“深红色”);第二部分{背景色:浅蓝色;宽度:120px;高度:40px;边框:1px实心灰色;填充:5px;}.包装器{背景色:蓝色;宽度:250px;高度:165px;}.父级{背景色:绿色;宽度:200px;高度:70px;}<script src=“https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js“></script><html><div class=“wrapper”><div class=“parent”>“parent”变为红色<div class=“change parent”>后代:“更改父对象”</div></div><div class=“parent”>“父级”保持绿色<div class=“nope”>后代:“nope”</div></div></div>目标<b>“<span style=“color:dark green”>父</span>”</b>将<span style=”color:red“>变为红色</span><br><b>只有当<b>具有</b>“change parent”的后代时,才</b><br><br>(反向级联,向前看,父级非后代)</html>
jQuery参考文档:$()或jQuery():DOM元素。.find:获取当前匹配元素集合中每个元素的后代,通过选择器、jQuery对象或元素进行筛选。.parents:获取匹配元素集合中每个元素的前一个同级元素。如果提供了选择器,则仅当它与该选择器匹配时,它才会检索上一个同级(过滤结果以仅包括列出的元素/选择器)。.css:为匹配元素集设置一个或多个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>
希望这对某人有所帮助。
没有“前一选择器”,但可以使用:not和~(“后选择器”)的组合。没有逆序,没有javascript。
.父级a{颜色:蓝色}.父项a.活动{颜色:红色}.parent a:不是(.parent a.active~a){颜色:红色}<div class=“parent”><a href=“”>链接</a><a href=“”>链接</a><a href=“”class=“active”>链接</a><a href=“”>链接</a><a href=“”>链接</a></div>
我认为我的方法比“设置所有div的样式,而不是删除div之后的样式”,或者使用javascript,或者使用相反的顺序更直接。
你可以使用双重否定
SELECTOR:not([SELECTOR]FILTER):not([SELECTOR]FILTER + SELECTOR) { ... }
用TAG或.CLASS替换SELECTOR(使用#ID可能太具体)。将FILTER替换为其他:PSUEDO-SELECTOR(我只尝试过:悬停)或.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(:悬停~.child){背景色:红色;边界半径:1.5em;}div.parent:hover>div.child:not(:hover):not(:悬停~.child)>div{背景色:黄色;}/*做得漂亮(有点)*/分部租金{宽度:9em;高度:9em;/*布局*/显示:栅格;栅格样板列:自动自动;栅格样板行:自动自动;}分部子项{/*尺寸*/高度:3em;宽度:3em;/*布局*/位置:相对;/*光标*/光标:指针;/*演示文稿*/边框:1px黑色实心;边界半径:1.5em;}.星{/*尺寸*/宽度:2.5em;高度:2.5em;/*放置*/位置:绝对;顶部:50%;左:50%;转换:转换(-50%,-50%);/*几何形状*/-webkit剪辑路径:多边形(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%);/*演示文稿*/背景色:浅灰色;}div.child:悬停{/*演示文稿*/背景色:黄色;边界半径:1.5em;}div.child:悬停>div.star{/*演示文稿*/背景色:红色;}<div class=“parent”><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div><div class=“child”href=“#”></div></div></div>
我遇到了同样的问题,当我试图更改输入焦点上的前置图标填充颜色时,我的代码看起来像这样:
<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引导槽来注入前缀,所以即使我改变了位置,输入后仍然会呈现
嗯,我的解决方案是滑动它们的位置,并添加自定义前缀和使用的~符号,因为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" />
Scss样式
.form-control:focus ~ .form-input-prepend {
svg path {
fill: $accent;
}
}
因此,只需尝试更改其位置,如果需要,请使用css order或position:absolute;以实现您想要的,并避免使用javascript来满足此类需求。