如何在悬停时用另一个div替换一个div(仅限CSS)

4
我有两个盒子,一个隐藏,一个可见。我希望当默认盒子悬停时,它会淡出并且display为none的盒子会变得可见。
这是代码,链接,但它并不按照我想要的方式工作,因为当第一个盒子悬停时,它仍然可见,而我希望它变成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。

有什么建议吗?先谢谢了。

5个回答

5
你可以使用以下CSS为这两个div添加一个包装器:

您可以使用以下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;,但是无法生效。 - DannyBoy
1
不幸的是,在 display: nonetransition 不起作用,如果您想要过渡效果,应该使用另一种触发显示的方式。 - Carl Binalla

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>


1
这将会非常麻烦,特别是在响应性方面,因为.box2需要恰好位于.box1的位置上,而.box1并不总是在文档的左上角。 - Carl Binalla
@Swellar 好的,但它取决于其父级 div,因为父级 div 具有 relative 值。 - ankita patel

3

这对你来说将会很好用。

我使用了一些过渡效果来满足你的需求。

只有将一个 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>

希望这对你有所帮助。

1

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

因此,您需要为两个框都设置position: absolute, 然后在hover时,您将在opacity: 0;visibility: hiddenopacity: 1;visibility: visible之间切换,而不是display: nonedisplay: block,请参阅以下代码片段以了解更多详细信息:

.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>


0

试试这个。

.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>


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