1つを除くすべての面にCSS3ボックスシャドウを作成する


115

開いているタブに他のタブと区別するための影を付けたいタブ付きナビゲーションバーがあります。また、タブセクション全体に単一の影(下の水平線を参照)が表示され、開いているタブを除くすべてのタブの下部が陰になるようにしたいと思います。

CSS3のbox-shadowプロパティを使用してこれを行いますが、必要な部分だけをシェーディングする方法を理解できません。

通常、開いているタブの下部の影をコンテンツ領域(高いz-index)で覆いますが、この場合、コンテンツ領域自体に影があり、タブを覆い隠すだけです。

タブのレイアウト

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

シャドーライン。

影は水平線から上がり、垂直線の外側になります。

                _______
               | |
_______________ | | _________________

これがライブの例です:

天才、助けはありますか?


23
@the_drow Re:CSS3、ドロップシャドウ、丸みを帯びた角などのデザイン機能は、最新のブラウザーを使用するユーザーにとっての報酬と考えています。
bloudermilk 2009

3
WOWこれはまさに私が必要とするものでした。質問が既に存在していてうれしいです。私もこれをあなたが示したとおりのタブに適用したいと思います。すごいすごいすごい:D
ホルヘイスラエル

この問題を解決するもう1つの素晴らしい方法は、疑似要素を使用することです。詳細については、私の回答を参照してください。
シルバーリングビー2016

疑似要素ソリューションの詳細については、こちらをご覧ください:stackoverflow.com/a/38372215/4769218
Silver Ringvee

これは古い質問ですが、タブのサイズはわかっていますか?それとも柔軟ですか?高さが設定されていても、幅が設定されていないことは想像できますか?
ルーク

回答:


72

サンプルでは、​​このスタイルで#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 */
}

このソリューションには欠けているものがあります。彼のコードを編集し、推奨されるスタイルを適用しても、「選択された」タブの上に影が残ります。オーバーフローがあるように見えます:隠れた行方不明ですか?
Bob Spryn

1
うん。あなたはオーバーフローを必要とするでしょう:それを機能させるためにナビに隠されています。
Bob Spryn

1
に表示されている「ラインシャドウ」#content_over_shadowは、実際には#contentのスタイルである必要があります。
AppleGrew

まあ、この解決策は2009年には正しかったが、今は正しくない。正解はstackoverflow.com/a/9800481/835753
ギルヘルムフェレイラ

疑似要素を使用したソリューション:stackoverflow.com/a/38372215/4769218
Silver Ringvee

25

オーバーフローで遮断します。

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>


3
これもオーバーフローstarikovs.com/2011/11/09/css3-one-side-shadowで切り取った例です
starikovs

この方法は、シャドウをオンにしたくない底面である場合にのみ機能します。
andrhamm

よく働く!親divは正しい場所に配置できますz-index
Rvanlaak 2013年

私は現在このソリューションを使用していますが、オーバーフローする必要のある子要素で(facebookのようなボタンとして)問題が発生しています。
Loenix 2013年

1
要素の高さを設定する必要があるため、ほとんどのレスポンシブデザインではあまり役に立ちません
ジョナサントンジ2013年

13

他の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>

全体的には非常に邪魔にならない。


1
これは素晴らしい解決策ですが、あなたが言うように、コーナーは不安定です。jsfiddle.net/mahemoff/ZStTr
mahemoff

1
角が丸い私のはめ込みシャドウニーズの魅力のように働きました。ありがとう!
Bruno Ely

9

この問題を解決するもう1つのかなりクリエイティブな方法は、:afterまたは:before疑似要素を要素の1つに追加することです。私の場合は次のようになります:

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

スクリーンショットを見て、疑似要素をより見やすくするために赤にしました。

スクリーンショットを見て、疑似要素をより見やすくするために赤にしました。


7

個人的に私はここで最もよく見られるソリューションが好きです:http : //css3pie.com/demos/tabs/

オーバーレイする下のコンテンツからの影がまだ残っている背景色を使用して、ゼロ状態またはホバー状態にすることができます。上記の方法でそれが可能かどうかはわかりません:

ホバー状態のある影付きタブ

更新:

実は私は間違っていました。承認済みのソリューションが上記のホバー状態をサポートするようにすることができます。これを行う:

aに正の相対関係を持たせる代わりに、下の#content div(影が付いている)よりも高いが、上のz-indexよりも低いz-indexを持つa.activeクラスに配置します。 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 */

7

更新:

clip-path 現在、すべての主要ブラウザでサポートされています。


元の回答:

部分的にしかサポートされていない実験的テクノロジを使用する場合は、この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のサイズは柔軟にすることができます。


残念ながら、2つの影が重なるギャップがあります。
sbaechler

@sbaechlerは詳しく説明できますか?影はどこで重なりますか?
ルーク

4

複数のボックスシャドウを使用してシャドウを隠すこともできます。

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


1

フックする2つのスパンを追加した場合、次のような2つのスパンを使用できます。

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

1つのスパンで

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

別の上。うまくいくかもしれません!

影が重なっている場合は、3つの影を使用することもできます。1つは左に、1つは右に、もう1つは上に、または必要に応じて厚くします。


0

私は一種のハックをしましたが、完璧ではありませんが、大丈夫そうです

<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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.