वहाँ एक "पिछले भाई" चयनकर्ता है?


1354

प्लस साइन ( +) अगले भाई-बहन के लिए है।

क्या पिछले भाई-बहन के लिए एक समान है?


17
OMG, यहां दिए गए सभी उत्तर आपको HTML तत्वों के क्रम को उलट देने का सुझाव देते हैं और फिर उन्हें पीछे की ओर प्रदर्शित करने के लिए CSS का उपयोग करते हैं जो एक वास्तविक खिंचाव है। सुनिश्चित करें कि यह प्रश्न में निर्दिष्ट नहीं है , लेकिन अधिकांश "आप सीएसएस के साथ एक्स कर सकते हैं" प्रश्नों को यह मान लेना चाहिए कि आप HTML को संरचनात्मक रूप से नहीं बदल सकते।
स्क्वायरकैंडी

3
@squarecandy, मैं ज्यादातर आपकी टिप्पणी से सहमत हूं। लेकिन आपके द्वारा अपर्याप्त के रूप में संदर्भित समाधान फिर भी कुछ मामलों में उपयोगी हैं (अपवोट्स को नोटिस करें)। इसलिए वे पोस्ट करने लायक हैं। जिसे आप "वास्तविक खिंचाव" के रूप में देखते हैं, वह दूसरों के लिए "रचनात्मक समाधान" हो सकता है।
माइकल बेंजामिन

जवाबों:


839

नहीं, कोई "पिछला सिबलिंग" चयनकर्ता नहीं है।

एक संबंधित नोट पर, ~सामान्य उत्तराधिकारी सहोदर के लिए है (जिसका अर्थ है कि तत्व इस एक के बाद आता है, लेकिन जरूरी नहीं कि तुरंत बाद) और एक CSS3 चयनकर्ता है। +अगले भाई के लिए है और CSS2.1 है।

सिलेक्टर्स लेवल 3 से एडजस्टेंट सिबलिंग कॉम्बिनेटर देखें और कैस्केडिंग स्टाइल शीट्स लेवल 2 रिविजन 1 (सीएसएस 2.1) स्पेसिफिकेशन से सटे सिबलिंग सिलेक्टर्स


14
CSS3 के मानक से: तत्वों दो दृश्यों के प्रतिनिधित्व वाले एक ही मूल साझा दस्तावेज़ पेड़ में और तत्व पहले अनुक्रम का प्रतिनिधित्व करती पछाड़ (जरूरी नहीं तुरंत) तत्व एक दूसरे का प्रतिनिधित्व करती।
रेयान

26
@ ली रयान: हाँ, लेकिन बिंदु cletus उसके जवाब में बना रहा है कि आप पूर्ववर्ती तत्व का चयन नहीं करते हैं ।
BoltClock

42
यहाँ एक उदाहरण है जो मैंने देखा कि यह क्या कर सकता है और क्या नहीं कर सकता। jsfiddle.net/NuuHy/1
अबैकस

7
इसके लिए उपयोगी jquery फ़ंक्शन प्रचलित है ()। उदाहरण के लिए $ ("# the_element")। Prev ()। Css ("पृष्ठभूमि-रंग", "लाल")
सतबीर किरा

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) में। इसके लिए इकाइयों / शब्दों और मार्जिन के बजाय पैडिंग के बीच एक सफेद-स्थान के पतन की आवश्यकता थी, लेकिन यह पूरी तरह से अन्यथा काम करता है!
स्टीवन वाचोन

7
हाँ, लेकिन एक ही पिछले सबसे अधिक समय की आवश्यकता है पिछले सभी नहीं!
अज़राफ़ती

41
यदि मैं उनके बीच के स्थान पर होवर करता हूं, तो लिंक सभी लाल हो जाते हैं।
लिन

3
@ उत्तर का उत्तर केवल पिछले लिंक को होवर पर लाल करने के लिए कोड शामिल है। अतिरिक्त शैलियाँ आपके उपयोग के मामले पर निर्भर करती हैं। एक स्टार रेटिंग घटक के लिए (जो मुझे लगता है कि एक सामान्य मामला है), आपको उस स्थान से छुटकारा पाने की आवश्यकता होगी और होवर लिंक को भी लाल करना होगा।
मंटिश

164

चयनकर्ता स्तर 4 परिचय:has() (पहले विषय सूचक !) जो आपको पिछले भाई-बहन का चयन करने की अनुमति देगा:

previous:has(+ next) {}

... लेकिन लेखन के समय, यह ब्राउज़र समर्थन के लिए रक्तस्राव के किनारे से कुछ दूरी पर है।


51
"ब्राउज़र सपोर्ट के लिए ब्लीडिंग एज" ओवरस्टैटमेंट हो सकता है। इसे लिखने के रूप में, क्रोम का नवीनतम संस्करण भी :has()छद्म श्रेणी का उपयोग नहीं कर सकता है ।
मार्टिन

33
@ReedMartin - यही कारण है कि मैंने ब्लीडिंग एज से परे कुछ दूरी
क्वेंटिन

12
"", इसे डायनेमिक चयनकर्ता प्रोफ़ाइल के हिस्से के रूप में चिह्नित नहीं किया गया है, जिसका अर्थ है कि इसे स्टाइलशीट के भीतर उपयोग नहीं किया जा सकता है, केवल डॉक्यूमेंट्स के साथ कार्य करता है ।querySelector ()। " - developer.mozilla.org/en-US/docs/Web/CSS/:has
आर्क लिनक्स टक्स

1
@ArchLinuxTux: "यह सीमा अब हटा दी गई है", इसलिए समय पर एक बार हम संभवतः इस सुविधा का उपयोग कर सकते हैं: डी।
जैकब वैन लिनन

@JacobvanLingen - caniuse.com/#feat=css-has - वर्तमान में कोई ब्राउज़र इसका समर्थन नहीं करता है।
क्वेंटिन

153

orderफ्लेक्स और ग्रिड लेआउट की संपत्ति पर विचार करें ।

मैं नीचे दिए गए उदाहरणों में flexbox पर ध्यान केंद्रित करूँगा, लेकिन वही अवधारणाएं ग्रिड पर लागू होती हैं।


फ्लेक्सबॉक्स के साथ, पिछले सिबलिंग सिलेक्टर का अनुकरण किया जा सकता है।

विशेष रूप से, फ्लेक्स orderसंपत्ति स्क्रीन के चारों ओर तत्वों को स्थानांतरित कर सकती है।

यहाँ एक उदाहरण है:

आप चाहते हैं कि तत्व A लाल हो जाए जब तत्व B होवर हो जाए।

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

कदम

  1. ulएक फ्लेक्स कंटेनर बनाएं ।

    ul { display: flex; }

  1. मार्क-अप में भाई-बहनों के आदेश को उलट दें।

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

  1. एलिमेंट ए ( ~या +करोगे) को टारगेट करने के लिए सिबलिंग सिलेक्टर का इस्तेमाल करें ।

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

  1. 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संपत्ति

फ्लेक्स आइटम डिफ़ॉल्ट रूप से, उसी क्रम में प्रदर्शित और निर्धारित किए जाते हैं जैसे वे स्रोत दस्तावेज़ में दिखाई देते हैं। orderसंपत्ति इस क्रम बदलने के लिए इस्तेमाल किया जा सकता।

orderसंपत्ति नियंत्रण जिस क्रम में फ्लेक्स आइटम फ्लेक्स कंटेनर के भीतर दिखाई देते हैं, उन्हें क्रमसूचक समूहों को बताए द्वारा। यह एक एकल <integer>मान लेता है , जो निर्दिष्ट करता है कि फ्लेक्स आइटम किस क्रमिक समूह से संबंधित है।

orderसभी फ्लेक्स आइटम के लिए प्रारंभिक मान 0 है।

orderसीएसएस ग्रिड लेआउट कल्पना में भी देखें ।


फ्लेक्स 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


एक साइड नोट - सीएसएस के बारे में दो स्पष्ट विश्वास

फ्लेक्सबॉक्स सीएसएस के बारे में लंबे समय से आयोजित विश्वासों को चकनाचूर कर रहा है।

ऐसा ही एक विश्वास है कि पिछले भाई-बहन का चयन सीएसएस में संभव नहीं है

यह कहना कि यह विश्वास व्यापक है एक समझ होगी। यहां केवल स्टैक ओवरफ्लो पर संबंधित प्रश्नों का एक नमूना है:

जैसा कि ऊपर वर्णित है, यह विश्वास पूरी तरह से सच नहीं है। पिछली orderसंपत्ति के चयनकर्ता को फ्लेक्स संपत्ति का उपयोग करके सीएसएस में नकली किया जा सकता है।

z-indexमिथक

एक और लंबे समय से चली आ रही मान्यता है जो z-indexकेवल तैनात तत्वों पर काम करती है।

वास्तव में, कल्पना का सबसे वर्तमान संस्करण - डब्ल्यू 3 सी संपादक का मसौदा - अभी भी यह सच होने का दावा करता है:

9.9.1 स्टैक स्तर निर्दिष्ट करना: z-index संपत्ति

z-index

  • मूल्य: ऑटो | | इनहेरिट
  • प्रारंभिक: ऑटो
  • पर लागू होता है: तत्वों को तैनात किया
  • इन्हेरिटेड: नहीं
  • प्रतिशत: एन / ए
  • मीडिया: दृश्य
  • कंप्यूटेड वैल्यू: जैसा कि निर्दिष्ट है

(महत्व दिया)

वास्तव में, हालांकि, यह जानकारी अप्रचलित और गलत है।

तत्वों है कि कर रहे हैं फ्लेक्स आइटम या ग्रिड आइटम संदर्भों भी स्टैकिंग जब बना सकते हैं positionहै static

4.3। फ्लेक्स आइटम जेड-ऑर्डरिंग

फ्लेक्स आइटम वास्तव में इनलाइन ब्लॉक के रूप में एक ही रंग, इसी क्रम संशोधित दस्तावेज़ आदेश कच्चे दस्तावेज़ आदेश के स्थान पर प्रयोग किया जाता है को छोड़कर, और z-indexअतिरिक्त अन्य मान autoभले ही एक स्टैकिंग प्रसंग बना positionहै static

5.4। Z- अक्ष क्रम: z-indexसंपत्ति

ग्रिड मदों की पेंटिंग आदेश वास्तव में, इनलाइन ब्लॉक के रूप में ही है कि आदेश संशोधित दस्तावेज़ आदेश को छोड़कर कच्चे दस्तावेज़ आदेश के स्थान पर प्रयोग किया जाता है, और z-indexअतिरिक्त अन्य मान autoभले ही एक स्टैकिंग प्रसंग बना positionहै static

यहां z-indexगैर-तैनात फ्लेक्स आइटम पर काम करने का एक प्रदर्शन है : https://jsfiddle.net/m0wddwxs/


15
orderसंपत्ति के लिए एक समाधान है, क्योंकि यह पूरी तरह से बदलने के लिए करना है नहीं है दृश्य आदेश, तो यह करता है नहीं मूल बहाल semantical आदेश है कि आप काम करने के लिए इस समाधान के लिए HTML में परिवर्तन करने के लिए मजबूर कर रहे हैं।
मराट तानलिन

2
@ मरात तानलिन: 90% उपयोग के मामलों के लिए, ब्राउज़र समर्थन मान लेना कोई समस्या नहीं है, यह ठीक काम करेगा। शेष 10% उपयोग के मामले या तो 1) ऐसे मामले हैं जहां दृश्य क्रम को बदलना कोई हल नहीं है, या 2) ऐसे मामले जिनमें सीएसएस शामिल नहीं है। शुक्र है, # 2 के लिए, चयनकर्ता -4 प्रदान करता है: () है, और इसे लागू करने के लिए बस चयनकर्ता पुस्तकालयों के डेवलपर्स तक है।
BoltClock

5
ध्यान रखें कि आप CSS2.2 ED का हवाला दे रहे हैं, संक्षेप में, अभी भी CSS2 है। और Flexbox और ग्रिड लेआउट CSS2 में मौजूद नहीं है, जहाँ तक CSS2 का संबंध है, यह जानकारी निश्चित रूप से सच है। बहुत कम से कम, टेक्स्ट को यह उल्लेख करने के लिए अद्यतन किया जा सकता है कि सी-सीएसएस के भविष्य के स्तरों में जेड-इंडेक्स अन्य प्रकार के तत्वों पर लागू हो सकता है, उसी तरह जो यह कहता है कि अन्य गुण स्टैकिंग संदर्भ स्थापित कर सकते हैं, जैसे कि अस्पष्टता।
BoltClock

3
यदि किसी को यह समझने में परेशानी हो रही है कि z-index"ओएमजी" होने पर भी काम कैसे होगा, तो positionनिर्दिष्ट नहीं है! ", विनिर्देश में स्टैकिंग संदर्भ की अवधारणा का उल्लेख किया गया है , जिसे एमडीएन पर इस लेख
रोजर स्पीयर

3
@Michael_B आपका स्वागत है! मैंने बहुत सारे फ्रंट-एंडर्स से अनजान है। एक अन्य बात जिसका मैं उल्लेख करना चाहूंगा, पिछली पिछली चयनकर्ता भी अच्छी तरह से काम करती है float: right(या किसी अन्य साधन से आदेश को उल्टा कर सकती है, जिसके flex/orderकम (कम से कम? दुष्प्रभाव) हैं। दो fiddles ऊपर मार पड़ी है: प्रदर्शन float: rightदृष्टिकोण , और प्रदर्शनdirection: rtl
रॉगियर SPIEKER

69

मेरे पास एक ही सवाल था, लेकिन तब मेरे पास "डुह" पल था। लिखने के बजाय

x ~ y

लिखो

y ~ x

जाहिर है कि यह "y" के बजाय "x" से मेल खाता है, लेकिन यह उत्तर देता है "क्या कोई मेल है?" जावास्क्रिप्ट में लूपिंग की तुलना में प्रश्न और सरल DOM ट्रैवर्सल आपको सही तत्व से अधिक कुशलता से प्राप्त कर सकते हैं।

मुझे पता है कि मूल प्रश्न एक सीएसएस प्रश्न था, इसलिए यह उत्तर शायद पूरी तरह से अप्रासंगिक है, लेकिन अन्य जावास्क्रिप्ट उपयोगकर्ता इस प्रश्न पर ठोकर खा सकते हैं जैसे मैंने किया था।


18
मेरा मानना ​​है कि जब y आसानी से मिल सकता है तो काम करता है। समस्या यह है कि यदि y केवल x के सापेक्ष पाया जा सकता है, और इसे उल्टा करने पर, आपको y नहीं मिल सकता है क्योंकि आपको पहले x खोजना होगा। यह निश्चित रूप से वाई के सवाल के संदर्भ में है जो कि अगले के बजाय भाई से पहले हो रहा है, लेकिन यह भी निम्न भाई होने के लिए लागू हो सकता है।
डेविड

19
तुम कठोर हो, हर्ष हो। (क्षमा करें, विरोध नहीं कर सकता।) मुद्दा यह है कि कभी-कभी आपको बस यह जानने की आवश्यकता होती है कि "क्या आपका अस्तित्व है?"। दूसरी बार आप दो तत्वों के बीच कुछ डालने के लिए ": पहले" का उपयोग कर सकते हैं। अंत में, यदि आपको खोज ("y ~ x") का उपयोग करके jQuery में छोड़ना है, तो प्रचलित () कई विकल्पों की तुलना में आसान है।
ब्रायन लार्सन

155
पिछले भाई के चयनकर्ता का विचार यह है कि वह पिछले तत्व का चयन करेगा। दुर्भाग्य से, इसे उलट, जैसा यहाँ वर्णित है, यह कार्यक्षमता प्रदान नहीं करता है।
ज़ेनेज़र

14
धन्यवाद @Zenexer इस स्पष्टीकरण के लिए कि यह उत्तर मूल प्रश्न का वास्तविक समाधान प्रदान नहीं करता है, मैं खुद को बेवकूफ समझने लगा था कि y ~ xमैं अपनी समस्या को कैसे हल कर सकता हूं
Jaime Hablutzel

4
मैं इस उत्तर के पीछे के विचार को समझता हूं, हालांकि उत्तर में दिए गए तर्क का कोई मतलब नहीं है। चयनकर्ता का y ~ xजवाब नहीं है "क्या कोई मैच है?" सवाल, क्योंकि यहां दिए गए दो चयनकर्ताओं का मतलब पूरी तरह से अलग है। कोई तरीका नहीं है जो y ~ xकभी भी <root><x/><y/></root>उदाहरण के लिए सबट्री दिए गए एक मैच का उत्पादन कर सके । यदि सवाल है "क्या y मौजूद है?" तो चयनकर्ता बस है y। यदि प्रश्न है "क्या किसी भी स्थिति में y को एक भाई x दिया गया है?" तब आपको दोनों चयनकर्ताओं की आवश्यकता होगी । (हालांकि शायद मैं सिर्फ इस बिंदु पर nitpicking हूँ ...)
BoltClock

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

+अगले भाई-बहन के लिए है। क्या पिछले भाई-बहन के लिए एक समान है?

आप दो अक्ष चयनकर्ताओं का उपयोग कर सकते हैं : !और?

कर रहे हैं 2 बाद में भाई चयनकर्ताओं पारंपरिक सीएसएस में:

  • +है तत्काल बाद भाई चयनकर्ता
  • ~है किसी भी बाद में भाई चयनकर्ता

पारंपरिक सीएसएस में, पिछले सिबलिंग चयनकर्ता नहीं है

हालाँकि, कुल्हाड़ी सीएसएस पोस्ट-प्रोसेसर लाइब्रेरी में, 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
यह मुझे एक वाक्यविन्यास त्रुटि देता है जब मैं इसे एक रेल परियोजना के अंदर sass पर लागू करने का प्रयास करता हूं।
एलेक्स

25
ax एक CSS पोस्ट-प्रोसेसर है। यह CSS प्री-प्रोसेसर जैसे Sass, कम या स्टाइलस के समान सिंटैक्स का उपयोग नहीं करता है।
रौनिन

1
@ क्या आप कुछ दस्तावेज़ीकरण लिंक जोड़ना चाहेंगे? मुझे कुल्हाड़ी पोस्ट-प्रोसेसर नहीं मिल सकती है ।
डायोनिस

@ डायोनीज़ - आपकी रुचि के लिए धन्यवाद। कुल्हाड़ी एक परियोजना है जिसे मैंने 2016 के अंत में शुरू किया था, जब मुझे ES2015 नहीं पता था और यहां तक ​​कि JS में वस्तुएं मेरे लिए बहुत नई थीं। GitHub रिपॉजिटरी यहां है: github.com/RouninMedia/axe । मेरा बहुत मतलब यह है कि मैं किसी भी बिंदु पर लौट आया हूं (मैंने कुछ अक्ष-ब्लेड भी विकसित किए हैं जो जावास्क्रिप्ट घटनाओं के सीएसएस के बराबर हैं), लेकिन मुझे अपना काम पहले किसी अन्य परियोजना (कोडेन एशिवा ) पर पूरा करना होगा ।
रौनिन

17

एक और फ्लेक्सबॉक्स समाधान

आप HTML में तत्वों के क्रम का उलटा उपयोग कर सकते हैं। इसके बाद Michael_B के उत्तर केorder रूप में उपयोग करने के अलावा आप अपने लेआउट पर उपयोग या निर्भर कर सकते हैं ।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
@ इयान क्योंकि :nth-child(-n+4)एक छद्म वर्ग है जिसे ठीक से काम करने के लिए एक चयनकर्ता पर लागू होना चाहिए। यदि आप आश्वस्त नहीं हैं, तो मेरी
फ़ेल्ड के

1
दरअसल, आप *चयनकर्ता का उपयोग करके नोड-टाइप स्वतंत्र जा सकते हैं , लेकिन यह अप्रिय रूप से बुरा व्यवहार है।
जोश बर्गेस

1
यह जवाब है कि मेरे लिए काम किया है, यह सुनिश्चित नहीं है कि यह उच्च मतदान क्यों नहीं हुआ या स्वीकार नहीं किया गया।
जेक कैटरॉल

1
दरअसल, यह विभिन्न नोड्स के लिए काम करता है: jsfiddle.net/aLhv9r1w/316 । कृपया अपना उत्तर अपडेट करें :)
जेमी बार्कर

1
मेरे पास एक जटिल चयनकर्ता था, लेकिन चलो यह कहते हैं li#someListItemऔर मैं इसके पहले नोड (ओं) को चाहता था (जो कि मैं "पिछले" की व्याख्या करता हूं) - मैं नहीं देखता कि आपने जो जानकारी प्रदान की है वह मुझे सीएसएस के माध्यम से व्यक्त करने में मदद कर सकती है। आप बस पहले n भाई-बहन का चयन कर रहे हैं, और मान लीजिए कि मैं n को जानता हूं। इस तर्क के आधार पर, कोई भी चयनकर्ता चाल कर सकता है और मुझे (जैसे: नहीं:) की आवश्यकता होती है।
बिटुलियन जूल

4

यदि आप जानते हैं कि सटीक स्थिति :nth-child()सभी भाई-बहनों के काम का बहिष्करण काम करेगा।

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

जो li3 से पहले सभी का चयन करेगा (उदाहरण के लिए 1 और 2)। लेकिन, मेरी राय में यह बदसूरत लग रहा है और इसमें बहुत तंग usecase है।

आप nth-child को दाएँ-से-बाएँ भी चुन सकते हैं:

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

जो ऐसा ही करता है।


3

यह सीएसएस के माध्यम से संभव नहीं है। यह "कैस्केड" को दिल तक ले जाता है ;-)।


हालाँकि, यदि आप अपने पेज में जावास्क्रिप्ट जोड़ने में सक्षम हैं, तो थोड़ा सा jQuery आपको अपने अंतिम लक्ष्य तक पहुंचा सकता है।
आप findअपने लक्ष्य तत्व / वर्ग / आईडी पर "लुक-फॉरवर्ड" करने के लिए jQuery का उपयोग कर सकते हैं , फिर अपने लक्ष्य का चयन करने के लिए पीछे हट सकते हैं।
तब आप अपने तत्व के लिए DOM (CSS) को फिर से लिखने के लिए jQuery का उपयोग करते हैं।

माइक ब्रैंट के इस जवाब के आधार पर , निम्नलिखित jQuery स्निपेट मदद कर सकता है।

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

यह पहले उन सभी का चयन करता है <ul>जो तुरंत a का अनुसरण करते हैं <p>
फिर यह <p>s के उस सेट से सभी पिछले s का चयन करने के लिए "backtracks" है <ul>

प्रभावी रूप से, "पिछले भाई-बहन" को jQuery के माध्यम से चुना गया है।
अब, .cssउस तत्व के लिए अपने सीएसएस नए मूल्यों में पारित करने के लिए फ़ंक्शन का उपयोग करें ।


मेरे मामले में मैं आईडी के साथ एक डीआईवाई का चयन करने का एक तरीका ढूंढ रहा था #full-width, लेकिन केवल तभी अगर इसमें (अप्रत्यक्ष) डीवाई के वर्ग के साथ वंशज था .companies

मेरे पास सभी HTML का नियंत्रण था .companies, लेकिन इसके ऊपर के किसी भी HTML को बदल नहीं सकता था।
और झरना केवल 1 दिशा: नीचे जाता है।

इस प्रकार मैं सभी का चयन कर सकता हूं #full-width
या मैं चुन सकता है .companiesकि केवल एक का पालन किया #full-width
लेकिन मैं केवल वही नहीं चुन सका #full-widthजो आगे बढ़ा .companies

और, फिर से, मैं जोड़ने में असमर्थ था .companies HTML में किसी भी उच्च । HTML का वह भाग बाहरी रूप से लिखा गया था, और हमारे कोड से लिपटा हुआ था।

लेकिन jQuery के साथ, मैं आवश्यक s का चयन कर सकता हूं #full-width, फिर उपयुक्त शैली असाइन करें:

$("#full-width").find(".companies").parents("#full-width").css( "width", "300px" );

यह सभी पाता है #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 तत्व।
खोजें : चयनित तत्व के वर्तमान सेट में प्रत्येक तत्व के वंशजों को प्राप्त करें, एक चयनकर्ता, jQuery ऑब्जेक्ट या तत्व द्वारा फ़िल्टर किया गया।
माता-पिता : मिलान तत्वों के सेट में प्रत्येक तत्व के तुरंत पूर्ववर्ती सिबलिंग प्राप्त करें। यदि एक चयनकर्ता प्रदान किया जाता है, तो यह पिछली सिबलिंग को केवल तभी पुनर्प्राप्त करता है जब यह मेल खाता है कि चयनकर्ता (परिणामों को केवल सूचीबद्ध तत्वों / चयनकर्ताओं को शामिल करता है)।
सीएसएस : मिलान तत्वों के सेट के लिए एक या अधिक सीएसएस गुण सेट करें।


इसका सवाल से कोई लेना-देना नहीं है। बेशक जेएस का उपयोग करना संभव है और इसके लिए आपको jQuery की भी आवश्यकता नहीं है ( previousElementSibling)।
फाबियान वॉन एलर्ट्स

1
@FabianvonEllerts मैंने ओपी के सवाल का जवाब सीधे अपनी प्रतिक्रिया की पहली पंक्ति में दिया। जैसा कि मेरे उत्तर में कहा गया है, सीएसएस के माध्यम से यह संभव नहीं है । फिर मैंने एक तकनीक (JS | JQuery) का उपयोग करते हुए लक्ष्य को प्राप्त करने के लिए 1 संभव मार्ग प्रदान किया , जिससे CSS के उपयोगकर्ता परिचित हो सकते हैं और उन तक पहुंच बना सकते हैं। उदाहरण के लिए, कई वर्डप्रेस साइटों में JQuery भी है, इसलिए यह एक आसान प्रविष्टि बिंदु है: इसका उपयोग करना, याद रखना और विस्तार करना आसान है। यह लक्ष्य को पूरा करने के लिए कोई वैकल्पिक तरीका प्रदान किए बिना, केवल NO का जवाब देना गैर-जिम्मेदाराना होगा । जब मैंने वही प्रश्न किया तो मैंने उसे सीखा और उसका उपयोग किया।
शेरिलहोमन

previousElementSibling()देशी जेएस डोम कार्यों से अधिक परिचित लोगों के लिए एक और गैर-सीएसएस पथ आगे प्रदान कर सकता है ।
शेरलहोमन

मैंने अन्य सीएसएस हैक को बहुत दिलचस्प पाया, लेकिन मेरे विशेष उपयोग के मामले के लिए उन्होंने या तो काम नहीं किया (कैविट्स श्रेणी में गिर गया), या बहुत दृढ़ थे। दूसरों के लिए जो एक ही परिस्थिति में आते हैं, इस आसान-से-उपयोग की विधि को साझा करना उचित है जो काम कर सकता है, जहां उपरोक्त समाधान विफल होते हैं, या लागू करना / बनाए रखना बहुत मुश्किल होगा। कई सीएसएस हैक साझा किए गए थे। चारों ओर यह काम कवर नहीं किया गया था। जवाबों में से कोई भी +(गैर-मौजूद) चयनकर्ता का उपयोग करता है जो ओपी ने विशेष रूप से पूछा है। इस उत्तर पर एक जेएस "हैक" पर विचार करें। यह यहाँ किसी और को बचाने के लिए समय है जब मैंने एक समाधान खोजने के लिए खर्च किया।
शेरलहोमन

2

दुर्भाग्य से कोई "पिछला" भाई-बहन का चयन करने वाला नहीं है, लेकिन आप संभवतः कर सकते हैं स्थिति (उदाहरण के लिए दाईं ओर) का उपयोग करके समान प्रभाव प्राप्त । यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

मेरे मामले में, मैं मुख्य रूप से CSS 5-स्टार रेटिंग सिस्टम चाहता था। मुझे पिछले सितारों को रंग (या आइकन स्वैप) करने की आवश्यकता होगी। प्रत्येक तत्व को सही से तैरने से, मुझे अनिवार्य रूप से एक ही प्रभाव मिल रहा है (तारों के लिए HTML इस प्रकार 'पीछे की ओर लिखा जाना चाहिए')।

मैं इस उदाहरण में FontAwesome का उपयोग कर रहा हूं और fa-star-o और fa-star के यूनिकोड के बीच स्वैप कर रहा हूं http://fortawesome.github.io/Font-Awesome/

सीएसएस:

.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
सही और तैरने लगते हैं +या ~चयनकर्ताओं मेरे चारों ओर साफ कार्य के रूप में बनाता है।
व्यालियम जुड

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>

हम 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 मार्जिन सेट करता है और LI के अंदर कोई UL तत्वों (या अन्य टैग) वाले लोगों के लिए इसे 0 पर वापस सेट करता है।


2

मुझे पिछले सिबलिंग ट्रे को चुनने के लिए एक समाधान की आवश्यकता थी। मैं रिएक्ट और स्टाइल-घटकों का उपयोग करके इस समाधान के साथ आया था। यह मेरा सटीक समाधान नहीं है (यह स्मृति से है, घंटों बाद)। मुझे पता है कि 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;
    }
`;

-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
quetzalcoatl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.