Cards flikcering when pointer moved from right to left in React

Viewed 15

I am using mouse enter and mouse leave event for scaling up the cards. When I move the pointer backwards i.e from second card to first then flickering happens. It works fine when I move from first card to second. The card code is in ListItem.js and it is called in ListSlider. Here is the jsx and css code.

import React, { useState } from 'react';
import './style.css';
import videos from '../../assets/images/Vincenzo _ Official Trailer.mp4';
import { HStack, Stack, Text, Box, Tooltip } from '@chakra-ui/react';
import { AiOutlinePlusCircle } from 'react-icons/ai';
import { IoIosPlayCircle, IoIosThumbsUp } from 'react-icons/io';
import { BsDot } from 'react-icons/bs';
import Modal from './Modal';

const ListItems = ({ index }) => {
  const [isHovered, setIsHovered] = useState(false);
  const trailer = 'https://player.vimeo.com/external/371433846.sd.mp4?s=236da2f3c0fd273d2c6d9a064f3ae35579b2bbdf&profile_id=139&oauth2_token_id=57447761'
  const imgUrl =
    'https://occ-0-5346-58.1.nflxso.net/dnm/api/v6/X194eJsgWBDE2aQbaNdmCXGUP-Y/AAAABfk0bgdUkyANVOxV_ICIDuU9Gqo8M7W3Cx7yjqQRHRx01BrKCzC8mnwHDLHybmbpCKsj34flH_1q3vFeRn-Fk2eHToauI-0SLebLo0r95rIM8LImtwIIDGSOXpB881ycQUvAfz4m4MVwryPITl5XN9jLRsBg6FgLfc92EeyFo_w76gxAsWJB7QmlgkuKh-c.jpg?r=c8b';
  return (
    <div
      className="listItem"
      style={{ left:  index * 225 - 50 + index * 2.5 }}
      onMouseEnter={() => setIsHovered(true)}
      onMouseLeave={() => setIsHovered(false)}
    >
      <img src={imgUrl} />
      {isHovered && (
        <>
          <Stack>
            <Stack>
              <video
                src={'https://youtu.be/QILhvR4QPsQ'}
                autoPlay={true}
                loop
                // muted={true}
                // preLoad="auto"
              />
            </Stack>

            <Stack p={5} gap={2}>
              <HStack justifyContent={'space-between'}>
                <HStack>
                  <IoIosPlayCircle color="#e5e5e5" size={40} />
                  <Tooltip
                    label="Add to My List"
                    placement="top"
                    hasArrow
                    arrowSize={10}
                    bgColor={'#e5e5e5'}
                    color={'black'}
                    fontSize={'md'}
                    px={3}
                    py={1}
                  >
                    <Box>
                      <AiOutlinePlusCircle color="#e5e5e5" size={40} />
                    </Box>
                  </Tooltip>
                  <Box border={'2px solid #e5e5e5'} borderRadius={'full'} p={2}>
                    <IoIosThumbsUp />
                  </Box>
                </HStack>
                {/* Episodes Modal */}
               
                <Modal/>
              </HStack>

              <HStack>
                <Text color={'#46d369'} fontSize={'md'} fontWeight={'bold'}>
                  96% Match
                </Text>
                <Text border={'1px solid #ffffff66'} px={2} fontWeight={'bold'}>
                  16+
                </Text>
                <Text color={'#fff'} fontSize={'md'} fontWeight={'bold'}>
                  20 Episodes
                </Text>
                <Text
                  border={'1px solid #ffffff66'}
                  fontSize={'xs'}
                  fontWeight={'bold'}
                  px={1}
                  borderRadius={'md'}
                >
                  HD
                </Text>
              </HStack>

              <HStack spacing={0}>
                <Text color={'#fff'} fontSize={'md'} fontWeight={'bold'}>
                  Dramedy
                </Text>
                <BsDot color="#777" size={25} />
                <Text color={'#fff'} fontSize={'md'} fontWeight={'bold'}>
                  Corruption
                </Text>
                <BsDot color="#777" size={25} />
                <Text color={'#fff'} fontSize={'md'} fontWeight={'bold'}>
                  Korean
                </Text>
              </HStack>
            </Stack>
          </Stack>
        </>
      )}
    </div>
  );
};

export default ListItems;

import React, { useRef, useState } from 'react';
import { IoIosArrowBack, IoIosArrowForward } from 'react-icons/io';
import { Stack, Text } from '@chakra-ui/react';
import ListItem from './ListItems';
import './style.css';

const ListSlider = () => {
  const [isMoved, setIsMoved] = useState(false);
  const [slideNumber, setSlideNumber] = useState(0);
  const listRef = useRef();

  const handleClick = direction => {
    setIsMoved(true);
    let distance = listRef.current.getBoundingClientRect().x - 50;
    if (direction === 'left' && slideNumber > 0) {
      setSlideNumber(slideNumber - 1);
      listRef.current.style.transform = `translateX(${230 + distance}px)`;
    }
    if (direction === 'right' && slideNumber < 5) {
      setSlideNumber(slideNumber + 1);
      listRef.current.style.transform = `translateX(${-230 + distance}px)`;
    }
  };
  return (
    <>
      <Stack width={'100%'}>
        <Text color={'#e5e5e5'} fontWeight={'700'} fontSize={'xl'} pl={'50px'}>
          Trending Now
        </Text>

        <div className="wrapper">
          <IoIosArrowBack
            className="sliderArrow left"
            onClick={() => handleClick('left')}
            style={{ display: !isMoved && 'none' }}
          />
          <div className="container" ref={listRef}>
            <ListItem index={0} />
            <ListItem index={1} />
            <ListItem index={2} />
            <ListItem index={3} />
            <ListItem index={4} />
            <ListItem index={5} />
            <ListItem index={6} />
            <ListItem index={7} />
            <ListItem index={8} />
            <ListItem index={9} />
          </div>
          <IoIosArrowForward
            className="sliderArrow right"
            onClick={() => handleClick('right')}
          />
        </div>
      </Stack>
    </>
  );
};

export default ListSlider;

body{
  overflow-x: hidden;
}
.wrapper {
  position: relative;
}
.sliderArrow {
  width: 50px;
  height: 100%;
  background-color: rgb(22, 22, 22, 0.5);
  color: white;
  position: absolute;
  z-index: 99;
  top: 0;
  bottom: 0;
  margin: auto;
  cursor: pointer;
}
.left {
  left: 0;
}

.right {
  right: 0;
}

.container {
  margin-left: 50px;
  display: flex;
  margin-top: 10px;
  width: max-content;
  transform: translateX(0px);
  transition: all 1s ease;

}


.listItem {
  width: 247px;
  height: 139px;
  background-color: #181818;
  margin-right: 5px;
  cursor: pointer;
  color: white;
  overflow: hidden;
  transition: transform 0.3s linear;
  
  
}


.listItem img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.listItem video {
  width: 100%;
  height: 175px;
  object-fit: cover;
  position: absolute;
  top: 0;
  left: 0;
}



.listItem:hover {
  transform: scale(1.1);


    width: 320px;
  height: 330px;
  position: absolute; 
  top: -150px; 
  bottom: 0 !important;
  ;
  -webkit-box-shadow: 0px 0px 15px 0px rgba(255, 255, 255, 0.07);
  box-shadow: 0px 0px 15px 0px rgba(255, 255, 255, 0.07);
  border-radius: 5px;
}
.listItem:hover img {
  height: 175px;
}

.modal-video{
  width: 100%;
  height: 445px;
  object-fit: cover;
  
}
.video-content{
  background: linear-gradient(0deg,#181818,transparent 50%);
}

.main-image .play-btn{
  opacity: 0;
}
.main-image:hover .play-btn{
  opacity: 1;
}
.listItem10 {
  width: 121px;
  height: 173px;
  background-color: #181818;
  margin-right: 5px;
  cursor: pointer;
  color: white;
  overflow: hidden;
}
.listItem10 img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.listItem10 video {
  width: 100%;
  height: 175px;
  object-fit: cover;
  position: absolute;
  top: 0;
  left: 0;
}

.listItem10:hover {
  width: 350px;
  height: 360px;
  position: absolute;
  top: -150px;
  -webkit-box-shadow: 0px 0px 15px 0px rgba(255, 255, 255, 0.07);
  box-shadow: 0px 0px 15px 0px rgba(255, 255, 255, 0.07);
  border-radius: 5px;
}
.listItem10:hover img {
  height: 175px;
}

0 Answers
Related