CSS选择前一个同级元素

7
我有一个进度条,它有两个子元素(部分)。每当这些子元素之一被悬停时,进度条及其子元素的总高度将发生变化。我已经使用next sibling selector解决了第一个子元素的问题,但是我找不到第二个子元素(黄色部分)的解决方案。到目前为止,我已经使用jQuery解决了这个问题,但我想在纯CSS中完成这个任务。
代码演示: https://jsfiddle.net/zfh263r6/5/

$('#start').on({
  mouseenter: function () {
   //$(this).css('height', '4px');
      //$( 'progress' ).css('height', '4px');
  },
  mouseleave: function () {
   //$(this).css('height', '');
     // $( 'progress' ).css('height', '');
  }
});
#progress_wrap {
    position: relative;
    height: 4px; /*max height of progress*/
    background: #f3f3f3;
}

progress {
    appearance: none;
    -moz-appearance: none;
    -webkit-appearance: none;
    width: 100%;
    border:none;
    height: 2px;
    transition:all .25s ease-in;
    cursor: pointer;
    background-color: #fff;
    position: absolute;
    top: 0;
    left: 0;
    display: block;
}

progress:hover, progress:hover + #start {height: 4px}

progress[value]  {
    /* Reset the default appearance */
    -webkit-appearance: none;
     -moz-appearance: none;
       appearance: none;

    /* Get rid of default border in Firefox. */
    border: none;

    /* For IE10 */
    color: #f8008c;
}

progress[value]::-webkit-progress-bar {
    background-color: #fff;
    border:none;
}

progress[value]::-webkit-progress-value {background:#f8008c}

progress::-ms-progress-value {background:#f8008c}

progress::-moz-progress-bar {background:#f8008c}

progress::-ms-fill {border: none}

#start {
    height: 2px;
    transition: all .25s ease-in;
    cursor: pointer;
    background-color: #ffe232;
    position: absolute;
    top: 0;
    left: 0px;
    width: 30px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="progress_wrap">
  <progress min="0" max="1" value="0.66" id="progress"></progress> 
  <div id="start" style="display: inline-block; left: 50px;"></div>
</div>


2
CSS 无法选择前面的兄弟元素。 - Ram
有没有其他仅使用CSS就能实现这个的方式?@Vohuman - M1X
1
我认为不太可能。唯一能想到的是将progressstart设为悬停高度,然后将progress_wrap设置为溢出隐藏和较短,并在悬停时扩展 - Draco18s no longer trusts SE
嘿,这很酷。它有效。谢谢。@Draco18s - M1X
唯一的问题是它会把我的其他元素往下推 :/ - M1X
2个回答

9

CSS没有前一个兄弟选择器,但是您可以使用~选择器 -

假设您有一组链接,当悬停在其中一个链接上时,所有前面的链接都应变为红色。您可以像这样实现:

/* 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>


感谢您提供的解决方案! - M1X
2
这个答案是从 https://dev59.com/vnI-5IYBdhLWcg3whImk#27993987 复制的。 - alexandernst
@alexandernst 看起来原始答案被(某种程度上)归属,但随后又被删除了。让我试着将其编辑回来。**更新:**编辑队列已满,所以现在无法将其编辑回来:( - Hippo

3

来自评论:

先使 progressstart 的悬停高度,然后使 progress_wrap 溢出隐藏并缩短,再使 在悬停时扩展。

为避免推动其他元素,我们可以同时添加一些负底部边距。

#progress_wrap {
    position: relative;
    height: 2px;
    background: #f3f3f3;
    overflow:hidden;
    transition: all .25s ease-in;
}

#progress_wrap:hover, progress:hover + #start {
  height: 4px;
  margin-bottom:-2px;
}

progress,#start {
  height: 4px; /*This is a change from existing, not a new declaration*/
}

https://jsfiddle.net/5t90s4jk/


嘿,抱歉,但是另一个答案有一个更简洁的解决方案。 - M1X
1
不要伤感情。 :) - Draco18s no longer trusts SE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接