reactjs - Optimera css med mindre loop?
Jag försöker lista ut hur man applicerar en kaskadliknande stileffekt genom att fördröja animationen några sekunder för varje iteration:
.stashCard {
background-color:white;
}
.in(@delay) {
-webkit-animation: swing-in-left-bck .6s cubic-bezier(.175, .885, .32, 1.275) @delay both;
animation: swing-in-left-bck .6s cubic-bezier(.175, .885, .32, 1.275) @delay both
}
.out(@delay) {
-webkit-animation: fade-out .2s ease-out @delay both;
animation: fade-out .2s ease-out @delay both
}
.baseKid {
width: 50px;
height: 50px;
display: inline-block;
}
.selected
{
.kid();
color:yellow;
}
.kid {
.out(0s);
.baseKid();
}
.stashCard:hover .kid {
.in(0s);
.baseKid();
}
.stashCard:hover .kid.selected {
.in(0s);
.baseKid();
}
.stashCard:hover .kid2.selected {
.in(0.05s);
.baseKid();
}
.stashCard:hover .kid2 {
.in(0.05s);
.baseKid();
}
.stashCard:hover .kid3.selected {
.in(0.1s);
.baseKid();
}
.stashCard:hover .kid3 {
.in(0.1s);
.baseKid();
}
.hover {
-webkit-animation: text-shadow-drop-center .6s both;
animation: text-shadow-drop-center .6s both
}
.unhover {
-webkit-animation: untext-shadow-drop-center .6s both;
animation: untext-shadow-drop-center .6s both
}
Och så här applicerar jag det:
export const PopupMenu = (props: InputProps) => {
return <div className="menu" style={props.style}>
<VoteOption count="actors" className={props.selectedCounts.indexOf("actors") >= 0 ? "selected kid" : "kid"} onClick={props.onClick} icon="sentiment_very_satisfied" tip="Real actors" />
<VoteOption count="audio" className={props.selectedCounts.indexOf("audio") >= 0 ? "selected kid2" : "kid2"} onClick={props.onClick} icon="music_video" tip="Great audio quality" />
<VoteOption count="picture" className={props.selectedCounts.indexOf("picture") >= 0 ? "selected kid3" : "kid3"} onClick={props.onClick} icon="photo_camera" tip="Great picture quality" />
</div>;
}
Uppenbarligen är detta ineffektivt och kräver mycket kopiera + klistra in, finns det ett sätt jag kan göra det så att jag kan lägga till så många röstalternativ jag vill och mindre kan skriva ut css som kommer att iterera över alla barnkomponenter och tillämpa med korrekt starttid för förskjutning?
Svar #1
Du kan använda en loop för att uppnå det:
.in(@delay) {
-webkit-animation: swing-in-left-bck .6s cubic-bezier(.175, .885, .32, 1.275) @delay both;
animation: swing-in-left-bck .6s cubic-bezier(.175, .885, .32, 1.275) @delay both
}
.out(@delay) {
-webkit-animation: fade-out .2s ease-out @delay both;
animation: fade-out .2s ease-out @delay both
}
.baseKid {
width: 50px;
height: 50px;
display: inline-block;
}
.loop(@counter) when (@counter > 0) {
.loop((@counter - 1)); // next iteration
.kid@{counter} {
.in(0.05s * (@counter - 1));
.baseKid();
}
.kid@{counter}.seleted {
width: (10px * @counter); // code for each iteration
}
}
.stashCard:hover {
.loop(5); // launch the loop
}
