Las reflexiones pueden agregar una dimensión interesante a los objetos, dándoles un toque de realismo y dándoles contexto dentro de su entorno. Echemos un vistazo a lograr reflexiones con CSS y examinaremos el desenfoque brillante y el cross-browser para una buena medida también.
Seguir este tutorial funciona sobre una serie de suposiciones:
sombra de la caja
trabajos. No es la clave de este tutorial, por lo que deberá resolverlo usted mismo. Si necesita una explicación, le sugiero que eche un vistazo a CSS3 frente a Photoshop: esquinas redondeadas y sombras de caja.Box-reflect es una propiedad de CSS que está destinada precisamente para este propósito: hacer reflexiones. No usaremos cuadro-reflejo
y imagen de máscara
, porque:
Cuando Microsoft introdujo sus efectos de filtro (piense en la era de IE 4, tablas anidadas para el diseño e imágenes para reflexiones), los filtros sucios no se aplicaron a la totalidad de ningún elemento dado. Supongo que utilizaron algún tipo de cuadro de límite desde la esquina superior izquierda hasta la esquina inferior derecha del elemento, lo que tenía sentido, porque, según mi conocimiento, no había una forma de exceder esta caja. Sin embargo, nunca lo corrigieron..
Ahora, en la era de Chrome 17, el webkit ha cometido el mismo error. Imágenes de máscara, la clave para -webkit-box-reflect
, haga una especie de instantánea dinámica dentro del cuadro del límite, péguela debajo y cambie su opacidad. Intenté recrear la demo usando -webkit-box-reflect:
No lo he terminado, pero el problema está claro. El ETBR tiene radio del borde
y sombra de la caja
. El cuadro de sombra es visible dentro, pero no fuera del cuadro de límite.
En mi método, las transformaciones matriciales, la inserción de sombra de cuadro y opacidad reemplazarán a cuadro-reflejo y máscara-imagen. Las limitaciones:
Violín | Pantalla completa
El color del texto no se vuelve más oscuro donde el fondo lo hace. Así que parece que no puedes tener un color diferente. y la caja de sombra juntos.
Mientras estamos en el tema de matrices y reflexiones ...
Usted toma la píldora azul: le muestro cómo recrear la demostración palabra por palabra. Toma la píldora roja. Te mostraré cómo hacer reflejos de cualquier cosa y te diré dónde puedes comprar estos tonos reflectantes a un precio muy interesante..
En pocas palabras; algunos de los siguientes pasos son opcionales, dependiendo de si desea recrear el píxel de demostración por píxel.
La demostración comienza con una plantilla HTML5 ...
index.html
Reflexiones CSS3
... y este archivo CSS.
style.css
html altura: 100%; cuerpo text-align: center; línea de altura: 1; margen: 0; relleno: 0; altura: 100%; p line-height: 1.2;
Y, por supuesto, agregaremos un enlace a la hoja de estilo:
Reflexiones CSS!
La demo es 2D. No es un solo elemento 3D. Lo sabemos, pero nuestro objetivo es hacer ellos Creo que construimos esto y luego fotografiamos la vista frontal.
Si queremos que crean que es 3D, debemos determinar cómo se posicionan y giran los objetos en el espacio 3D. La demo tiene un horizonte. El 10% superior es el 'cielo' negro, el otro 90% es un plano 3D falso. El elemento a reflejar (de aquí en adelante en nuestra demostración como ETBR) y el plano es perpendicular entre sí (el ángulo es de 90 °), la reflexión debe ser paralela a la ETBR.
El HTML:
reflexión
El ETBR es un hijo del avión. De esta manera, permanece en la misma posición vista desde el plano y el brillo permanece en el plano..
cuerpo text-align: center; línea de altura: 1; margen: 0; relleno: 0; color de fondo: # 000; altura: 100%; p line-height: 1.2; #plane izquierda: 0; superior: 10%; ancho: 100%; abajo: 0; ancho mínimo: 1080px; min-height: 600px; posición: absoluta; desbordamiento: oculto; overflow-x: visible;
Nota:
Localice el objeto (ETBR), cópielo, péguelo dentro de sí mismo y cambie su nombre a refl (ection):
reflexiónreflexión
Ahora dentro del css crea el selector del objeto. Agregue #refl en el selector para que nuestros estilos se apliquen a ambos elementos:
#ETBR, #refl
Básicamente, el CSS y el HTML de la reflexión deben ser los mismos que el CSS y el HTML del ETBR. Posicionaremos, reflejaremos y simularemos el reflejo del paso 5. Pero, por el momento, ocultaremos el reflejo..
#ETBR, #refl #refl mostrar: ninguno;
Internet Explorer es Internet Explorer, tenemos que agregar algunos HTML condicionales:
Reflexiones CSS3 reflexiónreflexión
Usted podría preguntarse por qué, simplemente desnudo conmigo. Debido a que estás hospitalizado, este primer Fiddle será completamente negro. ¿Quieres ver la influencia del avión? Cambiar el tamaño.
Violín | Pantalla completa
Esto no necesita explicación:
#ETBR, #refl color: # 004; Familia tipográfica: Impact, 'Arial Black', Helvetica, Arial, sans-serif; transformación de texto: mayúsculas; tamaño de fuente: 200px; color de fondo: #FFE; font-weight: negrita; relleno: 30px; pantalla: bloque en línea; #refl mostrar: ninguno;
OK, una pequeña explicación. La combinación de text-align: center;
y pantalla: bloque en línea;
centra un elemento vieja escuela, pero no es el santo grial; los elementos en línea no pueden contener elementos de bloque. Lo usé, porque no quería agregar miles de contenedores flotantes para este ejemplo. En general, sin embargo, este es el camino a seguir..
Violín | Pantalla completa
El brillo consiste en tres sombras: una sombra grande y estirada (que se parece más al reflejo de la luz en el plano), el brillo real (una sombra blanca con un rango de desenfoque más corto) y una sombra negra insertada (lo que hace que ETBR parece que está brillando). Como mencioné antes, no voy a explicar cómo funciona la sombra de caja y el radio de la frontera por sí mismo en estos días..
#ETBR, #refl color: # 004; Familia tipográfica: Impact, 'Arial Black', Helvetica, Arial, sans-serif; transformación de texto: mayúsculas; tamaño de fuente: 200px; color de fondo: #FFE; font-weight: negrita; relleno: 30px; pantalla: bloque en línea; cuadro de sombra: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, recuadro rgba (0,0,0, .8) 0 0 20px; radio del borde: 30px;
Violín | Pantalla completa
Vacíe el selector #refl para hacer visible el reflejo. Como las reflexiones no son "reales", nuestra reflexión no será parte del flujo de documentos; debe flotar La elección obvia es establecer la posición en absoluta, lo que significa que el elemento está posicionado en relación con su primer elemento ancestral posicionado (no estático). Debido a que no hay un primer antecesor posicionado de la reflexión, se posicionará en relación con la etiqueta del cuerpo.
Es mucho más fácil posicionar la reflexión en relación con el texto real, que también es un antecesor de la reflexión (¿coincidencia?). Para hacerlo, primero tenemos que "posicionar" el ETBR:
#ETBR, #refl color: # 004; Familia tipográfica: Impact, 'Arial Black', Helvetica, Arial, sans-serif; transformación de texto: mayúsculas; tamaño de fuente: 200px; color de fondo: #FFE; font-weight: negrita; relleno: 30px; pantalla: bloque en línea; cuadro de sombra: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, recuadro rgba (0,0,0, .8) 0 0 20px; radio del borde: 30px; posición: relativa;
Esto no cambia realmente la posición, pero está posicionado. Ahora:
#refl posición: absoluta; Top 100%; izquierda: 0;
La parte superior de la reflexión es relativa a la altura y posición del ETBR. El 0% les dará la misma punta, el 200% dejará una brecha tan grande como la altura del ETBR y el 100% coloca la parte superior de la reflexión en la parte inferior del ETBR. La izquierda es la misma, pero toma el porcentaje del ancho..
Violín | Pantalla completa
Casi todos los navegadores de uso común tienen estas características, desde IE6 hasta Google Chrome. Sin embargo, la implementación es diferente. Los navegadores modernos son muy sencillos para cada característica de una característica: transformar, difuminar y opacidad. Usaremos box-shadow también, pero reflejando primero.
#refl posición: absoluta; Top 100%; izquierda: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1);
Con la transformación podemos modificar un elemento para cada paralelogramo que puedas imaginar. Muchos paralelogramos, lo sé. Pero solo necesitamos reflejar el reflejo, por lo que dejaremos sin utilizar la mayoría de las funciones de transformación..
Cualquier diseñador debe saber que escalar por -1 en el eje Y es lo mismo que reflejar. La escala en el eje Y está multiplicando la distancia entre la parte superior (y la parte inferior) y el centro. Si escalamos en 2 en el eje Y, la distancia de la parte superior al centro será el doble de grande. Si escala por -1, la distancia será la misma, pero arriba es donde estaba la parte inferior y abajo está la parte superior. Enhorabuena, sabes como reflejar.!
Todos los navegadores modernos admitirán filtros muy pronto, -webkit-filter o SVG. FF, Opera e IE10 ya son compatibles con este último, Safari y Chrome solo están aumentando la tensión antes de liberarla. Uno de los filtros SVG es el buen Desenfoque Gaussiano. Es lento, pero es algo ...
Cree un archivo "filter.svg" en la misma carpeta que style.css. Su contenido:
Formalidades, excepto las reglas 6 a 8. El filtro llamado "desenfoque" (puede llamarlo como se llame) difumina 2 píxeles horizontalmente y 3 píxeles verticalmente. Volver a la hoja de estilo!
#refl posición: absoluta; Top 100%; izquierda: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filter: url (filter.svg # blur); / * FF, IE10 y Opera * / -webkit-filter: blur (2px);
filter.svg # blur
significa el elemento 'blur' en filter.svg. Si la ID del filtro fuera 'algo', la url sería filter.svg # cualquier cosa
. El radio de desenfoque se define en el archivo SVG. Los navegadores Webkit ponen todo esto en una regla.
La transparencia ha existido por mucho tiempo, por lo que solo tenemos que especificar una propiedad:
#refl posición: absoluta; Top 100%; izquierda: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filter: url (filter.svg # blur); / * FF, IE10 y Opera * / -webkit-filter: blur (2px); opacidad: .25;
No puedo poner el archivo SVG en el violín. (Debo liderar con el ejemplo para no mezclar la semántica y la presentación. De todos modos, las cosas serían más complicadas ...) Pero no estoy haciendo que la SVG se confunda ...
Violín | Pantalla completa
No esta completo Cuando Apple creó la reflexión en el tercer día, estaba destinada a ser menos reflexiva. La reflexión debe ser menos clara lejos de la superficie. Que haya oscuridad!
Esto solo funciona si la superficie tiene un color sólido y el color de la fuente es similar a este color: lo oscureceremos agregando otra sombra de cuadro. Este cuadro de sombra sobrescribe al anterior en el #ETBR, #refl
selector. Contrarrestaremos esto redeclarando la sombra del recuadro del selector anterior. La segunda sombra es la nueva sombra. Recuerda que cada sombra que agregamos al reflejo está reflejada..
#refl posición: absoluta; Top 100%; izquierda: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filter: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filter: blur (2px); / * webkit * / opacity: .25; cuadro de sombra: inserción rgba (0,0,0, 0,8) 0 0 20 px, inserción # 000 0 50 px 100 px; / * la primera sombra es vieja * /
La compensación de la segunda sombra es de 50 píxeles, pero el elemento siempre está reflejado después Se aplica la sombra. La sombra no se mueve hacia abajo, se mueve hacia arriba..
Mira esto:
Violín | Pantalla completa
¡Genial! Ahora échale un vistazo con IE8 (o confía en mi palabra): son básicamente dos copias del ETBR una encima de la otra, que no están duplicadas, transparentes o borrosas.
Agregamos algunos comentarios condicionales cuando comenzamos; tres grupos.
Si IE9 no fuera compatible con el nuevo material, sería mucho más fácil. (No me malinterpretes, me alegro de que Internet Explorer esté intentando cambiar. Pero sería más fácil ...) Y para hacerlo más complicado, hay diferencias entre los filtros sucios en IE9 e IE8. Basta ya de quejarse, vamos a hacer algo al respecto. Agregue a cada grupo un selector de #reflujo y mueva la propiedad de opacidad a la moderna.
#refl posición: absoluta; Top 100%; izquierda: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filter: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filter: blur (2px); / * webkit * / box-shadow: inserción rgba (0,0,0, .8) 0 0 20px, inserción # 000 0 50px 100px; .modern #refl opacidad: .25; .ie9 #refl .oldie #refl
A los filtros sucios no les gusta la opacidad de CSS2. Y hablando de filtros sucios, vamos a usar estos:
DXImageTransform.Microsoft.BasicImage
Nos permite reflejar la imagen y cambiar su opacidad.DXImageTransform.Microsoft.MotionBlur
y DXImageTransform.Microsoft.MotionBlur
es increíble.DXImageTransform.Microsoft.Gradient
como un reemplazo para la segunda caja de sombra.El primer filtro, BasicImage, en realidad tiene la propiedad "espejo". ¡SÍ! Desafortunadamente, establecer esta propiedad en 1 refleja el contenido horizontalmente, no verticalmente. Pero eso no significa que sea inútil para nosotros. Girar un elemento 180 ° y reflejarlo horizontalmente es lo mismo que reflejarlo verticalmente. Y esto es posible:
.oldie #refl filter: progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2);
Esta rotación no se mide en grados: 0 es 0 °, 1 es 90 °, 2 es 180 ° y 3 es 270 °. Sólo los viejos lo necesitan. IE9 soporta -transformada ms
.
Podemos especificar la opacidad en el mismo filtro ...
.ie9 #refl -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacidad = .25);" .oldie #refl filter: progid: DXImageTransform.Microsoft.BasicImage (espejo = 1, rotación = 2, opacidad = .35);
IE9 (y IE8, pero creo que Internet Explorer ya recibe suficiente atención) admite el filtro -ms. El valor es una cadena grande. Esto crea entendimiento por parte de los otros navegadores (Firefox va a un psiquiatra todos los viernes por Internet Explorer).
... pero necesitamos un nuevo filtro para el desenfoque. Múltiples filtros, si queremos que se vea bien. No comas no filtrar:
s entre los filtros, solo un espacio o una nueva linea. -ms-filter ya no tiene nuevas líneas ...
.ie9 #refl -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacity = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.Motion (fuerza = 15, dirección = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl filter: progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2, opacity = .35) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false") progid : DXImageTransform.Microsoft.MotionBlur (strength = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false");
Si lo difuminamos una vez con un radio de 6 píxeles, parece que alguien tomó 4 copias del reflejo y movió una de 6 píxeles arriba, una de 6 píxeles abajo, una de 6 píxeles a la izquierda y otra de 6 píxeles a la derecha. Si quieres presumir en el pub, debes saber el nombre: Desenfoque de caja. La adición de iteraciones (difuminando lo borroso) hace que Box Blur aparezca como un desenfoque normal. La segunda iteración es el desenfoque de movimiento, porque se ve bien.
Violín | Pantalla completa
Esta vez, no una, pero dos cosas están mal:
Segundo problema primero: como los oldies no son compatibles con box-shadow, usaremos un degradado alfa sucio como reemplazo. Por lo que sé, estos son los primeros valores similares a RGBA en CSS, pero si las especificaciones de w3c decían algo sobre los valores rgba en esos días, Internet Explorer no escuchó. Usaron 8 lugares hexadecimales en lugar de 6. Los dos primeros representan el alfa; los degradados sucios toman ARGB en lugar de RGBA, lo cual, debo admitir, suena mucho mejor:
.ie9 #refl -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacity = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.Motion (fuerza = 15, dirección = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl filter: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (espejo = 1, rotación = 2, opacidad = .35) progid: DXImagen .Microsoft.Blur (PixelRadius = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (strength = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = " falso");
El gradiente también debe estar borroso, así que eso es lo primero. Los degradados de filtro sucios son verticales por defecto. startColorstr
es el color degradado en la parte superior y startColorstr
El color en la parte inferior, pero se refleja! # 99000000 es lo mismo que rgba (0, 0, 0, 153). Recuerde: cuanto más alta sea la opacidad del gradiente, menor será la opacidad del reflejo..
El posicionamiento es solo una cuestión de prueba y error. Debido a que la reflexión ya tiene su posición establecida en porcentajes, no podemos ajustarla dentro del píxel usando las propiedades izquierda y superior. En su lugar, usaremos el margen:
.ie9 #refl margin-top: 20px; margen izquierdo: -10px; -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacidad = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.Motrosoft.MotionBlur (strength = , direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl margin-top: -20px; margen izquierdo: -7px; filter: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2, opacity = .35) progid: DXImageTransform.Microsoftflorescarcelzoplatzoplatzopopublicidadcelamiliaparcelopropieñocelopicorcelopicorcelopicorcelopicorcelopiccincadopañolintopotzoproscascoimpiezascontrol.texicocoestoplascoacopiezocelicopetrocidopañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañol. = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (strength = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false");
Violín | Pantalla completa
Cambiaremos dos cosas pequeñas antes de que gastes tu tiempo en algo mejor, como ver pandas estornudos en youtube.
Las soluciones:
Aquí está el archivo CSS. Los cambios finales se destacan:
style.css
html altura: 100%; cuerpo text-align: center; línea de altura: 1; margen: 0; relleno: 0; color de fondo: # 000; altura: 100%; p line-height: 1.2; #plane padding-top: 5%; izquierda: 0; superior: 10%; ancho: 100%; abajo: 0; ancho mínimo: 1080px; min-height: 600px; posición: absoluta; desbordamiento: oculto; overflow-x: visible; #ETBR, #refl color: # 004; Familia tipográfica: Impact, 'Arial Black', Helvetica, Arial, sans-serif; transformación de texto: mayúsculas; tamaño de fuente: 200px; color de fondo: #FFE; font-weight: negrita; relleno: 30px; pantalla: bloque en línea; cuadro de sombra: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, recuadro rgba (0,0,0, .8) 0 0 20px; radio del borde: 30px; posición: relativa; #refl posición: absoluta; índice z: -1; Top 100%; izquierda: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filter: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filter: blur (2px); / * webkit * / box-shadow: inserción rgba (0,0,0, .8) 0 0 20px, inserción # 000 0 50px 100px; .modern #refl opacidad: .25; .ie9 #refl margin-top: 20px; margen izquierdo: -10px; -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacidad = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.Motrosoft.MotionBlur (strength =) , direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl margin-top: -20px; margen izquierdo: -7px; filter: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2, opacity = .35) progid: DXImageTransform.Microsoftflorescarcelzoplatzoplatzopopublicidadcelamiliaparcelopropieñocelopicorcelopicorcelopicorcelopicorcelopiccincadopañolintopotzoproscascoimpiezascontrol.texicocoestoplascoacopiezocelicopetrocidopañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañónpañol. = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (strength = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false");
index.html
Reflexiones CSS3 reflexiónreflexión
filtro.svg
¡Y eso es todo! Este es el violín final, sin el filtro SVG borroso.
Violín | Pantalla completa
Como algo extra, aquí hay un CSS puro (excepto las estrellas en el fondo) Mac Dock que usa esta técnica.
Espero que hayas disfrutado este tutorial y espero que hayas aprendido algo nuevo. Siéntase libre de dejar cualquier pregunta en los comentarios.!