ตัวเลือกสำหรับแท็กหนึ่งตามด้วยแท็กอื่นโดยตรง


88

ซึ่งจะเลือก<B>แท็กทั้งหมดที่นำหน้าด้วย<A>แท็ก:

A+B {
    /* styling */
}

ตัวเลือกสำหรับ<A>แท็กทั้งหมดตามด้วย<B>แท็กโดยตรงคืออะไร

นี่คือตัวอย่าง HTML ที่เหมาะกับคำถามของฉัน:

<a>some text</a>
<b>some text</b>

3
Pease ให้เราตัวอย่างเช่น DOM วิธีAและBมีความเกี่ยวข้อง
Gumbo

2
พวกเขามีความสัมพันธ์ที่พวกเขาเป็นพี่น้องและ B ตามด้วยเอ OP ต้องการที่จะเลือกทั้งหมดbs ซึ่งจะตามมาด้วยas คล้ายกับa+bที่คุณสามารถเลือกได้ทั้งของที่จะนำโดยตรงb a
Anthony

2.5 ปีต่อมามีการอัปเดตสำหรับคำตอบนี้หรือไม่? ฉันยังต้องการกำหนดเป้าหมายตามด้วย b
chovy

คำตอบ:


29

คุณไม่สามารถใน css

แก้ไข:จะเป็นบิตที่เป็นประโยชน์มากขึ้นถ้าคุณใช้เช่น jQuery (ห้องสมุดจาวาสคริปต์) .prev()คุณสามารถใช้


มันเชื่อมต่อโซลูชันเดียวที่ใช้ JavaScript
Mostafa Farghaly

2
ขอบคุณ jeroen! นั่นช่วยแก้ปัญหาของฉันได้ เนื่องจาก "A" ของฉันลอยไปทางซ้ายและ "B" ลอยไปทางขวาจึงไม่สำคัญว่าฉันจะใส่มาร์กอัปในลำดับใด
BobRodes

53

คุณหมายถึงสไตล์ A เนื่องจากมีองค์ประกอบ B อยู่ข้างในหรือตามมาโดยตรง? แบบนี้:

<A>
    <B>
    </B>
</A>

// OR

<A>
</A>
<B>
</B>

คุณไม่สามารถทำสิ่งนั้นใน CSS ได้ (ยัง) Eric Meyer กล่าวว่าตัวเลือกประเภทนี้มีการพูดคุยกันหลายครั้งในรายชื่ออีเมล CSS และไม่สามารถทำได้ Dave Hyatt หนึ่งในผู้พัฒนา WebKit หลักแสดงความคิดเห็นพร้อมคำอธิบายที่ดีว่าเหตุใดจึงไม่สามารถทำได้

เช็คเอาต์: โพสต์บล็อก Shaun Inman ของและแสดงความคิดเห็นโดยเอริคเมเยอร์
David Hyatt ก็มีน้ำหนักเช่นกัน


ฉันหมายถึงอันที่สองฉันเข้าใจปัญหานี้ขอบคุณ nick :)
Mostafa Farghaly

17

คุณสามารถสนทนาได้เท่านั้น: ซึ่งจะเลือกแท็กทั้งหมดที่นำหน้าด้วยแท็กโดยตรง

สิ่งนี้เทียบเท่ากับคำขอของคุณในเชิงตรรกะ

ฉันมักจะใช้สิ่งนี้เพื่อจัดรูปแบบแถวของช่องทำเครื่องหมายที่มีป้าย

CSS:

label+input {
    margin-left: 4px;
}

DOM:

<input id="a" name="a" type="checkbox"/><label for="a">...</label>
<input id="b" name="b" type="checkbox"/><label for="b">...</label>
<input id="c" name="c" type="checkbox"/><label for="c">...</label>

3
ฉันคิดว่าคุณตั้งใจจะพิมพ์ "input + label" ใน CSS เพื่อให้ใช้ขอบซ้ายกับป้ายกำกับ
CAK2

1
@ CAK2 - ฉันคิดว่าเขาพูดถูก โดยการทำlabel+inputอัตรากำไรขั้นต้นจะถูกนำไปใช้กับทุกinputองค์ประกอบที่เริ่มต้นจากคนที่สอง เป็นวิธีที่สร้างสรรค์ในการสร้างพื้นที่ในหมู่พวกเขา แต่ไม่ใช่ที่จุดเริ่มต้นหรือตอนท้ายของแถว ในกรณีนี้เทียบเท่ากับinput:not(:first-child).
เดวิด

1

แม้ว่าจะไม่สะดวกนัก แต่ในปัจจุบันคุณสามารถบรรลุพฤติกรรมนี้ได้โดยการย้อนกลับลำดับขององค์ประกอบของคุณทั้งเมื่อคุณสร้าง HTML และโดยใช้กฎ CSS: display: flexและflex-direction: column-reverse

ul {
  display: flex;
  flex-direction: column-reverse;
}

.b ~ .a {
  color: red;
}
<ul>
    <li class="a">A 3</li>
    <li class="c">C 2</li>
    <li class="c">C 1</li>
    <li class="b">B 1</li>
    <li class="a">A 2</li>
    <li class="a">A 1</li>
</ul>

นอกจากนี้หากคุณมีองค์ประกอบอินไลน์ตั้งแต่ 2 รายการขึ้นไปคุณสามารถบรรลุได้โดยการใช้float: rightเนื่องจากจะแสดงในลำดับย้อนกลับ:

ul {
  float: left;
  list-style-type: none;
}

li {
  float: right;
}

li:not(:first-child) {
  margin-right: 20px;
}

.b ~ .a {
  color: red;
}
<ul>
    <li class="a">A 3</li>
    <li class="c">C 2</li>
    <li class="c">C 1</li>
    <li class="b">B 1</li>
    <li class="a">A 2</li>
    <li class="a">A 1</li>
</ul>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.