J'ai une barre de navigation à onglets où je voudrais que l'onglet ouvert ait une ombre pour le distinguer des autres onglets. J'aimerais également que toute la section d'onglets ait une seule ombre (voir la ligne horizontale du bas) qui monte et ombrage le bas de tous les onglets à l'exception de celui qui est ouvert.
Je vais utiliser la propriété box-shadow
de CSS3 pour le faire, mais je ne peux pas trouver un moyen d'ombrer uniquement les parties que je veux.
Normalement, je recouvrais la zone de contenu avec la zone de contenu (z-index
supérieur) dans l'ombre inférieure de l'onglet ouvert, mais dans ce cas, la zone de contenu elle-même avait une ombre qui recouvrait simplement l'onglet.
_______ _______ _______ | | | | | | ____ | _______ | __ | | __ | _______ | ______
L'ombre remonterait à partir des lignes horizontales et à l'extérieur des lignes verticales.
_______ | | _______________ | | _________________
Ici est un exemple vivant:
Toute aide là-bas, les génies?
Dans votre exemple, créez une div dans #content avec ce style
#content_over_shadow {
padding: 1em;
position: relative; /* look at this */
background:#fff; /* a solid background (non transparent) */
}
et changez le style de contenu (enlevez les rembourrages) et ajoutez des ombres
#content {
font-size: 1.8em;
box-shadow: 0 0 8px 2px #888; /* line shadow */
}
ajouter des ombres aux onglets:
#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 */
}
Coupez-le avec trop-plein.
<style type="text/css">
div div {box-shadow:0 0 5px #000; height:20px}
div {overflow:hidden;height:25px; padding:5px 5px 0 5px}
</style>
<div><div>tab</div></div>
Vous pouvez utiliser plusieurs ombres CSS sans autre div pour obtenir l’effet souhaité, avec l’avertissement de l’absence d’ombres dans les coins.
-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;
Globalement, c'est très peu intrusif.
Personnellement, j'aime mieux la solution trouvée ici: http://css3pie.com/demos/tabs/
Il vous permet d’avoir un état zéro ou un état de survol avec une couleur d’arrière-plan qui conserve l’ombre du contenu situé en dessous de la superposition. Pas sûr que ce soit possible avec la méthode ci-dessus:
METTRE À JOUR:
En fait, je me suis trompé. Vous pouvez faire en sorte que la solution acceptée prenne en charge l'état de survol indiqué ci-dessus. Faire ceci:
Au lieu d'avoir le relatif positif sur le a, placez-le sur la classe a.active avec un z-index supérieur à votre div #content ci-dessous (qui a l'ombre dessus) mais inférieur au z-index de votre content_wrapper.
Par exemple:
<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>
puis avec votre 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 */
Une autre façon plutôt créative de résoudre ce problème consiste à ajouter: après ou: avant le pseudo élément à l’un des éléments. Dans mon cas, cela ressemble à ceci:
#magik_megamenu>li:hover>a:after {
height: 5px;
width: 100%;
background: white;
content: '';
position: absolute;
bottom: -3px;
left: 0;
}
Voir la capture d'écran, faites le pseudo-élément rouge pour le rendre plus visible.
vous pouvez également masquer une ombre à l'aide de plusieurs ombres de boîte.
box-shadow: 0 10px 0 #fff, 0 0 10px #ccc;
Si vous avez ajouté deux portées à accrocher, vous pouvez en utiliser deux, par exemple:
box-shadow: -1px -1px 1px #000;
sur une travée et
box-shadow: 1px -1px 1px #000;
sur un autre. Pourrait fonctionner!
Si les ombres se chevauchent, vous pouvez même utiliser 3 ombres - une 1px à gauche, une 1px à droite et une 1px vers le haut ou l’épaisseur souhaitée.
J'ai fait une sorte de bidouille, pas parfait, mais ça a l'air bien:
<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);
}
Si vous souhaitez utiliser une technologie expérimentale avec seulement support partiel , vous pouvez utiliser la propriété clip-path
.
Cela produira l'effet souhaité: une ombre en forme de boîte sur les côtés supérieur, gauche et droit avec une coupure nette sur le bord inférieur.
Dans votre cas, vous utiliseriez clip-path: inset (px px px px); où les valeurs de pixel sont calculées à partir de l’arête en question (voir ci-dessous).
#container {
box-shadow: 0 0 8px 2px #888;
clip-path: inset(-8px -8px 0px -8px);
}
Cela coupera la div en question à:
Notez qu'aucune virgule n'est requise entre les valeurs de pixel.
La taille de la div peut être flexible.