I have a navigation bar with images, like so:
<ul>
<li class="me">
<span class="cont"><img src="dummy.png" /></span>
</li>
<li class="me">
<span class="cont"><img src="dummy.png" /></span>
</li>
</ul>
On hovering over a list item I want to change the background color to cover the span and image like so:
.me {background-color: none;}
.me:hover {background-color: rgba(150,150,150,0.5);}
Problem is, the image does not get covered… Is this because the background is in fact… a “background” on which child elements are sitting? If so, how could I achieve this effect with plain CSS?
EDIT – solution
this worked with my original HTML structure:
<ul>
<li>
<a href="" class="ui-btn">
<span class="ui-btn-inner"> /* CONTAINS IMAGE AS BACKGROUND */
<span class="ui-btn-text">text</span> /* GETS BACKGROUND */
<span class="ui-icon"></span>
</span>
</a>
</li>
</ul>
“Negative logic”: If I assign the background to list item, it sits behind all child elements, so I figured I needed to assign the background to an element that is a child of the element containing the img to have it appear above all items. span ui-btn-inner contains the image, so setting the :hover background on span ui-btn-text makes it appear above the image… weird, but works.
Yes, it’s because the background is in fact a background. The best method to achieve this in raw css would be to continue using the background:
You could also achieve this effect with a bit of javascript as well.
Code not tested. It might require tweaking to get it just right.
Edit: Layering concept
None of this pseudo-code is test, but I’ve done it before so it may just take a bit of tweaking. I don’t have a copy of the original I did on hand so I’ll have to wing it. The first step is to create a relative container and 2 sub containers.
Then you’d need to place these in divs inside your
<li>.I don’t recall ever trying this method inside embedded
<li>tags, so it may behave oddly at first. You may have to abandon<li>and switch to a different<div>structure entirely.