Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CSS Box/shadow overlapping issue z-index

Please take a look at the code snippet: http://codepen.io/anon/pen/JItLa

I'm trying to show 2 rows of blocks with different amount of items in a row. The hover event should reveal the CSS shadow, but there is a problem: the right border of the shadow is overlapped with the next block. You would say the possible solution here is to use display:inline-block which leaves the gaps between the blocks, but I don't need the gaps. The blocks should stay sticky to each other but the right shadow should overlap the next block onhover.

html,
body {
  margin: 0;
  padding: 0
}
.wrapper {
  width: 100%;
  margin-top: 20px
}
.tile,
.tile2 {
  float: left;
  background: #f2f2f2
}
.tile {
  width: 25%
}
.tile2 {
  width: 33.3%;
  border-left: 1px solid #ddd
}
.tile:hover,
.tile2:hover {
  -webkit-box-shadow: 0 0 2px rgba(255, 255, 190, .75), 0 0 23px 1px #000;
  -moz-box-shadow: 0 0 2px rgba(255, 255, 190, .75), 0 0 23px 1px #000;
  box-shadow: 0 0 2px rgba(255, 255, 190, .75), 0 0 23px 1px #000
}
.header {
  padding: 20px 0px 10px;
  text-align: center
}
.clear {
  clear: both
}
<div class="wrapper">
  <div class="tile">
    <div class="header">some text</div>
  </div>
  <div class="tile">
    <div class="header">some text</div>
  </div>
  <div class="tile">
    <div class="header">some text</div>
  </div>
  <div class="tile">
    <div class="header">some text</div>
  </div>
  <div class="clear"></div>
</div>
<div class="wrapper">
  <div class="tile2">
    <div class="header">some text</div>
  </div>
  <div class="tile2">
    <div class="header">some text</div>
  </div>
  <div class="tile2">
    <div class="header">some text</div>
  </div>
  <div class="clear"></div>
</div>

How is that possible?

There is another problem here: when I add the border between the blocks the last blocks moves to the next line which is not OK. See the 2nd row in the example given above.

like image 810
Andreas Avatar asked Nov 26 '13 03:11

Andreas


People also ask

How do you stop overlapping boxes in CSS?

All that is needed to fix this is “min-height” and “min-width” in your CSS. this makes a Div responsive. minimum height will prevent the Divs from overlapping on each other.

Why do divs overlap?

This could happen for several reasons, especially when you consider the position problems with divs from one website to another. Similarly, box elements may overlap for a few reasons, ranging from positioning errors to overflow issues and simple float problems.

How do you put two box shadows in CSS?

Multiple shadows can be made using the same code that is used for making single shadow. To make these multiple shadows we just need to define multiple shadow value and seperate them with a comma. Then we'll position the shadows using different values for x-offset and y-offset values.


1 Answers

Add a z-index to the element on hover.

Additionally, the element also has to be positioned in order for the z-index property to work. Therefore add position:relative too.

9.9.1 Specifying the stack level: the 'z-index' property

z-index: Applies to: positioned elements

Each box has a position in three dimensions. In addition to their horizontal and vertical positions, boxes lie along a "z-axis" and are formatted one on top of the other. Z-axis positions are particularly relevant when boxes overlap visually. This section discusses how boxes may be positioned along the z-axis.

Updated Codepen - it works now.

.tile:hover, .tile2:hover {
    z-index: 1;
    position: relative;
}

To address your second issue, the elements are appearing on a new line because their widths do not add up, as it is 1px off due to the border.

33.3% + 33.3% + 33.3% + 1px != 100%

You have a few different options:

  • Use calc() to subtract 1px from the width - width: calc(33.3% - 1px)

  • Change the box model to include the border in the element's width calculation - box-sizing

If you choose to use box-sizing, you need appropriate vendors/prexes if you want support across all browsers. I would use something like:

.tile2 {
    width: 33.3%;
    border-left: 1px solid #ddd;
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
}

Updated Codepen using box-sizing.

like image 173
Josh Crozier Avatar answered Sep 30 '22 13:09

Josh Crozier