Les réflexions peuvent ajouter une dimension intéressante aux objets, leur donnant une touche de réalisme et leur donnant un contexte dans leur environnement. Examinons maintenant comment réaliser des réflexions avec CSS et examinons également le flou lumineux et le flou sur tous les navigateurs..
Suivre ce tutoriel fonctionne sur plusieurs hypothèses:
boîte ombre
travaux. Ce n'est pas la clé de ce tutoriel, vous devrez donc le comprendre vous-même. Si vous avez besoin d'explications, je vous suggère de regarder CSS3 par rapport à Photoshop: coins arrondis et ombres de boîte.Box-reflect est une propriété CSS qui sert précisément à cela: faire des réflexions. Nous n'utiliserons pas boîte-réflexion
et masque-image
, parce que:
Lorsque Microsoft a introduit ses effets de filtres (pensez à l'ère IE 4, aux tableaux imbriqués pour la présentation et aux images pour les réflexions), les filtres répugnants ne s'appliquaient pas à l'ensemble d'un élément donné. J'imagine qu'ils ont utilisé une sorte de boîte de délimitation du coin supérieur gauche au coin inférieur droit de l'élément, ce qui était logique, car à ma connaissance, il n'y avait pas moyen de dépasser cette boîte. Cependant, ils ne l'ont jamais corrigé.
À l’époque de la version Chrome 17, Webkit a commis la même erreur. Masquer les images, la clé pour -webkit-box-reflect
, créer une sorte d’instantané dynamique dans la zone de délimitation, le coller en dessous et changer son opacité. J'ai essayé de recréer la démo en utilisant -webkit-box-reflect:
Je ne l'ai pas fini, mais le problème est clair. L’ETBR a rayon de la frontière
et boîte ombre
. La boîte-ombre est visible à l'intérieur, mais pas à l'extérieur de la zone de délimitation.
Dans ma méthode, les transformations de matrice, l’ombre et l’opacité dans l’encadré remplaceront l’image par réflexion et l’image par masque. Les limitations:
Violon | Plein écran
La couleur du texte ne devient pas plus sombre que l'arrière-plan. Il semble donc que vous ne pouvez pas avoir une couleur différente et la boîte-ombre ensemble.
Alors que nous sommes sur le sujet des matrices et des réflexions…
Vous prenez la pilule bleue - je vous montre comment recréer la démo mot à mot. Vous prenez la pilule rouge - je vais vous montrer comment réfléchir à n'importe quoi et je vous dirai où vous pouvez acheter ces lunettes réfléchissantes à un prix très intéressant..
Mettre tout simplement; Certaines des étapes suivantes sont facultatives, selon que vous souhaitiez recréer le pixel de démonstration pour pixel.
La démo commence avec un modèle HTML5…
index.html
Réflexions CSS3
… Et ce fichier CSS.
style.css
html hauteur: 100%; body text-align: center; hauteur de ligne: 1; marge: 0; rembourrage: 0; hauteur: 100%; p line-height: 1.2;
Et bien sûr, nous allons ajouter un lien vers la feuille de style:
Réflexions CSS!
La démo est en 2D. Pas un seul élément 3D. Nous le savons, mais notre objectif est de faire leur pensons que nous avons construit cela et ensuite photographié la vue de face.
Si nous voulons qu’ils croient que c’est de la 3D, nous devons déterminer comment les objets sont positionnés et pivotés dans l’espace 3D. La démo a un horizon. Le top 10% correspond au ciel noir, les 90% restants étant un faux avion 3D. L'élément à refléter (dorénavant désigné dans notre démo comme ETBR) et le plan sont perpendiculaires entre eux (l'angle est de 90 °), la réflexion doit être parallèle à l'ETBR.
Le HTML:
réflexion
L'ETBR est un enfant de l'avion. De cette façon, il reste dans la même position vue de l'avion et la lueur reste dans l'avion.
body text-align: center; hauteur de ligne: 1; marge: 0; rembourrage: 0; couleur de fond: # 000; hauteur: 100%; p line-height: 1.2; #plane left: 0; Top 10%; largeur: 100%; en bas: 0; largeur minimale: 1080px; hauteur minimale: 600px; position: absolue; débordement caché; débordement-x: visible;
Remarque:
Localisez l'objet (ETBR), copiez-le, collez-le en lui-même et renommez-le en refl (ection):
réflexionréflexion
Maintenant, dans le fichier css, créez le sélecteur de l'objet. Ajoutez #refl au sélecteur pour que nos styles soient appliqués aux deux éléments:
#ETBR, #refl
Fondamentalement, les CSS et HTML de la réflexion doivent être identiques à ceux des CSS et HTML de l'ETBR. Nous allons positionner, refléter et adorer le reflet de l'étape 5. Mais pour le moment, nous allons masquer le reflet..
#ETBR, #refl #refl display: none;
Internet Explorer étant Internet Explorer, nous devons ajouter du code HTML conditionnel:
Réflexions CSS3 réflexionréflexion
Vous pourriez vous demander pourquoi, juste nu avec moi. Parce que vous êtes hospitalisé, ce premier Fiddle sera complètement noir. Voulez-vous voir l'influence de l'avion? Le redimensionner.
Violon | Plein écran
Cela ne nécessite aucune explication:
#ETBR, #refl color: # 004; font-family: Impact, 'Arial Black', Helvetica, Arial, sans serif; text-transform: majuscule; taille de police: 200px; couleur de fond: #FFE; poids de police: gras; rembourrage: 30px; affichage: inline-block; #refl display: none;
OK, une petite explication. La combinaison de text-align: center;
et affichage: inline-block;
centre un élément vieille école, mais ce n'est pas le Saint Graal; Les éléments en ligne ne peuvent pas contenir d’éléments de bloc. Je l'ai utilisé, car je ne voulais pas ajouter des milliers de conteneurs flottants pour cet exemple. En règle générale, c’est la voie à suivre.
Violon | Plein écran
La lueur se compose de trois ombres: une grande ombre étendue (qui ressemble plus au reflet de la lumière sur le plan), la vraie lueur (une ombre blanche avec une plage de flou plus courte) et une ombre incrustée noire (qui rend le ETBR regarde comme il brille). Comme je l'ai déjà mentionné, je ne vais pas expliquer le fonctionnement de Box-Shadow, et Bord-Rayon parle de lui-même.
#ETBR, #refl color: # 004; font-family: Impact, 'Arial Black', Helvetica, Arial, sans serif; text-transform: majuscule; taille de police: 200px; couleur de fond: #FFE; poids de police: gras; rembourrage: 30px; affichage: inline-block; box-shadow: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, encart rgba (0,0,0, .8) 0 0 20px; border-radius: 30px;
Violon | Plein écran
Videz le sélecteur #refl pour rendre le reflet visible. Les réflexions n'étant pas "réelles", notre réflexion ne fera pas partie du flux de documents. il devrait flotter. Le choix évident consiste à définir la position sur absolue, ce qui signifie que l'élément est positionné par rapport à son premier élément ancêtre (non statique) positionné. Parce qu’il n’ya pas d’ancêtre au premier emplacement de la réflexion, celle-ci sera positionnée par rapport à la balise body..
Il est beaucoup plus facile de positionner la réflexion par rapport au texte réel, qui est également un ancêtre de la réflexion (coïncidence?). Pour ce faire, nous devons d’abord "positionner" l’ETBR:
#ETBR, #refl color: # 004; font-family: Impact, 'Arial Black', Helvetica, Arial, sans serif; text-transform: majuscule; taille de police: 200px; couleur de fond: #FFE; poids de police: gras; rembourrage: 30px; affichage: inline-block; box-shadow: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, encart rgba (0,0,0, 0,8) 0 0 20px; border-radius: 30px; position: relative;
Cela ne change pas réellement la position, mais elle est positionnée. À présent:
#refl position: absolute; Top 100%; gauche: 0;
Le sommet de la réflexion est relatif à la hauteur et à la position de l'ETBR. 0% leur donneront le même sommet, 200% laisseront un écart aussi grand que la hauteur de l'ETBR et 100% placera le haut de la réflexion au bas de l'ETBR. Gauche est identique, mais prend le pourcentage de la largeur.
Violon | Plein écran
Presque tous les navigateurs couramment utilisés possèdent ces fonctionnalités, d'IE6 à Google Chrome. La mise en œuvre est différente cependant. Les navigateurs modernes sont très simples, pour chaque caractéristique une propriété: transformation, flou et opacité. Nous allons aussi utiliser box-shadow, mais en miroir d'abord.
#refl position: absolute; Top 100%; gauche: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1);
Avec transform, nous pouvons modifier un élément pour chaque parallélogramme que vous pouvez imaginer. Beaucoup de parallélogrammes, je sais. Mais nous avons seulement besoin de refléter la réflexion, nous allons donc laisser la plupart des fonctions de transformation inutilisées.
Tout concepteur doit savoir que la mise à l'échelle de -1 sur l'axe des ordonnées est identique à la mise en miroir. La mise à l'échelle sur l'axe des ordonnées multiplie la distance entre le haut (et le bas) et le centre. Si l’échelle est 2 sur l’axe Y, la distance entre le sommet et le centre sera deux fois plus grande. Si vous redimensionnez à -1, la distance sera la même, mais top est l'endroit où se trouvait le bas et le bas était celle du haut. Félicitations, vous savez comment refléter!
Tous les navigateurs modernes supporteront très bientôt les filtres, filtres -webkit-filter ou SVG. FF, Opera et IE10 prennent déjà en charge ce dernier, Safari et Chrome ne font que renforcer la tension avant de la relâcher. L'un des filtres SVG est le bon vieux flou gaussien. C'est lent, mais c'est quelque chose…
Créez un fichier "filter.svg" dans le même dossier que style.css. Son contenu:
Formalités, sauf pour les règles 6 à 8. Le filtre appelé "flou" (vous pouvez l'appeler n'importe quoi) rend flous 2 pixels horizontalement et 3 pixels verticalement. Retour à la feuille de style!
#refl position: absolute; Top 100%; gauche: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtre: url (filter.svg # blur); / * FF, IE10 & Opera * / -webkit-filter: flou (2 pixels);
filter.svg # flou
signifie l'élément 'flou' dans filter.svg. Si l'ID du filtre était "quelque chose", l'URL serait filter.svg # rien
. Le rayon de flou est défini dans le fichier SVG. Les navigateurs Webkit mettent tout cela en une seule règle.
La transparence existe depuis beaucoup plus longtemps, il suffit donc de spécifier une propriété:
#refl position: absolute; Top 100%; gauche: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtre: url (filter.svg # blur); / * FF, IE10 & Opera * / -webkit-filter: flou (2 pixels); opacité: 0,25;
Je ne peux pas mettre le fichier SVG dans le violon. (Je dois donner l'exemple, donc je ne peux pas mélanger la sémantique et la présentation. Cela compliquerait les choses de toute façon…) Mais je ne suis pas en train de brouiller SVG…
Violon | Plein écran
Ce n'est pas complet. Lorsque Apple a créé la réflexion le troisième jour, elle était censée être moins réfléchissante. La réflexion devrait être moins nette plus loin de la surface. Laisse les ténèbres!
Cela ne fonctionne que si la surface a une couleur unie et si la couleur de la police est similaire à cette couleur: nous l'assombrirons en ajoutant une autre zone d'ombre. Cette boîte-ombre remplace l'ancien dans le #ETBR, #refl
sélecteur. Nous allons remédier à cela en redéclarant l'ombre incrustée de l'ancien sélecteur. La deuxième ombre est la nouvelle ombre. Rappelez-vous chaque ombre que nous ajoutons au reflet est reflétée.
#refl position: absolute; Top 100%; gauche: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtre: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filter: flou (2 pixels); / * webkit * / opacité: 0,25; box-shadow: encart rgba (0,0,0, .8) 0 0 20px, encart # 000 0 50px 100px; / * la première ombre est ancienne * /
Le décalageY de la deuxième ombre est de 50 pixels, mais l'élément est toujours reflété après l'ombre est appliquée. L'ombre ne descend pas, elle monte.
Regarde ça:
Violon | Plein écran
Génial! Maintenant, jetez-y un coup d'oeil avec IE8 (ou croyez-moi sur parole): il s'agit essentiellement de deux copies de l'ETBR superposées, qui ne sont ni en miroir, ni en transparence, ni flou..
Nous avons ajouté des commentaires conditionnels lorsque nous avons commencé; trois groupes.
Si IE9 ne supportait pas les nouveaux éléments, ce serait beaucoup plus facile. (Ne vous méprenez pas, je suis heureux qu'Internet Explorer essaie de changer. Mais ce serait plus facile…) Et pour compliquer les choses, il existe des différences entre les filtres sales dans IE9 et IE8. Assez des plaintes, faisons quelque chose à ce sujet. Ajoutez pour chaque groupe un sélecteur #refl et déplacez la propriété opacity sur moderne.
#refl position: absolute; Top 100%; gauche: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtre: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filter: flou (2 pixels); / * webkit * / box-shadow: encart rgba (0,0,0, .8) 0 0 20px, encart # 000 0 50px 100px; .modern #refl opacity: .25; .ie9 #refl .oldie #refl
Les filtres sales n'aiment pas l'opacité de CSS2. Et en parlant de filtres immondes, nous allons utiliser ceux-ci:
DXImageTransform.Microsoft.BasicImage
nous permet de refléter l'image et de changer son opacitéDXImageTransform.Microsoft.MotionBlur
et DXImageTransform.Microsoft.MotionBlur
est génial.DXImageTransform.Microsoft.Gradient
en remplacement de la deuxième boîte-ombre.Le premier filtre, BasicImage, a en fait la propriété "mirror"! OUI! Malheureusement, la définition de cette propriété sur 1 reflète le contenu horizontalement et non verticalement. Mais cela ne signifie pas que c'est inutile pour nous. Faire pivoter un élément de 180 ° et le refléter horizontalement équivaut à le refléter verticalement. Et c'est possible:
.oldie #refl filter: progid: DXImageTransform.Microsoft.BasicImage (miroir = 1, rotation = 2);
Cette rotation ne se mesure pas en degrés: 0 à 0 °, 1 à 90 °, 2 à 180 ° et 3 à 270 °. Seuls les vieux ont besoin de ça. IE9 prend en charge -ms-transform
.
Nous pouvons spécifier l'opacité dans le même filtre…
.ie9 #refl -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacity = .25);" .oldie #refl filter: progid: DXImageTransform.Microsoft.BasicImage (miroir = 1, rotation = 2, opacité = .35);
IE9 (et IE8, mais Internet Explorer reçoit déjà suffisamment d'attention) prend en charge -ms-filter. La valeur est une grosse chaîne. Cela crée une compréhension des autres navigateurs (Firefox va chez un psychiatre tous les vendredis à cause d'Internet Explorer).
… Mais nous avons besoin d'un nouveau filtre pour le flou. Plusieurs filtres, si nous voulons le faire bien paraître. Pas de virgule, pas filtre:
s entre les filtres, juste un espace ou une nouvelle ligne. -ms-filter n'obtient plus de nouvelles lignes…
.ie9 #refl -ms-filter: "ID de progression: DXImageTransform.Microsoft.BasicImage (opacité = .25) ID de progression: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.Microsoft.Mloss (force = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl filter: Progid: DXImageTransform.Microsoft.BasicImage (miroir = 1, rotation = 2, opacité = .35) Progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false") progid : DXImageTransform.Microsoft.MotionBlur (force = 15, direction = 0) Progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false");
Si nous le rendons flou une fois avec un rayon de 6 pixels, il semblerait que quelqu'un ait pris 4 copies du reflet et déplacé un de 6 pixels au-dessus, un de 6 pixels en dessous, un de 6 pixels à gauche et un de 6 pixels à droite. Si vous voulez vous montrer au pub, vous devez connaître le nom: Box Blur. L'ajout d'itérations (rendre flou le flou) fait en sorte que le flou de la boîte apparaisse comme un flou normal. La deuxième itération est le flou de mouvement, car il a l'air bien.
Violon | Plein écran
Cette fois, pas une, mais deux choses ne vont pas:
Deuxième problème: parce que les anciens ne supportent pas Box-Shadow, nous utiliserons un dégradé d'alpha comme substitut. Ce sont, à ma connaissance, les premières valeurs de type RGBA en CSS, mais si les spécifications du w3c ne disaient rien sur les valeurs de rgba à cette époque, Internet Explorer n'écoutait pas. Ils ont utilisé 8 positions hexadécimales au lieu de 6. Les deux premières représentent l'alpha; les dégradés sales prennent ARGB au lieu de RGBA, ce qui, je dois l'avouer, sonne beaucoup mieux:
.ie9 #refl -ms-filter: "ID de progression: DXImageTransform.Microsoft.BasicImage (opacité = .25) ID de progression: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.Microsoft.Mloss (force = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl filter: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (miroir = 1, rotation = 2, opacité = .35) progid: DXImageTransform .Microsoft.Blur (PixelRadius = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (force = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow faux");
Le dégradé doit aussi être flou, alors c'est le premier. Filthy Filter Gradients sont par défaut verticaux. startColorstr
est la couleur du dégradé en haut et startColorstr
la couleur en bas, mais ça se reflète! # 99000000 est identique à rgba (0, 0, 0, 153). Rappelez-vous: plus l’opacité du dégradé est élevée, plus l’opacité du reflet semble faible..
Le positionnement est juste une affaire d'essais et d'erreurs. Comme la position de la réflexion est déjà définie en pourcentage, nous ne pouvons pas l'ajuster dans les pixels à l'aide des propriétés left et top. Au lieu de cela, nous utiliserons la marge:
.ie9 #refl margin-top: 20px; marge gauche: -10px; -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacity = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.MotionBlur (force 15). , direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl margin-top: -20px; marge gauche: -7px; filter: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (miroir = 1, rotation = 2, opacité = .35) progid: DXImageTransform.Microsoft.Blur = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (force = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false");
Violon | Plein écran
Nous allons changer deux petites choses avant de passer votre temps à quelque chose de mieux, comme regarder des pandas à éternuer sur youtube..
Les solutions:
Voici le fichier CSS. Les dernières modifications sont mises en évidence:
style.css
html hauteur: 100%; body text-align: center; hauteur de ligne: 1; marge: 0; rembourrage: 0; couleur de fond: # 000; hauteur: 100%; p line-height: 1.2; #plane padding-top: 5%; gauche: 0; Top 10%; largeur: 100%; en bas: 0; largeur minimale: 1080px; hauteur minimale: 600px; position: absolue; débordement caché; débordement-x: visible; #ETBR, #refl color: # 004; font-family: Impact, 'Arial Black', Helvetica, Arial, sans serif; text-transform: majuscule; taille de police: 200px; couleur de fond: #FFE; poids de police: gras; rembourrage: 30px; affichage: inline-block; box-shadow: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, encart rgba (0,0,0, .8) 0 0 20px; border-radius: 30px; position: relative; #refl position: absolute; z-index: -1; Top 100%; gauche: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtre: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filter: flou (2 pixels); / * webkit * / box-shadow: encart rgba (0,0,0, .8) 0 0 20px, encart # 000 0 50px 100px; .modern #refl opacity: .25; .ie9 #refl margin-top: 20px; marge gauche: -10px; -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacity = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.MotionBlur (force 15). , direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); " .oldie #refl margin-top: -20px; marge gauche: -7px; filter: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (miroir = 1, rotation = 2, opacité = .35) progid: DXImageTransform.Microsoft.Blur = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (force = 15, direction = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false");
index.html
Réflexions CSS3 réflexionréflexion
filter.svg
Et c'est tout! C'est le dernier violon, sans pour autant le flou du filtre SVG.
Violon | Plein écran
En plus, voici un pur CSS (à l'exception des étoiles en arrière-plan) Mac Dock utilisant cette technique.
J'espère que vous avez apprécié ce tutoriel et que vous avez appris quelque chose de nouveau. N'hésitez pas à laisser des questions dans les commentaires!