Search code examples
htmlcssz-indexcss-transforms

Child element z-index inside element with transform property


I'm having a problem and I'd like to know if you guys can help me out with it.

As shown in the snippet, I have some elements with

transform: translate(0,0);

And then, inside them, I have a "dropdown" element that is shown when you click a button.

The problem comes when part of this dropdown gets hidden behind other elements, and I found out that this is happening because its parent element has this transform property.

enter image description here

My code has more stuff, the snippet is just an example. I can't get rid of the transform property.

I'd like to know if there is any solution for this. I'm trying to solve it using just CSS.

Cheers!!

$(document).ready(function() {
  $('button[name="button"]').click(function(e) {
    $(e.currentTarget).parent().find('.template-options-dropdown').toggleClass('open');
  });
});
.boxes {
  list-style-type: none;
}

.boxes >li {
  float: left;
  width: 100px;
  height: 100px;
  background-color: red;
  margin: 5px;
  transform: translate(0, 0);
}

.download-container {
  background: rgba(40, 39, 39, 0.8);
  bottom: 0;
  position: absolute;
  text-align: center;
  width: 100%;
}

.download-container .dropdown-container {
  display: inline-block;
  position: relative;
}

.download-container .dropdown-container button {
  background: #0bb9ab;
  color: #fff;
  padding: 6px 12px;
}

.template-options-dropdown {
  list-style-type: none;
  text-align: left;
  padding: 0;
  position: absolute;
  background-color: #111;
  visibility: hidden;
}

.template-options-dropdown.open {
  visibility: visible;
}

.template-options-dropdown li a {
  color: white;
  text-decoration: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="boxes">
  <li>
    <div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div>
  </li>
  <li><div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div></li>
  <li><div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div></li>
  <li><div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div></li>
  <li><div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div></li>
  <li><div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div></li>
  <li><div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div></li>
  <li><div class="download-container">
      <div class="dropdown-container">
        <button type="button" name="button">Download</button>

        <ul class="template-options-dropdown">
          <li>
            <a href="#">Original</a>
          </li>
          <li>
            <a href="#">Thumb</a>
          </li>
          <li>
            <a href="#">Mobile</a>
          </li>
          <li>
            <a href="#">Tab</a>
          </li>
          <li>
            <a href="#">Web</a>
          </li>
          <li>
            <a href="#">Large web</a>
          </li>
        </ul>
      </div>
    </div></li>
</ul>


Solution

  • Unfortunately, there maybe no CSS-only solution - CSS3 transitions creates a new stacking context - see the relevant doc description and this thread for another effect:

    If the property has a value different than none, a stacking context will be created.

    Source: MDN

    You can easily replace translate(0,0) there with position: relative and add a z-index more than zero to .template-options-dropdown to solve the problem.

    $(document).ready(function() {
      $('button[name="button"]').click(function(e) {
        $(e.currentTarget).parent().find('.template-options-dropdown').toggleClass('open');
      });
    });
    .boxes {
      list-style-type: none;
    }
    
    .boxes >li {
      float: left;
      width: 100px;
      height: 100px;
      background-color: red;
      margin: 5px;
      /*transform: translate(0, 0);*/
      position: relative; /*ADDED*/
    }
    
    .download-container {
      background: rgba(40, 39, 39, 0.8);
      bottom: 0;
      position: absolute;
      text-align: center;
      width: 100%;
    }
    
    .download-container .dropdown-container {
      display: inline-block;
      position: relative;
    }
    
    .download-container .dropdown-container button {
      background: #0bb9ab;
      color: #fff;
      padding: 6px 12px;
    }
    
    .template-options-dropdown {
      list-style-type: none;
      text-align: left;
      padding: 0;
      position: absolute;
      background-color: #111;
      visibility: hidden;
      z-index: 2;/*ADDED*/
    }
    
    .template-options-dropdown.open {
      visibility: visible;
    }
    
    .template-options-dropdown li a {
      color: white;
      text-decoration: none;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="boxes">
      <li>
        <div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div>
      </li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
    </ul>

    A hacky solution that messes up the wrapping - you can add more transforms:

    1. Add scaleY(-1) for the ul to make the list backwards because of the fact that the a list item with higher index comes over the one with a lower index.

    2. Add an inversion scaleY(-1) to the li to bring the world back to normal.

    3. Also clear the li floats.

    See demo below:

    $(document).ready(function() {
      $('button[name="button"]').click(function(e) {
        $(e.currentTarget).parent().find('.template-options-dropdown').toggleClass('open');
      });
    });
    .boxes {
      list-style-type: none;
      transform: scaleY(-1);/*ADDED*/
    }
    .boxes:after {/*ADDED*/
      content: '';
      clear: both;
      display: block;
    }
    
    .boxes >li {
      float: left;
      width: 100px;
      height: 100px;
      background-color: red;
      margin: 5px;
      transform: translate(0, 0) scaleY(-1);/*ADDED*/
    }
    
    .download-container {
      background: rgba(40, 39, 39, 0.8);
      bottom: 0;
      position: absolute;
      text-align: center;
      width: 100%;
    }
    
    .download-container .dropdown-container {
      display: inline-block;
      position: relative;
    }
    
    .download-container .dropdown-container button {
      background: #0bb9ab;
      color: #fff;
      padding: 6px 12px;
    }
    
    .template-options-dropdown {
      list-style-type: none;
      text-align: left;
      padding: 0;
      position: absolute;
      background-color: #111;
      visibility: hidden;
    }
    
    .template-options-dropdown.open {
      visibility: visible;
    }
    
    .template-options-dropdown li a {
      color: white;
      text-decoration: none;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="boxes">
      <li>
        <div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div>
      </li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
    </ul>

    If translate(0,0) still can't be removed, you have no option other than use javascript:

    1. Invert the list stacking by giving a z-index equal to the index in the list.

    2. Add position:relative to the li

    See demo below:

    $(document).ready(function() {
    
      // ADDED
      $($('ul.boxes > li').get().reverse()).each(function(index){
         $(this).css('z-index', index);
      });
    
      $('button[name="button"]').click(function(e) {
        $(e.currentTarget).parent().find('.template-options-dropdown').toggleClass('open');
      });
    });
    .boxes {
      list-style-type: none;
    }
    
    .boxes >li {
      float: left;
      width: 100px;
      height: 100px;
      background-color: red;
      margin: 5px;
      transform: translate(0, 0);
      position: relative;/*ADDED*/
    }
    
    .download-container {
      background: rgba(40, 39, 39, 0.8);
      bottom: 0;
      position: absolute;
      text-align: center;
      width: 100%;
    }
    
    .download-container .dropdown-container {
      display: inline-block;
      position: relative;
    }
    
    .download-container .dropdown-container button {
      background: #0bb9ab;
      color: #fff;
      padding: 6px 12px;
    }
    
    .template-options-dropdown {
      list-style-type: none;
      text-align: left;
      padding: 0;
      position: absolute;
      background-color: #111;
      visibility: hidden;
    }
    
    .template-options-dropdown.open {
      visibility: visible;
    }
    
    .template-options-dropdown li a {
      color: white;
      text-decoration: none;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="boxes">
      <li>
        <div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div>
      </li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
      <li><div class="download-container">
          <div class="dropdown-container">
            <button type="button" name="button">Download</button>
    
            <ul class="template-options-dropdown">
              <li>
                <a href="#">Original</a>
              </li>
              <li>
                <a href="#">Thumb</a>
              </li>
              <li>
                <a href="#">Mobile</a>
              </li>
              <li>
                <a href="#">Tab</a>
              </li>
              <li>
                <a href="#">Web</a>
              </li>
              <li>
                <a href="#">Large web</a>
              </li>
            </ul>
          </div>
        </div></li>
    </ul>