Cross-Browser CSS Reflecții, străluciri și neclarități

Reflecțiile pot adăuga o dimensiune interesantă obiectelor, dând o notă realistă și oferindu-le un context în vecinătatea lor. Să aruncăm o privire asupra realizării reflecțiilor cu CSS și vom examina blurirea strălucitoare și a browserelor încrucișate pentru o măsură bună.


Ipoteze

În urma acestui tutorial funcționează mai multe ipoteze:

  • Știi codul tău HTML.
  • Sunteți familiarizați cu selectorii CSS și CSS2.
  • Dacă doriți să recreați exact exemplul, ar trebui să știți cum box-shadow lucrări. Nu este cheia acestui tutorial, deci trebuie să vă dați seama. Dacă aveți nevoie de o explicație, vă sugerez să aruncați o privire asupra CSS3 vs. Photoshop: Cornere rotunjite și umbre de box.

Box-reflect vs. "Metoda mea"

Box-reflect este o proprietate CSS care este destinată exact acestui scop: a face reflecții. Nu vom folosi box-reflectă și masca-imagine, deoarece:

  • La momentul scrisului, ambele proprietăți sunt suportate numai de webkit (Chrome și Safari).
  • Implementarea este cea mai mică.

Când Microsoft și-a prezentat efectele de filtrare (gândiți-vă la epoca IE 4, tabele imbricate pentru aspect și imagini pentru reflecții), filtrele murdare nu se aplică întregului element dat. Cred că au folosit o anumită casetă delimitată de la colțul din stânga sus până la colțul din dreapta jos al elementului, ceea ce a făcut sens, din câte știu că nu a existat o cale de a depăși această casetă. Cu toate acestea, nu au corectat-o ​​niciodată.

Acum, în epoca Chrome 17, webkit a făcut aceeași greșeală. Imagini mascate, cheia pentru -webkit-box-reflectă, face un fel de instantaneu dinamic în caseta de frontieră, îl pastează mai jos și își schimbă opacitatea. Am încercat să recreez demo-ul folosind -webkit-box-reflect:

Nu am terminat-o, dar problema este clară. ETBR a avut border-radius și box-shadow. Umbra în cutie este vizibilă înăuntru, dar nu în afara casetei delimitate.

În metoda mea se transformă matricea, cutie-umbra și opacitatea se vor înlocui cu box-reflect și mască-imagine. Limitările:

  • Cea mai importantă limitare este că nu se face o reflecție transparentă. Este o combinație de transparență reală și falsă care va funcționa de cele mai multe ori, dar nu întotdeauna.
  • Textul din ETBR nu este afectat de inserția box-shadow. Acest lucru se întâmplă dacă culoarea textului nu este aceeași cu culoarea de fundal a suprafeței.

Fiddle | Ecran complet

Culoarea textului nu devine mai întunecată în cazul în care fundalul face. Se pare că nu poți avea o culoare diferită și cutia-umbra impreuna.


Alegeri ...

Deși suntem pe tema matricelor și a reflecțiilor ...

Luați pilula albastră - vă arăt cum să recreați cuvântul demonstrativ. Luați pilula roșie - vă voi arăta cum să faceți reflecții despre orice și vă voi spune unde puteți cumpăra aceste nuanțe reflectorizante pentru un preț foarte interesant.

Pune simplu; unii dintre următorii pași sunt opționali, în funcție de dacă doriți să recreați pixelul demo pentru pixeli.


Opțional: Pregătiri

Demo-ul începe cu un șablon HTML5 ...

index.html

      CSS3 Reflecții         

... și acest fișier CSS.

style.css

 html înălțime: 100%;  corp text-align: center; linia-înălțime: 1; marja: 0; umplutura: 0; înălțime: 100%;  p linie-înălțime: 1.2; 

Și, desigur, vom adăuga un link la foaia de stil:

    Reflecții CSS!       

2D, dar 3D

Demo-ul este 2D. Nu există niciun element 3D. Știm asta, dar scopul nostru este să facem lor cred că am construit acest lucru și apoi am fotografiat vederea frontală.

Dacă vrem să creadă că este 3D, ar trebui să determinăm modul în care obiectele sunt poziționate și rotite în spațiul 3D. Demo-ul are un orizont. Topul de 10% este negru "cer", celelalte 90% este un plan 3D fals. Elementul care urmează să fie reflectat (denumit în continuare în demo - ul nostru ca EtBr) și planul sunt perpendiculare unele pe altele (unghiul este de 90 °), reflexia trebuie să fie paralelă cu ETBR.


Pasul 1: opțional Planul și ETBR

HTML:

  
reflecţie

ETBR este un copil al avionului. În acest fel, aceasta rămâne în aceeași poziție văzută din avion, iar stingerea rămâne în plan.

 corp text-aliniere: centru; linia-înălțime: 1; marja: 0; umplutura: 0; fundal-culoare: # 000; înălțime: 100%;  p linie-înălțime: 1.2;  #plane stânga: 0; top 10%; lățime: 100%; fund: 0; min-lățime: 1080px; min-înălțime: 600px; poziția: absolută; overflow: ascuns; overflow-x: vizibil; 

Notă:

  • Avionul are o lățime min și o înălțime min, astfel încât ETBR este întotdeauna vizibil.
  • Overflow-y este setat la ascuns, astfel încât strălucirea ETBR rămâne în plan. (Cerul trebuie să fie negru.)
  • Avionul nu are o culoare de fundal, dar își obține culoarea de la strălucire, care nu are sens la nici un nivel, dar arată cel mai bine.

Pasul 2: Marcajul de reflecție

Localizați obiectul (ETBR), copiați-l, lipiți-l în sine și redenumiți-l pentru a refl (ecuație):

 reflecţiereflecţie

Acum, în css crea selectorul obiectului. Adăugați #refl la selector, astfel încât stilurile noastre să fie aplicate ambelor elemente:

 #ETBR, #refl 

Practic, CSS și HTML ale reflecției trebuie să fie aceleași cu CSS și HTML ale ETBR. Vom poziționa, vom reflecta și vom preface reflecția de la pasul 5. Dar, pentru moment, vom ascunde reflexia.

 #ETBR, #refl  #refl afișare: niciunul; 

Internet Explorer fiind Internet Explorer, trebuie să adăugăm câteva coduri HTML condiționate:

      CSS3 Reflecții             
reflecţiereflecţie

S-ar putea să te întrebi de ce, pur și simplu cu mine. Pentru că ești pacient în spital, prima Fiddle va fi complet neagră. Vreți să vedeți influența avionului? Redimensionați-l.

Fiddle | Ecran complet


Pasul 3: Styling de bază opțional

Nu este nevoie de o explicație:

 #ETBR, #refl culoare: # 004; font-family: Impact, "Arial Black", Helvetica, Arial, sans-serif; text-transform: majuscule; font-size: 200px; fundal-culoare: #FFE; font-weight: bold; padding: 30px; afișare: inline-block;  #refl display: none; 

OK, o mică explicație. Combinația dintre text-align: centru; și afișare: inline-block; un element vechi skool, dar nu este sfantul graal; elementele inline nu pot conține elemente blocate. Am folosit-o, pentru că nu am vrut să adaug mii de recipiente plutitoare pentru acest exemplu. Totuși, în general, acesta este calea de urmat.

Fiddle | Ecran complet


Pasul 4: Colțuri opționale și rotunjite

Stralucirea constă în trei umbre: o umbra mare, întinsă (care seamănă mai mult cu reflexia luminii din plan), strălucirea reală (o umbră albă cu un interval de estompare mai scurt) și o umbră neagră (ceea ce face ETBR arata ca este stralucitor). După cum am menționat mai devreme, nu voi explica cum funcționează umbra în cutie și raza de graniță vorbește în zilele noastre.

 #ETBR, #refl culoare: # 004; font-family: Impact, "Arial Black", Helvetica, Arial, sans-serif; text-transform: majuscule; font-size: 200px; fundal-culoare: #FFE; font-weight: bold; padding: 30px; afișare: inline-block; box-shadow: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, inset rgba (0,0,0, .8) 0 0 20px; raza de graniță: 30 pixeli; 

Fiddle | Ecran complet


Pasul 5: Poziționarea reflecției

Goliți selectorul #refl pentru a face vizibil reflexia. Deoarece reflecțiile nu sunt "reale", reflexia noastră nu va face parte din fluxul documentelor; ar trebui să plutească. Opțiunea evidentă este să setați poziția la valoare absolută, ceea ce înseamnă că elementul este poziționat în raport cu primul său element străbătut (nu static). Deoarece nu există un prim strămoș poziționat al reflecției, acesta va fi poziționat în raport cu eticheta caroseriei.

Este mult mai ușor să poziționați reflexia față de textul real, care este, de asemenea, un strămoș al reflecției (coincidență?). Pentru a face acest lucru, trebuie mai întâi să "poziționăm" ETBR-ul:

 #ETBR, #refl culoare: # 004; font-family: Impact, "Arial Black", Helvetica, Arial, sans-serif; text-transform: majuscule; font-size: 200px; fundal-culoare: #FFE; font-weight: bold; padding: 30px; afișare: inline-block; box-shadow: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, inset rgba (0,0,0, .8) 0 0 20px; raza de graniță: 30 pixeli; poziție: relativă; 

Acest lucru nu schimbă de fapt poziția, dar este poziționată. Acum:

 #refl poziție: absolută; top: 100%; stânga: 0; 

Partea superioară a reflexiei este relativă la înălțimea și poziția ETBR. 0% le va oferi același top, 200% va lăsa un decalaj la fel de mare ca înălțimea ETBR și 100% pune partea de sus a reflexiei în partea de jos a ETBR. Stânga este aceeași, dar ia procentul lățimii.

Fiddle | Ecran complet


Pasul 6: Modern Mirroring, Blurring & Transparency

Aproape fiecare browser utilizat în mod obișnuit are aceste caracteristici, de la IE6 la Google Chrome. Implementarea este însă diferită. Browserele moderne sunt foarte simple, pentru fiecare caracteristică o proprietate: transformare, estompare și opacitate. Vom folosi și umbra în cutie, dar în primul rând oglindirea.

Oglindire

 #refl poziție: absolută; top: 100%; stânga: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); 

Cu transformarea putem modifica un element în fiecare paralelogramă pe care o puteți imagina. Multe paralelograme, știu. Dar trebuie doar să reflectăm reflecția, așa că vom lăsa cele mai multe funcții transformate neutilizate.

Orice designer ar trebui să știe că scalarea cu -1 pe axa Y este aceeași ca și oglindirea. Scalarea pe axa Y înmulțește distanța dintre partea superioară (și partea de jos) și centrul. Dacă scarăm cu 2 pe axa Y, distanța dintre vârf și centru va fi de două ori mai mare. Dacă sculați cu -1, distanța va fi aceeași, dar partea de sus este în partea de jos a fost și partea de jos este în cazul în care partea de sus a fost. Felicitări, știi cum să oglilezi!

Estompa

Toate browserele moderne vor suporta filtre foarte curând, filtre -webkit-filter sau SVG. FF, Opera & IE10 suportă deja acest lucru, Safari și Chrome construiesc doar tensiunea înainte de ao elibera. Unul dintre filtrele SVG este vechiul Gaussian Blur. Este lent, dar este ceva ...

Creați un fișier "filter.svg" în același director ca stil.css. Conținutul său:

        

Formalități, cu excepția regulilor de la 6 la 8. Filtrul numit "blur" (se poate numi ceva) estompează 2 pixeli orizontal și 3 pixeli vertical. Înapoi la foaia de stil!

 #refl poziție: absolută; top: 100%; stânga: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtru: url (filter.svg # blur); / * FF, IE10 și Opera * / -webkit-filter: estomp (2px); 

filter.svg # neclaritate înseamnă elementul "blur" în filtrul.svg. Dacă ID-ul filtrului a fost "orice", url ar fi filter.svg # nimic. Raza de estompare este definită în fișierul SVG. Browserele Webkit au pus toate acestea într-o singură regulă.

Transparenţă

Transparența a fost mult mai lungă, deci trebuie să specificăm doar o proprietate:

 #refl poziție: absolută; top: 100%; stânga: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtru: url (filter.svg # blur); / * FF, IE10 și Opera * / -webkit-filter: estomp (2px); opacitate: .25; 

Nu pot pune fișierul SVG în vioară. (Trebuie să conduc exemplul, așa că nu pot amesteca semantica și prezentarea, ar face lucrurile mai complicate oricum ...) Dar nu fac ca SVG să se estompeze ...

Fiddle | Ecran complet

Nu este completă. Când Apple a creat reflecția în a treia zi, intenționa să fie mai puțin reflectorizantă. Reflexia ar trebui să fie mai puțin clară mai departe de suprafață. Să fie întuneric!

Acest lucru funcționează numai dacă suprafața are o culoare solidă și culoarea fontului este similară cu această culoare: o vom întuneca adăugând o altă umbră. Această umbra de cutie suprascrie cea veche din #ETBR, #refl selector. Vom contracara acest lucru redefinind umbra încadrată a selectorului vechi. Al doilea umbră este noua umbră. Amintiți-vă că fiecare umbra pe care o adăugăm reflecției este oglindită.

 #refl poziție: absolută; top: 100%; stânga: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtru: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filtru: estompare (2px); / * webkit * / opacitate: 0,25; box-shadow: inscripție rgba (0,0,0, .8) 0 0 20px, inset # 000 0 50px 100px; / * prima umbră este veche * /

Offsetul celei de-a doua umbre este de 50 de pixeli, dar elementul este întotdeauna oglindit după se aplică umbra. Umbra nu se mișcă în jos, se mișcă.

Uita-te la asta:

Fiddle | Ecran complet

Grozav! Acum, aruncați o privire la ea cu IE8 (sau luați-mi cuvântul pentru asta): sunt în esență două copii ale ETBR deasupra celuilalt, care nu sunt oglindite, transparente sau neclară.


Pasul 7: Filtrarea filtrată

Am adăugat câteva comentarii condiționate atunci când am început; trei grupuri.

  • Browserele moderne și IE10, care nu acceptă vechile filtre IE (IE10 au renunțat la suport), dar nu suportă cele noi.
  • IE8 și inferior, vechiiIIE, sprijină filtrele murdare și nu acceptă cele noi.
  • IE9, care susține un pic de ambele.

Dacă IE9 nu ar sprijini noile lucruri, ar fi mult mai ușor. (Nu mă înțelegeți greșit, sunt fericit că Internet Explorer încearcă să se schimbe, dar ar fi mai ușor ...) Și pentru a face mai complicat, există diferențe între filtrele murdare din IE9 și IE8. Destul de plângându-se, să facem ceva. Adăugați pentru fiecare grup un selector #refl și mutați proprietatea opacitate la moderne.

 #refl poziție: absolută; top: 100%; stânga: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtru: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filtru: estompare (2px); / * webkit * / box-shadow: inset rgba (0,0,0, .8) 0 0 20px, inset # 000 0 50px 100px;  .modern #refl opacitate: .25;  .ie9 #refl  .oldie #refl 

Filtrele filosofice nu le plac opacitatea CSS2. Și vorbind despre filtre murdare, vom folosi aceste:

  • DXImageTransform.Microsoft.BasicImage ne permite să reflectăm imaginea și să ne schimbăm opacitatea
  • DXImageTransform.Microsoft.MotionBlur și DXImageTransform.Microsoft.MotionBlur este minunat.
  • DXImageTransform.Microsoft.Gradient ca înlocuitor pentru cea de-a doua box-umbra.

Oglindire

Primul filtru, BasicImage, are proprietatea "oglindă"! DA! Din păcate, setarea acestei proprietăți la 1 reflectă conținutul orizontal, nu vertical. Dar asta nu înseamnă că e inutil pentru noi. Rotirea unui element la 180 ° și oglindirea acestuia pe orizontală este la fel ca o oglindire verticală. Și acest lucru este posibil:

 .oldie # refl filtru: progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotație = 2); 

Această rotație nu este măsurată în grade: 0 este 0 °, 1 este 90 °, 2 este 180 ° și 3 este 270 °. Numai vechii au nevoie de asta. IE9 acceptă -ms-transformare.

Opacitate

Putem specifica opacitatea din același filtru ...

 .ie9 #refl -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacitate = .25);"  .oldie #refl filtru: progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotație = 2, opacitate = .35); 

IE9 (și IE8, dar cred că Internet Explorer are deja suficientă atenție) suportă -ms-filter. Valoarea este un șir mare. Acest lucru creează înțelegerea de către celelalte browsere (Firefox merge la un psihiatru în fiecare vineri din cauza Internet Explorer).

Estompa

... dar avem nevoie de un filtru nou pentru estompare. Filtre multiple, dacă vrem să o facem bine. Nu există virgule, nu filtru:s între filtre, doar un spațiu sau o linie nouă. -ms-filter nu mai are linii noi ...

 .ie9 #refl -ms-filter: progid: DXImageTransform.Microsoft.BasicImage (opacitate = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (puterea = 15, direcția = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"  .oldie #refl filtru: progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2, opacity = .35) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = : DXImageTransform.Microsoft.MotionBlur (putere = 15, direcție = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); 

Dacă o ștergem o dată cu o rază de 6 pixeli, se pare că cineva a luat 4 copii ale reflecției și a mutat un pixel de 6 pixeli deasupra, cu 6 pixeli mai jos, cu 6 pixeli la stânga și cu 6 pixeli spre dreapta. Dacă doriți să vă manifestați la bar, ar trebui să știți numele: Box Blur. Adăugarea de iterații (estomparea neclarității) face ca caseta Blur să pară ca o neclaritate normală. A doua iterație este blurul mișcării, pentru că arată bine.

Fiddle | Ecran complet

De data aceasta, nu unul, ci două lucruri sunt greșite:

  1. Blurul mișca reflexia cu câțiva pixeli în sus și spre dreapta în IE9, dar în IE8 mișca reflexia în jos. De ce? E un mister.
  2. În IE7 și IE8, reflecția este la fel de transparentă peste tot.

A doua problema: pentru ca vechii nu sustin box-shadow, vom folosi un gradient alfa murdar ca inlocuitor. Acestea sunt, după cunoștințele mele, primele valori asemănătoare RGBA în CSS, dar dacă specificațiile w3c au spus ceva despre valorile rgba în acele zile, Internet Explorer nu a ascultat. Au folosit 8 locuri hexazecimale în loc de 6. Primele două reprezintă alfa; murdărie gradients ia ARGB în loc de RGBA, care, trebuie să recunosc, sună mult mai bine:

 .ie9 #refl -ms-filter: progid: DXImageTransform.Microsoft.BasicImage (opacitate = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (puterea = 15, direcția = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"  .oldie #refl filtru: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2, opacity = .Microsoft.Blur (PixelRadius = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (putere = 15, direcție = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = fals"); 

Gradientul trebuie să fie și neclar, deci este primul. Filtrele gradiente filtrată sunt în mod vertical în mod vertical. startColorstr este culoarea gradientului din partea de sus și startColorstr culoarea din partea de jos, dar este oglindită! # 99000000 este același cu rgba (0, 0, 0, 153). Amintiți-vă: cu cât am stabilit opacitatea gradientului, cu atât este mai mică opacitatea reflecției.

Poziționarea este doar o problemă de încercare și eroare. Deoarece reflecția are deja poziția stabilită în procente, nu putem să o ajustăm în interiorul pixelului utilizând proprietățile din stânga și de sus. În schimb, vom folosi marja:

 .ie9 #refl margin-top: 20px; margin-stânga: -10px; -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacitate = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.MotionBlur , direcția = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); "  .oldie # refl margin-top: -20px; margin-stânga: -7px; filtru: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2, opacity = .35) progid: DXImageTransform.Microsoft.Blur = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (putere = 15, direcție = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); 

Fiddle | Ecran complet


Pasul 8: Sfaturi de finisare

Vom schimba două lucruri înainte de a vă petrece timpul pe ceva mai bun, cum ar fi să vă uitați de strănut pandas pe YouTube.

  • Plasarea reflexiei dincolo de ETBR (în z-spațiu), deoarece reflecția neclară se situează deasupra ETBR și deasupra strălucirii.
  • Deplasați ETBR în jos. Partea superioară a ETBR se aliniază perfect cu orizontul, care arată foarte ciudat.

Soluțiile:

  • În mod normal, am seta indexul z al ETBR și reflecția respectiv la 2 și 1. Dar, deoarece nu există alte elemente în spatele reflecției din acest demo (din nou, în z-spațiu), putem seta pur și simplu z- indexul reflexiei la -1.
  • Adăugați căptușeală în partea de sus a planului. Deoarece ETBR este un copil al avionului, se va muta în jos.

Iată fișierul CSS. Modificările finale sunt evidențiate:

style.css

 html înălțime: 100%;  corp text-align: center; linia-înălțime: 1; marja: 0; umplutura: 0; fundal-culoare: # 000; înălțime: 100%;  p linie-înălțime: 1.2;  #plane padding-top: 5%; stânga: 0; top 10%; lățime: 100%; fund: 0; min-lățime: 1080px; min-înălțime: 600px; poziția: absolută; overflow: ascuns; overflow-x: vizibil;  #ETBR, #refl culoare: # 004; font-family: Impact, "Arial Black", Helvetica, Arial, sans-serif; text-transform: majuscule; font-size: 200px; fundal-culoare: #FFE; font-weight: bold; padding: 30px; afișare: inline-block; box-shadow: rgba (255,255,240, .2) 0 0 200px 100px, rgba (255,255,240, .3) 0 0 40px, inset rgba (0,0,0, .8) 0 0 20px; raza de graniță: 30 pixeli; poziție: relativă;  #refl poziție: absolută; indicele z: -1; top: 100%; stânga: 0; -moz-transform: scaleY (-1); -webkit-transform: scaleY (-1); -ms-transform: scaleY (-1); filtru: url (filter.svg # blur); / * FF, Opera + IE10 * / -webkit-filtru: estompare (2px); / * webkit * / box-shadow: inset rgba (0,0,0, .8) 0 0 20px, inset # 000 0 50px 100px;  .modern #refl opacitate: .25;  .r9 #refl margin-top: 20px; margin-stânga: -10px; -ms-filter: "progid: DXImageTransform.Microsoft.BasicImage (opacitate = .25) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow =" false ") progid: DXImageTransform.Microsoft.MotionBlur , direcția = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); "  .oldie # refl margin-top: -20px; margin-stânga: -7px; filtru: progid: DXImageTransform.Microsoft.Gradient (startColorstr = # 99000000, endColorstr = # 00000000) progid: DXImageTransform.Microsoft.BasicImage (mirror = 1, rotation = 2, opacity = .35) progid: DXImageTransform.Microsoft.Blur = '3', MakeShadow = "false") progid: DXImageTransform.Microsoft.MotionBlur (putere = 15, direcție = 0) progid: DXImageTransform.Microsoft.Blur (PixelRadius = '3', MakeShadow = "false"); 

index.html

      CSS3 Reflecții             
reflecţiereflecţie

filter.svg

        

Concluzie

Și asta e tot! Acesta este ultimul Fiddle, fără filtrul SVG estompat.

Fiddle | Ecran complet

Ca ceva extra, iată un CSS pur (cu excepția starurilor din fundal) Mac Dock folosind această tehnică.

Sper că v-ați bucurat de acest tutorial și sper că ați învățat ceva nou. Simțiți-vă liber să lăsați orice întrebări în comentarii!