【问题标题】:How to replace on div with another on hover (CSS ONLY)如何在悬停时用另一个替换 div(仅限 CSS)
【发布时间】:2025-12-20 08:20:07
【问题描述】:

我有两个盒子,一个是隐藏的,一个是可见的。我想让它以这样一种方式工作,即当默认框悬停时,它会淡出并且不显示的框变得可见。

这是code,它不能按我想要的方式工作,因为一旦框悬停,它仍然可见,而我希望它去display: none

.box1, .box2{
  width:100px;
  height 100px;
  border:1px solid black;
  text-align:center;
}

.box1{
  display: block;
}

.box2{
  display: none;
}

.box1:hover ~ .box2{
  display:block;
}
<div class="box1">
  <p>data 1</p>
</div>

<div class="box2">
  <p>data 2</p>
</div>

如果在盒子切换后有动画效果会更好。

有人提出了类似的问题,但他们都要求使用 JavaScript。我只喜欢 CSS。

有什么想法吗?提前致谢。

【问题讨论】:

    标签: html css display


    【解决方案1】:

    您可以使用以下 css 将包装器添加到两个 div:

    .wrapper {
      width: auto;
      display: inline-block;
      background-color: red; //for visuals
    }
    

    而且你好像忘了隐藏.box1

    .box1,
    .box2 {
      width: 100px;
      height: 100px;
      border: 1px solid black;
      text-align: center;
    }
    
    .box1 {
      display: block;
    }
    
    .box2 {
      display: none;
    }
    
    .wrapper {
      width: auto;
      display: inline-block;
      background-color: red;
    }
    
    .wrapper:hover .box1 {
      display: none;
    }
    
    .wrapper:hover .box2 {
      display: block;
    }
    <div class="wrapper">
      <div class="box1">
        <p>data 1</p>
      </div>
    
      <div class="box2">
        <p>data 2</p>
      </div>
    </div>

    【讨论】:

    • 感谢您的回答。你也可以添加淡入淡出效果吗?我在.wrapper 类中尝试了-webkit-transition: display 600ms ease 0ms;,但没有用。
    • 很遗憾,transitiondisplay: none中不起作用,如果你想有过渡,应该使用另一种触发显示
    【解决方案2】:

    这对你来说很好。

    我已经使用了一些过渡来满足您的需求。

    您的需求只能通过将div 包裹在您的.box1.box2 周围来实现。

    .box1,
    .box2 {
      width: 100px;
      height 100px;
      border: 1px solid black;
      text-align: center;
      overflow: hidden;
      max-height: 200px;
      opacity: 1;
      transition: all ease-in-out 0.4s;
    }
    
    .box1 {
      display: block;
    }
    
    .box2 {
      max-height: 0px;
      opacity: 0;
    }
    .main_box{
     display:inline-block;
    }
    
    .main_box:hover .box1{
      max-height: 0px;
      opacity: 0;
    }
    
    .main_box:hover .box2{
      max-height: 200px;
      opacity: 1;
    }
    <div class="main_box">
      <div class="box1">
        <p>data 1</p>
      </div>
    
      <div class="box2">
        <p>data 2</p>
      </div>
    </div>

    希望这对您有所帮助。

    【讨论】:

      【解决方案3】:

      试试这个。我添加了一个额外的 div 来包装 box1box2 以及一些 css。

      .box1, .box2{
        width:100px;
        height: 100px;
        border:1px solid black;
        text-align:center;
        transition:0.5s;
      }
      .box2 {
        opacity: 0;
        position: absolute;
        top: 0;
        left: 0;  
      }
      .box-wrap:hover .box2{
        opacity:1;
        transform:translateY(0px);  
      }
      .box-wrap:hover .box1{
        opacity:0;
        height:0; 
      }
      .box-wrap{
        position:relative;
        display:inline-block;
        vertical-align: top;
      }
      <div class="box-wrap">
        <div class="box1">
          <p>data 1</p>
        </div>
      
        <div class="box2">
          <p>data 2</p>
        </div>
      </div>

      【讨论】:

      • 这会很麻烦,尤其是在响应方面,因为.box2 需要正好在.box1 的位置,而.box1 并不总是在文档的左上角
      • @Swellar 好的,但它依赖于其父 div,因为父 div 具有 relative 值。
      【解决方案4】:

      参考 @Swellar 先生的回答,我注意到您想添加过渡效果。

      因此您必须为两个盒子设置position: absolute, 然后onhover你会在opacity: 0;visibility: hiddenopacity: 1;visibility: visible而不是display: nonedisplay: block之间切换,更多细节请看下面的sn-p:

      .box1,
      .box2 {
        width: 100px;
        height: 100px;
        border: 1px solid black;
        text-align: center;
        position: absolute;
        transition: 600ms ease;;
      }
      
      .box1 {
        opacity: 1;
        visibility: visible;
        background-color: red;
      }
      
      .box2 {
        opacity: 0;
        visibility: hidden;
        background-color: green;
      }
      
      .wrapper {
        width: auto;
        display: inline-block;
      }
      
      .wrapper:hover .box1 {
        opacity: 0;
        visibility: hidden;
      }
      
      .wrapper:hover .box2 {
        opacity: 1;
        visibility: visible;
      }
      <div class="wrapper">
        <div class="box1">
          <p>data 1</p>
        </div>
      
        <div class="box2">
          <p>data 2</p>
        </div>
      </div>

      【讨论】:

        【解决方案5】:

        试试这个。

        .box1, .box2{
          width:100px;
          height 100px;
          border:1px solid black;
          text-align:center;
          float: left;
        }
        
        .box1{
          display: block;
          background: red;
        }
        
        .box2{
          display: none;
          margin-left: -102px;
          background: green;
        }
        .box1:hover{
          opacity:0;
        }
        .box1:hover ~ .box2{
          display:block;
        }
        <div class="box1">
          <p>data 1</p>
        </div>
        
        <div class="box2">
          <p>data 2</p>
        </div>

        【讨论】:

          最近更新 更多