【问题标题】:Creating a CSS3 box-shadow on all sides but one在除一个之外的所有边上创建 CSS3 盒子阴影
【发布时间】:2010-11-28 14:43:13
【问题描述】:

我有一个选项卡式导航栏,我希望打开的选项卡有一个阴影,以便将其与其他选项卡区分开来。我还希望整个选项卡部分有一个单独的阴影(见底部水平线)向上,为除打开的选项卡之外的所有选项卡的底部设置阴影。

我将使用 CSS3 的 box-shadow 属性来完成此操作,但我无法找到仅对我想要的部分进行着色的方法。

通常我会用内容区域(更高的z-index)覆盖打开选项卡的底部阴影,但在这种情况下,内容区域本身有一个阴影,因此最终会覆盖选项卡。

标签布局

_______ _______ _______ | | | | | | ____|________|__| |__|________|______

阴影线。

阴影会从水平线向上,垂直线向外。

_______ | | _______________| |_________________

Here 是一个活生生的例子:

有什么帮助吗,天才们?

【问题讨论】:

  • @the_drow 回复:CSS3,我喜欢将阴影、圆角等设计功能视为对那些使用现代浏览器的用户的奖励。
  • 哇,这正是我所需要的,很高兴已经存在一个问题。我也想把它应用到一个标签上,就像你展示的那样,哇哇哇:D
  • 解决此问题的另一种好方法是使用伪元素,有关详细信息,请参阅我的答案。
  • 在此处查看伪元素解决方案的详细信息:stackoverflow.com/a/38372215/4769218
  • 我知道这是一个老问题,但标签的大小是否已知?还是他们灵活?我可以想象可以设置高度,但不能设置宽度?

标签: html css shadow


【解决方案1】:

在您的示例中,使用此样式在 #content 中创建一个 div

#content_over_shadow {
    padding: 1em;
    position: relative; /* look at this */
    background:#fff;    /* a solid background (non transparent) */
}

并更改#content 样式(删除填充)并添加阴影

#content {
    font-size: 1.8em;
    box-shadow: 0 0 8px 2px #888; /* line shadow */
}

为标签添加阴影:

#nav li a {
    margin-left: 20px;
    padding: .7em .5em .5em .5em;
    font-size: 1.3em;
    color: #FFF;
    display: inline-block;
    text-transform: uppercase;
    position: relative;
    box-shadow: 0 0 8px 2px #888; /* the shadow */
}

【讨论】:

  • 这个解决方案缺少一些东西。编辑他的代码并应用推荐的样式,您仍然会在“选定”选项卡上留下阴影。好像有溢出:隐藏缺失?
  • 是的。您需要一个溢出:隐藏在导航上才能使其工作。
  • #content_over_shadow 中显示的“线条阴影”实际上应该是#content 的样式。
  • 这个解决方案在 2009 年可能是正确的,但现在不是。正确答案是stackoverflow.com/a/9800481/835753
  • 伪元素解决方案:stackoverflow.com/a/38372215/4769218
【解决方案2】:

用溢出将其切断。

div div {box-shadow:0 0 5px #000; height:20px}
div {overflow:hidden;height:25px; padding:5px 5px 0 5px}
<div><div>tab</div></div>

【讨论】:

  • 这也是一个使用溢出将其切断的示例starikovs.com/2011/11/09/css3-one-side-shadow
  • 此方法仅在您不希望阴影出现在底部时才有效
  • 效果很好!父div可以放在正确的z-index
  • 我目前正在使用这个解决方案,我遇到了一些需要溢出的子元素的问题(就像 facebook 一样的按钮)。
  • 对于大多数响应式设计来说不是很有用,因为您必须设置元素的高度
【解决方案3】:

您可以在没有任何其他 div 的情况下使用多个 CSS 阴影来获得所需的效果,但需要注意的是拐角处没有阴影。

div.shadow {
    -webkit-box-shadow: 0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    -moz-box-shadow:    0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    box-shadow:         0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    height: 25px
}
 <div style="height: 25px"><div class="shadow">tab</div></div>

总的来说,虽然它非常不打扰。

【讨论】:

  • 这将是一个很好的解决方案,但正如您所说,角落很不稳定。 jsfiddle.net/mahemoff/ZStTr
  • 用圆角满足我的嵌入阴影需求就像一个魅力。谢谢!
【解决方案4】:

解决此问题的另一种颇具创意的方法是将 :after 或 :before 伪元素添加到其中一个元素中。就我而言,它看起来像这样:

#magik_megamenu>li:hover>a:after {
    height: 5px;
    width: 100%;
    background: white;
    content: '';
    position: absolute;
    bottom: -3px;
    left: 0;
}

看截图,把伪元素变成红色,让它更显眼。

【讨论】:

    【解决方案5】:

    我个人最喜欢这里的解决方案:http://css3pie.com/demos/tabs/

    它允许您拥有一个零状态或悬停状态,其背景颜色仍然有来自下面内容的阴影覆盖它。不确定上述方法是否可行:

    更新:

    其实我错了。您可以使接受的解决方案支持上面显示的悬停状态。这样做:

    不要在 a 上使用正相关,而是将其放在 a.active 类上,其 z-index 高于您下面的#content div(上面有阴影)但低于 z- content_wrapper 上的索引。

    例如:

    <nav class="ppMod_Header clearfix">
        <h1 class="ppMod_PrimaryNavigation-Logo"><a class="ppStyle_Image_Logo" href="/">My company name</a></h1>
        <ul class="ppList_PrimaryNavigation ppStyle_NoListStyle clearfix">
            <li><a href="/benefits">Benefits</a></li>
            <li><a class="ppStyle_Active" href="/features">Features</a></li>
            <li><a href="/contact">Contact</a></li>
            <li><a href="/company">Company</a></li>
        </ul>
    </nav>
    <div id="ppPage-Body">
        <div id="ppPage-BodyWrap">
            content goes here
        </div>
    </div>
    

    然后用你的css:

    #ppPage-Body
        box-shadow: 0 0 12px rgba(0,0,0,.75)
        position: relative /* IMPORTANT PART */
    
    #ppPage-BodyWrap
        background: #F4F4F4
        position: relative /* IMPORTANT PART */
        z-index: 4 /* IMPORTANT PART */
    
    
    .ppList_PrimaryNavigation li a:hover
        background: #656565
        -webkit-border-radius: 6px 6px 0 0
        -moz-border-radius: 6px 6px 0 0
        border-radius: 6px 6px 0 0
    
    .ppList_PrimaryNavigation li a.ppStyle_Active
        background: #f4f4f4
        color: #222
        -webkit-border-radius: 6px 6px 0 0
        -moz-border-radius: 6px 6px 0 0
        border-radius: 6px 6px 0 0
        -webkit-box-shadow: 0 0 12px rgba(0,0,0,0.75)
        -moz-box-shadow: 0 0 12px rgba(0,0,0,0.75)
        box-shadow: 0 0 12px rgba(0,0,0,0.75)
        position: relative /* IMPORTANT PART */
        z-index: 3 /* IMPORTANT PART */
    

    【讨论】:

      【解决方案6】:

      更新:

      现在所有主流浏览器都支持clip-path


      原答案:

      如果您愿意使用只有partial support 的实验技术,您可以使用clip-path property

      这将产生所需的效果:顶部、左侧和右侧有一个盒子阴影,底部边缘有一个干净的切口。

      在您的情况下,您将使用 clip-path: inset(px px px px);其中像素值是根据相关边缘计算的(见下文)。

      #container {
          box-shadow: 0 0 8px 2px #888;
          clip-path: inset(-8px -8px 0px -8px);
      }
      

      这将在以下位置剪辑有问题的 div:

      • 顶部上方 8 个像素(包括阴影)
      • 右边缘外 8 个像素(包括阴影)
      • 距底部 0 像素(隐藏阴影)
      • 左边缘外 8 个像素(包括阴影)

      请注意,像素值之间不需要逗号。

      div 的大小可以灵活调整。

      【讨论】:

      • 不幸的是,两个阴影重叠的地方有一个间隙。
      • @sbaechler 你能详细说明一下吗?阴影在哪里重叠?
      【解决方案7】:

      您也可以使用多个盒子阴影来掩盖阴影。

      box-shadow: 0 10px 0 #fff, 0 0 10px #ccc;

      【讨论】:

        【解决方案8】:

        如果您添加了两个跨度来挂钩,那么您可以使用两个,例如:

        box-shadow: -1px -1px 1px #000;
        

        在一个跨度上

        box-shadow: 1px -1px 1px #000;
        

        另一个。可能有用!

        如果阴影重叠,您甚至可以使用 3 个阴影 - 一个向左 1 像素,一个向右 1 像素,一个向上 1 像素,或者您希望它们有多厚。

        【讨论】:

          【解决方案9】:

          我做了一些 hack,并不完美,但看起来还不错:

          <ul class="tabs">
          <li class="tab active"> Tab 1 </li>
          <li class="tab"> Tab 2 </li>
          <li class="tab"> Tab 3 </li>
          </ul>
          
          <div class="tab-content">Content of tab goes here</div>
          

          SCSS

           .tabs { list-style-type: none; display:flex;align-items: flex-end;
            .tab {
              margin: 0;
              padding: 4px 12px;
              border: 1px solid $vivosBorderGrey2;
              background-color:$vivosBorderGrey2;
              color: $vivosWhite;
              border-top-right-radius: 8px;
              border-top-left-radius: 8px;
              border-bottom: 0;
              margin-right: 2px;
              font-size: 14px;
              outline: none;
              cursor: pointer;
              transition: 0.2s;
              &.active {
                padding-bottom: 10px;
                background-color: #ffffff;
                border-color: #eee;
                color: $vivosMedGrey;
                border-bottom-color: transparent;
                box-shadow: 0px -3px 8px -3px rgba(0, 0, 0, 0.1);
              }
              &:hover {padding-bottom: 10px;
              }
             } 
          
          .tabContent {
            border: 1px solid #eee;
            padding:10px;
            margin-top: -1px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-19
            • 2012-03-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多