Comment obtenir l'ombre de la boîte sur les côtés gauche et droit uniquement


222

N'importe quel moyen d'obtenir une zone d'ombre sur les côtés gauche et droit (horizontal?) Uniquement sans piratage ni images. J'utilise:

box-shadow: 0 0 15px 5px rgba(31, 73, 125, 0.8);

Mais ça donne de l'ombre tout autour.

Je n'ai pas de frontières autour des éléments.

Réponses:


262

REMARQUE: je suggère de vérifier la réponse de @ Hamish ci-dessous; il n'implique pas le "masquage" imparfait dans la solution décrite ici.


Vous pouvez vous approcher avec plusieurs ombres en boîte; un pour chaque côté

box-shadow: 12px 0 15px -4px rgba(31, 73, 125, 0.8), -12px 0 8px -4px rgba(31, 73, 125, 0.8);

http://jsfiddle.net/YJDdp/

Éditer

Ajoutez 2 ombres de boîte supplémentaires pour le haut et le bas à l'avant pour masquer ce qui saigne.

box-shadow: 0 9px 0px 0px white, 0 -9px 0px 0px white, 12px 0 15px -4px rgba(31, 73, 125, 0.8), -12px 0 15px -4px rgba(31, 73, 125, 0.8);

http://jsfiddle.net/LE6Lz/


1
D'accord. Merci. Il y a aussi un peu d'ombre en haut et en bas peut-être à cause du flou / rayon mais je suppose que je dois vivre avec.
Jawad

5
-1: l'ombre n'atteint pas les coins, ils se terminent quelques pixels auparavant.
Francisco Corrales Morales

4
Je ne peux pas croire que cette solution soit si bien cotée. Il développe l'objet vers le haut et le bas (en appliquant une ombre solide), il n'est donc utile que lorsque la div est sur un fond uniforme et peut avoir un espace au-dessus et en dessous. Très limité et lié à la solution de contexte en effet. La solution de Hamish est bien supérieure et plus simple.
Ejaz

Il y a une meilleure solution (2020). Regardez la réponse de Luke ci-dessous: stackoverflow.com/a/62367058/760777
RWC

171

Je n'étais pas satisfait du haut et du bas arrondis de l'ombre présente dans la solution de Deefour alors j'ai créé la mienne.

inset box-shadow crée une belle ombre uniforme avec le haut et le bas coupés.

Pour utiliser cet effet sur les côtés de votre élément, créez deux pseudo-éléments :beforeet :afterpositionnés absolument sur les côtés de l'élément d'origine.

div:before, div:after {
  content: " ";
  height: 100%;
  position: absolute;
  top: 0;
  width: 15px;
}
div:before {
  box-shadow: -15px 0 15px -15px inset;
  left: -15px;
}
div:after {
  box-shadow: 15px 0 15px -15px inset;
  right: -15px;
}

div {
  background: #EEEEEE;
  height: 100px;
  margin: 0 50px;
  width: 100px;
  position: relative;
}
<div></div>


Éditer

Selon votre conception, vous pourrez peut-être utiliser clip-path, comme indiqué dans la réponse de @ Luke. Cependant, notez que dans de nombreux cas, cela entraîne toujours la réduction de l'ombre en haut et en bas, comme vous pouvez le voir dans cet exemple:

div {
  width: 100px;
  height: 100px;
  background: #EEE;
  box-shadow: 0 0 15px 0px #000;
  clip-path: inset(0px -15px 0px -15px);
  position: relative;
  margin: 0 50px;
}
<div></div>


9
Très intelligent. Notez également vos :afterbesoins top: 0.
Sprintstar

1
J'ai dû ajouter display: inline-blockdes pseudo-classes pour que votre exemple fonctionne. Dans l'ensemble: belle solution. +1
Morpheus

7
Je pense que cela devrait vraiment être la bonne réponse, car la solution fournie entraîne vraiment une "zone d'ombre sur les côtés gauche et droit uniquement". La réponse marquée comme correcte entraîne toujours des ombres au-dessus et en dessous.
Luke

2
Je pense que cela aurait dû être la réponse acceptée. Parce que celui de @Deefour fonctionne bien qui laisse les coins supérieurs et inférieurs des côtés vides. D'un autre côté, cette solution particulière est tout simplement parfaite.
Rishabh Shah

1
@Hamish Ouais, c'est ce que j'ai fait pour l'instant :-) Dommage, une caractéristique intéressante de cette approche est qu'elle (généralement) ne notnécessite aucun élément d'aide <div>. :-)
Frerich Raabe


26

Approche classique: spread négatif

CSS box-shadow utilise 4 paramètres: h-shadow, v-shadow, blur, spread:

box-shadow: 10px 0 8px -8px black;

L' ombre en V ( ombre verticale) est définie sur 0.

Le paramètre flou ajoute l'effet de dégradé, mais ajoute également une petite ombre sur les bordures verticales (celle dont nous voulons nous débarrasser).

La propagation négative réduit l'ombre sur toutes les bordures: vous pouvez jouer avec elle en essayant de supprimer cette petite ombre verticale sans trop affecter celle des côtés (c'est plus facile pour les petites ombres, 5 à 10 pixels).

Voici un exemple de violon .


Deuxième approche: div absolu sur le côté

Ajoutez un div vide dans votre élément et stylisez-le avec un positionnement absolu afin qu'il n'affecte pas le contenu de l'élément.

Voici le violon avec un exemple d'ombre gauche.

<div id="container">
  <div class="shadow"></div>
</div>

.shadow{
    position:absolute;
    height: 100%;
    width: 4px;
    left:0px;
    top:0px;
    box-shadow: -4px 0 3px black;
}

Troisièmement: Masquer l'ombre

Si vous avez un arrière-plan fixe, vous pouvez masquer l'effet d'ombre latérale avec deux ombres de masquage ayant la même couleur d'arrière-plan et flou = 0, par exemple:

box-shadow: 
    0 -6px white,          // Top Masking Shadow
    0 6px white,           // Bottom Masking Shadow
    7px 0 4px -3px black,  // Left-shadow
    -7px 0 4px -3px black; // Right-shadow

J'ai à nouveau ajouté une propagation négative (-3px) à l'ombre noire, afin qu'elle ne s'étende pas au-delà des coins.

Voici le violon .


4

Cela fonctionne bien pour tous les navigateurs:

-webkit-box-shadow: -7px 0px 10px 0px #000, 7px 0px 10px 0px #000;
-moz-box-shadow: -7px 0px 10px 0px #000, 7px 0px 10px 0px #000;
box-shadow: -7px 0px 10px 0px #000, 7px 0px 10px 0px #000;

3
cela ne fonctionne même pas un peu. Peut-être que le format a changé, mais cela dit de déplacer l'ombre de 7 pixels vers la gauche, 0 pixel vers le bas, de rendre les 10 pixels extérieurs flous et d'étendre le flou de 0 pixels. Décomposer: un flou de 17 pixels à gauche, un flou de 10 pixels en haut et en bas et un flou de 3 pixels à droite. C'est ce que j'obtiens.
john ktejik

4

DEMO

Vous devez utiliser le multiple box-shadow;. La propriété en médaillon donne une belle apparence à l'intérieur

div {
    box-shadow: inset 0 12px  15px -4px rgba(31, 73, 125, 0.8), inset 0 -12px  8px -4px rgba(31, 73, 125, 0.8);
    width: 100px;
    height: 100px;
    margin: 50px;
    background: white;
}

4

Une autre façon est de: overflow-y:hiddensur le parent avec un rembourrage.

#wrap {
    overflow-y: hidden;
    padding: 0 10px;
}
#wrap > div {
    width: 100px;
    height: 100px;
    box-shadow: 0 0 20px -5px red;
}

http://jsfiddle.net/qqx221c8/


2

clip-pathest maintenant (2020) le meilleur moyen que j'ai trouvé pour obtenir des ombres sur des côtés spécifiques d'éléments, en particulier lorsque l'effet requis est une ombre "nette" sur des bords particuliers , comme ceci:

.shadow-element {
    width: 100px;
    height: 100px;
    background-color: #FFC300;
    box-shadow: 0 0 10px 5px rgba(0,0,0,0.75);
    clip-path: inset(0px -15px 0px -15px);

    /* position and left properties required to bring element out from edge of parent
    so that shadow can be seen; margin-left would also achieve the same thing */
    position: relative;
    left: 15px;
}
<div class="shadow-element"></div>

... par opposition à une ombre atténuée / réduite / éclaircie comme celle-ci:

.shadow-element {
    width: 100px;
    height: 100px;
    background-color: #FFC300;
    box-shadow: 15px 0 15px -10px rgba(0,0,0,0.75), -15px 0 15px -10px rgba(0,0,0,0.75);

    /* position and left properties required to bring element out from edge of parent
    so that shadow can be seen; margin-left would also achieve the same thing */
    position: relative;
    left: 15px;
}
<div class="shadow-element"></div>


Appliquez simplement le CSS suivant à l'élément en question:

box-shadow: 0 0 Xpx Ypx [hex/rgba]; /* note 0 offset values */
clip-path: inset(Apx Bpx Cpx Dpx);

Où:

  • Apx définit la visibilité des ombres pour le bord supérieur
  • Bpx droite
  • Cpx bas
  • Dpx la gauche

Entrez une valeur de 0 pour toutes les arêtes où l'ombre doit être masquée et une valeur négative (identique au résultat combiné du rayon de flou + valeurs d'étalement - Xpx + Ypx) pour toutes les arêtes où l'ombre doit être affichée.


1
C'est la meilleure réponse. C'est encore plus simple. Vous pouvez simplement appliquer l'ombre directement à votre image. Fonctionne comme un charme. Exemple: img.shadowed {box-shadow: 0 0 15px rgba (0,0,0,0,75); clip-path: encart (0px -15px 0px -15px); }
RWC

Même dans votre exemple, vous pouvez voir les coins supérieurs et inférieurs de l'ombre se courber. Néanmoins, cela peut être bon pour certains cas d'utilisation.
Hamish

@Hamish, regardez-vous l' clip-pathexemple? Il existe 2 extraits de code. Le premier utilise clip-pathet a une coupure complètement propre sans "coins supérieurs et inférieurs incurvés" - tout comme votre solution (mais avec beaucoup moins de CSS requis). Le deuxième extrait de code est un exemple simplement pour la comparaison - de nombreuses solutions entraînent une ombre de boîte dispersante qui n'est souvent pas ce que les gens veulent réaliser.
Luke

Si vous voulez une ombre plus forte, vous pouvez simplement modifier la box-shadowpropriété en quelque chose comme 0 0 10px 5px rgba(0,0,0,0.75);. Notez la spreadvaleur ajoutée et réduite blur-radius.
Luke

@Hamish J'ai mis à jour mon premier extrait à démontrer.
Luke

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

Ça marche de mon côté. J'espère que cela vous aide.


0

JOLIE OMBRE INSERT SUR LES CÔTÉS GAUCHE ET DROITE POUR DIVS, IMAGES OU CONTENU INTÉRIEUR

Pour une belle ombre incrustée sur les côtés droit et gauche des images ou de tout autre contenu, utilisez-le de cette façon

*** L'index z: -1 fait une bonne astuce lors de l'affichage d'images ou d'objets internes avec des encarts

<html>
<div class="shadowcontainer">
<img src="https://www.google.es/images/srpr/logo11w.png" class="innercontent" style="with:100%"/>
</div>

<style>

.shadowcontainer{
display:inline-flex;
box-shadow: inset -40px 0px 30px -30px rgba(0,0,0,0.9),inset 40px 0px 30px -30px rgba(0,0,0,0.9);
}

.innercontent{
z-index:-1
}
</style>
</html>

0

Dans certaines situations, vous pouvez masquer l'ombre par un autre conteneur. Par exemple, s'il y a un DIV au-dessus et en dessous du DIV avec l'ombre, vous pouvez l'utiliser position: relative; z-index: 1;sur les DIV environnants.


0

Pour l'horizontale uniquement, vous pouvez tromper l'ombre de la boîte en utilisant le débordement sur sa div parent:

<div class="parent">
  <div class="box-shadow">content</div>
</div>

.parent{
  overflow:hidden;
}
.box-shadow{
  box-shadow: box-shadow: 0 5px 5px 0 #000;
}

0

Une autre idée pourrait être de créer un pseudo-élément flou foncé avec éventuellement de la transparence pour imiter l'ombre. Faites-le avec un peu moins de hauteur et plus de largeur ig


0

Vous pouvez utiliser 1 div à l'intérieur pour "effacer" l'ombre:

.yourdiv{
    position:relative;
    width:400px;
    height:400px;
    left:10px;
    top:40px;
    background-color:white;
    box-shadow: 0px 0px 1px 0.5px #5F5F5F;

}
.erase{
    position:absolute;
    width:100%;
    top:50%;
    height:105%;
    transform:translate(0%,-50%);
    background-color:white;
}

Vous pouvez jouer avec "hauteur:%;" et "largeur:%;" pour effacer l'ombre que vous voulez.


0

Pour une raison quelconque, les réponses fournies ici ne fonctionneraient tout simplement pas dans mon cas. Donc, je suis devenu créatif. Voici une nouvelle solution pour vous tous qui utilise linear-gradient()à la place de box-shadow.

p {
  padding: 1rem;
  background-color: #b55;
  color: white;
  background-image: linear-gradient(90deg, rgba(0,0,0,0.5), rgba(0,0,0,0) .5rem, rgba(0,0,0,0), rgba(0,0,0,0.0) calc(100% - .5rem), rgba(0,0,0,0.5));
}
<p>Testing</p>

Bien que je ne cherche pas à argumenter ce point, ce n'est pas vraiment une "boîte" que vous (nous) essayons de former, donc je suppose qu'on pourrait dire que cela box-shadown'avait pas de sens pour commencer.


0

J'ai essayé de copier le bootstrap shadow-sm juste à droite, voici mon code:

.shadow-rs{
    box-shadow: 5px 0 5px -4px rgba(237, 241, 235, 0.8);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.