¿Puede CSS3 box-shadow: inset hacer solo uno o dos lados? como el borde superior?


80

Me pregunto sobre el soporte para sombras internas específicas de los lados en css3.

Sé que esto funciona muy bien en navegadores compatibles.

div { box-shadow:inset 0px 1px 5px black; }

Solo tengo curiosidad por saber si hay una manera de lograr algo como:

div { box-shadow-top:inset 0px 1px 5px black; }

Posible duplicado de Cómo obtener una sombra de cuadro solo en los lados izquierdo y derecho , que tiene respuestas y explicaciones más detalladas.
brichins

Respuestas:


147

Esto es lo que funcionó para mí:

box-shadow: inset 1px 4px 9px -6px;

Ejemplo: http://jsfiddle.net/23Egu/


9
La solución más elegante hasta ahora.
enyo

¡Increíble! Siempre he luchado con esto, pero esta única línea trae el borde lateral más sexy de todos los tiempos. ¡Gracias hombre!
Sliq

12
Vale la pena señalar que puede cambiar eso a box-shadow: inset 1px -4px 9px -6px;una sombra inferior.
Justin Russell

7
Sombra del lado izquierdo: Sombra del lado box-shadow: inset 4px 1px 9px -6px; derecho:box-shadow: inset -4px 1px 9px -6px;
bryanbraun

hmm, entonces todo lo que estamos haciendo es usar un valor de propagación grande y luego negarlo usando un desenfoque negativo. Inteligente
Samiullah Khan

11

No creo que realmente lo necesite box-shadow-topporque si establece offsetxen 0 y offsetyen cualquier valor positivo, solo la sombra restante está en la parte superior.

Si desea tener una sombra en la parte superior y una sombra en la parte inferior, simplemente puede usar dos divs:

<div style="box-shadow:inset 0 1px 5px black;">
  <div style="box-shadow:inset 0 -1px 5px black;">
    some content
  </div>
</div>

si desea deshacerse de la sombra en los lados, use en rgbalugar de hexcolor y configure más grande offsety:

box-shadow:inset 0 5px 5px rgba(0,0,0,.5) 

De esta manera, le da a la sombra más opacidad para que los lados permanezcan ocultos y con más compensación obtenga menos opacidad

ejemplo completo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style type="text/css">
            body {
                background: #1C1C1C;
            }
            div {
                margin: 50px auto;
                width: 200px;
                height: 200px;
                background: #fff;
                -webkit-border-radius: 20px;
                -khtml-border-radiust: 20px;
                -moz-border-radius: 20px;
                -o-border-radius: 20px;
                border-radius: 20px;
                box-shadow:inset 0px 5px 5px rgba(0,0,0,.5); 
            }
            div > div {
                background:none;
                box-shadow:inset 0px -5px 5px rgba(0,0,0,.5); 
            }
        </style>
    </head>
    <body>
        <div><div></div></div>
    </body>
</html>

Y la sombra estará más extendida de lo que quisieras. Y los lados también se han movido. Definitivamente es un resultado diferente al box-shadow-topque daría. editar Pero así es como yo también lo hago normalmente =)
Rudie

@Rudie, si desea deshacerse de la sombra en los lados, use en rgbalugar de hexcolor y establezca más grande offsety: box-shadow: 0 5px 5px rgba (0,0,0, .5) de esta manera le da a la sombra más opacidad para que los lados permanezcan ocultos y con más compensación se obtiene menos opacidad
seler

3
Para su información, en lugar de tener dos div anidados para lograr sombras superior e inferior al mismo tiempo, puede hacerlo con un div usando esto:box-shadow:inset 0 1px 5px black, inset 0 -1px 5px black;
Jake Wilson

10

usando :beforey afterelementos con sombras regulares cortadas overflow:hiddenen el cuadro principal como en este ejemplo: http://dabblet.com/gist/2585782

CSS

/**
 * Top and Bottom inset shadow
 */


#element{
  background-color: #E3F2F7;
  height: 55px;
  position: relative; /* to position pseudo absolute*/
  overflow: hidden; /* to cut of overflow shadow*/
  margin-top: 200px;    
}

#element:before , #element:after{
  content: "\0020";
  display: block;
  position: absolute;
  width: 100%;
  height: 1px; /* when 0 no shadow is displayed*/
  box-shadow: #696c5c 0 0 8px 0;
}

#element:before { top: -1px} /* because of height: 1*/
#element:after { bottom: -1px}  /* because of height: 1*/

HTML

<div id="element"></div>

Esta es la técnica que funcionó para mí. En mi caso, #element era desplazable, así que tuve que cambiar de posición a sticky para que funcionara.
Mihai Răducanu

5

Puede utilizar un degradado de fondo para solucionarlo en la mayoría de los casos:

Ejemplo de SCSS (con brújula):

@include background(linear-gradient(top, #666 1%, #999 3%, #ddd 6%, #f6f6f6 9%, #f6f6f6 92%, #ddd 94%, #999 97%, #666 99%) );

1
A veces necesitamos dar un paso atrás y pensar en lo que estamos tratando de lograr. Y esto es a menudo lo que buscamos con una sombra de caja interior de un solo lado. Brillante. ¡Votaría dos veces si pudiera!
random_user_name

Cuando vi este comentario por primera vez, pensé que parecía demasiado complicado para funcionar, pero funcionó perfectamente. ¡¡Gracias!!
Alex

4
box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);
-moz-box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);
-webkit-box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);
-o-box-shadow: inset 5px 0 5px -5px rgba(0,0,0,0.5),inset -5px 0 5px -5px rgba(0,0,0,0.5);

Esto funciona de maravilla :)

Aquí hay un codepen que lo ilustra: http://codepen.io/poopsplat/pen/cGBLy


3

Para la misma sombra pero solo en la parte superior:

box-shadow: inset 0px 6px 5px -5px black;

Para tener la sombra en una dirección, debe negar el parámetro "difuminar" con el parámetro "extender" y luego ajustar los parámetros "h-pos" y / o "v-pos" con este mismo valor. No funciona con borde opuesto o borde triple. Tienes que agregar una definición más.

Más ejemplos aquí: http://codepen.io/GBMan/pen/rVXgqP



1

Yo solo tuve este problema. La solución que encontré fue con varias sombras de caja (una para cada lado en el que quieres tu sombra). Aquí está la definición:

box-shadow: none|h-offset v-offset blur spread color |inset|initial|inherit;

Así es como pensarlo:

  • primero, haga que la propagación sea 0 (esto deshabilitará el efecto en todos los lados)
  • el h-offset (si lo establece en positivo, se proyectará en el lado izquierdo, si lo establece en negativo, en el lado derecho)
  • el v-offset (si lo establece en positivo, se proyectará en el lado superior, si lo establece en negativo, en el lado inferior

Aquí puede ver mi estuche con sombra de caja en tres lados (izquierdo, superior, derecho y el inferior es del mismo color que el fondo para crear el efecto que quería: el lado izquierdo y el derecho van hasta el fondo ) https://codepen.io/cponofrei/pen/eMMyQX


0

Puede lograr una sombra interna de un solo lado configurando su div overflow:hiddeny agregando elementos de sombra a lo largo de los bordes.

Establezca una sombra interior en los bordes superior e inferior de una división:

HTML

<div id="innerShadow">
    <div id="innerShadowTop">
        Content...
    <div id="innerShadowBottom">
</div>

CSS

#innerShadow
{
    position: relative;
    overflow: hidden;
}

#innerShadowTop
{
    width: 100%;
    height: 1px;
    margin: 0;
    padding: 0;
    position: absolute;
    top: -1px;
    -moz-box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
    -webkit-box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
    -o-box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
    box-shadow: 0px 1px 6px 1px rgba(0, 0, 0, 0.65);
}

#bannerShadowBottom
{
    width: 100%;
    height: 1px;
    margin: 0;
    padding: 0;
    position: absolute;
    bottom: -1px;
    -moz-box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
    -webkit-box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
    -o-box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
    box-shadow: 0px -1px 6px 1px rgba(0, 0, 0, 0.65);
}

Muchos dirían que agregar un marcado adicional como este no es semántico y es una mala práctica. Esto podría lograrse usando insety siendo creativo usando los valores de box-shadow css. Recuerde que puede apilar sombras de caja en el mismo elemento. Entonces, uno podría usar algo como @Jakobud dijo en un comentario anterior: box-shadow:inset 0 1px 5px black, inset 0 -1px 5px black; Otra forma, que es solo un poco menos ofensiva que agregar marcas innecesarias, es usar :beforey :afterselectores. Pero, ¿por qué hacerlo si puede hacerlo seleccionando directamente y aplicando estilo al elemento original?
ORyan

0

box-shadowes para los cuatro lados. No puedes cambiar eso (¿todavía?). Los 4 tamaños en la box-shadowdefinición son OffsetX, offsetY, Blury Spread.


1
Difundir y Desenfocar no son lo mismo. Hay valores separados para cada uno. Así que técnicamente no son 6. Inset/Outset, OffsetX, OffsetY, BlurRadius, SpreadRadiusy Color. Como han señalado otros, puede especificar un lado como estebox-shadow: inset 0 8px 6px -6px black;
ORyan

1
Cierto. Cambié la respuesta para reflejar los 4 tamaños .
Rudie

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.