Istnieje wiele różnych kształtów CSS w CSS Tricks - Shapes of CSS, a ja jestem szczególnie zaskoczony trójkątem:
#triangle-up {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
<div id="triangle-up"></div>
Jak i dlaczego to działa?
css
geometry
polygon
css-shapes
Stanisław Shabalin
źródło
źródło
Odpowiedzi:
Trójkąty CSS: tragedia w pięciu aktach
Jak powiedział Alex , granice o równej szerokości stykają się ze sobą pod kątem 45 stopni:
Gdy nie masz górnej granicy, wygląda to tak:
Następnie dajesz mu szerokość 0 ...
... i wysokość 0 ...
... i wreszcie, czynisz dwie boczne krawędzie przezroczystymi:
Daje to trójkąt.
źródło
:before
lub:after
pseudo klas.left-border
iright-border
, nie-trójkąt równoramienny może być wykonana. A kiedy połączonych jest wiele trójkątów ... jsfiddle.net/zRNgzGranice używają krawędzi pod kątem, w których się przecinają (kąt 45 ° z granicami o równej szerokości, ale zmiana szerokości granic może przekrzywić kąt).
Zobacz jsFiddle .
Ukrywając określone granice, możesz uzyskać efekt trójkąta (jak widać powyżej, zmieniając różne porcje na różne kolory).
transparent
jest często używany jako kolor krawędzi w celu uzyskania kształtu trójkąta.źródło
Zacznij od podstawowego kwadratu i granic. Każda ramka otrzyma inny kolor, abyśmy mogli je odróżnić:
co daje ci to :
Ale nie ma potrzeby górnej granicy, więc ustaw jej szerokość na
0px
. Teraz nasze dolne obramowanie200px
spowoduje, że nasz trójkąt będzie miał wysokość 200 pikseli.i otrzymamy to :
Następnie, aby ukryć dwa trójkąty boczne, ustaw kolor obramowania na przezroczysty. Ponieważ górna ramka została skutecznie usunięta, możemy ustawić kolor górnej granicy również na przezroczysty.
w końcu otrzymujemy to :
źródło
There's another way to draw ..
, co okazuje się być tym samym sposobem :) JednakOdmienne podejście:
Trójkąty CSS3 z transformacją obracają się
Trójkątny kształt jest dość łatwy do wykonania przy użyciu tej techniki. Dla osób, które wolą zobaczyć animację wyjaśniającą działanie tej techniki, jest to:
W przeciwnym razie tutaj znajduje się szczegółowe wyjaśnienie w 4 aktach (nie jest to tragedia), w jaki sposób wykonać trójkąt równoramienny z jednym elementem.
<div class="tr"></div>
KROK 1: Zrób div
Łatwo, po prostu upewnij się, że
width = 1.41 x height
. Możesz użyć dowolnej techniki ( patrz tutaj ), w tym wartości procentowych i wypełnienia-dno, aby utrzymać proporcje i stworzyć responsywny trójkąt . Na poniższym obrazku div ma złotożółtą obwódkę.W tym div wstaw pseudoelement i podaj mu 100% szerokości i wysokości elementu nadrzędnego. Pseudoelement ma niebieskie tło na poniższym obrazku.
W tym momencie mamy ten CSS :
KROK 2: Obróćmy
Po pierwsze, najważniejsze: zdefiniuj początek transformacji . Domyślne pochodzenie jest w środku elementu pseudo i musimy go w lewym dolnym rogu. Dodając ten CSS do pseudoelementu:
transform-origin:0 100%;
lubtransform-origin: left bottom;
Teraz możemy obrócić pseudoelement o 45 stopni zgodnie z ruchem wskazówek zegara
transform : rotate(45deg);
W tym momencie mamy ten CSS :
KROK 3: ukryj
Aby ukryć niechciane części pseudoelementu (wszystko, co przepełnia div z żółtą ramką), wystarczy ustawić
overflow:hidden;
na pojemniku. po usunięciu żółtej ramki otrzymasz ... TRÓJKĄT ! :PRÓBNY
CSS:
KROK 4: idź dalej ...
Jak pokazano w wersji demonstracyjnej , możesz dostosować trójkąty:
skewX()
.Dlaczego warto korzystać z tej techniki?
Dlaczego nie skorzystać z tej techniki?
źródło
skewX
użyteczne byłoby wspomnienie, w jaki sposób wyprowadzono różne szerokości do użycia z .Oto animacja w JSFiddle, którą stworzyłem dla celów demonstracyjnych.
Zobacz też fragment kodu poniżej.
To jest animowany GIF wykonany z screencastu
Pokaż fragment kodu
Wersja losowa
Pokaż fragment kodu
Wersja naraz
Pokaż fragment kodu
źródło
Powiedzmy, że mamy następujący div:
Teraz edytuj CSS krok po kroku, aby uzyskać jasny obraz tego, co się dzieje
KROK 1: JSfiddle Link:
To jest prosty div. Z bardzo prostym CSS. Tak więc laik może zrozumieć. Div ma wymiary 150 x 150 pikseli z ramką 50 pikseli. Obraz jest załączony:
KROK 2: JSfiddle Link:
Teraz właśnie zmieniłem kolor obramowania ze wszystkich 4 stron. Obraz jest załączony.
KROK: 3 JSfiddle Link:
Teraz właśnie zmieniłem wysokość i szerokość div ze 150 pikseli na zero. Obraz jest załączony
KROK 4: JSfiddle:
Teraz wszystkie granice są przezroczyste oprócz dolnej. Obraz jest załączony poniżej.
KROK 5: JSfiddle Link:
Teraz właśnie zmieniłem kolor tła na biały. Obraz jest załączony.
Stąd mamy trójkąt, którego potrzebowaliśmy.
źródło
A teraz coś zupełnie innego ...
Zamiast używać sztuczek css, nie zapomnij o rozwiązaniach tak prostych jak encje HTML:
Wynik:
▲
Zobacz: Jakie są jednostki HTML dla trójkątów w górę iw dół?
źródło
Rozważ poniższy trójkąt
Oto, co otrzymujemy:
Dlaczego wyszło w tym kształcie? Poniższy schemat objaśnia wymiary. Zwróć uwagę, że dolna ramka została ustawiona na 15 pikseli, a na lewą i prawą zastosowano 10 pikseli.
Wykonanie trójkąta pod kątem prostym jest również dość łatwe, usuwając prawą ramkę.
źródło
Idąc o krok dalej, używając css opartego na tym dodałem strzałki do tyłu i do następnych przycisków (tak, wiem, że nie jest to w 100% przeglądarka internetowa, ale mimo wszystko zręczna).
źródło
OK, ten trójkąt zostanie utworzony ze względu na sposób, w jaki granice elementów współpracują ze sobą w HTML i CSS ...
Ponieważ zwykle używamy ramek 1 lub 2px, nigdy nie zauważamy, że ramki tworzą kąty 45 ° względem siebie o tej samej szerokości, a jeśli szerokość się zmienia, zmienia się również stopień kąta, uruchom kod CSS, który utworzyłem poniżej:
Następnie w następnym kroku nie mamy żadnej szerokości ani wysokości, coś takiego:
A teraz sprawiamy, że lewa i prawa krawędź są niewidoczne, aby uczynić nasz pożądany trójkąt, jak poniżej:
Jeśli nie chcesz uruchamiać fragmentu kodu, aby zobaczyć kroki, utworzyłem sekwencję obrazów, aby przejrzeć wszystkie kroki na jednym obrazie:
źródło
Odmienne podejście. Z gradientem liniowym (dla IE, tylko IE 10+). Możesz użyć dowolnego kąta:
Oto jsfiddle
źródło
CSS
clip-path
Czuję, że to pytanie przeoczyło;
clip-path
clip-path
użyje samego elementu, a nie jego granic, aby wyciąć kształt określony w jego parametrach. Wykorzystuje bardzo prosty układ współrzędnych oparty na procentach, co sprawia, że edycja jest bardzo łatwa i oznacza, że możesz go podnieść i stworzyć dziwne i wspaniałe kształty w ciągu kilku minut.Przykład kształtu trójkąta
Minusem
Ma to obecnie poważną wadę, jedną z nich jest duży brak wsparcia, tak naprawdę jest objęty
-webkit-
przeglądarkami i nie ma wsparcia w IE, a jedynie bardzo częściowy w FireFox.Zasoby
Oto kilka przydatnych zasobów i materiałów, które pomogą lepiej zrozumieć,
clip-path
a także rozpocząć tworzenie własnych.clip-path
Generatorclip-path
Dokumentacja MDNclip-path
Obsługa przeglądarkiźródło
To stare pytanie, ale myślę, że warto podzielić się tym, jak stworzyć strzałę za pomocą tej techniki trójkąta.
Krok 1:
Stwórzmy 2 trójkąty, dla drugiego użyjemy
:after
pseudoklasy i umieścimy ją tuż pod drugim:Krok 2
Teraz musimy tylko ustawić dominujący kolor obramowania drugiego trójkąta na ten sam kolor tła:
Pokaż fragment kodu
Baw się wszystkimi strzałami:
http://jsfiddle.net/tomsarduy/r0zksgeu/
źródło
Trójkąt mixin SASS (SCSS)
Napisałem to, aby ułatwić (i DRY) automatyczne wygenerowanie trójkąta CSS:
przykład zastosowania:
Strona placu zabaw
Ważna uwaga:
jeśli trójkąt wydaje się pikselowany w niektórych przeglądarkach, wypróbuj jedną z opisanych tutaj metod .
źródło
Jeśli chcesz zastosować obramowanie do trójkąta, przeczytaj to: Utworzyć trójkąt za pomocą CSS?
Prawie wszystkie odpowiedzi koncentrują się na trójkącie zbudowanym za pomocą obramowania, więc zamierzam rozwinąć tę
linear-gradient
metodę (jak rozpoczęto w odpowiedzi @lima_fil ).Użycie wartości stopnia, takiej jak
45°
, zmusi nas do przestrzegania określonego stosunkuheight/width
w celu uzyskania pożądanego trójkąta, a to nie będzie odpowiadać:Pokaż fragment kodu
Zamiast tego powinniśmy wziąć pod uwagę predefiniowane wartości kierunku jak
to bottom
,to top
itp W tym przypadku możemy uzyskać wszelkiego rodzaju kształt trójkąta, utrzymując ją czuły.1) Prostokąt trójkąt
W celu uzyskania takiego trójkąta trzeba jeden liniowy gradiencie i ukośnie jak
to bottom right
,to top left
,to bottom left
, etc.Pokaż fragment kodu
2) trójkąt równoramienny
Do tego potrzebujemy 2 gradientów liniowych jak wyżej i każdy z nich zajmie połowę szerokości (lub wysokości). To tak, jakbyśmy tworzyli lustrzane odbicie pierwszego trójkąta.
Pokaż fragment kodu
3) trójkąt równoboczny
Ten jest nieco trudny w obsłudze, ponieważ musimy zachować relację między wysokością i szerokością gradientu. Będziemy mieli ten sam trójkąt jak powyżej, ale sprawimy, że obliczenia będą bardziej złożone, aby przekształcić trójkąt równoramienny w równoboczny.
Aby to ułatwić, rozważymy, że szerokość naszego diva jest znana, a wysokość jest wystarczająco duża, aby móc narysować nasz trójkąt wewnątrz (
height >= width
).Mamy dwa gradientu
g1
ig2
, niebieskie jest to szerokośćdiv
w
i każdy gradient będzie miała 50% (tow/2
), a każda strona trójkąta sould równew
. Zielona linia to wysokość obu gradientówhg
i możemy łatwo uzyskać poniższy wzór:(w/2)² + hg² = w²
--->hg = (sqrt(3)/2) * w
--->hg = 0.866 * w
Możemy polegać na
calc()
naszych obliczeniach i uzyskaniu potrzebnego wyniku:Pokaż fragment kodu
Innym sposobem jest kontrolowanie wysokości div i utrzymanie łatwej składni gradientu:
Pokaż fragment kodu
4) Losowy trójkąt
Aby uzyskać losowy trójkąt, jest to łatwe, ponieważ musimy po prostu usunąć warunek 50% każdego, ALE powinniśmy zachować dwa warunki (oba powinny mieć tę samą wysokość, a suma obu szerokości powinna wynosić 100%).
Pokaż fragment kodu
Ale co, jeśli chcemy zdefiniować wartość dla każdej strony? Po prostu musimy ponownie wykonać obliczenia!
Zdefiniujmy
hg1
ihg2
jak wysokość naszego gradientu (oba są równe czerwoną linią) wtedywg1
iwg2
jak szerokość naszego gradientu (wg1 + wg2 = a
). Nie będę szczegółowo wyliczał obliczeń, ale na koniec będziemy mieli:Teraz osiągnęliśmy limit CSS, ponieważ nawet
calc()
nie będziemy w stanie tego zaimplementować, dlatego musimy po prostu ręcznie zebrać ostateczny wynik i użyć go jako stałej wielkości:Pokaż fragment kodu
Premia
Nie powinniśmy zapominać, że możemy również zastosować obrót i / lub pochylenie i mamy więcej opcji, aby uzyskać więcej trójkąta:
Pokaż fragment kodu
I oczywiście powinniśmy pamiętać o rozwiązaniu SVG, które może być bardziej odpowiednie w niektórych sytuacjach:
Pokaż fragment kodu
źródło
oto kolejne skrzypce:
https://jsfiddle.net/qdhvdb17/
źródło
Inni już to dobrze wyjaśnili. Pozwól, że dam ci animację, która szybko to wyjaśni: http://codepen.io/chriscoyier/pen/lotjh
Oto kod do zabawy i nauki pojęć.
HTML:
CSS:
Graj z tym i zobacz, co się stanie. Ustaw wysokość i szerokość na zero. Następnie usuń górną ramkę i ustaw przezroczystość lewej i prawej strony lub po prostu spójrz na poniższy kod, aby utworzyć trójkąt css:
źródło
Jeśli chcesz się bawić z
border-size
,width
aheight
i zobaczyć, jak te, mogą tworzyć różne kształty, spróbuj tego:źródło
Spróbuj tego:-
źródło
Wiem, że to stary, ale chciałbym dodać do tej dyskusji, że istnieje co najmniej 5 różnych metod tworzenia trójkąta przy użyciu samego HTML i CSS.
borders
linear-gradient
conic-gradient
transform
ioverflow
clip-path
Myślę, że wszystkie zostały tutaj omówione, z wyjątkiem metody 3, za pomocą
conic-gradient
, więc podzielę się tutaj:źródło