Wie React Icons ausfüllen / Alternative?
In meiner React Component (siehe unten) ist leider das Icon ArrowUpCircleSharp von "react-icons" innen unausgefüllt was nicht schön aussieht wenn es sich über Text und Bilder bewegt, andere Icons wie von FontAwesome Material Icons haben das gleiche Problem. Ich habe es versucht mit den Props Stroke, Fill und mit CSS background, ändert aber nur das Schwarze außen und nicht innerhalb vom Icon.
Was kann ich tun ? Will jetzt nicht umbedingt eine ganze Library einbinden für das Icon, bei react-icons hab ich den Vorteil das es nur die benutzen auch wirklich nutzt,
'use client';
import { useEffect, useState } from "react";
import "../.././assets/styles/components/ScrollToTop/ScrollToTop.scss";
import { IoArrowUpCircleSharp} from "react-icons/io5";
export const ScrollToTop = () => {
const [ScrollY,setScrollY] = useState<number>(0);
useEffect(() => {
window.addEventListener("scroll",() => setScrollY(document.documentElement.scrollTop))
return () => {
window.addEventListener("scroll",() => setScrollY(document.documentElement.scrollTop))
}
}, [ScrollY])
return(
<div
onClick={()=>{ScrollY > 100 ?
window.scrollTo({
behavior : "smooth",
left : 0,
top : 0})
:
window.scrollTo({
behavior : "smooth",
left : 0,
top : document.body.scrollHeight});
}}
className={`ScrollToTop ${ScrollY > 100 ? " ScrollToTop_Up" : "ScrollToTop_Down"}`}>
<IoArrowUpCircleSharp/>
</div>
)
}
Mein SCSS: @import "../../globals/_css-resets.scss";
@import "../../globals/_mixins.scss";
@import "../../globals/_variables.scss";
@import "../../globals/_media-queries.scss";
@import "../../globals/_font-face";
.ScrollToTop{
position: fixed;
right: 1vw;
bottom: 1vw;
z-index: 1000;
cursor: pointer;
color: #000;
font-size: 56px;
@media screen and (max-width : $Mobile_Breakpoint_L) {
}
&::before{
/*top left content usw.*/
@include pseudo_positionieren();
background-color: red;
border-radius: 100%;
aspect-ratio: 1/1;
}
}
.ScrollToTop_Up{
svg{
rotate: 0deg;
transition: all .5s;
}
}
.ScrollToTop_Down{
svg{
rotate: -180deg;
transition: all .5s;
}
}
2 Antworten
Ich denke die schnellste Lösung in diesem Fall wäre einfach einen weißen Kreis hinter das Icon zu legen. Dafür könntest du ggf. ein Pseudo-Element (::before / ::after) verwenden, oder einfach ein div, das du um das <IoArrowUpCircleSharp> wrappst.
Mit `aspect-ratio: 1` oder für ältere Browser auch `padding-bottom: 100%` ist das quadratisch und mit `border-radius: 50%` ein schöner runder Kreis. Background-color geben, hinter dem Icon platzieren (falls du ein Pseudo-Element verwendest, ansonsten passt das eh schon) und dann sollte das klappen :)
Das ist mit den Dev Tools zu sehen, kenne mich leider garnicht aus mit SVG Grafiken und wie man diese Editieren kann.
<div class="ScrollToTop ScrollToTop_Up"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M256 48C141.13 48 48 141.13 48 256s93.13 208 208 208 208-93.13 208-208S370.87 48 256 48zm80.09 224L272 208.42V358h-32V208.42L175.91 272l-22.54-22.7L256 147.46 358.63 249.3z"></path></svg></div>
Das mit der Border habe ich gerade nachträglich in die Frage ergänzt, vielleicht kannst du es bei dir Nachstellen und was erkennen. Und dazu habe ich ein Bild ergänzt.
Ich weiß ehrlich nicht was da fehlt
Hindert dich was daran, den Pfeil einfach selbst einzufügen?
<svg xmlns="http://www.w3.org/2000/svg" style="width:1em" viewbox="0 0 5 5">
<circle
style="fill:#000000;fill-opacity:0.979592;stroke:#000000;stroke-width:0.0360134"
id="path231"
cx="2.5"
cy="2.5"
r="2.4819932" />
<path
style="fill:#ffffff;stroke:#000000;stroke-width:0.0362033px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 1.5549134,2.3235735 2.3382928,3.0793488 2.3251167,1.2888531 2.6868601,1.2983891 2.7036294,3.0698122 3.4594588,2.3140371 3.7385519,2.5882142 2.5167683,3.7874409 1.2831558,2.5804655 Z"
id="path457" />
</svg>
Also dieses SVG-Bild statt <IoArrowUpCircleSharp> verwenden.
Danke daran habe ich garnicht gedacht weil ich keine Ahnung von SVG-Grafiken habe, aber wir haben ja heutzutage ChatGPT.
Muss es damit nur in validen JSX Code wegen dem style umändern und minimal kleiner machen dann passt es.
Achso das kannte ich garnicht, dachte immer falsch man macht so simple Icons manuell selber und aufwendige Logos mit Programmen die so teuer sind wie Adobe Canva.
Werde ich mir anschauen aber auch seltsam das react-icons nicht selber die Props hat um das innere auszufüllen.
Hatte mich schon seit Tagen gestört auf meiner Website
Danke aber das hatte ich schon versucht hat leider nicht so geklappt, man sieht den gleichen Effekt wie wenn ich sage
Innen ist es weiß aber da wo das schwarze ist bekommt außen nochmal weißen Rand.