Kawałek Kodu

Pomimo, że multum serwisów udostępnia multum fontów do użycia na stronach internetowych, to czasem jednak brakuje nam odpowiedniego. Dziś o stylu na miarę plazmy, czyli czwartego stanu skupienia materii obok ciekłego, stałego i gazowego (regular, bold, italic). O stylu, który możemy zastosować do dowolnej czcionki, a szczególnie tych, które tego stylu standardowo... nie mają.

Dziurawiec niepospolity.

Tak jak dziurawiec w naturze poprawia apetyt, tak dzisiejszy efekt zaspokoi go. Czy wartość tytułowej właściwości rzeczywiście istnieje? Nie, choć pokażę Ci jak w prosty sposób go "wytworzyć". Przekształcimy dowolny font w jego dziurawą wersję, czyli taką gdzie zostanie obrys każdej litery, ale wnętrze będzie przezroczyste, tak więc będzie prześwitywać przez nie pozostała część strony.

Będziemy potrzebować do tego kilku filtrów bazowych SVG. A! To, że użyjemy filtrów SVG, nie oznacza, że efekt będzie działał tylko w obrębie SVG - będziesz mógł go używać do standardowych elementów HTML.

A więc będą potrzebne filtry:

  • feMorphology - filtr, który na podstawie danych źródłowych pogrubi nam obiekt,
  • feFlood - wypełni obszar kolorem,
  • feComposite - wykona jedną z operacji mieszania obszarów (tzw. kompozycja Porter-Duff).

Cały nasz filtr będzie wyglądał tak:

<!-- <svg> nie musi być widoczny,
     więc ustawiamy wymiary na 0
-->
<svg width="0" height="0">

<!-- nasz cały filtr -->
  <filter id="hollow">

<!-- pierwszy filtr bazowy,
     wejściem jest kanał alpha,
     wszystko co nieprzezroczyste
     lub półprzezroczyste
     pogrubiamy o 1 piksel,
     czyli nasz obiekt/litera
     rozszerzy się o 1px w każdym
     kierunku, jeśli chcesz zmienić
     grubość obrysu, to możesz
     ustalać go niezależnie
     w obydwu osiach (wartość
     atrybutu radius)
-->
    <feMorphology
      operator="dilate"
      radius="1 1"
      in="SourceAlpha"
      result="morphology"
    />

<!-- wlewamy kolor pod obszar litery,
     czyli cały prostokąt, który zajmuje,
     wynik przechowujemy w zmiennej flood
-->
    <feFlood
      flood-color="#000"
      result="flood"
    />

<!-- łączymy wynik pogrubienia
     z prostokątnym, kolorowym
     obszarem, dzięki czemu
     otrzymujemy część wspólną,
     czyli pokolorowany, pogrubiony
     obiekt, wynik przechowujemy
     w zmiennej composite
-->
    <feComposite
      in="flood"
      in2="morphology"
      operator="in"
      result="composite"
    />

<!-- teraz łączymy pokolorowany,
     pogrubiony obiekt z wejściowymi
     danymi, a dzięki operatorowi out,
     zostanie usunięta część wspólna
     i obiekt wejściowy, czyli zostanie
     tylko dorysowany, pogrubiony brzeg
-->
    <feComposite
      in="composite"
      in2="SourceAlpha"
      operator="out"
    />
  </filter>
</svg>

Aby użyć filtr wystarczy dodać dla wybranego elementu właściwość CSS:

p{
  filter: url(#hollow);
}

Efekt będzie taki:

Niestety właściwość color nie ma wpływu na kolor obrysu, bo ten jest zależny od wartości atrybutu flood-color filtra bazowego feFlood. Nic nie stoi na przeszkodzie, aby zmieniać go w CSS (w przypadku tego atrybutu jest to możliwe):

/* odnosimy się poprzez
   id filtra do elementu
   feFlood
*/
#hollow feFlood {
  flood-color: #f00;
}

Pamiętaj jednak, że zmiana tej wartości wpływa na każdy tekst, dla którego użyto tego filtra.

Jeśli teraz pooksperymentujemy z filtrem to okaże się, że w przypadku kiedy używamy czarnego obrysu, możemy pozbyć się feFlood, bo efekt pierwszego filtra to czarne piksele, a co za tym idzie możemy pozbyć się również drugiego filtra feComposite, bo po co mamy farbować czarny obszar na czarny kolor. Filtr możemy wtedy uprościć do:

<svg width="0" height="0">
  <filter id="hollow">
    <feMorphology
      operator="dilate"
      radius="1 1"
      in="SourceAlpha"
      result="morphology"
    />
<!-- teraz łączymy bezpośrednio
     czarny pogrubiony obiekt
     z obiektem źródłowym
-->
    <feComposite
      in="morphology"
      in2="SourceAlpha"
      operator="out"
    />
  </filter>
</svg>

Słowa słowami, ale przydałby się jeszcze rysunek wyjaśniający jak działa ten filtr:

Nie obyłoby się bez wzmianki o Edge, bo na tej przeglądarce do tej pory w CSS nie działają SVG-owe filtry. Jak mówią, to "ostatnie podrygi konającej ostrygi", miejmy więc nadzieję, że nowa wersja oparta o Chromium połączy najlepsze cechy obydwu, a wymieniane w Wikipedii "with enhancements" nie spowodują jej powrotu do stylu pracy ala IE6. Do przeczytania!

 

Przydatne linki:
Operacje łączenia Porter-Duff.
Filtr bazowy feMorphology.
Filtr bazowy feFlood.
Filtr bazowy feComposite.