JSFiddle - React, Tailwind, and code Playground

by Alexandru Gatea

HTML

<div class="tw-homepage-carousel">
  <svg class="tw-svg-clip">
    <clipPath id="slideMask" clipPathUnits="objectBoundingBox">
      <path d="M0,0 V1 H0.724 a0.03,0.048,0,0,0,0.028,-0.03 L1,0"></path>
    </clipPath>
  </svg>
  <div class="tw-carousel-slider">
    <div class="tw-homepage-carousel-inner">
      <div class="tw-carousel-slide">
        <div class="tw-carousel-slide-content">
          <div class="tw-container">
            <h1>Heading</h1>
          </div>
        </div>
      </div>
      <div class="tw-carousel-slide">
        <div class="tw-carousel-slide-content">
          <div class="tw-container">
            <h1>Heading</h1>
          </div>
        </div>
      </div>
            <div class="tw-carousel-slide">
        <div class="tw-carousel-slide-content">
          <div class="tw-container">
            <h1>Heading</h1>
          </div>
        </div>
      </div>
      <div class="tw-carousel-slide">
        <div class="tw-carousel-slide-content">
          <div class="tw-container">
            <h1>Heading</h1>
          </div>
        </div>
      </div>
    </div>
  </div>

  <div class="tw-carousel-nav">
    next
  </div>

</div>

CSS

* {
  box-sizing: border-box;
}

body {
  background: #0E0727
}

.tw-svg-clip {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10;
  pointer-events: none;
}

.tw-homepage-carousel {
  width: 100%;
  height: 0;
  padding-bottom: 56.25%;
  position: relative;
  overflow: hidden;
  clip-path: url(#slideMask);
}

.tw-homepage-carousel-inner, 
.tw-carousel-slider {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  display: flex;
  transition: all 0.3s ease-in-out;
}

.tw-carousel-slider {
  padding-right: 0px;
}

.tw-carousel-slide,
.tw-carousel-slide-content {
  
  background: #f00;
  width: 90%;
  position: relative;
  overflow: hidden;
  background: #0E0727;
}

.tw-carousel-slide-content {
  background: #221C3A;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 5px;
  width: calc(100% - 7px);
    display: flex;
  align-items: center;
}


.tw-carousel-slide:not(:first-child) {
  margin-left: -7%;
  z-index: -1;
}

.tw-carousel-nav {
  position: absolute;
  width: 30%;
  height: 100%;
  top: 0;
  right: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}



.tw-carousel-slide-content .tw-container{
  width: 80%;
  margin: auto;
  display: flex;
  align-items: center;
  font-size: 60px;
  font-family: sans-serif;
  color: #fff;
  
}

JavaScript

let carouselCount = $(".tw-homepage-carousel-inner .tw-carousel-slide").length;

let count = carouselCount;
$('.tw-carousel-slide').each(function(){
		$(this).css("z-index", count);
    count --;
});

$('.tw-carousel-nav').css("z-index", carouselCount + 1);

if (carouselCount <=2) {
	
  $(".tw-carousel-slide:first-child").clone().addClass("tw-slide-clone").appendTo(".tw-homepage-carousel-inner");
	carouselCount = $(".tw-homepage-carousel-inner .tw-carousel-slide").length;
}

let carouselWidth = carouselCount * $(".tw-carousel-slider").width();
let slideWidth = carouselWidth / carouselCount;


$(".tw-homepage-carousel-inner").width(carouselWidth + "px");
$(".tw-homepage-carousel-inner .tw-carousel-slide").width(slideWidth + "px");


let translateX = slideWidth - (0.07 * carouselWidth);


$(".tw-carousel-nav").on("click", function(){

	$(".tw-homepage-carousel-inner").css({
  	transform: "translateX(-" + translateX + "px)"
  });
      translateX += translateX;
});