"이전 형제"선택기가 있습니까?


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 표준에서 : 두 시퀀스로 표시되는 요소는 문서 트리에서 동일한 부모공유 하며 첫 번째 시퀀스로 표시되는 요소는 두 번째 시퀀스로 표시되는 요소 보다 우선 합니다.
Lie Ryan

26
@Lie Ryan : 네, 그러나 Cletus가 그의 대답에서하고있는 요점 은 앞의 요소를 선택 하지 않는다는 것 입니다.
BoltClock

42
이것이 내가 할 수있는 것과 할 수없는 것을보기 위해 만든 예입니다. jsfiddle.net/NuuHy/1
주판

7
이것에 유용한 jquery 함수는 prev ()입니다. 예를 들어 $ ( "# the_element"). prev (). css ( "background-color", "red")
Satbir Kira

1
마크 업에 따라 도움이 될 수 있습니다. stackoverflow.com/questions/42680881/…
samnau

234

~필요한 것에 따라 작동 할 수있는 모든 이전 형제 (의 반대 ) 스타일을 지정하는 방법을 찾았습니다 .

링크 목록이 있고 하나를 가리키면 이전의 모든 링크가 빨간색으로 변한다고 가정 해 봅시다. 다음과 같이 할 수 있습니다 :

/* 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
그렇습니다. 그러나 이전의 것이 전부는 아닙니다.
azerafati

41
내가 그들 사이의 공간을 가리키면 링크가 모두 빨간색으로 바뀝니다.
Lynn

3
@Lynn에는 이전 링크가 빨간색으로 바뀌는 코드 만 포함되어 있습니다. 추가 스타일은 사용 사례에 따라 다릅니다. 별표 등급 구성 요소 (일반적인 경우라고 생각)의 경우 해당 공간을 제거하고 호버링 된 링크를 빨간색으로 만들어야합니다.
mantish

164

선택기 레벨 4에서는:has()! 다음과 같이 이전 형제를 선택할 수있는 (이전 제목 표시기 )를 소개합니다 .

previous:has(+ next) {}

… 그러나 글을 쓰는 시점에서 브라우저 지원을위한 최첨단을 벗어난 거리입니다.


51
"브라우저 지원을위한 최첨단" 은 과장된 표현 일 수 있습니다. 이 글을 쓰는 시점에서 최신 버전의 Chrome조차도 :has()의사 클래스를 사용할 수 없습니다 .
리드 마틴

33
@ReedMartin — 이것이 바로 최첨단을 넘어선 거리
Quentin

12
":는 동적 선택기 프로파일의 일부로 표시되지 않았습니다. 이는 스타일 시트에서 사용할 수 없으며 document.querySelector ()와 같은 함수에서만 사용할 수 있음을 의미합니다." - developer.mozilla.org/en-US/docs/Web/CSS/:has
아치 리눅스 턱시도

1
@ArchLinuxTux : "이 제한은 이제 제거되었습니다". 가끔 우리는이 기능을 사용할 수 있습니다 : D.
Jacob van Lingen

@JacobvanLingen — caniuse.com/#feat=css-has — 현재 지원하는 브라우저가 없습니다.
Quentin

153

order플렉스 및 그리드 레이아웃 의 속성을 고려하십시오 .

아래 예제에서는 flexbox에 중점을 두지 만 동일한 개념이 Grid에도 적용됩니다.


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>

flexbox 사양에서 :

5.4. 표시 순서 : order속성

Flex 항목은 기본적으로 소스 문서에 나타나는 순서대로 표시되고 배치됩니다. order속성은이 순서를 변경할 수 있습니다.

order속성은 플렉스 항목을 순서 그룹에 할당하여 플렉스 컨테이너 내에 표시되는 순서를 제어합니다. <integer>flex 값이 속하는 서수 그룹을 지정 하는 단일 값을 갖습니다.

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에 대한 오래된 신념

Flexbox는 CSS에 대한 오랜 믿음을 산산조각 내고 있습니다.

그러한 신념 중 하나 는 CSS에서 이전 형제 선택기가 불가능하다는 것입니다 .

이 믿음이 널리 퍼져 있다고 말하는 것은 과소 평가 일 것이다. 다음은 스택 오버플로에만 관련된 질문에 대한 샘플입니다.

위에서 설명한 것처럼이 믿음은 전적으로 사실이 아닙니다. flex order속성을 사용하여 CSS에서 이전 형제 선택기를 시뮬레이션 할 수 있습니다 .

z-index신화

또 다른 오랜 믿음은 z-index위치 지정된 요소에서만 작동 한다는 것입니다 .

사실, 최신 버전의 사양 인 W3C Editor 's Draft 는 여전히 이것이 사실이라고 주장합니다.

9.9.1 스택 레벨 지정 : z-index 속성

z-index

  • 값 : 자동 | | 상속
  • 초기 : 자동
  • 적용 대상 : 위치 지정된 요소
  • 상속 : 아니오
  • 백분율 : N / A
  • 미디어 : 시각
  • 계산 된 값 : 지정된대로

(강조 추가)

그러나 실제로이 정보는 더 이상 사용되지 않으며 부정확합니다.

플렉스 아이템 또는 그리드 아이템 인 요소 position는 is 인 경우에도 스태킹 컨텍스트를 생성 할 수 있습니다 static.

4.3. 플렉스 아이템 Z 주문

Flex 항목은 순서가 수정 된 문서 순서가 원시 문서 순서 대신 사용되며 is 인 경우에도 스택 컨텍스트를 작성하는 z-index것 이외의 값을 제외하고는 인라인 블록과 정확히 동일하게 페인트합니다 .autopositionstatic

5.4. Z 축 주문 : z-index속성

그리드 항목의 페인팅 순서는 인라인 블록과 정확히 동일합니다. 단, 순서 수정 문서 순서는 원시 문서 순서 대신 사용되며 is 인 경우에도 스택 컨텍스트를 만드는 z-index것 이외의 값 입니다 .autopositionstatic

z-index위치가 지정되지 않은 플렉스 항목에 대한 작업 데모는 다음과 같습니다 . https://jsfiddle.net/m0wddwxs/


15
order속성은 시각적 순서 를 변경하기위한 것일 뿐이므로이 대안이 작동하기 위해 HTML에서 강제로 변경해야하는 원래 의미 론적 순서를 복원 하지 않습니다 .
Marat Tanalin

2
@Marat Tanalin : 브라우저 지원에 문제가 없다고 가정하면 사용 사례의 90 %가 제대로 작동합니다. 유스 케이스의 나머지 10 %는 1) 시각적 순서 변경이 해결책이 아닌 경우 또는 2) CSS와 전혀 관련이없는 경우입니다. 고맙게도 # 2의 경우 selectors-4는 : has ()를 제공하며이를 구현하는 것은 선택기 라이브러리 개발자에게 달려 있습니다.
BoltClock

5
인용하는 CSS2.2 ED는 본질적으로 여전히 CSS2입니다. 그리고 flex2와 격자 레이아웃은 CSS2에 존재하지 않으므로 CSS2에 관한 한 그 정보는 확실히 사실입니다. 최소한 z-index가 CSS의 미래 레벨에서 다른 유형의 요소에 적용될 수 있음을 언급하도록 텍스트를 업데이트 할 수 있으며 다른 속성이 불투명도와 같은 스택 컨텍스트를 설정할 수있는 것과 동일합니다.
BoltClock

3
경우에는 사람이 문제가 될 때 이해하지 데 z-index작동하는 경우에도, "세상에, 더있다 position, 사양이의 개념을 언급 지정을!" 컨텍스트를 스태킹 에 의해 잘 설명, MDN에이 문서
로지에 (Rogier) Spieker

3
@Michael_B 천만에요! 나는 이것을 모르는 많은 프론트 엔드를 다루었습니다. 내가 언급하고 싶은 또 다른 것은 가짜 이전 형제 선택기 에서도 훌륭하게 작동합니다 float: right(또는 flex/order부작용을 거의하지 않는 순서를 바꾸는 다른 방법 ). 두 개의 바이올린 채찍질 : 보여주는 float: right접근 방식을 하고, 시연direction: rtl
로지에 (Rogier) Spieker을

69

나는 같은 질문을했지만 "duh"순간을 가졌다. 쓰는 대신

x ~ y

쓰다

y ~ x

분명히 이것은 "y"대신 "x"와 일치하지만 "일치합니까?" 질문과 간단한 DOM 순회는 자바 스크립트에서 반복하는 것보다 올바른 요소로보다 효율적으로 이동할 수 있습니다.

원래 질문은 CSS 질문 이므로이 답변은 전혀 관련이 없지만 다른 Javascript 사용자는 내가했던 것처럼 검색을 통해 질문에 걸려 넘어 질 수 있습니다.


18
나는 y를 쉽게 찾을 수있을 때 작동한다고 생각합니다. 문제는 y가 x와 관련하여 만 찾을 수 있고 반대로하면 x를 먼저 찾아야하므로 y를 찾을 수 없다는 것입니다. 이것은 물론 y가 다음보다 형제보다 선행한다는 문제와 관련이 있지만 y가 다음 형제 인 경우에도 적용될 수 있습니다.
David

19
넌 가혹한데, 하쉬 (죄송합니다. 저항 할 수 없었습니다.) 요점은 때때로 "당신은 존재 하는가?"를 알아야한다는 것입니다. 다른 경우에는 ": before"를 사용하여 두 요소 사이에 무언가를 넣을 수 있습니다. 마지막으로 jQuery에 드롭 해야하는 경우 find ( "y ~ x"). prev ()를 사용하는 것이 많은 대안보다 쉽습니다.
Bryan Larsen

156
이전 형제 선택기의 아이디어는 이전 요소를 선택한다는 것입니다. 안타깝게도 여기에 설명 된대로 뒤집 으면이 기능이 제공되지 않습니다.
Zenexer

14
이 대답은 원래의 질문에 대한 실제적인 솔루션을 제공하지 않는다는 설명에 대한 감사 @Zenexer, 나는 나 자신에게 방법에 대한 어리석은 생각 느끼기 시작했다 y ~ x나의 문제를 해결할 수
제이미 Hablutzel

4
나는이 대답의 배경에 대한 아이디어를 이해하지만 대답에 주어진 추론은 의미가 없습니다. 선택기 y ~ x가 "일치 하는가?"라고 대답하지 않습니다. 여기에 주어진 두 선택기는 완전히 다른 것을 의미하기 때문에 질문입니다. 예를 들어 y ~ x하위 트리 <root><x/><y/></root>가 주어지면 일치하는 방법이 없습니다 . 질문이 "y 존재합니까?" 그러면 선택기는 간단 y합니다. 질문이 "임의의 x에 임의의 위치에있는 경우 y가 존재합니까?" 그런 다음 선택기 가 모두 필요 합니다 . (아마도 나는이 시점에서 nitpicking
일뿐입니다

25

두 가지 트릭 . 기본적으로 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

+다음 형제 자매입니다. 이전 형제에 해당하는 것이 있습니까?

당신은이 사용할 수있는 도끼 선택기 : !?

기존 CSS 에는 2 개의 후속 형제 선택기 가 있습니다.

  • +는 IS 즉각적인 후속 형제 선택기
  • ~는 IS 어떤 후속 형제 선택기

기존 CSS 에는 이전 형제 선택기없습니다 .

그러나 ax CSS 포스트 프로세서 라이브러리에는 2 개의 이전 형제 선택기가 있습니다 .

  • ?는 IS 즉시 이전 형제 선택기 (의 반대 +)
  • !는 IS 모든 이전 형제 선택기 (반대 ~)

작업 예 :

아래 예에서 :

  • .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
레일 프로젝트 내부의 sass에서 구현하려고하면 구문 오류가 발생합니다.
alex

25
ax 는 CSS 포스트 프로세서입니다. Sass, Less 또는 Stylus와 같은 CSS 전처리 기와 동일한 구문을 사용하지 않습니다.
Rounin

1
@Rounin 문서 링크를 추가 하시겠습니까? 도끼 포스트 프로세서를 찾을 수 없습니다 .
Dionys

@Dionys-관심을 가져 주셔서 감사합니다. ax 는 ES2015를 알지 못하고 JS의 객체조차도 나에게 매우 새로운 2016 년 후반에 시작한 프로젝트입니다. GitHub의 저장소는 여기에 있습니다 : github.com/RouninMedia/axe . 나는 어느 시점에서 이것으로 돌아갈 것을 매우 의미한다 (또한 자바 스크립트 이벤트와 CSS에 해당하는 axe-blades 라고 불리는 것을 개발했다 ).하지만 다른 프로젝트 (codenamed ashiva ) 에 대한 작업을 먼저 완료해야한다 .
Rounin

17

또 다른 flexbox 솔루션

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>


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)은 올바르게 작동하기 위해 선택기에 적용해야하는 의사 클래스 이기 때문 입니다. 당신이 확신하지 않는 경우, 내 바이올린의 포크를 사용하여 실험을 시도하고 당신이 그것을하지 냄비 않는 것을 볼 수 있습니다
0x1gene

1
실제로 *셀렉터를 사용하여 노드 유형에 독립적으로 갈 수는 있지만 명백히 나쁜 습관입니다.
Josh Burgess

1
이것은 왜 나에게 효과가 있었는지, 왜 더 높은 표를 얻었는지 또는 받아 들여지지 않았는지 확실하지 않습니다.
Jake Cattrall

1
실제로, 그것은 다른 노드에서 작동합니다 : jsfiddle.net/aLhv9r1w/316 . 답변을 업데이트하십시오 :)
Jamie Barker

1
나는 복잡한 셀렉터를 가지고 있지만, 그 li#someListItem전에 노드를 원했고 (이것은 "이전"으로 해석하는 방법이다)-제공 한 정보가 CSS를 통해 그것을 표현하는 데 어떻게 도움이 될 수 있는지 알지 못한다. 첫 n 형제를 선택하고 n을 알고 있다고 가정합니다. 이 논리를 기반으로 모든 선택기는 트릭을 수행하고 필요한 요소 (예 : : not ())를 선택할 수 있습니다.
bitoolean

4

정확한 위치를 알고 있다면 :nth-child()다음의 모든 형제 자매에 대한 배제가 효과가 있습니다.

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

어느 것이 li세 번째 (예 : 첫 번째 및 두 번째) 이전에 모든 s를 선택합니까 ? 그러나 제 생각에는 이것이 추악하게 보이고 매우 엄격한 유스 케이스가 있습니다.

오른쪽에서 왼쪽으로 n 번째 자식을 선택할 수도 있습니다.

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

어느 것도 마찬가지입니다.


3

아니요. CSS를 통해서는 불가능합니다. "캐스케이드"를 생각 나게한다 ;-).


그러나 페이지 에 JavaScript 를 추가 할 수 있으면 약간의 jQuery 가 최종 목표를 달성 할 수 있습니다.
jQuery를 사용 find하여 대상 요소 / 클래스 / ID에서 "look-ahead"를 수행 한 다음 역 추적하여 대상을 선택할 수 있습니다.
그런 다음 jQuery를 사용하여 요소의 DOM (CSS)을 다시 작성하십시오.

를 기반으로 마이크 브랜트하여이 대답 , 다음과 같은 jQuery를 조각은 도움이 될 수.

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

먼저 <ul>a 바로 뒤에 오는 모든을 선택합니다 <p>.
그런 다음 "역 추적"하여 <p>해당 세트에서 이전 의 모든 것을 선택합니다 <ul>.

효과적으로, "이전 형제"는 jQuery를 통해 선택되었습니다.
이제 .css함수를 사용하여 해당 요소의 CSS 새 값을 전달하십시오.


내 경우에는 id가있는 DIV를 선택하는 방법을 찾고 #full-width있었지만 클래스가 (간접) 자손 DIV 인 경우에만 .companies.

에서 모든 HTML을 제어 .companies할 수 있었지만 그 위에있는 HTML을 변경할 수 없었습니다.
그리고 계단식은 한 방향으로 만 진행됩니다.

따라서 ALL을 선택할 수 #full-width있습니다.
또는 .companies그 뒤에 만 선택할 수 #full-width있습니다.
그러나 나는 할 수 없습니다 만 선택 #full-width그 s의 진행 .companies .

그리고 다시, 나는 .companiesHTML에서 더 높은 것을 추가 할 수 없었 습니다. 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 Reference Docs :
$ () 또는 jQuery () : DOM 요소.
. find : 현재 일치하는 요소 집합에서 각 요소의 자손을 가져와 선택기, jQuery 객체 또는 요소로 필터링합니다.
. 부모 : 일치하는 요소 집합에서 각 요소의 바로 이전 형제를 가져옵니다. 선택기가 제공되면 해당 선택자와 일치하는 경우에만 이전 형제를 검색합니다 (목록에있는 요소 / 선택기 만 포함하도록 결과를 필터링 함).
. css : 일치하는 요소 집합에 대해 하나 이상의 CSS 속성을 설정합니다.


이것은 질문과 관련이 없습니다. 물론 JS를 사용하는 것이 가능하며 이것을 위해 jQuery가 필요하지 않습니다 ( previousElementSibling).
Fabian von Ellerts

1
@ FabianvonEllerts 응답의 첫 줄에 OP의 질문에 직접 대답했습니다. 내 대답에 따르면 CSS를 통해 말 그대로 불가능합니다 . 그런 다음 CSS 사용자가 친숙하고 액세스 할 수있는 기술 (JS | JQuery)을 사용하여 목표를 달성 할 수있는 1 가지 방법을 제시 했습니다. 예를 들어 많은 WordPress 사이트에도 JQuery가 있으므로 사용, 기억 및 확장이 용이합니다. 목표를 달성하기위한 대체 방법을 제공하지 않고 단순히 NO로 대답하는 것은 무책임한 일입니다. 나는 같은 질문을했을 때 배운 것을 사용했습니다.
SherylHohman 19

previousElementSibling()네이티브 JS DOM 함수에 더 익숙한 사람들은 CSS가 아닌 다른 경로를 제공 할 수 있습니다.
SherylHohman 19

다른 CSS HACKS가 매우 흥미 롭다는 것을 알았지 만 특정 사용 사례의 경우 작동하지 않거나 (주의 사항 범주에 빠지거나) 너무 복잡했습니다. 같은 상황에 처한 다른 사람들에게는 위의 솔루션이 실패하거나 구현 / 유지하기가 너무 어려울 수있는 사용하기 쉬운이 방법을 공유하는 것이 공정합니다. 많은 CSS HACKS가 공유되었습니다. 이 문제는 다루지 않았습니다. 답변 +중 어느 것도 OP가 특별히 요청한 (존재하지 않은) 선택기를 사용하지 않습니다. 이 답변을 JS "hack"이라고 생각하십시오. 솔루션을 찾는 데 소비 한 다른 사람을 구하기 위해 여기 있습니다.
SherylHohman

2

유감스럽게도 "이전"형제 선택기는 없지만 포지셔닝 (예 : 오른쪽 플로트)을 사용하여 동일한 효과를 얻을 수 있습니다 . 당신이하려는 일에 달려 있습니다.

제 경우에는 주로 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
float 오른쪽 +또는 ~선택자가 가장 깨끗한 해결 방법으로 나를 공격합니다.
Wylliam Judd

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 행은 행 인덱스를 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;
    }
`;

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