「前の兄弟」セレクターはありますか?


1355

プラス記号(+)は次の兄弟を表します。

前の兄弟に相当するものはありますか?


18
OMG、html要素の順序を逆にし、CSSを使用して要素を後方に表示することを提案するすべての回答は、実際のストレッチです。もちろん、質問には明記されていませんが、ほとんどの「CSSでXを実行できますか」という質問では、HTMLを構造的に変更できないと想定する必要があります。
squarecandy

3
@squarecandy、私はほとんどあなたのコメントに同意します。しかし、不十分であるとあなたが参照する解決策は、それにもかかわらず、いくつかの場合に有用です(賛成票に注意してください)。だから彼らは投稿する価値があります。あなたが「本当のストレッチ」として見るものは、他の人にとっての「創造的な解決策」かもしれません。
Michael Benjamin

回答:


839

いいえ、「前の兄弟」セレクターはありません。

関連する注で~は、一般的な後続の兄弟(要素がこの要素の後に来るが、必ずしも直後ではない)を示し、CSS3セレクターです。+次の兄弟用で、CSS2.1です。

参照してください隣接兄弟コンビネータからセレクタレベル35.7隣接兄弟セレクタからカスケーディング・スタイル・シートレベル2リビジョン1(CSS 2.1)仕様


14
CSS3標準から:2つのシーケンスで表される要素は、ドキュメントツリーで同じ親共有し、最初のシーケンスで表される要素は、2番目のシーケンスで表される要素の前に(必ずしもすぐにではなく)あります。
リーライアン

26
@リー・ライアン:ええ、でもクレタスが彼の答えで指摘しているのは、前の要素を選択しないということです。
BoltClock

42
これができることとできないことを見るために私が作った例です。jsfiddle.net/NuuHy/1
そろばん

7
これに役立つjquery関数はprev()です。たとえば、$( "#the_element")。prev()。css( "background-color"、 "red")
Satbir Kira

1
あなたのマークアップに応じて、このかもしれないのヘルプ:stackoverflow.com/questions/42680881/...
samnau

235

以前のすべての兄弟(の反対~)をスタイルする方法を見つけました。これは、必要に応じて機能する場合があります。

リンクのリストがあり、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>


17
動作の説明を追加できます。(すべてのアイテムと次のアイテムにスタイルを適用しているようですが、明示的に説明できます)
AL

1
素晴らしいソリューション。マークアップやレンダリング(を介してfloat:right)で要素を並べ替える必要はありません。余白ではなく単位/単語とパディングの間の空白の折りたたみが必要でしたが、それ以外の場合は完全に機能します!
Steven Vachon

7
そうですが、ほとんどの場合、以前のものは1つだけ必要です。
azerafati 2016年

42
リンクをクリックすると、リンクが赤くなります。
リン、

3
@Lynn回答には、ホバー時に以前のリンクを赤くするためのコードのみが含まれています。追加のスタイルは、ユースケースによって異なります。星評価コンポーネント(これは一般的なケースだと思います)の場合、そのスペースを削除し、ホバーされたリンクを赤にする必要があります。
2016

164

セレクターレベル4では:has()!、以前は次の兄弟を選択できるようにする(以前は件名インジケーター)が導入されています。

previous:has(+ next) {}

…しかし、これを書いている時点では、ブラウザサポートの最先端をいくらか超えています。


51
「ブラウザサポートの最前線」は誇張されているかもしれません。これを書いている時点では、最新バージョンのChromeでも:has()疑似クラスを使用できません。
リードマーティン

33
@ReedMartin —それが私が最先端をいくらか離れたところ
Quentin

12
":hasは動的セレクタープロファイルの一部としてマークされていないため、スタイルシート内では使用できません。document.querySelector()などの関数でのみ使用できます。" - developer.mozilla.org/en-US/docs/Web/CSS/:has
アーチLinuxのタキシード

1
@ArchLinuxTux:「この制限は削除されました」。そのため、たまにこの機能を使用できる可能性があります:D。
Jacob van Lingen

@JacobvanLingen — caniuse.com/#feat=css-has —現在、ブラウザはこれをサポートしていません。
クエンティン

153

orderフレックスレイアウトとグリッドレイアウトのプロパティを検討します。

以下の例ではflexboxに焦点を当てますが、同じ概念がグリッドにも適用されます。


フレックスボックスを使用すると、以前の兄弟セレクターをシミュレートできます。

特に、flex orderプロパティは画面内で要素を移動できます。

次に例を示します。

要素Bにカーソルを合わせると、要素Aが赤くなります。

<ul>
    <li>A</li>
    <li>B</li>
</ul>

手順

  1. 作りulフレックスコンテナ。

    ul { display: flex; }

  1. マークアップ内の兄弟の順序を逆にします。

    <ul>
       <li>B</li>
       <li>A</li>
    </ul>

  1. 兄弟セレクターを使用して、要素Aをターゲットにします(~または+そうします)。

    li:hover + li { background-color: red; }

  1. 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>

フレックスボックス仕様から:

5.4。表示順序:orderプロパティ

Flexアイテムは、デフォルトでは、ソースドキュメントに表示されるのと同じ順序で表示およびレイアウトされます。の orderプロパティは、この順序を変更するために使用することができます。

このorderプロパティは、フレックスアイテムを序数グループに割り当てることにより、フレックスコンテナー内に表示される順序を制御します。<integer>フレックスアイテムが属する序数グループを指定する単一の値を取ります。

orderすべてのフレックスアイテムの初期値は0です。

orderCSSグリッドレイアウトの仕様もご覧ください。


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>

jsFiddle


余談– CSSに関する2つの時代遅れの信念

Flexboxは、CSSに関する長年の信念を打ち砕いています。

そのような信念の1つは、以前の兄弟セレクターはCSSでは不可能であるというものです。です。

この信念が広まっていると言うのは控えめな表現でしょう。Stack Overflowのみに関する関連質問の例を以下に示します。

上記のように、この信念は完全に真実ではありません。以前の兄弟セレクターは、flex orderプロパティを使用してCSSでシミュレートできます。

z-index神話

もう1つの長年の信念はz-index、配置された要素でのみ機能するというものです。

実際、最新バージョンの仕様(W3C Editor's Draft)では、これが真実であると主張しています。

9.9.1スタックレベルの指定:z-index プロパティ

z-index

  • 値:auto | | 受け継ぐ
  • 初期:自動
  • 適用対象:配置された要素
  • 継承:いいえ
  • パーセンテージ:なし
  • メディア:ビジュアル
  • 計算値:指定どおり

(強調を追加)

ただし、実際には、この情報は古く、不正確です。

ある要素フレックス項目またはグリッド項目は、場合でも、スタッキングコンテキストを作成することができますpositionですstatic

4.3。フレックスアイテムのZオーダー

フレックスアイテムは、生文書順の代わりに使用されるため、変更された文書の順序を除いて、正確に、インラインブロックと同じペイント、およびz-index以外の値autoとしてもスタッキングコンテキストを作成しpositionていますstatic

5.4。Z軸の順序:z-indexプロパティ

グリッド項目の塗装順序は正確生文書順の代わりに使用されるため、変更された文書の順序を除いて、インラインブロックと同じであり、そしてz-index以外の値autoとしてもスタッキングコンテキストを作成し positionていますstatic

以下は、z-index配置されていないflexアイテムでの作業のデモンストレーションです:https : //jsfiddle.net/m0wddwxs/


15
このorderプロパティは視覚的な順序を変更することのみを目的としているため、ソリューションではありませ。この回避策を機能させるためにHTMLで変更を強制される元の意味的な順序復元されませ
Marat Tanalin 2016年

2
@Marat Tanalin:使用例の90%では、ブラウザーのサポートが問題ではないと想定すると、これは問題なく機能します。残りの10%の使用例は、1)視覚的な順序の変更が解決策ではない場合、または2)CSSをまったく使用しない場合のいずれかです。ありがたいことに、#2の場合、selectors-4は:has()を提供します。それを実装するかどうかは、セレクターライブラリの開発者次第です。
BoltClock

5
引用しているCSS2.2 EDは、本質的にはまだCSS2であることに注意してください。また、フレックスボックスとグリッドレイアウトはCSS2には存在しないため、CSS2に関する限り、その情報は確かに当てはまります。少なくとも、CSSの将来のレベルでは、z-indexが他のタイプの要素に適用される可能性があることを説明するようにテキストを更新できます。
BoltClock

3
場合には誰もが、トラブル時に理解していない持っているz-index動作します場合でも、「OMG、何がありますposition、仕様はの概念に言及指定を!」コンテキストを積み重ねることでうまく説明されて、MDNこの記事
ロジェSpiekerの

3
@Michael_Bどういたしまして!私はこれを知らない多くのフロントエンドに対処しました。もう1つ述べておきたいことですが、以前偽の兄弟セレクターもうまく機能しますfloat: right(または順序を逆にする他の手段で、flex/order副作用はほとんど(最も少ない?)あります)。2つのフィドルをfloat: rightdirection: rtl
練り上げた

69

私も同じ質問をしましたが、それから「だめ」の瞬間がありました。書く代わりに

x ~ y

書く

y ~ x

これは明らかに「y」ではなく「x」に一致しますが、「一致はありますか?」と答えます。質問、そして単純なDOMトラバーサルは、JavaScriptでループするよりも効率的に正しい要素に到達する可能性があります。

元の質問はCSSの質問だったので、この回答はおそらくまったく無関係ですが、他のJavaScriptユーザーは、私のように検索で質問に出くわすかもしれません。


18
yが簡単に見つかるとうまくいくと思います。問題は、yがxに相対的にしか見つからない場合で、逆にすると、最初にxを見つける必要があるため、yを見つけることができません。これはもちろん、yが次の兄弟ではなく前の兄弟であるという質問を参照していますが、yが次の兄弟であることにも当てはまります。
デビッド

19
ちょっと厳しいです (申し訳ありませんが、抵抗できませんでした。)要点は、「yは存在するか?」また、「:before」を使用して2つの要素の間に何かを置くこともできます。最後に、jQueryにドロップする必要がある場合は、find( "y〜x")。prev()を使用する方が、多くの代替手段よりも簡単です。
Bryan Larsen

156
以前の兄弟セレクターの考え方は、前の要素を選択することです。残念ながら、ここで説明するようにそれを逆にしても、この機能は提供されません。
Zenexer 2013

14
この回答では元の質問に対する実際の解決策は提供されないという説明を@Zenexerに感謝します。私はy ~ x自分の問題を解決する方法について自分が愚かに考え始めていました
Jaime Hablutzel

4
私はこの回答の背後にある考えを理解していますが、回答で与えられた推論はまったく意味がありません。セレクターy ~ xは「一致はありますか?」と答えません。質問、ここで与えられた2つのセレクターは完全に異なるものを意味するため。たとえばy ~ x、サブツリー<root><x/><y/></root>の場合、一致を生成する方法はありません。質問が「存在しますか?」セレクタは単純yです。質問が「兄弟xが任意の位置にある場合、yは存在しますか?」次に、両方のセレクタが必要になります。(たぶん、私はこの時点でひったくりです...)
BoltClock

25

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>


25

+次の兄弟のためです。前の兄弟に相当するものはありますか?

2つのaxセレクターを使用できます:!および?

従来の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>


3
Railsプロジェクト内のsassに実装しようとすると、構文エラーが発生します。
alex

25
axはCSSポストプロセッサです。Sass、Less、StylusなどのCSSプリプロセッサと同じ構文は使用しません。
Rounin 2017

1
@Rouninにドキュメントリンクをいくつか追加してもよろしいですか。私は斧のポストプロセッサーを見つけることができません。
Dionys

@Dionys-関心をお寄せいただきありがとうございます。axは、ES2015を知らなかった2016年後半に始めたプロジェクトで、JSのオブジェクトでさえ、私にとっては非常に新しいものでした。GitHubリポジトリは、github.com / RouninMedia / axeです。私はある時点でこれに戻るつもりです(CSSでjavascriptイベントに相当するaxe- bladesと呼ばれるものも開発しました)が、最初に別のプロジェクト(コードネームashiva)で作業を完了する必要があります。
Rounin

17

別のフレックスボックスソリューション

HTMLの要素の順序を逆にすることができます。次にorderMichael_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>


16

現時点では正式な方法はありませんが、少しトリックを使用してこれを実現できます。これは実験的なものであり、いくつかの制限があることを覚えておいてください...(ナビゲーターの互換性が心配な場合は、このリンクを確認してください)

あなたができることは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>

制限事項

  • 次の要素のクラスに基づいて前の要素を選択することはできません
  • これは擬似クラスでも同じです

1
@Ian :nth-child(-n+4)は、正しく動作するためにセレクターに適用する必要がある疑似クラスであるためです。納得がいかない場合は、私のフィドルのフォークを使用して試してみてください。中華
料理

1
実際には、*セレクターを使用してノードタイプに依存しないようにすることができますが、それは不愉快に悪い習慣です。
Josh Burgess

1
これは私にとってうまくいった答えです、なぜそれがより高い投票または受け入れられないのかはわかりません。
Jake Cattrall、2015年

1
実際、それはさまざまなノードで動作します:jsfiddle.net/aLhv9r1w/316。答えを更新してください:)
ジェイミー・バーカー

1
複雑なセレクターがありましたが、そのli#someListItem直前にノードが必要だったとしましょう(これが「前の」を解釈する方法です)-入力した情報がCSSでそれを表現するのにどのように役立つのかわかりません。あなたは最初のn人の兄弟を選択しているだけで、私はn人を知っていると仮定しています。このロジックに基づいて、任意のセレクターがトリックを実行し、必要な要素(:not()など)を選択します。
bitoolean

4

正確な位置がわかっている場合:nth-child()は、後続のすべての兄弟の除外に基づいて機能します。

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

すべてを選択します li、3番目より前のの(たとえば、1番目と2番目)。しかし、私の意見ではこれは醜く見え、非常にタイトなユースケースがあります。

n番目の子を右から左に選択することもできます。

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

これは同じことです。


3

いいえ、できません。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プロパティを設定します。


これは問題とは何の関係もありません。もちろん、JSを使用することも可能であり、jQueryも必要ありません(previousElementSibling)。
Fabian von Ellerts

1
@FabianvonEllerts OPの質問に直接回答しました。私の答えが述べるように、それは文字通りCSSを介して不可能です。次に、CSSのユーザーが精通していてアクセスできるテクノロジ(JS | JQuery)を使用して、目標を達成するための1つの 可能なパスを提供しました。たとえば、多くのWordPressサイトにもJQueryがあるので、これは簡単なエントリーポイントです。使いやすく、覚えて、拡張することができます。目標を達成する別の方法を提供せずに、単にNOと答えるのは無責任です。同じ質問があったときに学んだことと使用したことを共有しました。
SherylHohman

previousElementSibling()ネイティブのJS DOM関数に慣れている方は、CSS以外の別のパスを提供できます。
SherylHohman

他のCSS HACKは非常に興味深いものでしたが、私の特定のユースケースでは、機能しなかった(警告カテゴリに分類された)か、複雑すぎました。同じ状況に陥る他の人にとって、上記の解決策が失敗するか、実装/保守が難しい場合に機能する、この使いやすい方法を共有することは公平です。多くのCSSハックが共有されました。この回避策はカバーされていません。回答のどれ+も、OPが具体的に要求した(存在しない)セレクターを使用していません。この答えをJSの「ハック」と考えてください。私が解決策を見つけるために費やした時間を他の誰かを救うためにここにあります。
SherylHohman

2

残念ながら「以前の」兄弟セレクターはありませんがませんが、位置付けを使用同じ効果を得る(例: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/


1
右にフロートする+か、~セレクターが最もきれいな回避策として私を攻撃します。
Wylliam Judd 2017

2

あなたの正確な目的に応じて、親セレクターを使用せずに親セレクターの有用性を達成する方法があります(存在する場合でも)...

私たちが持っているとしましょう:

<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にリセットされます。


2

以前の兄弟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;
    }
`;

0

ありません、あります

入力の前にラベルを配置する必要がある場合は、入力の後にラベルを配置し、ラベルと入力の両方を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で使用可能な標準の次の兄弟スタイリングオプションを適用できます。これは、以前の兄弟スタイリングを使用しているように見えます。


-1

私は同様の問題を抱えていましたが、この性質のすべての問題は次のように解決できることがわかりました:

  1. すべてのアイテムにスタイルを与えます。
  2. 選択したアイテムにスタイルを与えます。
  3. +または〜を使用して次のアイテムにスタイルを与えます。

このようにして、現在の前のアイテム(現在のアイテムと次のアイテムで上書きされたすべてのアイテム)と次のアイテムのスタイルを設定できます。

例:

/* 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>

それが誰かを助けることを願っています。


1
それは基本的に同じスレッドから古い答えと同じトリックです:stackoverflow.com/a/27993987/717732
ケツァルコアトル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.