Using checkbox hack and LESS loop to output CSS in order to 'place' previous and next slides, based on total number of slides
A Pen by Nick Moreton on CodePen.
Using checkbox hack and LESS loop to output CSS in order to 'place' previous and next slides, based on total number of slides
A Pen by Nick Moreton on CodePen.
| <h1>Fluid No-JS LESS Slider</h1> | |
| <p>Slider built using the CSS checkbox hack and LESS loops to control colours and slide positioning</p> | |
| <div class="slider"> | |
| <!-- 'fa' classes are for Font Awesome icons http://fontawesome.io --> | |
| <input type="radio" id="control-1" name="slider-control" checked> | |
| <label for="control-1" class="fa fa-circle-o"></label> | |
| <label for="control-1" class="fa fa-circle"></label> | |
| <input type="radio" id="control-2" name="slider-control"> | |
| <label for="control-2" class="fa fa-circle-o"></label> | |
| <label for="control-2" class="fa fa-circle"></label> | |
| <input type="radio" id="control-3" name="slider-control"> | |
| <label for="control-3" class="fa fa-circle-o"></label> | |
| <label for="control-3" class="fa fa-circle"></label> | |
| <input type="radio" id="control-4" name="slider-control"> | |
| <label for="control-4" class="fa fa-circle-o"></label> | |
| <label for="control-4" class="fa fa-circle"></label> | |
| <input type="radio" id="control-5" name="slider-control"> | |
| <label for="control-5" class="fa fa-circle-o"></label> | |
| <label for="control-5" class="fa fa-circle"></label> | |
| <div class="slide" id="slide-1"> | |
| <label for="control-5" class="fa fa-chevron-left fa-4x previous"></label> | |
| <label for="control-2" class="fa fa-chevron-right fa-4x next"></label> | |
| </div> | |
| <div class="slide" id="slide-2"> | |
| <label for="control-1" class="fa fa-chevron-left fa-4x previous"></label> | |
| <label for="control-3" class="fa fa-chevron-right fa-4x next"></label> | |
| </div> | |
| <div class="slide" id="slide-3"> | |
| <label for="control-2" class="fa fa-chevron-left fa-4x previous"></label> | |
| <label for="control-4" class="fa fa-chevron-right fa-4x next"></label> | |
| </div> | |
| <div class="slide" id="slide-4"> | |
| <label for="control-3" class="fa fa-chevron-left fa-4x previous"></label> | |
| <label for="control-5" class="fa fa-chevron-right fa-4x next"></label> | |
| </div> | |
| <div class="slide" id="slide-5"> | |
| <label for="control-4" class="fa fa-chevron-left fa-4x previous"></label> | |
| <label for="control-1" class="fa fa-chevron-right fa-4x next"></label> | |
| </div> | |
| </div> | |
| /* For automation, remove comments - animation cycles through and checks radio buttons. Slider pauses and plays on mouseenter/mouseleave | |
| $(document).ready(function(){ | |
| var time = 4000; | |
| var index = 1; | |
| var count = $('.slide').length; | |
| function slide() { | |
| if (index > count) | |
| index = 1; | |
| $("#control-"+index).click(); | |
| index++; | |
| } | |
| var slider = setInterval(slide,time); | |
| $('.slider').mouseenter(function(){ | |
| clearInterval(slider); | |
| slider = null; | |
| }); | |
| $('.slider').mouseleave(function(){ | |
| slider = setInterval(slide,time); | |
| }); | |
| }); | |
| */ |
| //LESS | |
| //Match number of slides | |
| @slides: 5; | |
| // Set up 'spin' degree for a range of colours | |
| @degree: 360/@slides; | |
| // Set up base color | |
| @base: #ff0000; | |
| // Loop for main slide | |
| .i-loop (@i) when (@i > 0) { | |
| // Background color of each slide | |
| #slide-@{i}{ | |
| background: spin(@base,(@i * @degree)); | |
| } | |
| // Dot colour | |
| #control-@{i} ~ label[for="control-@{i}"] { | |
| color: spin(@base,(@i * @degree)); | |
| } | |
| // Show full dot when checked | |
| #control-@{i}:checked ~ label[for="control-@{i}"].fa-circle { | |
| display:inline-block; | |
| } | |
| // Hide hollow dot | |
| #control-@{i}:checked ~ label[for="control-@{i}"].fa-circle-o { | |
| display:none; | |
| } | |
| // Show 'checked' slide | |
| input[type=radio]#control-@{i}:checked ~ div#slide-@{i} { | |
| left:0; | |
| } | |
| // Loop for all previous slides up to @i variable | |
| @maxj: @i - 1; | |
| .j-loop (@j) when (@j > 0 ) { | |
| //Place slides off to the left | |
| input[type=radio]#control-@{i}:checked ~ div#slide-@{j} { | |
| left:((@i - @j) * -100%); | |
| } | |
| .j-loop(@j - 1); | |
| } | |
| .j-loop (0) {} | |
| .j-loop(@maxj); | |
| // Loop for all 'next' slides from @i up to total @slides | |
| @maxk: @slides; | |
| .k-loop (@k) when (@k > @i ) { | |
| // place slides off to the right | |
| input[type=radio]#control-@{i}:checked ~ div#slide-@{k} { | |
| left:((@k - @i) * 100%); | |
| } | |
| .k-loop(@k - 1); | |
| } | |
| .k-loop (0) {} | |
| .k-loop(@maxk); | |
| .i-loop(@i - 1); | |
| } | |
| .i-loop (0) {} | |
| .i-loop(@slides); | |
| // See http://stackoverflow.com/questions/17011090/how-do-i-create-nested-loops-with-less-css for more information on nested loops | |
| // CSS | |
| * { | |
| box-sizing:border-box; | |
| } | |
| body { | |
| text-align:center; | |
| padding-bottom:30px; | |
| } | |
| input[type=radio] { | |
| position: absolute; | |
| top: -9999px; | |
| left: -9999px; | |
| } | |
| label { | |
| margin: 10px 0; | |
| cursor: pointer; | |
| } | |
| .slider { | |
| // Width can be changed, slides will automatically resize | |
| width:100%; | |
| margin:auto; | |
| height:400px; | |
| overflow:hidden; | |
| position:relative; | |
| } | |
| .slide { | |
| width:100%; | |
| height:400px; | |
| position:absolute; | |
| transition: left ease-in-out 500ms; | |
| color:white; | |
| } | |
| .previous { | |
| float:left; | |
| margin-top:160px; | |
| display:block; | |
| opacity:0; | |
| transition: opacity ease-in-out 300ms; | |
| } | |
| .slide:hover > .previous { | |
| opacity:0.6; | |
| } | |
| .previous:hover{ | |
| opacity:1 !important; | |
| } | |
| .next { | |
| float:right; | |
| margin-top:160px; | |
| display:block; | |
| opacity:0; | |
| transition: opacity ease-in-out 300ms; | |
| } | |
| .slide:hover > .next { | |
| opacity:0.6; | |
| } | |
| .next:hover{ | |
| opacity:1 !important; | |
| } | |
| .fa-circle { | |
| display:none; | |
| } |