Es gibt einen ziemlich beliebten CSS-Hack, der transparente Ränder an einem Element mit 0 Breite / 0 Höhe verwendet, um Dreiecke zu imitieren. Hier auf CSS-Tricks gibt es einen CSS-Schnipsel, der dies darstellt.
Wenn Sie sich, wie ich, nie ganz daran erinnern, wie es funktioniert, können wir uns mit Sass helfen.
/// Triangle helper mixin
/// @param {Direction} $direction - Triangle direction, either `top`, `right`, `bottom` or `left`
/// @param {Color} $color [currentcolor] - Triangle color
/// @param {Length} $size [1em] - Triangle size
@mixin triangle($direction, $color: currentcolor, $size: 1em) {
@if not index(top right bottom left, $direction) {
@error "Direction must be either `top`, `right`, `bottom` or `left`.";
}
width: 0;
height: 0;
content: '';
z-index: 2;
border-#{opposite-position($direction)}: ($size * 1.5) solid $color;
$perpendicular-borders: $size solid transparent;
@if $direction == top or $direction == bottom {
border-left: $perpendicular-borders;
border-right: $perpendicular-borders;
} @else if $direction == right or $direction == left {
border-bottom: $perpendicular-borders;
border-top: $perpendicular-borders;
}
}
Zusätzliche Hinweise
* Die Funktion opposite-position stammt von Compass; wenn Sie Compass nicht verwenden, müssen Sie möglicherweise Ihre eigene haben;
* Das Mixin kümmert sich nicht um die Positionierung des Dreiecks; es ist jedoch durchaus möglich, es mit einem Positionierungs-Mixin zu kombinieren;
* Die Direktive content soll es ermöglichen, sie auf Pseudo-Elemente anzuwenden, was in den meisten Fällen tatsächlich der Fall ist.
Verwendung
.foo::before {
@include triangle(bottom);
position: absolute;
left: 50%;
bottom: 100%;
}
.foo::before {
width: 0;
height: 0;
content: '';
z-index: 2;
border-top: 1.5em solid currentColor;
border-left: 1em solid transparent;
border-right: 1em solid transparent;
position: absolute;
left: 50%;
bottom: 100%;
}
Ich würde auch
transform: scale(1.01)hinzufügenhttps://brettstrikesback.com/de-pixelating-the-css-triangle/
Ich denke, die Größe (Randbreite) sollte dynamisch sein. Manchmal benötigen Sie zwei Werte, zum Beispiel:
border-width: 5px 8px;Außerdem haben Sie im Mixing die Wörter "opposite-position" erwähnt. Das bedeutet nichts für SASS... es bricht den Compiler.
Hallo,
Super Fund. Ich habe es ein wenig debuggt. Es funktioniert jetzt einwandfrei mit SCSS. Ich bin mir nicht sicher, was ich mit Ihrem Code falsch gemacht habe, aber ich konnte den Farbparameter nicht anzeigen. Die folgende Mixin-Änderung dient zur Verwendung, z. B.
@include triangle(top,#CCC,8px);
……………………………………………………………..
@mixin triangle($direction, $color: currentcolor, $size: 1em) {
@if not index(top right bottom left, $direction) {
@error “Direction must be either
top,right,bottomoderleft.”;}
width: 0;
height: 0;
content: ”;
z-index: 2;
$perpendicular-borders: $size solid transparent;
@if $direction == top {
border-left: $perpendicular-borders;
border-right: $perpendicular-borders;
border-bottom: $size solid $color;
} @else if $direction == bottom {
border-left: $perpendicular-borders;
border-right: $perpendicular-borders;
border-top: $size solid $color;
} @else if $direction == right {
border-bottom: $perpendicular-borders;
border-top: $perpendicular-borders;
border-left: $size solid $color;
} @else if $direction == left {
border-bottom: $perpendicular-borders;
border-top: $perpendicular-borders;
border-right: $size solid $color;
}
}
/*
* Mixin für grundlegende CSS-Dreiecke
* @include triangle(up, #000, 50px);
* @include triangle(bottomleft, #000, 50px);
*/
@mixin triangle($direction:up, $color:#000, $size:100px) {
@if ($direction == up){
border-color: transparent transparent $color;
border-style: solid;
border-width: 0 $size $size;
height: 0;
width: 0;
}
@if ($direction == down) {
border-color: $color transparent transparent transparent;
border-style: solid;
border-width: $size;
height: 0;
width: 0;
}
@if ($direction == left) {
border-color: transparent $color transparent transparent;
border-style: solid;
border-width: $size $size $size 0;
height: 0;
width: 0;
}
@if ($direction == right) {
border-color: transparent transparent transparent $color;
border-style: solid;
border-width: $size 0 $size $size;
height: 0;
width: 0;
}
@if ($direction == bottomright) {
border-color: transparent transparent $color transparent;
border-style: solid;
border-width: 0 0 $size $size;
height: 0;
width: 0;
}
@if ($direction == bottomleft) {
border-color: transparent transparent transparent $color;
border-style: solid;
border-width: $size 0 0 $size;
height: 0;
width: 0;
}
@if ($direction == topleft) {
border-color: $color transparent transparent transparent;
border-style: solid;
border-width: $size $size 0 0;
height: 0;
width: 0;
}
@if ($direction == topright) {
border-color: transparent $color transparent transparent;
border-style: solid;
border-width: 0 $size $size 0;
height: 0;
width: 0;
}
}
Danke für die Kommentare und Korrekturen. Außerdem denke ich, dass der Größenparameter für linke und rechte Pfeile tatsächlich durch 2 geteilt werden sollte, um eine genaue Höhe für 1em zu erhalten. 1em Pfeile oben und unten und tatsächlich 0,5em Pfeile links und rechts, wenn man von der Textgröße ausgeht.
Für diejenigen, die versuchen, den Code zu verwenden: Sie müssen die Funktion
opposite-directioneinbinden, und Sie benötigen diese Funktion aus dem verlinkten Artikel. Nur ist es opposite-direction, nicht opposite-position (was nicht existiert, das Mixin position ist etwas anderes).