How to force spaces between two elements when position: absolute only with CSS?

I am trying to create a menu that appears when the mouse is on div, with some buttons at the top and some buttons at the divbottom.

.session {
    position: relative;
    width: 300px;
}
.button {
    background-color: white;
    border: 1px solid black;
    width: 20px;
    height: 20px;
}
.button:hover {
    cursor: pointer
}
.top-menu, .bottom-menu {
    display: none;
}
.session:hover .top-menu{
    position: absolute;
    display: block;
    top: 0px;
    right: -20px;
}
.session:hover .bottom-menu {
    position: absolute;
    display: block;
    bottom: 0px;
    right: -20px;
}
.big-box {
    background-color: red;
    height: 300px;
}
.normal-box {
    background-color: green;
    height: 100px;
}
.small-box {
    background-color: blue;
    height: 50px;
}
<div class="big-box session">
    <div class="top-menu">
        <div class="button-1 button">1</div>
        <div class="button-2 button">2</div>
        <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
        <div class="button-a button">a</div>
    </div>
</div>
<div class="normal-box session">
    <div class="top-menu">
        <div class="button-1 button">1</div>
        <div class="button-2 button">2</div>
        <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
        <div class="button-a button">a</div>
    </div>
</div>
<div class="small-box session">
    <div class="top-menu">
        <div class="button-1 button">1</div>
        <div class="button-2 button">2</div>
        <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
        <div class="button-a button">a</div>
    </div>
</div>
Run codeHide result

JSFiddle demo

It works great, but as you can see, when you move the mouse to the lower blue session, the buttons overlap. I want him to use the spaces below when the section is too small. Usually, when I have it position: relative, it automatically pushes another div into the next line, but I cannot find a way to achieve the same effect without using it position: absolute. In fact, the height of a section depends on the content it contains, so it is not possible to copy the position for a specific div.

, , CSS, position: absolute, , position: relative ?

P.S. . , , .

+4
1

position: absolute; .top-menu .bottom-menu , . , .

position: relative; , , , , .bottom-menu , .

flexbox .bottom-menu , .top-menu .

:

  • .top-menu .bottom-menu div, .menu
  • .menu:
    • display: none;, .
    • flex-direction: column;,
    • justify-content: space-between;, . ,
    • left: 100%;,
    • min-height: 100%;, , height
    • position: absolute;, left position ing
  • .session:hover .menu:
    • display: flex;, flexbox , .
  • .session:hover .top-menu .session:hover .bottom-menu

.session {
  position: relative;
  width: 300px;
}
.button {
  background-color: white;
  border: 1px solid black;
  width: 20px;
  height: 20px;
}
.button:hover {
  cursor: pointer
}
.menu {
  display: none;
  flex-direction: column;
  justify-content: space-between;
  left: 100%;
  min-height: 100%;
  position: absolute;
}
.session:hover .menu {
  display: flex;
}
.big-box {
  background-color: red;
  height: 300px;
}
.normal-box {
  background-color: green;
  height: 100px;
}
.small-box {
  background-color: blue;
  height: 50px;
}
<div class="big-box session">
  <div class="menu">
    <div class="top-menu">
      <div class="button-1 button">1</div>
      <div class="button-2 button">2</div>
      <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
      <div class="button-a button">a</div>
    </div>
  </div>
</div>
<div class="normal-box session">

  <div class="menu">
    <div class="top-menu">
      <div class="button-1 button">1</div>
      <div class="button-2 button">2</div>
      <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
      <div class="button-a button">a</div>
    </div>
  </div>
</div>
<div class="small-box session">
  <div class="menu">
    <div class="top-menu">
      <div class="button-1 button">1</div>
      <div class="button-2 button">2</div>
      <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
      <div class="button-a button">a</div>
    </div>
  </div>
</div>
Hide result

IE8, flexbox . , , position ing padding:

  • .menu:
    • box-sizing: border-box;, padding height
    • padding-bottom: 22px; - padding, height bottom-menu. "" bottom-menu
  • .session:hover .menu:
    • display: block;, , .
  • .bottom-menu:
    • bottom: 0; position .menu. "" padding
    • position: absolute;, bottom position ing

, .top-menu , , .menu height, . padding .menu, .bottom-menu position ed absolutely, .top-menu.

.session {
  position: relative;
  width: 300px;
}
.button {
  background-color: white;
  border: 1px solid black;
  width: 20px;
  height: 20px;
}
.button:hover {
  cursor: pointer
}
.menu {
  box-sizing: border-box;
  display: none;
  left: 100%;
  min-height: 100%;
  padding-bottom: 22px;
  position: absolute;
}
.session:hover .menu {
  display: block;
}
.bottom-menu {
  bottom: 0;
  position: absolute;
}
.big-box {
  background-color: red;
  height: 300px;
}
.normal-box {
  background-color: green;
  height: 100px;
}
.small-box {
  background-color: blue;
  height: 50px;
}
<div class="big-box session">
  <div class="menu">
    <div class="top-menu">
      <div class="button-1 button">1</div>
      <div class="button-2 button">2</div>
      <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
      <div class="button-a button">a</div>
    </div>
  </div>
</div>
<div class="normal-box session">

  <div class="menu">
    <div class="top-menu">
      <div class="button-1 button">1</div>
      <div class="button-2 button">2</div>
      <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
      <div class="button-a button">a</div>
    </div>
  </div>
</div>
<div class="small-box session">
  <div class="menu">
    <div class="top-menu">
      <div class="button-1 button">1</div>
      <div class="button-2 button">2</div>
      <div class="button-3 button">3</div>
    </div>
    <div class="bottom-menu">
      <div class="button-a button">a</div>
    </div>
  </div>
</div>
Hide result
+3

Source: https://habr.com/ru/post/1613804/


All Articles