Comment créer une boîte-ombre encastrée d'un seul côté?

109

Est-il possible de n'avoir en quelque sorte qu'une ombre de boîte en médaillon d'un côté d'un div? Notez que je parle ici d'une boîte-ombre en médaillon , pas de la boîte-ombre extérieure normale.

Par exemple, dans le JSFiddle suivant, vous verrez que l'ombre incrustée apparaît sur les 4 côtés, à des degrés divers.

Comment puis-je l'afficher UNIQUEMENT en haut? Ou au plus UNIQUEMENT en haut et en bas?

JSFiddle: http://jsfiddle.net/ahmadka/KFrun/

.box {
  -webkit-box-shadow: inset 0px 5px 10px 1px #000000;
  box-shadow: inset 0px 5px 10px 1px #000000;
}

.text {
  padding: 20px;
}
<div class="box">
  <div class="text">
    Lorem ipsum ....
  </div>
</div>

Ahmad
la source
3
Un autre moyen (et entièrement personnalisable) serait un dégradé de fond ...
vals

Réponses:

237

C'est ce que vous recherchez. Il a des exemples pour chaque côté que vous voulez avec une ombre.

.top-box
{
    box-shadow: inset 0 7px 9px -7px rgba(0,0,0,0.4);
}
.left-box
{
    box-shadow: inset 7px 0 9px -7px rgba(0,0,0,0.4);
}
.right-box
{
    box-shadow: inset -7px 0 9px -7px rgba(0,0,0,0.4);
}
.bottom-box
{
    box-shadow: inset 0 -7px 9px -7px rgba(0,0,0,0.4);
}

Voir l'extrait pour plus d'exemples:

Gordon Tucker
la source
13

L'astuce est un deuxième .box-innerintérieur, qui est plus large que l'original .box, et le box-shadowest appliqué à cela.

Ensuite, ajoutez plus de rembourrage pour .textcompenser la largeur ajoutée.

Voici à quoi ressemble la logique:

logique de la boîte

Et voici comment cela se fait en CSS:

Utilisez la largeur maximale pour .inner-boxne pas .boxélargir et overflowpour vous assurer que le reste est coupé:

.box {
    max-width: 100% !important;
    overflow: hidden;
}

110% est plus large que le parent qui est 100% dans le contexte d'un enfant (devrait être le même lorsque le parent .boxa une largeur fixe, par exemple). Les marges négatives compensent la largeur et provoquent le centrage de l'élément (au lieu de masquer uniquement la partie droite):

.box-inner {
    width: 110%;
    margin-left:-5%;
    margin-right: -5%;
    -webkit-box-shadow: inset 0px 5px 10px 1px #000000;
    box-shadow: inset 0px 5px 10px 1px #000000;
}

Et ajoutez un peu de remplissage sur l'axe X pour compenser le plus large .inner-box:

.text {
    padding: 20px 40px;
}

Voici un violon qui fonctionne.

Si vous inspectez le violon, vous verrez:

.boîte .box-intérieur .texte

casraf
la source
Comment pouvez-vous simplement publier le lien pour violer sans le code? : O
Mohammad Areeb Siddiqui
Homme! C'est un truc tellement! Cool: P
Mohammad Areeb Siddiqui
Dans mon Firefox, je ne vois pas le texte sur les bordures droite et gauche. Le texte est simplement coupé. (Voici la capture d'écran goo.gl/aO8ZX ) J'ai essayé moi-même et utilisé un peu plus divpour cacher l'ombre ... jsfiddle.net/KFrun/19
Fabian
Oui, j'utilise jsfiddle.net/KFrun/6/ Est-ce probablement un problème de version de Firefox? J'utilise Firefox 21.0 pour Ubuntu ...
Fabian
Mais il y a encore une ombre en dessous
Cody Guldner
8

Un peu tard, mais une réponse en double qui ne nécessite pas de modifier le remplissage ou d'ajouter des div supplémentaires peut être trouvée ici: Vous avez un problème avec le fond de l'encart box-shadow uniquement . Il dit: "Utilisez une valeur négative pour la quatrième longueur qui définit la distance de propagation. Ceci est souvent négligé, mais pris en charge par tous les principaux navigateurs"

Du violon du répondeur :

box-shadow: inset 0 -10px 10px -10px #000000;
drkario
la source
7

Cela vient un peu près.

.box
{
    -webkit-box-shadow: inset -1px 10px 5px -3px #000000;
    box-shadow: inset -1px 10px 5px -3px #000000;
}
Mohkhan
la source
C'est ce que j'ai essayé! Mais il ne voulait pas cela, donc ne l'a pas posté comme réponse! :(
Mohammad Areeb Siddiqui
Gros comme. Merci ❤️
mghhgm
Il peut y avoir une réponse plus simple que celle-ci (du moins pour le moment). Merci
Gendrith
1

essayez-le, peut-être utile ...

box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 3px #cbc9c9;
                    -webkit-box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 5px #cbc9c9;
                    -o-box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 5px #cbc9c9;
                    -moz-box-shadow: 0 0 0 3px rgb(255,255,255), 0 7px 5px #cbc9c9;  

ci-dessus CSScar vous avez une ombre de boîte en bas.
vous pouvez en rouge plus ici

Hamid Talebi
la source
1

Ce n'est peut-être pas exactement ce que vous recherchez, mais vous pouvez créer un effet très similaire en utilisant rgbaen combinaison avec linear-gradient:

  background: linear-gradient(rgba(0,0,0,.5) 0%, rgba(0,0,0,0) 30%);

Cela crée un dégradé linéaire du noir avec une opacité de 50% ( rgba(0,0,0,.5)) à transparent ( rgba(0,0,0,0)) qui commence à être parfaitement transparent à 30% du haut. Vous pouvez jouer avec ces valeurs pour créer l'effet souhaité. Vous pouvez l'avoir d'un côté différent en ajoutant une valeur deg ( linear-gradient(90deg, rgba(0,0,0,.5) 0%, rgba(0,0,0,0) 30%)) ou en changeant les couleurs. Si vous voulez des ombres vraiment complexes comme des angles différents sur différents côtés, vous pouvez même commencer à superposer linear-gradient.

Voici un extrait de code pour le voir en action:

.box {
  background: linear-gradient(rgba(0,0,0,.5) 0%, rgba(0,0,0,0) 30%);
}

.text {
  padding: 20px;
}
<div class="box">
  <div class="text">
    Lorem ipsum ....
  </div>
</div>

leonheess
la source
0

Inset Box Shadow uniquement sur la face supérieure?

#box {
            background: #CCC;
            -webkit-box-shadow: inset 0 20px 20px -20px rgba(0,0,0,0.8);
            -moz-box-shadow: inset 0 20px 20px -20px rgba(0,0,0,0.8);
            box-shadow: inset 0 20px 20px -20px rgba(0,0,0,0.8);
            font: bold 18px/1.2em sans-serif;
            height: auto;
            margin: 15px auto;
            padding: 75px 15px 25px;
            text-align: center;
            width: 80%;
        }
Piyush
la source