├── LICENSE ├── README.md ├── images ├── movie-01.jpg ├── movie-02.jpg ├── movie-03.jpg ├── movie-04.jpg ├── movie-05.jpg ├── movie-06.jpg ├── movie-07.jpg ├── movie-08.jpg ├── movie-09.jpg ├── movie-10.jpg ├── movie-11.jpg ├── movie-12.jpg ├── movie-13.jpg ├── movie-14.jpg ├── movie-wide-1.jpg ├── movie-wide-2.jpg ├── movie-wide-3.jpg ├── movie-wide-4.jpg └── movie-wide-5.jpg ├── index.html ├── readme-images ├── Thumbs.db └── desktop.png ├── script.js ├── style-guide.md └── style.css /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Sadee 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | ![GitHub repo size](https://img.shields.io/github/repo-size/codewithsadee/pure-js-slider) 4 | ![GitHub stars](https://img.shields.io/github/stars/codewithsadee/pure-js-slider?style=social) 5 | ![GitHub forks](https://img.shields.io/github/forks/codewithsadee/pure-js-slider?style=social) 6 | [![Twitter Follow](https://img.shields.io/twitter/follow/codewithsadee_?style=social)](https://twitter.com/intent/follow?screen_name=codewithsadee_) 7 | [![YouTube Video Views](https://img.shields.io/youtube/views/NNQuhOeM0mI?style=social)](https://youtu.be/NNQuhOeM0mI) 8 | 9 |
10 |
11 | 12 |

Pure JavaScript Slider

13 | 14 | A fully responsive and functional vanilla js slider,
Responsive for all devices, build using HTML, CSS, and vanilla JavaScript. 15 | 16 | ➥ Live Demo 17 | 18 |
19 | 20 |
21 | 22 | ### Demo Screeshots 23 | 24 | ![Pure Js Slider Desktop Demo](./readme-images/desktop.png "Desktop Demo") 25 | 26 | ### Prerequisites 27 | 28 | Before you begin, ensure you have met the following requirements: 29 | 30 | * [Git](https://git-scm.com/downloads "Download Git") must be installed on your operating system. 31 | 32 | ### Run Locally 33 | 34 | To run **pure-js-slider** locally, run this command on your git bash: 35 | 36 | Linux and macOS: 37 | 38 | ```bash 39 | sudo git clone https://github.com/codewithsadee/pure-js-slider.git 40 | ``` 41 | 42 | Windows: 43 | 44 | ```bash 45 | git clone https://github.com/codewithsadee/pure-js-slider.git 46 | ``` 47 | 48 | ### Contact 49 | 50 | If you want to contact with me you can reach me at [Twitter](https://www.twitter.com/codewithsadee). 51 | 52 | ### License 53 | 54 | This project is **free to use** and does not contains any license. 55 | -------------------------------------------------------------------------------- /images/movie-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-01.jpg -------------------------------------------------------------------------------- /images/movie-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-02.jpg -------------------------------------------------------------------------------- /images/movie-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-03.jpg -------------------------------------------------------------------------------- /images/movie-04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-04.jpg -------------------------------------------------------------------------------- /images/movie-05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-05.jpg -------------------------------------------------------------------------------- /images/movie-06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-06.jpg -------------------------------------------------------------------------------- /images/movie-07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-07.jpg -------------------------------------------------------------------------------- /images/movie-08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-08.jpg -------------------------------------------------------------------------------- /images/movie-09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-09.jpg -------------------------------------------------------------------------------- /images/movie-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-10.jpg -------------------------------------------------------------------------------- /images/movie-11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-11.jpg -------------------------------------------------------------------------------- /images/movie-12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-12.jpg -------------------------------------------------------------------------------- /images/movie-13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-13.jpg -------------------------------------------------------------------------------- /images/movie-14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-14.jpg -------------------------------------------------------------------------------- /images/movie-wide-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-wide-1.jpg -------------------------------------------------------------------------------- /images/movie-wide-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-wide-2.jpg -------------------------------------------------------------------------------- /images/movie-wide-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-wide-3.jpg -------------------------------------------------------------------------------- /images/movie-wide-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-wide-4.jpg -------------------------------------------------------------------------------- /images/movie-wide-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/images/movie-wide-5.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Pure JavaScript Slider 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 67 | 68 |
69 | 70 |
71 | 72 |
73 |
74 | 75 |
76 |
77 | 78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 |
86 | 87 |
88 |
89 | 90 |
91 |
92 | 93 |
94 |
95 | 96 |
97 |
98 | 99 |
100 |
101 | 102 |
103 |
104 | 105 |
106 |
107 | 108 |
109 | 110 | 113 | 114 | 117 | 118 |
119 | 120 |
121 | 122 |
123 | 124 |
125 |
126 | 127 |
128 |
129 | 130 |
131 |
132 | 133 |
134 |
135 | 136 |
137 |
138 | 139 |
140 |
141 | 142 |
143 |
144 | 145 |
146 |
147 | 148 |
149 |
150 | 151 |
152 |
153 | 154 |
155 | 156 | 159 | 160 | 163 | 164 |
165 | 166 |
167 | 168 |
169 | 170 |
171 |
172 | 173 |
174 |
175 | 176 |
177 |
178 | 179 |
180 |
181 | 182 |
183 |
184 | 185 |
186 |
187 | 188 |
189 | 190 | 193 | 194 | 197 | 198 |
199 | 200 |
201 | 202 | 203 | 204 | 205 | 206 | 209 | 210 | 211 | 214 | 215 | 216 | 217 | 218 | 219 | -------------------------------------------------------------------------------- /readme-images/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/readme-images/Thumbs.db -------------------------------------------------------------------------------- /readme-images/desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codewithsadee/pure-js-slider/c850e1911b76a1f10f1ba3153eda99fbb27a9697/readme-images/desktop.png -------------------------------------------------------------------------------- /script.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | 4 | 5 | const sliders = document.querySelectorAll("[data-slider]"); 6 | 7 | const sliderInit = function (currentSlider) { 8 | 9 | const sliderContainer = currentSlider.querySelector("[data-slider-container]"); 10 | const sliderPrevBtn = currentSlider.querySelector("[data-slider-prev]"); 11 | const sliderNextBtn = currentSlider.querySelector("[data-slider-next]"); 12 | 13 | const totalSliderVisibleItems = Number(getComputedStyle(currentSlider).getPropertyValue("--slider-items")); 14 | 15 | const totalSliderItems = sliderContainer.childElementCount - totalSliderVisibleItems; 16 | 17 | let currentSlidePos = 0; 18 | 19 | /** 20 | * NEXT SLIDE 21 | */ 22 | const slideNext = function () { 23 | 24 | currentSlidePos++; 25 | 26 | sliderContainer.style.transform = `translateX(-${sliderContainer.children[currentSlidePos].offsetLeft}px)`; 27 | 28 | if (currentSlidePos >= totalSliderItems) sliderNextBtn.setAttribute("disabled", ""); 29 | sliderPrevBtn.removeAttribute("disabled"); 30 | 31 | } 32 | 33 | sliderNextBtn.addEventListener("click", slideNext); 34 | 35 | /** 36 | * PREVIOUS SLIDE 37 | */ 38 | const slidePrev = function () { 39 | 40 | currentSlidePos--; 41 | 42 | sliderContainer.style.transform = `translateX(-${sliderContainer.children[currentSlidePos].offsetLeft}px)`; 43 | 44 | if (currentSlidePos <= 0) sliderPrevBtn.setAttribute("disabled", ""); 45 | sliderNextBtn.removeAttribute("disabled"); 46 | 47 | } 48 | 49 | sliderPrevBtn.addEventListener("click", slidePrev); 50 | 51 | const dontHaveExtraItem = totalSliderItems <= 0; 52 | if (dontHaveExtraItem) sliderNextBtn.setAttribute("disabled", ""); 53 | 54 | sliderPrevBtn.setAttribute("disabled", ""); 55 | 56 | } 57 | 58 | for (let i = 0, len = sliders.length; i < len; i++) { sliderInit(sliders[i]); } -------------------------------------------------------------------------------- /style-guide.md: -------------------------------------------------------------------------------- 1 | # Essential Stuff 2 | 3 | ## Html import links 4 | 5 | Ionicon 6 | 7 | ``` html 8 | 9 | 10 | ``` 11 | 12 | --- 13 | 14 | ## Colors 15 | 16 | ``` css 17 | --background: hsl(210, 7%, 11%); 18 | --surface-variant: hsl(218, 8%, 28%); 19 | --secondary-container: hsl(218, 18%, 29%); 20 | --on-secondary-container: hsl(219, 70%, 91%); 21 | ``` 22 | 23 | ## Border Radius 24 | 25 | ``` css 26 | --radius-full: 50%; 27 | --radius-12: 12px; 28 | ``` 29 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | /*-----------------------------------*\ 2 | #style.css 3 | \*-----------------------------------*/ 4 | 5 | /** 6 | * copyright 2022 codewithsadee 7 | */ 8 | 9 | 10 | 11 | 12 | 13 | /*-----------------------------------*\ 14 | #CUSTOM PROPERTY 15 | \*-----------------------------------*/ 16 | 17 | :root { 18 | 19 | /** 20 | * colors 21 | */ 22 | 23 | --background: hsl(210, 7%, 11%); 24 | --surface-variant: hsl(218, 8%, 28%); 25 | --secondary-container: hsl(218, 18%, 29%); 26 | --on-secondary-container: hsl(219, 70%, 91%); 27 | 28 | /** 29 | * border radius 30 | */ 31 | 32 | --radius-full: 50%; 33 | --radius-12: 12px; 34 | 35 | } 36 | 37 | 38 | 39 | 40 | 41 | /*-----------------------------------*\ 42 | #RESET 43 | \*-----------------------------------*/ 44 | 45 | *, 46 | *::before, 47 | *::after { 48 | margin: 0; 49 | padding: 0; 50 | box-sizing: border-box; 51 | } 52 | 53 | img, 54 | button, 55 | ion-icon { display: block; } 56 | 57 | img { 58 | height: auto; 59 | user-select: none; 60 | } 61 | 62 | button { 63 | background: none; 64 | border: none; 65 | font: inherit; 66 | cursor: pointer; 67 | } 68 | 69 | html { 70 | font-size: 62.5%; 71 | scroll-behavior: smooth; 72 | } 73 | 74 | body { 75 | background-color: var(--background); 76 | font-size: 1.6rem; 77 | padding-block: 48px; 78 | overflow-y: overlay; 79 | } 80 | 81 | ::-webkit-scrollbar { width: 6px; } 82 | 83 | ::-webkit-scrollbar-track { background-color: transparent; } 84 | 85 | ::-webkit-scrollbar-thumb { 86 | background-color: transparent; 87 | border-radius: 8px; 88 | } 89 | 90 | body:is(:hover, :focus-visible)::-webkit-scrollbar-thumb { 91 | background-color: var(--surface-variant); 92 | } 93 | 94 | 95 | 96 | 97 | 98 | /*-----------------------------------*\ 99 | #MAIN 100 | \*-----------------------------------*/ 101 | 102 | .container { 103 | padding-inline: 8px; 104 | display: grid; 105 | gap: 24px; 106 | } 107 | 108 | .slider { 109 | --slider-items: 1; /* mandatory for slider */ 110 | 111 | position: relative; 112 | width: 100%; 113 | padding-inline: 16px; 114 | overflow-x: hidden; 115 | } 116 | 117 | .slider::before, 118 | .slider::after { 119 | content: ""; 120 | position: absolute; 121 | top: 0; 122 | width: 24px; 123 | height: 100%; 124 | z-index: 1; 125 | background-image: linear-gradient(to var(--gr-direction, right), 126 | var(--background) 0%, transparent 100%); 127 | } 128 | 129 | .slider::before { left: 0; } 130 | 131 | .slider::after { 132 | right: 0; 133 | --gr-direction: left; 134 | } 135 | 136 | .slider-container { 137 | position: relative; /* mandatory for slider */ 138 | display: flex; 139 | justify-content: flex-start; 140 | transition: transform 250ms ease; 141 | } 142 | 143 | .slider-item { 144 | min-width: calc(100% / var(--slider-items)); 145 | width: calc(100% / var(--slider-items)); 146 | padding-inline: 4px; 147 | } 148 | 149 | .card { 150 | background-color: var(--surface-variant); 151 | border-radius: var(--radius-12); 152 | overflow: hidden; 153 | } 154 | 155 | .img-holder { aspect-ratio: var(--width) / var(--height); } 156 | 157 | .img-cover { 158 | width: 100%; 159 | height: 100%; 160 | object-fit: cover; 161 | } 162 | 163 | .btn-icon { 164 | width: 40px; 165 | height: 40px; 166 | background-color: var(--secondary-container); 167 | color: var(--on-secondary-container); 168 | font-size: 2.4rem; 169 | display: grid; 170 | place-items: center; 171 | border-radius: var(--radius-full); 172 | box-shadow: 0 1px 2px hsla(0, 0%, 0%, 0.5); 173 | } 174 | 175 | .slider-control { 176 | position: absolute; 177 | top: 50%; 178 | transform: translateY(-50%); 179 | z-index: 2; 180 | } 181 | 182 | .slider-control.prev { left: 0; } 183 | 184 | .slider-control.next { right: 0; } 185 | 186 | .slider-control:disabled { display: none; } 187 | 188 | 189 | 190 | 191 | 192 | /*-----------------------------------*\ 193 | #MEDIA QUERIES 194 | \*-----------------------------------*/ 195 | 196 | /** 197 | * responsive for large than 567px screen 198 | */ 199 | 200 | @media (min-width: 567px) { 201 | 202 | .container { 203 | max-width: 480px; 204 | width: 100%; 205 | margin-inline: auto; 206 | } 207 | 208 | .card-slider { --slider-items: 2; } 209 | 210 | } 211 | 212 | 213 | 214 | 215 | 216 | /** 217 | * responsive for large than 768px screen 218 | */ 219 | 220 | @media (min-width: 768px) { 221 | 222 | .container { max-width: 720px; } 223 | 224 | .card-slider { --slider-items: 3; } 225 | 226 | } 227 | 228 | 229 | 230 | 231 | 232 | /** 233 | * responsive for large than 992px screen 234 | */ 235 | 236 | @media (min-width: 992px) { 237 | 238 | .container { max-width: 960px; } 239 | 240 | .card-slider { --slider-items: 4; } 241 | 242 | } 243 | 244 | 245 | 246 | 247 | 248 | /** 249 | * responsive for large than 1200px screen 250 | */ 251 | 252 | @media (min-width: 1200px) { 253 | 254 | .container { max-width: 1150px; } 255 | 256 | .banner-slider { --slider-items: 2; } 257 | 258 | .card-slider { --slider-items: 5; } 259 | 260 | } 261 | 262 | 263 | 264 | 265 | 266 | /** 267 | * responsive for large than 1400px screen 268 | */ 269 | 270 | @media (min-width: 1400px) { 271 | 272 | .container { max-width: 1400px; } 273 | 274 | } --------------------------------------------------------------------------------