Innym sposobem na osiągnięcie tego, szczególnie dla kogoś, kto potrzebuje tego do pracy z trójkątami równobocznymi lub nawet skalenicznymi, tak jak ja, jest użycie filter: drop-shadow(...)
wielu wartości i bez promienia rozmycia. Ma to dodatkową zaletę polegającą na tym, że nie potrzeba wielu elementów ani dostępu do obu : przed i: po (próbowałem to osiągnąć za pomocą: po treści, która była w tekście, więc chciałem również uniknąć pozycjonowania bezwzględnego).
W powyższym przypadku CSS: after może wyglądać następująco ( skrzypce ):
.container {
margin-left: 15px;
width: 200px;
background: #FFFFFF;
border: 1px solid #CAD5E0;
padding: 4px;
position: relative;
min-height: 200px;
}
.container:after {
content: '';
display: block;
position: absolute;
top: 10px;
left: 100%;
width: 0;
height: 0;
border-style: solid;
border-width: 20px 0 40px 15px; /* skewed to show support for non-right-angle triangles */
border-color: transparent transparent transparent #fff;
filter: drop-shadow(1px 0 0 #CAD5E0) drop-shadow(0 .5px 0 #CAD5E0);
}
<div class="container">
Test Container
</div>
Myślę jednak, że są pewne ograniczenia lub dziwactwa:
- Brak obsługi w IE11 (choć wydaje się dobrze w FF, Chrome i Edge)
- Nie jestem do końca pewien, dlaczego .5px dla
<offset-y>
wartości w drugim cieniu () powyżej wygląda bardziej jak 1px niż 1px, chociaż wyobrażam sobie, że jest to związane z trygonometrią (chociaż przynajmniej na moim monitorze nie widzę różnicy między rzeczywiste wartości oparte na trygonometrii lub .5px lub nawet .1px w tym przypadku).
- Obramowania większe niż 1 piksel (cóż, ich wygląd w ten sposób) wydają się nie działać dobrze. A przynajmniej nie znalazłem rozwiązania, chociaż poniżej znajduje się mniej niż optymalny sposób na zwiększenie rozmiaru. (Myślę, że udokumentowany, ale nieobsługiwany czwarty parametr (
<spread-radius>
) drop-shadow () może być tym, czego naprawdę szukam zamiast wielu wartości filtrów, ale dodając go po prostu całkowicie zepsuty.) Tutaj możesz zobaczyć, co zaczyna się dziać po przekroczeniu 1 piksela ( skrzypce ):
.container {
background-color: #eee;
padding: 1em;
}
.container:after {
content: "";
width: 0;
height: 0;
border-style: solid;
border-width: 20.4px 10px 0 10px;
border-color: yellow transparent transparent transparent;
margin-left: .25em;
display: inline-block;
filter: drop-shadow(-6px -4px 0 green) drop-shadow(6px -4px 0 red) drop-shadow(0 6px 0 blue);
}
<div class="container">
Test Container
</div>
Zwróć uwagę na zabawne, że pierwszy (zielony) jest nakładany raz, ale drugi (czerwony) jest nakładany zarówno na żółty trójkąt utworzony przez obramowanie, jak i zielony cień () i ostatni (niebieski) zostanie zastosowany do wszystkich powyższych. (Być może jest to również związane z wyglądem .5px).
Ale myślę, że możesz skorzystać z tych cieni budujących się nawzajem, jeśli potrzebujesz czegoś szerszego niż 1px, zmieniając je na coś takiego jak następujące ( skrzypce ):
filter: drop-shadow(0 0 2.5px red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red);
gdzie pierwszy z nich ma ustawiony promień rozmycia (w tym przypadku 2,5 piksela, chociaż wynik jest pomnożony), a cała reszta ma rozmycie na 0. Ale to zadziała tylko dla tego samego koloru ze wszystkich stron i skutkuje w niektórych zaokrąglonych rogach, a także dość szorstkich krawędziach, im większy masz.