react-marquee-slider-vertical
Version:
The marquee slider of your wildest dreams. Only for React.js ⛺
127 lines (111 loc) • 3.29 kB
JavaScript
import React, { useEffect, useState } from "react";
import styled from "styled-components";
import times from "lodash/times";
import Marquee, { Motion, randomIntFromInterval } from "../../../src";
import { withSize } from "react-sizeme";
import { nanoid } from "nanoid";
import FullWidth from "../components/FullWidth";
import logoAmazon from "../images/amazon.svg";
import logoAngular from "../images/angular.svg";
import logoApple from "../images/apple.svg";
import logoGatsby from "../images/gatsby.svg";
import logoLamborghini from "../images/lamborghini.svg";
import logoMicrosoft from "../images/microsoft.svg";
import logoNext from "../images/next.svg";
import logoPython from "../images/python.svg";
import logoRollsRoyce from "../images/rolls-royce.svg";
import logoTesla from "../images/tesla-motors.svg";
import logoTwilio from "../images/twilio.svg";
const Height = styled.div`
position: relative;
width: 100%;
height: ${(props) => (props.height ? props.height + "px" : "auto")};
`;
const Company = styled.div`
position: relative;
width: ${(props) => props.scale * 75}px;
height: ${(props) => props.scale * 75}px;
`;
const Circle = styled.div`
position: absolute;
transform: scale(0.5);
object-position: center center;
will-change: transform, opacity;
width: ${(props) => props.scale * 150}px;
height: ${(props) => props.scale * 150}px;
top: -50%;
left: -50%;
border-radius: 50%;
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1), 0 3px 10px rgba(0, 0, 0, 0.07);
display: flex;
justify-content: center;
align-items: center;
`;
const Logo = styled.img`
display: block;
/* https://stackoverflow.com/questions/24843676/how-can-i-fit-a-square-html-image-inside-a-circle-border */
/* just making it < 70.7% */
width: 60%;
height: 60%;
`;
const icons = [
logoAmazon,
logoGatsby,
logoAngular,
logoApple,
logoLamborghini,
logoMicrosoft,
logoNext,
logoPython,
logoRollsRoyce,
logoTesla,
logoTwilio,
];
const Companies = ({ size, onStartPerformance, onEndPerformance }) => {
const [key, setKey] = useState(nanoid());
useEffect(() => {
setKey(nanoid());
}, [size, size.width]);
let scale = 0.5;
if (size && size.width > 800) {
scale = 0.65;
}
if (size && size.width > 1100) {
scale = 0.8;
}
if (size && size.width > 1400) {
scale = 1;
}
return (
<FullWidth>
<Height height={500}>
<Marquee
key={key}
velocity={12}
scatterRandomly
minScale={0.7}
resetAfterTries={200}
onInit={onStartPerformance}
onFinish={onEndPerformance}
>
{times(8, Number).map((id) => (
<Motion
key={`marquee-example-company-${id}`}
initDeg={randomIntFromInterval(0, 360)}
direction={Math.random() > 0.5 ? "clockwise" : "counterclockwise"}
velocity={10}
radius={scale * 100}
>
<Company scale={scale}>
<Circle scale={scale}>
<Logo src={icons[id]} alt="" />
</Circle>
</Company>
</Motion>
))}
</Marquee>
</Height>
</FullWidth>
);
};
export default React.memo(withSize()(Companies));