简体   繁体   English

绝对定位的元素-需要切换可见性

[英]Absolute positioned elements - Need to toggle visibility

Trying to place two elements in the same spot to toggle between states. 试图将两个元素放在同一位置以在状态之间切换。

Parent element is relatively positioned and child elements are absolute. 父元素是相对放置的,子元素是绝对的。 The problem with this is I lose the height of my parent div. 问题是我失去了父母div的身高。

I know I could set these children elements as floated elements but I need them to be in the same spot to transition between showing one and hiding one on toggle that appear in the same spot. 我知道我可以将这些子元素设置为浮动元素,但我需要它们在同一位置以在显示一个元素和隐藏在同一位置的切换上隐藏一个元素之间过渡。

Is there a way to have these two elements placed at the same spot, whilst the parent element maintains its height and transition between the two in css or am I going to have to use Javascript? 有没有办法将这两个元素放在同一位置,而父元素在CSS中保持其高度和两者之间的过渡,还是我必须使用Javascript?

I also don't want to set an explicit height as you can add content inside the child elements that will expand the height of the parent div. 我也不想设置显式的高度,因为您可以在子元素内添加内容以扩大父div的高度。

<div class='parent'>
  <div class='child1'>
  <div class='child2'>
</div>
<button>Toggle Child</button>

If your browser support requirements allow using CSS grid , you can create a 1x1 grid and put both children into the same grid cell: 如果您的浏览器支持要求允许使用CSS grid ,则可以创建一个1x1网格并将两个子级放入同一网格单元中:

 $(function () { $("button").click(function () { $(".parent").toggleClass("show-child2"); }); }); 
 .parent { display: grid; } .parent > * { grid-area: 1 / 1; } .parent { background: green; padding: 20px; } .child1 { background: #ff8080; } .child2 { background: #8080ff; opacity: 0; visibility: hidden; transition: opacity 0.5s linear, visibility 0s 0.5s; } .parent.show-child2 .child2 { opacity: 1; visibility: visible; transition: opacity 0.5s linear; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class='parent'> <div class='child1'> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, </div> <div class='child2'> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </div> </div> <button>Toggle Child</button> 

If you can't use grid, you can achieve something similar by abusing flexbox, making the children inflexible and full width (so that the second child overflows), and then adjust the positioning of the second child: 如果您不能使用网格,则可以通过滥用flexbox,使子级不灵活且全宽(以使第二个子级溢出),然后调整第二个子级的位置,来实现类似的目的:

 $(function () { $("button").click(function () { $(".parent").toggleClass("show-child2"); }); }); 
 .parent { display: flex; } .parent > * { width: 100%; flex: none; } .child2 { position: relative; left: -100%; } .parent { background: green; padding: 20px; } .child1 { background: #ff8080; } .child2 { background: #8080ff; opacity: 0; visibility: hidden; transition: opacity 0.5s linear, visibility 0s 0.5s; } .parent.show-child2 .child2 { opacity: 1; visibility: visible; transition: opacity 0.5s linear; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class='parent'> <div class='child1'> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, </div> <div class='child2'> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </div> </div> <button>Toggle Child</button> 

Finally, if even flexbox isn't an option, then you can achieve almost the same thing with display: inline-block , but as you see you'll lose the benefit that the smaller child automatically takes the bigger child's height. 最后,即使没有flexbox,您也可以通过display: inline-block达到几乎相同的效果,但是如您所见,您将失去较小的孩子自动占据较大孩子的身高的好处。

 $(function () { $("button").click(function () { $(".parent").toggleClass("show-child2"); }); }); 
 .parent { white-space: nowrap; } .parent > * { display: inline-block; width: 100%; white-space: normal; vertical-align: top; } .child2 { position: relative; left: -100%; } .parent { background: green; padding: 20px; } .child1 { background: #ff8080; } .child2 { background: #8080ff; opacity: 0; visibility: hidden; transition: opacity 0.5s linear, visibility 0s 0.5s; } .parent.show-child2 .child2 { opacity: 1; visibility: visible; transition: opacity 0.5s linear; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class='parent'> <div class="wrapper"><div class='child1'> At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, </div></div><div class="wrapper"><div class='child2'> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. </div></div> </div> <button>Toggle Child</button> 

How you solve that depends on your use case, whether you want to fade out the other child to make sure only one is visible, or create extra background (pseudo-)elements that have 100% height (which will work now, because the .childX element provide an intrinsic height to the parent), or something else. 如何解决该问题取决于您的用例,是要淡出另一个孩子以确保只有一个孩子可见,还是要创建高度为100%的额外背景(伪)元素(现在可以使用,因为.childX元素.childX提供一个固有的高度),或其他。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM