I am trying to create a 'slider' where a user is able to scroll horizontally to navigate to certain 'slider items'. I'm trying to create this with pure css, however; I can't seem to get it working right.
Start:
End:
Alright, let me explain the pictures a little.
Everything within 'Window' is visible. That means also the overflow from the unordered list. What I want is to make the user able to scroll horizontally within the container to move the unordered list. However; I can't use overflow: hidden
or overflow: scroll
on the 'container' since it will hide all the overflowing content, which I do not want.
How can I achieve this or is it even possible to achieve with pure CSS?
My current code: https://jsfiddle.net/f0exzxkw/2/
This can happen if you add a width of 100vw to page content, meaning it automatically makes up 100% of the width of the viewport plus the width of the scrollbar. Be sure to note, however, the scrollbar is always visible to indicate that the content is outside or below the height of the viewport.
Add CSS. Set the overflow property to “auto”. This value adds scrollbar when the content overflows.
hidden - The overflow is clipped, and the rest of the content will be invisible. scroll - The overflow is clipped, and a scrollbar is added to see the rest of the content. auto - Similar to scroll , but it adds scrollbars only when necessary.
To prevent scrolling with this property, just apply the rule overflow: hidden to the body (for the entire page) or a container element. This hides all content beyond the element's border.
I started using the SwiperJs as @Karl mentioned (demo: https://swiper-demo-13-centered-1j4bnx.stackblitz.io/), but after that i started try without it. There is a lot of tricks, and a lot of them can be different and be improved. But, to align correctly the scrollbar, you have to use a custom one. The main idea was have a negative margin on .scroll-container
, using CSS Variables to calculate the space scross the elements.
:root {
--WINDOW-X-SPACE: 20px;
--CONTAINER-X-SPACE: 30px;
}
* {
box-sizing: border-box;
}
html, body {
height: 100vh;
}
body {
background: teal;
margin: 0;
padding: 20px var(--WINDOW-X-SPACE);
overflow-x: hidden;
}
main {
padding: 10px var(--CONTAINER-X-SPACE);
background: purple;
}
.scroll-container {
height: 200px;
margin: 0 calc(-1 * calc(var(--WINDOW-X-SPACE) + var(--CONTAINER-X-SPACE)));
padding: 0 var(--WINDOW-X-SPACE);
display: flex;
overflow: auto;
}
.scroll-container::-webkit-scrollbar {
all: unset;
}
.scroll-container::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
border-radius: 10px;
margin: 0 var(--WINDOW-X-SPACE);
}
.scroll-container::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5);
background-color: white;
}
.list-wrapper {
background: orange;
width: fit-content;
height: 100%;
display: flex;
margin: 0;
padding: 0;
padding-top: 40px;
position: relative;
}
.list-wrapper:before {
content: "Unordened list";
display: block;
position: absolute;
left: 15px;
top: 12px;
}
.list-item {
text-align: center;
font-size: 18px;
background: rgba(255, 255, 255, .5);
border: solid 1px orange;
width: 100px;
flex-shrink: 0;
height: 100%;
/* Center slide text vertically */
display: flex;
justify-content: center;
align-items: center;
}
.fix-offset {
width: var(--WINDOW-X-SPACE);
flex-shrink: 0;
}
<h4>Window</h4>
<main>
<h4>Container</h4>
<div class="scroll-container">
<ul class="list-wrapper">
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
<div class="list-item">List item</div>
</ul>
<span class="fix-offset"></span>
</div>
</main>
Try it: https://codepen.io/Alynva/full/gOPaGVX
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With