vue-ssr-carousel
Version:
A performance focused Vue carousel designed for SSR/SSG environments.
192 lines (187 loc) • 4.16 kB
CSS
.ssr-carousel-left-button,
.ssr-carousel-right-button {
position: absolute;
top: 50%;
transform: translateY(-50%);
display: inline-block;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: none;
color: inherit;
border: none;
padding: 0;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
.ssr-carousel-left-button {
left: 2%;
}
.ssr-carousel-right-button {
right: 2%;
}
.ssr-carousel-left-icon,
.ssr-carousel-right-icon {
display: inline-block;
width: 42px;
height: 42px;
background-color: rgba(0,0,0,0.5);
border-radius: 21px;
display: flex;
align-items: center;
justify-content: center;
transition: opacity 0.2s;
}
[aria-disabled] > .ssr-carousel-left-icon,
[aria-disabled] > .ssr-carousel-right-icon {
opacity: 0.1;
cursor: default;
}
:not([aria-disabled]) > .ssr-carousel-left-icon,
:not([aria-disabled]) > .ssr-carousel-right-icon {
opacity: 0.5;
}
@media (hover: hover) {
:not([aria-disabled]) > .ssr-carousel-left-icon:hover,
:not([aria-disabled]) > .ssr-carousel-right-icon:hover {
opacity: 0.85;
}
}
:not([aria-disabled]) > .ssr-carousel-left-icon:active,
:not([aria-disabled]) > .ssr-carousel-right-icon:active {
opacity: 1;
}
:not([aria-disabled]) > .ssr-carousel-left-icon.active,
:not([aria-disabled]) > .ssr-carousel-right-icon.active {
opacity: 1;
}
.ssr-carousel-left-icon:before,
.ssr-carousel-right-icon:before {
content: '';
position: relative;
}
.ssr-carousel-left-icon:before {
width: 0;
height: 0;
background: 0;
border-style: solid;
border-width: 9px 12px 9px 0;
border-color: transparent #fff transparent transparent;
left: -2px;
}
.ssr-carousel-right-icon:before {
width: 0;
height: 0;
background: 0;
border-style: solid;
border-width: 9px 0 9px 12px;
border-color: transparent transparent transparent #fff;
left: 2px;
}
.ssr-carousel-dot-button {
display: inline-block;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: none;
color: inherit;
border: none;
padding: 0;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
.ssr-carousel-dots {
margin-top: 10px;
display: flex;
justify-content: center;
}
.ssr-carousel-dot-icon {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 6px;
border: 2px solid rgba(0,0,0,0.7);
margin-left: 4px;
margin-right: 4px;
transition: opacity 0.2s;
}
[aria-disabled] > .ssr-carousel-dot-icon {
opacity: 1;
background: rgba(0,0,0,0.7);
cursor: default;
}
:not([aria-disabled]) > .ssr-carousel-dot-icon {
opacity: 0.5;
}
@media (hover: hover) {
:not([aria-disabled]) > .ssr-carousel-dot-icon:hover {
opacity: 0.85;
}
}
:not([aria-disabled]) > .ssr-carousel-dot-icon:active {
opacity: 1;
}
:not([aria-disabled]) > .ssr-carousel-dot-icon.active {
opacity: 1;
}
.ssr-carousel-track {
display: flex;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.ssr-carousel-track.dragging {
pointer-events: none;
}
.ssr-carousel-slide {
flex-shrink: 0;
}
.ssr-carousel-rtl .ssr-carousel-slide {
direction: rtl;
}
.ssr-carousel-mask.disabled .ssr-carousel-slide[aria-hidden='true'] {
display: none;
}
.ssr-carousel {
touch-action: pan-y;
direction: ltr;
}
.ssr-carousel-slides {
position: relative;
}
.ssr-peek-values {
position: absolute;
}
.ssr-carousel-mask {
position: relative;
}
.ssr-carousel-mask:not(.no-mask) {
overflow: hidden;
}
.ssr-carousel-mask:not(.disabled):not(.not-draggable) {
cursor: -webkit-grab;
cursor: grab;
}
.ssr-carousel-mask:not(.disabled):not(.not-draggable).pressing {
cursor: -webkit-grabbing;
cursor: grabbing;
}
.ssr-carousel-visually-hidden {
border: 0;
clip: rect(0 0 0 0);
-webkit-clip-path: inset(50%);
clip-path: inset(50%);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
white-space: nowrap;
}