【问题标题】:Can I control CSS selection for :hover on nested elements?我可以控制 :hover 在嵌套元素上的 CSS 选择吗?
【发布时间】:2012-01-30 08:04:55
【问题描述】:

我正在尝试解决以下问题。我有以下 HTML:

<div style="width:50em; height:10em">
    <span class='rating-5 rating-span'>
        <span class='rating-4 rating-span'>
            <span class='rating-3 rating-span'>
                <span class='rating-2 rating-span'>
                    <span class='rating-1 rating-span'>
                        <div class='rating-star unselected'></div>
                    </span>
                    <div class='rating-star unselected'></div>
                </span>
                <div class='rating-star unselected'></div>
             </span>
             <div class='rating-star unselected'></div>
         </span>
         <div class='rating-star unselected'></div>
     </span>
</div>

以及以下 CSS:

div.rating-star{
    display:inline-block;
    width:20%;
    height:100%;
    /*border:solid thin black;*/
    padding:0px;
    margin:0px;
}

div.rating-star.unselected {
    background-image: url(star.jpg);   
    background-size: contain;
    background-repeat: no-repeat;
}

.rating-span:hover div.rating-star {
    background-image: url(hover.jpg);   
    background-size: contain;
    background-repeat: no-repeat;
}

这个想法是,如果你将鼠标悬停在一颗星星上,左边的所有星星都会亮起。 然而,实际上发生的事情是所有的星星都会亮起来,无论你悬停在哪里。

现在我很清楚这是因为我的 :hover 选择器选择了最外层的跨度。我的问题是:在 :hover 选择器的情况下,可以确定悬停在哪个元素上。在该元素包含其他元素(相同类型)的情况下,是否有办法规定应该选择哪个元素。在这种情况下,这将是可能的最低值。

我很感激我可以用 Javascript 简单地做到这一点;我只是希望有一个纯 CSS 解决方案。

更新 这是一个 JSFiddle:http://jsfiddle.net/MkJmj/1/ 稍作修改以使用图像的绝对网址,但其他方面相同

【问题讨论】:

  • 单独使用 CSS 解决这个问题会很棒。为一个有趣的问题 +1。
  • 你能提供一个JS Fiddle吗?我想我有一个想法,但在我可以测试之前我不确定(我也懒得去寻找星标来测试)。
  • 与您的问题无关,但将divs 嵌套在spans 中是无效的-您不妨将所有内容都转为span
  • 不将此作为答案发布,只是您可能想研究的内容:htmldrive.net/items/show/689/Pure-CSS-Star-Rating-System 我认为此解决方案比您尝试做的更清洁。
  • 如果从右到左而不是从左到右突出显示,使用.rating-star:hover, .rating-star:hover ~ .rating-star 之类的东西并删除不合时宜的嵌套内容会很容易和干净。不幸的是,没有“兄弟姐妹”选择器,而且不太可能是一个。

标签: css css-selectors


【解决方案1】:

纯 CSS 解决方案

jsFiddle:http://jsfiddle.net/alecgorge/Sw5Ym/

这是一个纯 CSS 解决方案。我建议更改 HTML,但这是一个有趣的练习。这是我所做的更改:

div.rating-star{
    display:inline-block;

...

.rating-span:hover div.rating-star {

div.rating-star{
    display:block;
    float:right;

...

.rating-span:hover > div.rating-star {

更好的解决方案

通过将div 更改为span,您可以获得有效的HTML(虽然有点混乱),并且您可以获得完全兼容IE 7+ 的解决方案:http://jsfiddle.net/alecgorge/FEHuw/

确保调整窗口大小以在一行上显示所有星星。一旦星形图像变小,span 的图像就会变小,效果会更好。

【讨论】:

  • 感谢您的解决方案;无论如何,我都需要更改我的无效 HTML,所以我想我最终不会使用这个...但是找到解决方案的荣誉!
  • 这个小提琴似乎也坏了:/
【解决方案2】:

我已经简化了您的 HTML,因为它既无效又笨拙(更不用说难以使用 CSS 选择器轻松定位)。而且,使用修改后的 HTML,CSS(如下)似乎可以按您的意愿工作。尽管它仅在 Chromium 14 中进行了测试,但旧版浏览器几乎可以肯定无法正常工作。也不是 Internet Explorer(完全是猜测):

HTML:

<div>
    <div class='rating-star unselected'></div>
    <div class='rating-star unselected'></div>
    <div class='rating-star unselected'></div>
    <div class='rating-star unselected'></div>
    <div class='rating-star unselected'></div>
</div>

还有 CSS:

div:hover div.rating-star:hover ~ div.rating-star {
    background-image: url(http://danrumney.co.uk/images/star.jpg);   
    background-size: contain;
    background-repeat: no-repeat;
}

JS Fiddle.

【讨论】:

  • 这是一个令人愉快的解决方案。事实证明,MSIE 根本不喜欢背景大小,所以我可能一无所获。不过,我真的很喜欢这个解决方案……非常整洁。
猜你喜欢
  • 2015-06-05
  • 2015-10-06
  • 2013-11-01
  • 2015-01-25
  • 2020-04-11
  • 2015-09-09
  • 1970-01-01
  • 2021-09-23
  • 2016-11-30
相关资源
最近更新 更多