UNPKG

vue3-carousel

Version:

A simple carousel component for Vue 3

257 lines (221 loc) 4.75 kB
:root { --vc-clr-primary: #000; --vc-clr-secondary: #090f207f; --vc-clr-white: #ffffff; } .carousel, .carousel * { box-sizing: border-box; } .carousel { height: var(--vc-carousel-height); overscroll-behavior: none; position: relative; touch-action: pan-y; z-index: 1; } .carousel.is-dragging { touch-action: none; } .carousel__track { display: flex; gap: var(--vc-slide-gap); height: 100%; list-style: none; margin: 0; padding: 0; position: relative; transition: transform ease-out; transition-duration: var(--vc-transition-duration); width: 100%; } .carousel__viewport { height: 100%; overflow: hidden; width: 100%; } .carousel__sr-only { border: 0; clip: rect(0, 0, 0, 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .carousel.is-rtl { direction: rtl; } .carousel.is-ttb .carousel__track { flex-direction: column; } .carousel.is-btt .carousel__track { flex-direction: column-reverse; } .carousel.is-vertical .carousel__slide--clone:first-child { margin-block-start: var(--vc-cloned-offset); } .carousel:not(.is-vertical) .carousel__slide--clone:first-child { margin-inline-start: var(--vc-cloned-offset); } .carousel.is-effect-fade .carousel__track { display: grid; grid-template-columns: 100%; grid-template-rows: 100%; transition: none; } .carousel.is-effect-fade .carousel__slide { grid-area: 1 / 1; height: 100%; opacity: 0; pointer-events: none; transition: opacity ease-in-out; transition-duration: var(--vc-transition-duration); width: 100%; } .carousel.is-effect-fade .carousel__slide--active { opacity: 1; pointer-events: auto; } :root { --vc-icn-width: 100%; } .carousel__icon { fill: currentColor; height: var(--vc-icn-width); width: var(--vc-icn-width); } :root { --vc-nav-background: transparent; --vc-nav-border-radius: 0; --vc-nav-color: var(--vc-clr-primary); --vc-nav-color-hover: var(--vc-clr-secondary); --vc-nav-height: 30px; --vc-nav-width: 30px; } .carousel__next, .carousel__prev { align-items: center; background: var(--vc-nav-background); border: 0; border-radius: var(--vc-nav-border-radius); color: var(--vc-nav-color); cursor: pointer; display: flex; font-size: var(--vc-nav-height); height: var(--vc-nav-height); justify-content: center; padding: 0; position: absolute; inset-block-start: 50%; transform: translateY(-50%); width: var(--vc-nav-width); } .carousel__next--disabled, .carousel__prev--disabled { cursor: not-allowed; opacity: 0.5; } .carousel__next { inset-inline-end: 0; } .carousel__prev { inset-inline-start: 0; } .carousel.is-vertical { .carousel__next, .carousel__prev { inset-inline: auto 50%; inset-block-start: auto; transform: translateX(50%); } &.is-ttb { .carousel__next { inset-block-end: 0; } .carousel__prev { inset-block-start: 0; } } &.is-btt { .carousel__next { inset-block-start: 0; } .carousel__prev { inset-block-end: 0; } } } @media (hover: hover) { .carousel__next:hover, .carousel__prev:hover { color: var(--vc-nav-color-hover); } } :root { --vc-pgn-active-color: var(--vc-clr-primary); --vc-pgn-background-color: var(--vc-clr-secondary); --vc-pgn-border-radius: 0; --vc-pgn-gap: 6px; --vc-pgn-height: 4px; --vc-png-bottom: 10px; --vc-png-left: auto; --vc-png-right: 10px; --vc-pgn-width: 16px; } .carousel__pagination { bottom: var(--vc-png-bottom); display: flex; gap: var(--vc-pgn-gap); justify-content: center; left: 50%; list-style: none; margin: 0; padding: 0; position: absolute; transform: translateX(-50%); } .carousel__pagination-button { background-color: var(--vc-pgn-background-color); border: 0; border-radius: var(--vc-pgn-border-radius); cursor: pointer; display: block; height: var(--vc-pgn-height); margin: 0; padding: 0; width: var(--vc-pgn-width); } .carousel__pagination-button--active { background-color: var(--vc-pgn-active-color); } @media (hover: hover) { .carousel__pagination-button:hover { background-color: var(--vc-pgn-active-color); } } .carousel.is-vertical { .carousel__pagination { bottom: 50%; flex-direction: column; left: var(--vc-png-left); right: var(--vc-png-right); transform: translateY(50%); } .carousel__pagination-button { height: var(--vc-pgn-width); width: var(--vc-pgn-height); } } .carousel.is-btt .carousel__pagination { flex-direction: column-reverse; } .carousel__slide { align-items: center; display: flex; flex-shrink: 0; justify-content: center; margin: 0; transform: translateZ(0); }