プラス記号(+
)は次の兄弟を表します。
前の兄弟に相当するものはありますか?
プラス記号(+
)は次の兄弟を表します。
前の兄弟に相当するものはありますか?
回答:
いいえ、「前の兄弟」セレクターはありません。
関連する注で~
は、一般的な後続の兄弟(要素がこの要素の後に来るが、必ずしも直後ではない)を示し、CSS3セレクターです。+
次の兄弟用で、CSS2.1です。
参照してください隣接兄弟コンビネータからセレクタレベル3と5.7隣接兄弟セレクタからカスケーディング・スタイル・シートレベル2リビジョン1(CSS 2.1)仕様。
以前のすべての兄弟(の反対~
)をスタイルする方法を見つけました。これは、必要に応じて機能する場合があります。
リンクのリストがあり、1つにカーソルを合わせると、前のリンクがすべて赤に変わるとします。あなたはこのようにそれを行うことができます:
/* default link color is blue */
.parent a {
color: blue;
}
/* prev siblings should be red */
.parent:hover a {
color: red;
}
.parent a:hover,
.parent a:hover ~ a {
color: blue;
}
<div class="parent">
<a href="#">link</a>
<a href="#">link</a>
<a href="#">link</a>
<a href="#">link</a>
<a href="#">link</a>
</div>
float:right
)で要素を並べ替える必要はありません。余白ではなく単位/単語とパディングの間の空白の折りたたみが必要でしたが、それ以外の場合は完全に機能します!
セレクターレベル4では:has()
!
、以前は次の兄弟を選択できるようにする(以前は件名インジケーター)が導入されています。
previous:has(+ next) {}
…しかし、これを書いている時点では、ブラウザサポートの最先端をいくらか超えています。
:has()
疑似クラスを使用できません。
order
フレックスレイアウトとグリッドレイアウトのプロパティを検討します。以下の例ではflexboxに焦点を当てますが、同じ概念がグリッドにも適用されます。
フレックスボックスを使用すると、以前の兄弟セレクターをシミュレートできます。
特に、flex order
プロパティは画面内で要素を移動できます。
次に例を示します。
要素Bにカーソルを合わせると、要素Aが赤くなります。
<ul> <li>A</li> <li>B</li> </ul>
手順
作りul
フレックスコンテナ。
ul { display: flex; }
マークアップ内の兄弟の順序を逆にします。
<ul>
<li>B</li>
<li>A</li>
</ul>
兄弟セレクターを使用して、要素Aをターゲットにします(~
または+
そうします)。
li:hover + li { background-color: red; }
flex order
プロパティを使用して、ビジュアルディスプレイ上の兄弟の順序を復元します。
li:last-child { order: -1; }
...そしてほら!以前の兄弟セレクターが生まれました(または少なくともシミュレーションされます)。
完全なコードは次のとおりです。
ul {
display: flex;
}
li:hover + li {
background-color: red;
}
li:last-child {
order: -1;
}
/* non-essential decorative styles */
li {
height: 200px;
width: 200px;
background-color: aqua;
margin: 5px;
list-style-type: none;
cursor: pointer;
}
<ul>
<li>B</li>
<li>A</li>
</ul>
フレックスボックス仕様から:
Flexアイテムは、デフォルトでは、ソースドキュメントに表示されるのと同じ順序で表示およびレイアウトされます。の
order
プロパティは、この順序を変更するために使用することができます。この
order
プロパティは、フレックスアイテムを序数グループに割り当てることにより、フレックスコンテナー内に表示される順序を制御します。<integer>
フレックスアイテムが属する序数グループを指定する単一の値を取ります。
order
すべてのフレックスアイテムの初期値は0です。
order
CSSグリッドレイアウトの仕様もご覧ください。
flex order
プロパティで作成された「以前の兄弟セレクター」の例。
.container { display: flex; }
.box5 { order: 1; }
.box5:hover + .box4 { background-color: orangered; font-size: 1.5em; }
.box6 { order: -4; }
.box7 { order: -3; }
.box8 { order: -2; }
.box9 { order: -1; }
.box9:hover ~ :not(.box12):nth-child(-1n+5) { background-color: orangered;
font-size: 1.5em; }
.box12 { order: 2; }
.box12:hover ~ :nth-last-child(-1n+2) { background-color: orangered;
font-size: 1.5em; }
.box21 { order: 1; }
.box21:hover ~ .box { background-color: orangered; font-size: 1.5em; }
/* non-essential decorative styles */
.container {
padding: 5px;
background-color: #888;
}
.box {
height: 50px;
width: 75px;
margin: 5px;
background-color: lightgreen;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
cursor: pointer;
}
<p>
Using the flex <code>order</code> property to construct a previous sibling selector
</p>
<div class="container">
<div class="box box1"><span>1</span></div>
<div class="box box2"><span>2</span></div>
<div class="box box3"><span>3</span></div>
<div class="box box5"><span>HOVER ME</span></div>
<div class="box box4"><span>4</span></div>
</div>
<br>
<div class="container">
<div class="box box9"><span>HOVER ME</span></div>
<div class="box box12"><span>HOVER ME</span></div>
<div class="box box6"><span>6</span></div>
<div class="box box7"><span>7</span></div>
<div class="box box8"><span>8</span></div>
<div class="box box10"><span>10</span></div>
<div class="box box11"><span>11</span></div>
</div>
<br>
<div class="container">
<div class="box box21"><span>HOVER ME</span></div>
<div class="box box13"><span>13</span></div>
<div class="box box14"><span>14</span></div>
<div class="box box15"><span>15</span></div>
<div class="box box16"><span>16</span></div>
<div class="box box17"><span>17</span></div>
<div class="box box18"><span>18</span></div>
<div class="box box19"><span>19</span></div>
<div class="box box20"><span>20</span></div>
</div>
Flexboxは、CSSに関する長年の信念を打ち砕いています。
そのような信念の1つは、以前の兄弟セレクターはCSSでは不可能であるというものです。です。
この信念が広まっていると言うのは控えめな表現でしょう。Stack Overflowのみに関する関連質問の例を以下に示します。
上記のように、この信念は完全に真実ではありません。以前の兄弟セレクターは、flex order
プロパティを使用してCSSでシミュレートできます。
z-index
神話
もう1つの長年の信念はz-index
、配置された要素でのみ機能するというものです。
実際、最新バージョンの仕様(W3C Editor's Draft)では、これが真実であると主張しています。
z-index
- 値:auto | | 受け継ぐ
- 初期:自動
- 適用対象:配置された要素
- 継承:いいえ
- パーセンテージ:なし
- メディア:ビジュアル
- 計算値:指定どおり
(強調を追加)
ただし、実際には、この情報は古く、不正確です。
ある要素フレックス項目またはグリッド項目は、場合でも、スタッキングコンテキストを作成することができますposition
ですstatic
。
フレックスアイテムは、生文書順の代わりに使用されるため、変更された文書の順序を除いて、正確に、インラインブロックと同じペイント、および
z-index
以外の値auto
としてもスタッキングコンテキストを作成しposition
ていますstatic
。グリッド項目の塗装順序は正確生文書順の代わりに使用されるため、変更された文書の順序を除いて、インラインブロックと同じであり、そして
z-index
以外の値auto
としてもスタッキングコンテキストを作成しposition
ていますstatic
。
以下は、z-index
配置されていないflexアイテムでの作業のデモンストレーションです:https : //jsfiddle.net/m0wddwxs/
order
プロパティは視覚的な順序を変更することのみを目的としているため、ソリューションではありません。この回避策を機能させるためにHTMLで変更を強制される元の意味的な順序は復元されません。
z-index
動作します場合でも、「OMG、何がありますposition
、仕様はの概念に言及指定を!」コンテキストを積み重ねることでうまく説明されて、MDNこの記事
float: right
(または順序を逆にする他の手段で、flex/order
副作用はほとんど(最も少ない?)あります)。2つのフィドルをfloat: right
direction: rtl
私も同じ質問をしましたが、それから「だめ」の瞬間がありました。書く代わりに
x ~ y
書く
y ~ x
これは明らかに「y」ではなく「x」に一致しますが、「一致はありますか?」と答えます。質問、そして単純なDOMトラバーサルは、JavaScriptでループするよりも効率的に正しい要素に到達する可能性があります。
元の質問はCSSの質問だったので、この回答はおそらくまったく無関係ですが、他のJavaScriptユーザーは、私のように検索で質問に出くわすかもしれません。
y ~ x
自分の問題を解決する方法について自分が愚かに考え始めていました
y ~ x
は「一致はありますか?」と答えません。質問、ここで与えられた2つのセレクターは完全に異なるものを意味するため。たとえばy ~ x
、サブツリー<root><x/><y/></root>
の場合、一致を生成する方法はありません。質問が「存在しますか?」セレクタは単純y
です。質問が「兄弟xが任意の位置にある場合、yは存在しますか?」次に、両方のセレクタが必要になります。(たぶん、私はこの時点でひったくりです...)
2つのトリック。基本的に、HTML内の目的の要素のHTML順序を逆にし、
~
次の兄弟演算子を使用します。
float-right
+ HTML要素の順序を逆にするdiv{ /* Do with the parent whatever you know just to make the
inner float-right elements appear where desired */
display:inline-block;
}
span{
float:right; /* float-right the elements! */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
background:red;
}
<div>
<!-- Reverse the order of inner elements -->
<span>5</span>
<span>4</span>
<span>3</span>
<span>2</span>
<span>1</span>
</div>
direction: rtl;
+を持つ親は内部要素の順序を逆にします.inverse{
direction: rtl;
display: inline-block; /* inline-block to keep parent at the left of window */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
background:gold;
}
Hover one span and see the previous elements being targeted!<br>
<div class="inverse">
<!-- Reverse the order of inner elements -->
<span>5</span>
<span>4</span>
<span>3</span>
<span>2</span>
<span>1</span>
</div>
+
次の兄弟のためです。前の兄弟に相当するものはありますか?
!
および?
従来のCSSには2つの後続の兄弟セレクターがあります。
+
ある即時後続の兄弟セレクタ~
ある任意の後続の兄弟セレクタ従来のCSSでは、以前の兄弟セレクターはありません。
ただし、ax CSSポストプロセッサライブラリには、以前の2つの兄弟セレクタがあります。
?
ある即時前の兄弟セレクタは(の反対+
)!
ある任意の前の兄弟セレクタ(の反対~
)実例:
以下の例では:
.any-subsequent:hover ~ div
後続を選択します div
.immediate-subsequent:hover + div
直後を選択 div
.any-previous:hover ! div
以前のいずれかを選択します div
.immediate-previous:hover ? div
直前を選択 div
div {
display: inline-block;
width: 60px;
height: 100px;
color: rgb(255, 255, 255);
background-color: rgb(255, 0, 0);
text-align: center;
vertical-align: top;
cursor: pointer;
opacity: 0;
transition: opacity 0.6s ease-out;
}
code {
display: block;
margin: 4px;
font-size: 24px;
line-height: 24px;
background-color: rgba(0, 0, 0, 0.5);
}
div:nth-of-type(-n+4) {
background-color: rgb(0, 0, 255);
}
div:nth-of-type(n+3):nth-of-type(-n+6) {
opacity: 1;
}
.any-subsequent:hover ~ div,
.immediate-subsequent:hover + div,
.any-previous:hover ! div,
.immediate-previous:hover ? div {
opacity: 1;
}
<h2>Hover over any of the blocks below</h2>
<div></div>
<div></div>
<div class="immediate-previous">Hover for <code>?</code> selector</div>
<div class="any-previous">Hover for <code>!</code> selector</div>
<div class="any-subsequent">Hover for <code>~</code> selector</div>
<div class="immediate-subsequent">Hover for <code>+</code> selector</div>
<div></div>
<div></div>
<script src="https://rouninmedia.github.io/axe/axe.js"></script>
HTMLの要素の順序を逆にすることができます。次にorder
、Michael_Bの回答のように使用する以外に、レイアウトに応じて、flex-direction: row-reverse;
または使用することができflex-direction: column-reverse;
ます。
作業サンプル:
.flex {
display: flex;
flex-direction: row-reverse;
/* Align content at the "reversed" end i.e. beginning */
justify-content: flex-end;
}
/* On hover target its "previous" elements */
.flex-item:hover ~ .flex-item {
background-color: lime;
}
/* styles just for demo */
.flex-item {
background-color: orange;
color: white;
padding: 20px;
font-size: 3rem;
border-radius: 50%;
}
<div class="flex">
<div class="flex-item">5</div>
<div class="flex-item">4</div>
<div class="flex-item">3</div>
<div class="flex-item">2</div>
<div class="flex-item">1</div>
</div>
現時点では正式な方法はありませんが、少しトリックを使用してこれを実現できます。これは実験的なものであり、いくつかの制限があることを覚えておいてください...(ナビゲーターの互換性が心配な場合は、このリンクを確認してください)
あなたができることはCSS3セレクターを使うことです:呼ばれる疑似クラス nth-child()
#list>* {
display: inline-block;
padding: 20px 28px;
margin-right: 5px;
border: 1px solid #bbb;
background: #ddd;
color: #444;
margin: 0.4em 0;
}
#list :nth-child(-n+4) {
color: #600b90;
border: 1px dashed red;
background: orange;
}
<p>The oranges elements are the previous sibling li selected using li:nth-child(-n+4)</p>
<div id="list">
<span>1</span><!-- this will be selected -->
<p>2</p><!-- this will be selected -->
<p>3</p><!-- this will be selected -->
<div>4</div><!-- this will be selected -->
<div>5</div>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
</div>
:nth-child(-n+4)
は、正しく動作するためにセレクターに適用する必要がある疑似クラスであるためです。納得がいかない場合は、私のフィドルのフォークを使用して試してみてください。中華
*
セレクターを使用してノードタイプに依存しないようにすることができますが、それは不愉快に悪い習慣です。
li#someListItem
直前にノードが必要だったとしましょう(これが「前の」を解釈する方法です)-入力した情報がCSSでそれを表現するのにどのように役立つのかわかりません。あなたは最初のn人の兄弟を選択しているだけで、私はn人を知っていると仮定しています。このロジックに基づいて、任意のセレクターがトリックを実行し、必要な要素(:not()など)を選択します。
いいえ、できません。CSSではできません。それは「カスケード」を心に刻みます;-)
ただし、ページにJavaScriptを追加できる場合は、少しのjQueryで最終目標を達成できます。
jQueryを使用find
してターゲット要素/クラス/ IDで「先読み」を実行し、バックトラックしてターゲットを選択できます。
次に、jQueryを使用して、要素のDOM(CSS)を書き換えます。
Mike Brantによるこの回答に基づいて、次のjQueryスニペットが役立つ可能性があります。
$('p + ul').prev('p')
これは最初に<ul>
、の直後に続くすべてのを選択します<p>
。
次に、「バックトラック」して<p>
、そののセットから前のをすべて選択します<ul>
。
事実上、「前の兄弟」はjQueryを介して選択されています。
次に、.css
関数を使用して、その要素の新しい値をCSSに渡します。
私の場合、idのDIVを選択する方法を探し#full-width
ていましたが、それがのクラスを持つ(間接)子孫DIVを持っている場合のみです.companies
。
の下にあるすべてのHTMLを制御.companies
できましたが、その上のHTMLを変更することはできませんでした。
そして、カスケードは一方向のみに行きます。
したがって、ALLを選択できます#full-width
。
または.companies
、後に続くもののみを選択することもできます#full-width
。
しかし、進行したs だけを選択することはできませんでした。#full-width
.companies
そして、再び、私は追加することができませんでした .companies
になりますが、HTMLの上位。HTMLのその部分は外部で記述され、コードをラップしました。
しかし、jQueryを使用すると、必要なを選択して#full-width
、適切なスタイルを割り当てることができます。
$("#full-width").find(".companies").parents("#full-width").css( "width", "300px" );
これは、CSSの標準でセレクターを使用して特定の要素をターゲットにする方法と同様に、すべてを検出し#full-width .companies
、それらのみを選択.companies
します。
次に、を使用.parents
して「バックトラック」し、のすべての親を選択しますが.companies
、
それらの結果をフィルタリングして#fill-width
要素のみを保持するため、最終的には、クラスの子孫がある場合に
のみ#full-width
要素を選択します.companies
。
最後width
に、結果の要素に新しいCSS()値を割り当てます。
$(".parent").find(".change-parent").parents(".parent").css( "background-color", "darkred");
div {
background-color: lightblue;
width: 120px;
height: 40px;
border: 1px solid gray;
padding: 5px;
}
.wrapper {
background-color: blue;
width: 250px;
height: 165px;
}
.parent {
background-color: green;
width: 200px;
height: 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" turns red
<div class="change-parent">
descendant: "change-parent"
</div>
</div>
<div class="parent">
"parent" stays green
<div class="nope">
descendant: "nope"
</div>
</div>
</div>
Target <b>"<span style="color:darkgreen">parent</span>"</b> to turn <span style="color:red">red</span>.<br>
<b>Only</b> if it <b>has</b> a descendant of "change-parent".<br>
<br>
(reverse cascade, look ahead, parent un-descendant)
</html>
jQueryリファレンスドキュメント:
$()またはjQuery():DOM要素。
。find:セレクター、jQueryオブジェクト、または要素によってフィルター処理された、一致する要素の現在のセット内の各要素の子孫を取得します。
。parents:一致する要素のセット内の各要素の直前の兄弟を取得します。セレクターが提供されている場合、そのセレクターに一致する場合にのみ前の兄弟を取得します(リストされた要素/セレクターのみが含まれるように結果をフィルタリングします)。
。css:一致する要素のセットに1つ以上のCSSプロパティを設定します。
previousElementSibling
)。
previousElementSibling()
ネイティブのJS DOM関数に慣れている方は、CSS以外の別のパスを提供できます。
+
も、OPが具体的に要求した(存在しない)セレクターを使用していません。この答えをJSの「ハック」と考えてください。私が解決策を見つけるために費やした時間を他の誰かを救うためにここにあります。
残念ながら「以前の」兄弟セレクターはありませんが、ませんが、位置付けを使用同じ効果を得る(例:float right)。それはあなたが何をしようとしているのかに依存します。
私の場合、主にCSSの5つ星の評価システムが必要でした。以前の星に色を付ける(またはアイコンを交換する)必要があります。各要素を正しくフローティングすることで、基本的に同じ効果が得られます(したがって、星のhtmlは「後方」に記述する必要があります)。
この例ではFontAwesomeを使用しており、fa-star-oとfa-starのユニコードを交換しています http://fortawesome.github.io/Font-Awesome/
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/
+
か、~
セレクターが最もきれいな回避策として私を攻撃します。
あなたの正確な目的に応じて、親セレクターを使用せずに親セレクターの有用性を達成する方法があります(存在する場合でも)...
私たちが持っているとしましょう:
<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>
靴下ブロック(靴下の色を含む)を間隔を使用して視覚的に目立たせるにはどうすればよいですか?
何がいいでしょうが存在しません:
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のマージンが設定され、LI内にUL要素(または他のタグ)がないアンカーリンクは0にリセットされます。
以前の兄弟trを選択するためのソリューションが必要でした。私は、ReactコンポーネントとStyledコンポーネントを使用してこのソリューションを思い付きました。これは私の正確な解決策ではありません(これはメモリからの時間です)。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を次のようにスタイル設定します。
.input-box {
display: flex;
flex-direction: column-reverse;
}
<div class="input-box">
<input
id="email"
class="form-item"
/>
<label for="email" class="form-item-header">
E-Mail*
</label>
</div>
これで、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>
それが誰かを助けることを願っています。