// FROM https://css-tricks.com/css-only-carousel/ @keyframes tonext { 75% { left: 0; } 95% { left: 100%; } 98% { left: 100%; } 99% { left: 0; } } @keyframes tostart { 75% { left: 0; } 95% { left: -300%; } 98% { left: -300%; } 99% { left: 0; } } @keyframes snap { 96% { scroll-snap-align: center; } 97% { scroll-snap-align: none; } 99% { scroll-snap-align: none; } 100% { scroll-snap-align: center; } } * { box-sizing: border-box; scrollbar-color: transparent transparent; /* thumb and track color */ scrollbar-width: 0px; } *::-webkit-scrollbar { width: 0; } *::-webkit-scrollbar-track { background: transparent; } *::-webkit-scrollbar-thumb { background: transparent; border: none; } * { -ms-overflow-style: none; } $height: 30rem; .carousel { ol, li { list-style: none; margin: 0; padding: 0; } position: relative; filter: drop-shadow(0 0 10px #0003); perspective: 100px; // define the height of the whole carousel height: $height; } .carousel__viewport { position: absolute; z-index: 2; top: 0; right: 0; bottom: 0; left: 0; display: flex; overflow-x: scroll; counter-reset: item; scroll-behavior: smooth; scroll-snap-type: x mandatory; } .carousel__slide { position: relative; flex: 0 0 100%; width: 100%; counter-increment: item; z-index: 1; // important: need to have a base set } .slide-content { position: absolute; width: 100%; z-index: 0; .slide-image { width: 100%; padding: 0; margin: 0; img { border-radius: 2px; object-fit: cover; max-height: 22rem; } figcaption { font-size: .9rem; opacity: 0.9; text-align: center; margin-top: 1rem; } } } .slide-inner { } // .carousel__slide:nth-child(even) { // background-color: #99f; // } .carousel__slide:before { position: absolute; top: 50%; left: 50%; transform: translate3d(-50%,-40%,70px); color: #fff; font-size: 2em; } .carousel__snapper { position: sticky; top: 0; left: 0; width: 100%; height: 100%; scroll-snap-align: center; z-index: 2; pointer-events: none; // let the slide content take the pointer events } // @media (hover: hover) { // .carousel__snapper { // animation-name: tonext, snap; // animation-timing-function: ease; // animation-duration: 4s; // animation-iteration-count: infinite; // } // .carousel__slide:last-child .carousel__snapper { // animation-name: tostart, snap; // } // } @media (prefers-reduced-motion: reduce) { .carousel__snapper { animation-name: none; } } .carousel:hover .carousel__snapper, .carousel:focus-within .carousel__snapper { animation-name: none; } .carousel__navigation { position: absolute; z-index: 2; right: 0; bottom: 1rem; left: 0; text-align: center; } .carousel__navigation-list, .carousel__navigation-item { display: flex; justify-content: center; } .carousel__navigation-button { display: inline-block; width: 1.5rem; height: 1.5rem; background-clip: content-box; background-color: #eeeeee; box-shadow: inset 0 0 2px black; border: 0.25rem solid transparent; border-radius: 50%; font-size: 0; transition: transform 0.1s; } .carousel::before, .carousel::after, .carousel__prev, .carousel__next { position: absolute; top: 0; width: 4rem; height: 4rem; transform: translateY($height/2 - 2rem); border-radius: 50%; font-size: 0; outline: 0; z-index: 2; } .carousel::before, .carousel__prev { left: -0.5rem; } .carousel::after, .carousel__next { right: -0.5rem; } .carousel__prev,.carousel__next { // make sure that the square on each side is can be interacted with pointer-events: visible !important; } // the big circle navigation button left and right .carousel::before, .carousel::after { content: ''; z-index: 10; background-color: transparent; opacity: 0.65; background-size: 1.5rem 1.5rem; background-repeat: no-repeat; background-position: center center; font-size: 2.5rem; line-height: 4rem; text-align: center; pointer-events: none; } .carousel::before:hover, .carousel::after:hover { opacity: 1 !important; } .carousel::before { background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpolygon points='0,50 80,100 80,0' /%3E%3C/svg%3E"); } .carousel::after { background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpolygon points='100,50 20,100 20,0' /%3E%3C/svg%3E"); } .carousel__navigation-item { display: flex; align-items: center; } .carousel__navigation-item.enabled { .carousel__navigation-button { opacity: 0.5; background-color: lighten($accent, 0%); } } @media (max-width: $md-breakpoint) { $md-height: 47rem; .carousel { height: $md-height !important; } .carousel::before, .carousel::after, .carousel__prev, .carousel__next { transform: translateY($md-height - 4.5rem) !important; } .carousel::next { } } // layout definitions inside the slides .layout-grid-image { display: grid; grid-column-gap: 2rem; min-height: 25rem; .image-container { margin-top: 1.5rem; display: flex; align-items: center; } } .double-image-container { display: flex; } .layout-grid-image.third { grid-template-columns: 3fr 1fr; } .layout-grid-image.half { grid-template-columns: 1fr 1fr; } @media (max-width: $md-breakpoint) { .carousel { .layout-grid-image.half { display: block; } .layout-grid-image.third { display: block; } .image-container { display: flex; justify-content: center; padding-top: 1rem; } .slide-image { height: 20rem; img { width: auto; height: 100%; max-height: initial !important; object-fit: contain; } } } } @media (max-width: $sm-breakpoint) { .carousel { .image-container { padding-top: 0rem; } .slide-image { height: 16rem; } } }