user1292810
user1292810

Reputation: 1822

Select specific element before other element

I have following HTML structure:

<div>
  <h2>Candy jelly-o jelly beans gummies lollipop</h2>
  <p>
    Cupcake ipsum dolor sit amet. Sugar plum liquorice dragée oat cake cupcake.
  </p>
  <p>
    Candy tiramisu bonbon toffee. Croissant pudding ice cream soufflé pastry toffee  chocolate bar. Tiramisu wypas tootsie roll icing fruitcake oat cake icing soufflé tiramisu. 
  </p>
  <h2>Dessert pie cake</h2>
  <ul>
    <li>liquorice</li>
    <li>powder</li>
    <li>dessert</li>
  </ul>
  <h2>Chupa chups sweet dragée</h2>
  <p>
    Chocolate cake biscuit pie jelly-o chocolate bar. Marshmallow topping sugar plum apple pie brownie cotton candy dragée lemon drops. Soufflé cake toffee.
  </p>
</div>

I would like to choose only that h2 which is directly before ul. How can I do this? In my content there are many more uls and many more h2s so the solution should be universal.

Upvotes: 53

Views: 142535

Answers (6)

Shreyasikhar26
Shreyasikhar26

Reputation: 873

To select h2 elements that are directly before ul element

h2:has(+ul) {
    background-color: #ff0000;
}

Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/:has

Please Note: It might not support all browsers, check browser support here.

Upvotes: 53

Nicolas Soudet
Nicolas Soudet

Reputation: 1

The rule h2~ul will not select h2 but ul. So you will not be able to apply any style to h2.

CSS element1~element2

I have the same problem with panel location. I have a element that is followed by a . And in this case I would like to reduce the height or the min-height (depends on the panels are fixed or not) of the main panel by style application.

In case of fixed footer, because I can declare the element before the main in my html file (it will be relocated by top/left properties) I can use the ~ selector like this: footer ~ main. But in case of non fixed footer, the only way I found is to add a class at document.ready() call.

Upvotes: -1

davidaam
davidaam

Reputation: 449

You can use the general sibling selector ~.

In your case, you can use h2~ul that will apply to the h2 before ul inside the same parent.

Upvotes: -5

Mateusz Rogulski
Mateusz Rogulski

Reputation: 7455

You should use this

div h2::nth-child(2) {

}

Upvotes: 0

djlumley
djlumley

Reputation: 2967

As far as I know, CSS doesn't offer any selectors which will target before a selector. Could you select it as an h2 which is directly after a p (p + h2)?

h2 {
    color: #1a1a1a;
}

p + h2 {
    color: #0cc;
}

Example on JSFiddle

As you can see, this is probably the best selector you can use if you're relying on CSS, although you could easily just add a class to each h2 that is before a ul. That would avoid the case where you have a paragraph section before another h2 and paragraph section.

You could do this using jQuery:

.highlight {
    color: #0cc;
}

$('ul').prev('h2').addClass('highlight')

Example on JSFiddle

This selects every ul, then selects the h2 that is before it, before finally adding the .highlight class to it.

Upvotes: 35

alphanyx
alphanyx

Reputation: 1697

with this you can style just the first h2 element

h2:first-child { color:red; }

for browser support read here: http://www.quirksmode.org/css/contents.html#t17

Upvotes: 0

Related Questions