516 votes

Ombre de la boîte sur un seul côté

J'ai souvent besoin de créer l'ombre d'un élément de bloc mais seulement (par exemple) sur son côté droit. La façon dont je le fais est d'envelopper l'élément intérieur de box-shadow dans un autre avec padding-right et overflow:hidden; donc les 3 autres côtés de l'ombre ne sont pas visibles.

Y a-t-il un meilleur moyen d'y parvenir ? Comme box-shadow-right ?

EDIT : Mes intentions sont de créer uniquement la partie verticale de l'ombre. Exactement la même chose que ce qui repeat-y de la règle background:url(shadow.png) 100% 0% repeat-y faire.

4 votes

Compte tenu des outils limités de css en termes de box-shadows, je pense que votre approche est déjà très bonne. Elle n'est pas trop encombrante et a un impact relativement faible en termes de sémantique : une seule div sans signification.

0 votes

Voici une belle ombre latérale en css : stackoverflow.com/a/20596554/1491212

1 votes

C'est sans conteste la meilleure réponse ! \o / stackoverflow.com/a/62366856/358532 Merci !

638voto

Kyle Sevenoaks Points 29929

Oui, vous pouvez utiliser la propriété "shadow spread" de la règle "box-shadow" :

.myDiv
{
    border: 1px solid #333;
    width: 100px;
    height: 100px;
    -webkit-box-shadow: 10px 0 5px -2px #888;
            box-shadow: 10px 0 5px -2px #888;
}

La quatrième propriété -2px est l'étalement de l'ombre, vous pouvez l'utiliser pour modifier l'étalement de l'ombre, en donnant l'impression que l'ombre est d'un seul côté.

Cela utilise également les règles de positionnement de l'ombre 10px l'envoie vers la droite (décalage horizontal) et 0px le maintient sous l'élément (décalage vertical).

5px est le rayon du flou :)

Exemple pour vous ici .

14 votes

Merci de m'avoir signalé quelque chose que je ne savais pas, mais mes intentions étaient de créer uniquement la partie verticale de l'ombre. C'est exactement ce que ferait background:url(shadow.png) 100% 0% repeat-y.

0 votes

Aha ok, c'est le plus proche que je puisse obtenir en utilisant du CSS pur. Je vais cependant laisser ce message ici pour informer les autres utilisateurs sur la propagation des ombres :)

4 votes

@Tillda vous devriez marquer cette réponse pour qu'elle apparaisse en haut pour les autres qui cherchent une solution. J'ai failli rejeter cette méthode de stylisme en lisant les commentaires et la réponse acceptée.

37voto

Puyol Points 1031

Ma solution personnelle qui est facile à modifier :

HTML :

<div id="anti-shadow-div">
    <div id="shadow-div"></div>
</div>​

css :

#shadow-div{
    margin-right:20px; /* Set to 0 if you don't want shadow at the right side */
    margin-left:0px; /* Set to 20px if you want shadow at the left side */
    margin-top:0px; /* Set to 20px if you want shadow at the top side */
    margin-bottom:0px; /* Set to 20px if you want shadow at the bottom side */
    box-shadow: 0px 0px 20px black; 
    height:100px;
    width:100px;
    background: red;
}

#anti-shadow-div{
    margin:20px;
    display:table;
    overflow:hidden;
}​

Démonstration :
http://jsfiddle.net/jDyQt/103

1 votes

Il semble que ce soit la solution la plus simple - c'est juste le conteneur div qui me rend malheureux ;)

1 votes

C'est la seule vraie solution. La réponse acceptée a toujours le flou en haut et en bas de l'ombre, mais à des positions différentes.

0 votes

Cela n'a pas fonctionné pour moi dans Microsoft Edge ou Internet Explorer 11. Il y avait encore un peu d'ombre sur les autres côtés, selon le niveau de zoom. Les autres navigateurs fonctionnent bien.

28voto

Jacek Kuzemczak Points 13

Pour obtenir l'effet de coupure sur deux côtés au maximum, vous pouvez utiliser des pseudo-éléments avec des dégradés d'arrière-plan.

header::before, main::before, footer::before, header::after, main::after, footer::after {
    display:    block;
    content:    '';
    position:   absolute;
    width:      8px;
    height:     100%;
    top:        0px;
}

header::before, main::before, footer::before {
    left:       -8px;
    background: linear-gradient(to left, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}

header::after, main::after, footer::after {
    right:      -8px;
    background: linear-gradient(to right, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}

ajoutera un bel effet d'ombre à gauche et à droite des éléments qui composent normalement un document.

0 votes

Est une solution parfaite, car elle ajoute un effet d'ombre à un seul côté d'un élément sans encombrer le balisage.

1 votes

Par rapport à la méthode de l'écart négatif, cette méthode présente l'avantage de ne pas rétrécir dans les coins.

4 votes

@BananaAcid J'ai créé une démo pour ceux qui en ont besoin : jsfiddle.net/jDyQt/1198

16voto

meo Points 10534

C'est difficile avec box-shadow mais ce que vous pouvez faire, c'est utiliser border-image et y mettre un gradient CSS3.

fonctionne dans webkit : http://jsfiddle.net/Hs3qU/1/ Je ne peux pas le dire pour l'autre navigateur...

4voto

Hello Points 368

Voici une petite astuce que j'ai faite.

<div id="element"><!--element that I want an one-sided inset shadow from the bottom--></div> 
<div class="one_side_shadow"></div>
  1. Créer un <div class="one_side_shadow"></div> juste en dessous de l'élément pour lequel je veux créer l'ombre d'un côté de la boîte (dans ce cas, je veux une ombre d'un côté de la boîte pour l'élément en question). id="element" venant du bas)

  2. Ensuite, j'ai créé une ombre en boîte régulière en utilisant un décalage vertical négatif pour pousser l'ombre vers le haut sur un côté.

    box-shadow : 0 -8px 20px 2px #DEDEE3 ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X