修复了标头和侧边栏z-index问题

时间:2017-08-01 20:13:52

标签: html css css3 z-index fixed

已经有一段时间了! 我目前正在尝试解决问题,我希望有人可以帮助我。 我有一个固定的侧边栏和标题。两者都投下了阴影。但是,我不希望标题在侧边栏上投射阴影(我希望它们在同一级别上)。同时,标题包含下拉列表,这些需要将鼠标悬停在所有内容上。 由于它相当复杂,我创造了一个jsfiddle。

Simple example

由于某种原因,我被迫在这里粘贴代码(SO输入验证)。

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
   Mat img = imread("1.png");

   Mat gray;
   cvtColor(img,           //BGR form image
            gray,          //Mat for gray(destination)
            CV_BGR2GRAY);  //type of transform(in here BGR->GRay)

   Mat edgeImage;
   Canny(gray,       //Input Array
         edgeImage,  //Output Array
         40,         // Lower threshold
         120);        //Upper threshold

   namedWindow("Edge-Image");       //create a window for display image
   imshow("Edge-Image",edgeImage);  //Display edgeImage in window that in before line create
   waitKey(0);                      //stick display window and wait for any key

   return 0;

}

和css

<div class="layout">
  <div class="header z-depth-2">
    <div class="dropdown-toogle">
      <div class="dropdown-menu">
      </div>
    </div>
  </div>
  <div class="page-wrapper">
    <div class="sidebar z-depth-2">
    </div>
    <div class="content">
    </div>
  </div>
</div>

请注意,当您更改视口宽度时,即使z-index较大,也会在侧边栏后面下拉幻灯片。

如果我增加标题的z-index,它会开始在侧边栏上投射阴影(下拉开始工作),我想避免。我一直在玩不同的组合,但无法正确分类。

希望我能说清楚,非常感谢!

2 个答案:

答案 0 :(得分:2)

使用您当前的布局,这是不可能的。由于标题设置为侧边栏后面的z-index,因此标题的任何子节点也将位于侧边栏的后面。 (详情请参阅 stacking contexts

要解决此问题,您可以在内容窗格中使用插入box-shadow。这将使它有一个阴影,好像它是由标题和侧边栏投射,但它实际上是容器投射它自己。这样您就不必担心标题投射到侧边栏上,侧边栏可以安全地位于标题“后面”。有了这个你根本不需要摆弄z-index(虽然我没有删除它们,以防页面上的其他东西需要它。)

为了使其正常工作,我必须更改您使用的padding以使用margin定位内容元素,但老实说,这是一个更好的属性,可用于在元素周围添加空间。我建议您也阅读一下何时使用 padding vs margin

https://jsfiddle.net/79gykeu3/6/

HTML

<div class="layout">
  <div class="header z-depth-2">
    <div class="dropdown-toogle">
      <div class="dropdown-menu">
      </div>
    </div>
  </div>
  <div class="page-wrapper">
    <div class="sidebar z-depth-2">
    </div>
    <div class="content">
    </div>
  </div>
</div>

CSS

需要注意的是.content类现在有了box-shadow

html {
  height: 100%;
}

body {
  width: 100%;
  height: 100%;
  margin: 0;
}

.layout {
  width: 100%;
  height: 100%;
  position: relative;
}

.header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 70px;
  background-color: blue;
  z-index: 103;
}

.sidebar {
  position: fixed;
  top: 70px;
  left: 0;
  width: 200px;
  background-color: green;
  bottom: 0;
  z-index:101;
}

.content {
  margin-left: 200px;
  width: 100%;
  height: 100%;
    box-shadow: inset 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
}

.page-wrapper {
  margin-top: 70px;
  height: 100%;
}

.dropdown-toogle {
  margin-right: 100px;
  float: right;
  position: relative;
  height: 100%;
  width: 50px;
  background-color: yellow;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  right: 0;
  width: 70%;
  height: 200px;
  background-color: grey;
  z-index:1000;
}

.z-depth-2 {
}

答案 1 :(得分:0)

首先,非常感谢Don,他的方法完全有效,聪明,甚至可能比我使用的更好。 但是,我认为我会发布我的最终解决方案以及有人可能会重视有两种方法。我所做的就是我添加了一个&#34;假的&#34;梯度绝对位于标题和侧边栏的右侧。 我之所以这样做,基本上是我使用了我所知道并且可以信赖的技术。我也不喜欢内容上的溢出自动。无论如何,就是这样:

https://jsfiddle.net/79gykeu3/11/

<div class="layout">
    <div class="header">
        <div class="header__shadow">
        </div>
        <div class="dropdown-toogle">
            <div class="dropdown-menu">
            </div>
        </div>
    </div>
    <div class="page-wrapper">
        <div class="sidebar">
            <div class="sidebar__shadow">
            </div>
        </div>
        <div class="content">
        </div>
    </div>
</div>

的CSS

.layout {
    width: 100 %;
    height: 100 %;
    position: relative;
}

.header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    height: 70px;
    background - color: blue;
    z - index: 103;
}

.sidebar {
    position: fixed;
    top: 70px;
    left: 0;
    width: 200px;
    background - color: green;
    bottom: 0;
    z - index:101;
}

.content {
    padding - left: 200px;
    height: 8000px;
}

.page - wrapper {
    padding - top: 70px;
    height: 100 %;
}

.dropdown - toogle {
    margin - right: 100px;
    float: right;
    position: relative;
    height: 100 %;
    width: 50px;
    background - color: yellow;
}

.dropdown - menu {
    position: absolute;
    top: 100 %;
    right: 0;
    width: 400px;
    height: 200px;
    background - color: grey;
    z - index:1000;
}

.header__shadow {
    position: absolute;
    height: 7px;
    left: 200px;
    right: 0;
    top: 100 %;
    background: linear - gradient(to bottom, rgba(0, 0, 0, 0.35) 0%,rgba(0, 0, 0, 0) 100%);
}

.sidebar__shadow {
    position: absolute;
    left: 100 %;
    top: 0;
    bottom: 0;
    width: 7px;
    background: linear - gradient(to right, rgba(0, 0, 0, 0.35) 0%,rgba(0, 0, 0, 0) 100%);
}