Pierwsze kroki z kształtami CSS

Owijanie treści ścieżkami niestandardowymi

Razvan Caliman
Razvan Caliman

Przez długi czas projektanci stron internetowych byli zmuszani do tworzenia treści zgodnie z ograniczeniami prostokąta. Większość treści w internecie jest nadal uwięziona w prostych pudełkach, ponieważ większość twórczyń z wykorzystaniem nieprostokątnego układu kończy się frustracją. To się zmieni po wprowadzeniu kształtów CSS, które są dostępne od Chrome 37. Kształty CSS umożliwiają projektantom stron internetowych otoczenie treści wokół niestandardowych ścieżek, takich jak okręgi, elipsy i wielokąty, co pozwala wydostać się z ograniczeń prostokąta.

Kształty można definiować ręcznie lub określać je z obrazów.

Spójrzmy na bardzo prosty przykład.

Być może podczas pierwszego pływania obrazu z przezroczystymi częściami zawartość strony w treści zawijasz i wypełniałaś luki, masz dość naiwnego zachowania jak ja. Ostatnio rozczarował Cię prostokątny kształt zawijania widoczny wokół elementu. Do rozwiązania tego problemu można użyć Kształtów CSS.

Wyodrębnianie kształtu z obrazu
<img class="element" src="image.png" />
<p>Lorem ipsum…</p>

<style>
.element{
  shape-outside: url(image.png);
  shape-image-threshold: 0.5;
  float: left;
}
</style>

Deklaracja CSS shape-outside: url(image.png) informuje przeglądarkę, że ma wyodrębnić kształt z obrazu.

Właściwość shape-image-threshold określa minimalny poziom przezroczystości pikseli, które zostaną użyte do utworzenia kształtu. Wartość musi się mieścić w zakresie od 0.0 (pełna przezroczystość) do 1.0 (pełna nieprzezroczysta). Oznacza to, że do utworzenia kształtu zostaną użyte tylko piksele o przezroczystości co najmniej 50%.shape-image-threshold: 0.5

Właściwość float ma tutaj kluczowe znaczenie. Właściwość shape-outside określa kształt obszaru, wokół którego zostanie owinięta treść. Jeśli jednak nie użyjesz pływającej, efekty tej zmiany nie będą widoczne.

Elementy mają pole powierzchni zmiennoprzecinkowej po przeciwnej stronie wartości float. Jeśli na przykład element z obrazem filiżanki pływa w lewo, na prawo od filiżanki zostanie utworzony obszar zmiennoprzecinkowy. Mimo że możesz opracować obraz z lukami po obu stronach, treść zostanie zawijana tylko wokół kształtu po przeciwnej stronie wyznaczonej przez właściwość pływającej – po lewej lub prawej stronie, ale nigdy z obu tych stron.

W przyszłości będzie można używać shape-outside w elementach, które nie są pływające po wprowadzeniu wykluczeń CSS.

Ręczne tworzenie kształtów

Oprócz wyodrębniania kształtów z obrazów możesz też zakodować je ręcznie. Aby utworzyć kształty, możesz wybrać jedną z kilku wartości funkcjonalnych: circle(), ellipse(), inset() i polygon(). Każda funkcja kształtu akceptuje zestaw współrzędnych i jest połączona z ramką odniesienia, która określa układ współrzędnych. Za chwilę więcej informacji o polach referencyjnych.

FunkcjaCircle()

Ilustracja wartości kształtu okręgu()

Pełny zapis wartości kształtu okręgu to circle(r at cx cy), gdzie r to promień koła, a cx i cy to współrzędne środka okręgu na osi X i Y. Współrzędne środka okręgu są opcjonalne. Jeśli je pominiesz, jako domyślny zostanie użyty środek elementu (przecięcie jego przekątnych).

.element{
  shape-outside: circle(50%);
  width: 300px;
  height: 300px;
  float: left;
}

W przykładzie powyżej treść zostanie obcięta poza okrągłą ścieżką. Pojedynczy argument 50% określa promień okręgu, który w tym przypadku jest równy połowie szerokości lub wysokości elementu. Zmiana wymiarów elementu wpłynie na promień okręgu. To podstawowy przykład responsywności kształtów CSS.

Zanim przejdziemy dalej, na marginesie: trzeba pamiętać, że kształty CSS wpływają tylko na kształt obszaru pływającego wokół elementu. Jeśli element ma tło, kształt nie zostanie przycięty. Aby osiągnąć ten efekt, musisz użyć właściwości z maskowania CSS: clip-path lub mask-image. Właściwość clip-path jest bardzo przydatna, bo jest zgodna z tym samym zapisem co w przypadku kształtów CSS, więc możesz wielokrotnie używać tych samych wartości.

Ilustracja kształtu „Circle()” + Clip-path

Ilustracje w tym dokumencie wykorzystują przycinanie, by wyróżnić kształt i pomóc zrozumieć efekty.

Wróć do kształtu okręgu.

Przy wykorzystaniu wartości procentowych dla promienia okręgu wartość jest obliczana za pomocą nieco bardziej złożonego wzoru: sqrt(width^2 + wysokość^2) / sqrt(2). Warto to zrozumieć, bo dzięki temu łatwiej będzie Ci sobie wyobrazić, jaki będzie kształt okręgu, jeśli wymiary elementu nie będą równe.

We współrzędnych funkcji kształtu można używać wszystkich typów jednostek CSS – px, em, rem, vw, vh itd. Możesz wybrać taki, który jest elastyczny lub wystarczająco sztywny, aby odpowiadał Twoim potrzebom.

Położenie okręgu można dostosować, ustawiając bezpośrednie wartości współrzędnych jego środka.

.element{
  shape-outside: circle(50% at 0 0);
}

Określa położenie środka okręgu na początku układu współrzędnych. Co to jest układ współrzędnych? W tym miejscu wprowadzamy pola referencyjne.

Pola z odwołaniami do kształtów CSS

Pole odniesienia to wirtualne pole wokół elementu, które określa układ współrzędnych używany do rysowania i ustawiania kształtu. Początek układu współrzędnych znajduje się w lewym górnym rogu, a oś X jest w prawo, a oś Y w dół.

System współrzędnych dla kształtów CSS

Pamiętaj, że shape-outside zmienia kształt obszaru pływającego, wokół którego zostanie zwinięta. Obszar zmiennoprzecinkowy rozciąga się do zewnętrznych krawędzi pola określonych przez właściwość margin. Jest ono nazywane margin-box i jest domyślnym polem referencyjnym dla kształtu, jeśli żadne z nich nie jest wyraźnie wspomniane.

Te 2 deklaracje CSS dają identyczne wyniki:

.element{
  shape-outside: circle(50% at 0 0);
  /* identical to: */
  shape-outside: circle(50% at 0 0) margin-box;
}

Nie ustawiono jeszcze marży dla tego elementu. W tym momencie można przyjąć, że punkt początkowy układu współrzędnych i środek okręgu znajdują się w lewym górnym rogu obszaru treści elementu. Zmienia się to po ustawieniu marży:

.element{
  shape-outside: circle(50% at 0 0) margin-box;
  margin: 100px;
}

Punkt początkowy układu współrzędnych znajduje się teraz poza obszarem treści elementu (100 piks. w górę i 100 pikseli po lewej) oraz środek okręgu. Obliczona wartość promienia okręgu rośnie także, uwzględniając zwiększoną powierzchnię układu współrzędnych określoną przez pole odniesienia margin-box.

Układ współrzędnych pola marginesu z marginesem i bez niego
Masz do wyboru kilka opcji pól odniesień: „margin-box”, „granice-box”, „dopełnienie pola” i „content-box”. Ich nazwy wskazują na granice obiektu. Wcześniej objaśniliśmy pole „margin-box”. Jest ono ograniczone zewnętrznymi krawędziami obramowań elementu, a „dopełnienie” – dopełnieniem elementu, a pole „content-box” jest takie samo jak powierzchnia wykorzystywana przez zawartość elementu.
Ilustracja przedstawiająca wszystkie pola referencyjne

Z deklaracją shape-outside można w danym momencie używać tylko 1 pola referencyjnego. Każde pole odniesienia wpływa na kształt w inny i subtelny sposób. Dostępny jest też inny artykuł, który zawiera bardziej szczegółowe informacje i pomaga zrozumieć pola odniesienia do kształtów CSS.

Funkcja elipsy()

Ilustracja wartości kształtu elipsy

Wielokropek wygląda jak ściśnięte okręgi. Są one zdefiniowane jako ellipse(rx ry at cx cy), gdzie rx i ry to promienie elipsy na osi X i Y, a cx i cy to współrzędne środka elipsy.

.element{
  shape-outside: ellipse(150px 300px at 50% 50%);
  width: 300px;
  height: 600px;
}

Wartości procentowe będą obliczane na podstawie wymiarów układu współrzędnych. Nie musisz się tu zabawnie liczyć. Możesz pominąć współrzędne środka elipsy – zostaną one ustalone na podstawie środka układu współrzędnych.

Promieni na osi X i Y można też określać za pomocą słów kluczowych: farthest-side zwraca promień równy odległości między środkiem elipsy a krawędzią pola referencyjnego najdalej od niego. closest-side oznacza przeciwieństwo, czyli największą odległość między środkiem a bokiem.

.element{
  shape-outside: ellipse(closest-side farthest-side at 50% 50%);
  /* identical to: */
  shape-outside: ellipse(150px 300px at 50% 50%);
  width: 300px;
  height: 600px;
}

Jest to przydatne, gdy wymiary (lub pole odniesienia) mogą się zmieniać w nieprzewidywalny sposób, ale chcesz dostosować kształt elipsy.

Tych samych słów kluczowych farthest-side i closest-side można również użyć w przypadku promienia w funkcji kształtu circle().

Funkcja wielokąt()

Ilustracja wartości kształtu wielokąta()

Jeśli okręgi i elipsy za bardzo się ograniczają, funkcja kształtu wielokąta otwiera wiele możliwości. Format to polygon(x1 y1, x2 y2, ...), gdzie określa się pary współrzędnych x y dla każdego wierzchołka (punktu) wielokąta. Minimalna liczba par, która określa wielokąt, to trzy.

.element{
  shape-outside: polygon(0 0, 0 300px, 300px 600px);
  width: 300px;
  height: 600px;
}

Wierzchołki są umieszczane w układzie współrzędnych. W przypadku wielokątów elastycznych można podać wartości procentowe dla niektórych lub wszystkich współrzędnych.

.element{
  /* polygon responsive to font-size*/
  shape-outside: polygon(0 0, 0 100%, 100% 100%);
  width: 20em;
  height: 40em;
}

Dostępny jest opcjonalny parametr fill-rule, zaimportowany z SVG, który instruuje przeglądarkę, jak interpretować „wewnętrznie” wielokąta w przypadku samodzielnie przecinających się ścieżek lub zamkniętych kształtów. Joni Trythall bardzo dobrze objaśnia, jak działa właściwość reguły wypełniania w SVG. Jeśli nie zdefiniowano żadnej wartości, fill-rule przyjmuje domyślnie wartość nonzero.

.element{
  shape-outside: polygon(0 0, 0 100%, 100% 100%);
  /* identical to: */
  shape-outside: polygon(nonzero, 0 0, 0 100%, 100% 100%);
}

Funkcja inset()

Funkcja kształtu inset() umożliwia tworzenie prostokątnych kształtów, wokół których można zawijać treść. Może to brzmieć sprzeczne z intuicją, biorąc pod uwagę wstępne założenie, że usługa CSS kształtuje bezpłatne treści internetowe z prostych pól. Tak może być. Nie udało mi się jeszcze znaleźć przypadku użycia funkcji inset(), którego nie da się zrealizować za pomocą liczby zmiennoprzecinkowej i marży ani polygon(). Chociaż funkcja inset() oferuje bardziej czytelne wyrażenie prostokątnych kształtów niż polygon().

Pełny zapis funkcji wstawionego kształtu to inset(top right bottom left border-radius). Pierwsze 4 argumenty pozycji to odsunięcia do wewnątrz od krawędzi elementu. Ostatni argument to promień obramowania prostokątnego kształtu. Jest opcjonalny, więc możesz go pominąć. Jest on zgodny ze skróconym zapisem border-radius, którego już używasz w CSS.

.element{
  shape-outside: inset(100px 100px 100px 100px);
  /* yields a rectangular shape which is 100px inset on all sides */
  float: left;
}

Tworzenie kształtów na podstawie pól odniesień

Jeśli nie określisz funkcji kształtu na podstawie właściwości shape-outside, możesz zezwolić przeglądarce na pobieranie kształtu z pola odniesienia elementu. Domyślnym polem referencyjnym jest margin-box. Na razie nie ma nic egzotycznego, tak właśnie działa pływanie. Stosując tę technikę, możesz ponownie wykorzystać geometrię elementu. Przyjrzyjmy się właściwości border-radius.

Jeśli użyjesz go do zaokrąglenia rogów elementu pływającego, uzyskasz efekt przycinania, ale obszar swobodny pozostaje prostokątny. Dodaj shape-outside: border-box, aby objąć kontur utworzony przez border-radius.

Wyodrębnianie kształtu z promienia obramowania elementu za pomocą pola odniesienia do ramki
.element{
  border-radius: 50%;
  shape-outside: border-box;
  float: left;
}

W ten sposób można oczywiście korzystać ze wszystkich pól odniesień. Oto kolejne zastosowanie kształtów derywowanych – cudzysłowów pull (przesunięcie).

Tworzenie cytatu pull przesunięcia przy użyciu pola odniesień do pola treści

Efekt przesuwania odsunięcia można uzyskać, stosując tylko właściwości liczby zmiennoprzecinkowej i marginesów. Wymaga to jednak umieszczenia elementu cudzysłowu w drzewie HTML w miejscu, w którym ma być on renderowany.

Oto jak uzyskać taki sam efekt przesunięcia typu pull-quote przy użyciu większej elastyczności:

.pull-quote{
  shape-outside: content-box;
  margin-top: 200px;
  float: left;
}

Wyraźnie ustawiamy pole odniesienia content-box dla układu współrzędnych kształtu. W tym przypadku ilość treści w cudzysłowie określa kształt, wokół którego otacza się treść zewnętrzna. Właściwość margin-top służy do określania pozycji (przesunięcia) cudzysłowu pull niezależnie od jego pozycji w drzewie HTML.

Margines kształtu

Zauważysz, że gdy zawartość wokół kształtu może się ocielić zbyt blisko elementu, Odstępy wokół kształtu możesz dodawać za pomocą właściwości shape-margin.

.element{
  shape-outside: circle(40%);
  shape-margin: 1em;
  float: left;
}

Efekt jest podobny do tego, do jakiego była używana standardowa właściwość margin, z tą różnicą, że shape-margin ma wpływ tylko na przestrzeń wokół wartości shape-outside. Spowoduje to dodanie odstępów wokół kształtu tylko wtedy, gdy w układzie współrzędnych jest na to miejsce. Właśnie dlatego w przykładzie powyżej promień okręgu wynosi 40%, a nie 50%. Gdyby promień był ustawiony na 50%, okrąg zająłby całą przestrzeń w układzie współrzędnych, nie poświęcając miejsca na efekt działania shape-margin. Pamiętaj, że kształt jest ostatecznie ograniczany do margin-box elementu (elementu plusa, gdy ten element znajduje się w okolicy: margin). Jeśli kształt jest większy i wylewa się z niego, zostanie przycięty do: margin-box, dzięki czemu otrzymasz prostokątny kształt.

Pamiętaj, że shape-margin akceptuje tylko jedną wartość dodatnią. Nie ma zapisu długiego. Czym w ogóle jest margines kształtu u góry okręgu?

Animowanie kształtów

Kształty CSS możesz mieszać z wieloma innymi funkcjami CSS, takimi jak przejścia i animacje. Muszę jednak zaznaczyć, że zmiana układu tekstu podczas czytania jest bardzo irytująca dla użytkowników. Jeśli zdecydujesz się na animowanie kształtów, zwróć szczególną uwagę na interfejs.

Możesz animować promienie i środki kształtów circle() oraz ellipse(), pod warunkiem, że będą one określone w wartościach, które przeglądarka może interpolować. Przejście z circle(30%) na circle(50%) jest możliwe. Animacja między circle(closest-side) a circle(farthest-side) powoduje jednak zadławienie przeglądarki.

.element{
  shape-outside: circle(30%);
  transition: shape-outside 1s;
  float: left;
}

.element:hover{
  shape-outside: circle(50%);
}
GIF animowanego okręgu

Ciekawsze efekty można uzyskać, animując kształty polygon(). Należy przy tym pamiętać, że wielokąt musi mieć taką samą liczbę wierzchołków między dwoma stanami animacji. Przeglądarka nie może interpolować po dodaniu lub usunięciu wierzchołków.

Jedną ze sztuczek jest dodanie maksymalnej liczby potrzebnych wierzchołków i umieszczenie ich razem w stanie animacji, tak aby kształtowało się mniej widocznych krawędzi.

.element{
  /* four vertices (looks like rectangle) */
  shape-outside: polygon(0 0, 100% 0, 100% 100%, 0 100%);
  transition: shape-outside 1s;
}

.element:hover{
  /* four vertices, but second and third overlap (looks like triangle) */
  shape-outside: polygon(0 0, 100% 50%, 100% 50%, 0 100%);
}
GIF z animowanym trójkątem

Zawijanie treści wewnątrz kształtu

Zrzut ekranu z prezentacją Alicji w Krainie Czarów z użyciem kształtów CSS do zawijania treści

Początkowa wersja robocza specyfikacji CSS Characters zawierała właściwość shape-inside, która umożliwiała zawijanie treści wewnątrz kształtu. Przez jakiś czas były nawet wdrożenia w Chrome i Webkit. Pamiętaj jednak, że umieszczanie samodzielnie umieszczonych treści w ramach niestandardowej ścieżki wymaga dużo więcej pracy i przeprowadzenia badań w celu uwzględnienia wszystkich możliwych scenariuszy i uniknięcia błędów. W związku z tym odroczono korzystanie z właściwości shape-inside do poziomu kształtów CSS, a jej implementacje zostały wycofane.

Jednak przy odrobinie wysiłku i zachowaniach kompromisów można osiągnąć taki efekt, jakim jest zawijanie treści we właściwy kształt. Polega on na użyciu 2 elementów pływających z elementem shape-outside, które znajdują się na przeciwległych stronach kontenera. Kompromis polega na tym, że należy użyć jednego lub dwóch pustych elementów, które nie mają znaczenia semantycznego, lecz pełnią funkcję podpórek, które mają stworzyć iluzję wewnętrznego kształtu.

<div>
  <div class='left-shape'></div>
  <div class='right-shape'></div>

  Lorem ipsum...
</div>

Położenie elementów słupków .left-shape i .right-shape na górze kontenera jest ważne, ponieważ będą one przesuwane w lewo i w prawo, by były bokami zawartości.

.left-shape{
  shape-outside: polygon(0 0, ...);
  float: left;
  width: 50%;
  height: 100%;
}

.right-shape{
  shape-outside: polygon(50% 0, ...);
  float: right;
  width: 50%;
  height: 100%;
}
Ilustracja obejścia kształtu wewnętrznego dla Alicji w wersji demonstracyjnej

Ten styl sprawia, że 2 rakiety pływające zajmują całą przestrzeń w elemencie, ale właściwości shape-outside wydzielają miejsce na pozostałą część treści.

Jeśli przeglądarka nie obsługuje kształtów CSS, spowoduje to brzydkie efekty, spychając całą zawartość w dół. Dlatego ważne jest, aby coraz częściej korzystać z tej funkcji.

We wcześniejszych przykładach animacji kształtu widać, że przesuwanie tekstu może być uciążliwe. Nie we wszystkich przypadkach użycia można użyć animowanego kształtu. Możesz jednak animować inne właściwości, które współdziałają z kształtami CSS, aby uzyskać efekt w odpowiednich miejscach.

W demonstracji kształtów CSS Alicja w Krainie Czarów posłużyliśmy się pozycją przewijania, aby zmienić górny margines treści. Tekst jest wciśnięty między dwa pływające elementy. Gdy przesuwa się w dół, musi przekazywać się zgodnie z shape-outside z dwóch elementów pływających. Powoduje to wrażenie, że tekst zapada w pamięć i dodaje uczucia narracyjnego. Nieuzasadnione zjawisko? Być może. Ale to wygląda nieźle.

Układ tekstu jest tworzony natywnie przez przeglądarkę, więc wydajność jest wyższa niż w przypadku języka JavaScript. Zmiana marginesu na górze po przewinięciu strony wywołuje jednak wiele zdarzeń przekazywania i renderowania, co może znacznie obniżyć wydajność. Używaj tej funkcji z rozwagą. Jednak użycie kształtów CSS bez ich animowania nie wiąże się z widocznym trafieniem dla wydajności.

Stopniowe ulepszanie

Zacznij od założeniu, że przeglądarka nie obsługuje kształtów CSS, a jeśli ta funkcja zostanie wykryta, skorzystaj z tej możliwości. Dobrym rozwiązaniem do wykrywania cech jest Modernizr. Testy kształtów CSS znajdują się w sekcji „Wykryte elementy spoza rdzenia”.

Niektóre przeglądarki umożliwiają wykrywanie funkcji w CSS za pomocą reguły @supports, bez potrzeby korzystania z bibliotek zewnętrznych. Google Chrome, który obsługuje również kształty CSS, rozpoznaje regułę @supports. Możesz to wykorzystać do stopniowego ulepszania:

.element{
  /* styles for all browsers */
}

@supports (shape-outside: circle(50%)){
  /* styles only for browsers which support CSS Shapes */
  .element{
    shape-outside: circle(50%);
  }
}

Lea Verou napisała więcej o tym, jak używać reguły CSS @supports.

Ujednoznacznienie z wykluczeń usług porównywania cen

Obecnie wiemy, że kształty CSS nosiły nazwę wykluczeń i kształtów CSS na początku korzystania z specyfikacji. Zmiana nazewnictwa może wydawać się niuansem, ale w rzeczywistości jest bardzo ważna. Wykluczenia CSS, teraz dostępne w osobnej specyfikacji, umożliwiają opakowanie treści wokół dowolnie wybranych elementów bez użycia właściwości „float”. Wyobraź sobie, że łączysz treści wokół elementu umieszczonego w absolutnie umieszczonym elemencie. To przykład zastosowania wykluczeń CSS. Kształty CSS określają jedynie ścieżkę, wokół której otacza się treść.

Kształty i wykluczenia to nie to samo, ale wzajemnie się uzupełniają. Kształty CSS są obecnie dostępne w przeglądarkach, podczas gdy wykluczenia CSS nie są jeszcze implementowane za pomocą interakcji kształtów.

Narzędzia do pracy z kształtami CSS

Możesz tworzyć ścieżki w klasycznych narzędziach do tworzenia obrazów, ale żadne z nich w momencie tworzenia tego tekstu nie eksportuje wymaganej składni wartości kształtów CSS. Nawet gdyby tak, to działanie w taki sposób nie byłoby zbyt praktyczne.

Kształty CSS są przeznaczone do stosowania w przeglądarce, gdzie reagują na inne elementy na stronie. Bardzo przydatna jest wizualizacja wpływu edycji kształtu na otaczające je treści. Możesz skorzystać z kilku narzędzi, które ułatwią Ci to zadanie:

Nawiasy kwadratowe: rozszerzenie CSS kształts Editor dla nawiasów używa trybu podglądu na żywo edytora kodu, aby nakładać interaktywny edytor do edytowania wartości kształtów.

Google Chrome: rozszerzenie CSS Characters Editor dla Google Chrome rozszerza dostępne w przeglądarce narzędzia dla programistów o opcje tworzenia i edytowania kształtów. Na wybranym elemencie umieszcza się interaktywny edytor.

Inspektor w Google Chrome ma wbudowaną obsługę wyróżniania kształtów. Najedź kursorem na element z właściwością shape-outside, a wyświetli się on, aby zaprezentować kształt.

Kształty z obrazów: jeśli wolisz generować obrazy, a przeglądarka wyodrębnia z nich kształty, Rebecca Hauck napisała przydatny samouczek dotyczący programu Photoshop.

Polyfill: Google Chrome jest pierwszą dużą przeglądarką, która przesyła kształty CSS. Funkcja ta będzie wkrótce obsługiwana w systemach iOS 8 i Safari 8 firmy Apple. Inni dostawcy przeglądarek mogą wziąć to pod uwagę w przyszłości. Do tego czasu możesz skorzystać z kodu polyfill CSS Characters.

Podsumowanie

W internecie, w którym treści są zwykle ukryte w prostych pudełkach, z funkcji CSS Characters można utworzyć ekspresyjny układ, który wypełni lukę między wiernością a projektem drukowanym. Oczywiście kształty można nadużywać, aby rozpraszać uwagę. Jeśli jednak zastosujesz kształty z gustem i odpowiednim osądem, będą one uatrakcyjnić prezentację treści i przyciągną uwagę użytkownika w sposób, który jest dla nich unikalny.

Przygotowałem dla Ciebie kolekcję prac innych twórców, głównie z druku, o interesujących zastosowaniach w układzie nieprostokątnym. Mam nadzieję, że zainspiruje Cię to do wypróbowania Kształtów CSS i poeksperymentowania z nowymi pomysłami na projektowanie.

Dziękujemy Pearl Chen, Alan Stearns i Zoltan Horvath za przeczytanie tego artykułu i przekazanie cennych wskazówek.