Getting Started
Linear Slider, a powerful, responsive, and extremely customizable, versatile slider with image (.jpg, .jpg, .png, .webp) and video (.mp4) support, seamlessly running on all major browsers and mobile devices, including iPhone, iPad, iOS, Android, MAC, and Windows, elevating your website's audio experience to a whole new level.
It is built using EcmaScript6 using the latest JavaScript and CSS standards. The spiral/slider is using Three.js and WebGL shaders running exclusively on the device's GPU, the caption is HTML.
Please note that it will not work locally, it has to run on an HTTP or HTTPS protocol.
It is crucial to optimize your images and videos, especially since they are used as textures. Larger image and video files demand more GPU power to display due to the increased number of pixels. To minimize performance impact, select images and videos that are visually close in size to the slider mesh.
Please note that the mettrix are units so visual aproximation is needed, since the slider runs in 3D space and various aspects like camera position or camera rotation, using pixels is not possible.
Installation
The demo presetes are all included in the build folder.
Choose one of the preset HTML files from the build folder and open it in a text editor as a refference.
In the download files inside the build folder you will find the src folder that contains the JavaScript code and content folder that contains the CSS file and other important files like the vector font, the content folder has to be uploaded on the server where the slider is used.
Include the slider CSS file and JavaScript in the header:
<head>
<!-- ... -->
<link rel="stylesheet" href="./content/global.css">
<script type="text/javascript" src="./src/FWDLS.js"></script>
<!-- ... -->
</head>
The next step is to add the initialize code in the page header or footer after the inclusion of the slider JavaScript and CSS files.
<script type="text/javascript">
if(document.readyState == 'complete'){
setupLS();
}else{
document.addEventListener('DOMContentLoaded', ()=>{
setupLS();
});
}
function setupLS(){
new FWDLS({
// Main settings.
instance: 'fwdls0',
parentId: 'myDiv',
displayType: 'afterparent',
sliderDataId: 'sliderData',
initializeWhenVisible: 'no',
maxWidth: 1920,
maxHeight: 1000,
stopScrollingForPx: 0,
autoScale: 'yes',
paralax: 'yes',
stats: 'yes',
gui: 'yes',
showPreloader: 'yes',
preloaderColor: '#FFFFFF',
backgroundColor: '#141414',
bendVertices: 'no',
itemWidth: 2.6,
itemHeight: 1.65,
minItemScaleX: 0.11,
maxItemScaleX: 1,
minItemScaleY: 0.6,
minimizedGap: 0.1,
maximizedGap: 0.5,
showMaskGradient: 'no',
useCaption: 'yes',
useBlackAndWhite: 'yes',
addShiftBaseOnSpeed: 'yes',
curveDistortionStrength: 0,
opacityStrength: 0.6,
scrollSpeedStrength: 0.8,
scrollBendStrength: 1,
mouseFollowStrength: 0,
noiseAmplitude: 0,
noiseFrequency: 0,
noiseSpeed: 0.6,
// Camera postion
horizontalX: 0,
horizontalY: 0,
horizontalZ: 0,
horizontalRotationX: 0,
horizontalRotationY: 0,
horizontalRotationZ: 0,
// Controller
enableControlsAudio: 'yes',
showControlButtons: 'yes',
controlButtonsNormalColor: '#ffffff',
controlsImageHeight: 80,
// Post processing.
antialias: 'yes',
fluid: 'no',
fluidPassMainText: 'LINEAR SLIDER',
fluidPassSubText: 'Hold to start experience',
waveFrequency: 0.1,
waveAmplitude: 0.02,
rgbShiftStrength: 0,
mouseRippleStrength: 0,
glitch: 'no',
buldge: 'no',
buldgeDirection: 'in',
buldgeFixed: 'yes',
buldgeStrength: 1.3,
noise: 'no',
noiseSize: 0.4,
noiseFadeSize: 0.2,
noiseBlurStrength: 0.3,
grid: 'no',
gridAddRGBDistortion: 'yes',
gridSize: 400,
gridMouseRadiusFactor: 0.2,
gridMouseStrengthFactor: 0.48,
gridMouseRelaxation: 0.9,
afterImage: 'no',
afterImageDumping: 0.75,
});
}
</script>
The last step adding the slider is to create a div with an unique ID that will act as the parent/holder for the slider and set the parentId option to point to the div id ex: parentId: 'myDiv', this div can be added anywhere in your page.
<!-- Slider holder. -->
<div id="myDiv"></div>
To add multiple sliders just redo the steps explained above and make sure to change the instance to fwdls1, fwdls2, fwdls3, etc... depending on how many sliders are added, also change the parentId to a different ID and if you want add a different slider by also change the sliderDataId to point to a different slider.
Please read the settings section to understand the slider configuration options.
Setup slider
A slider is created by adding in the page inside the body a div with an unique ID and setting the display style to none, this will be used only as the slider data markup, This unique ID has to be added as the value of the sliderDataId option in the slider settings like this sliderDataId: 'sliderData'.
<!-- Linear Slider. -->
<div id="sliderData" style="display: none;">
<div data-src="media/videos/2.mp4" data-width="1280" data-height="720" data-url="https://fwdapps.net" data-target="_blank" data-background-color="#c5d9da" data-caption-color="#27e6c3" data-buttons-color="#000000">
<div data-caption="">
<p class="fwdls caption">Waterfall</p>
</div>
</div>
<div data-src="media/images/1.jpg" data-width="1920" data-height="1080" data-url="https://fwdapps.net" data-target="_blank" data-background-color="#d3c2b3" data-caption-color="#f09b5f" data-buttons-color="#000000">
<div data-caption="">
<p class="fwdls caption">Quality Cofee</p>
</div>
</div>
<div data-src="media/images/2.jpg" data-width="1920" data-height="1080" data-url="https://fwdapps.net" data-target="_blank" data-background-color="#d3dac2" data-caption-color="#daf05f" data-buttons-color="#000000">
<div data-caption="">
<p class="fwdls caption">Cute Bunny</p>
</div>
</div>
<!-- Add as many slider items as you need ... -->
</div>
Adding slider items is done by adding inside the slider div one or more div's with data paremeters expplained below.
Slider item parameters
- data-src - required media path (.jpg, .jpeg, .png, .webp) or video (.mp4)
- data-width - video or image width in px.
- data-height - video or image height in px.
- data-url - The URL page to open when the mehs is clicked.
- data-target - The URL page to open target, _self or _blank.
- data-background-color - The item background color when maximized.
- data-caption-color - The item caption color when maximized.
- data-buttons-color - The control buttons color.
Slider item caption
An optional caption can be added, the CSS formating is added in the global.css file.
<div data-src="media/images/1.png" data-width="900" data-height="600" data-url="https://fwdapps.net" data-target="_blank">
<div data-caption="">
<p class="fwdls caption">Cute Bunny</p>
</div>
</div>
Modify code
LS is using VITE to build the built final Javascript file.
Settings
Linear Slider has many options that allows to customize it's features. They are added directly in the slider constructor as it can be seen in the installation section.
Example
<script type="text/javascript">
if(document.readyState == 'complete'){
setupLS();
}else{
document.addEventListener('DOMContentLoaded', ()=>{
setupLS();
});
}
function setupLS(){
new FWDLS({
// Main settings.
instance: 'fwdls0',
displayType: 'responsive',
parentId: 'myDiv',
sliderDataId: 'sliderData',
initializeWhenVisible: 'yes',
etc...
})
}
</script>
instance
Type: (String) - default: fwdls0
The slider instance name, this is used to call the API. In the examples files the instance name is set to fwdls0, if you are using multiple sliders instances just change the instance to fwdls1, fwdls2, fwdls3, etc...
parentId
Type: (String) - default: unset
The slider holder/div ID, please make sure that this has an unique ID, it can be added anywhere in your page.
displayType
Type: (String) - default: responsive
The slider display type can be either responsive, which will automatically resize the slider based on the maxWidth and maxHeight settings, or afterParent, which will resize the slider based on its parent element’s width and height.
sliderDataId
Type: (String) - default: unset
The slider data div ID, please read the slider section for more info.
initializeWhenVisible
Type: (String) - default: yes
This can be yes or no, lazy scrolling / loading, the posibility to initialize LS on scroll when the product is visible in the page, this way for example if the product is in a section of a page that is not visible it will not be initialized, instead LS will be initalized only when the user is scrolling to that section in which LS is added.
maxWidth
Type: (Number) - default: 1920
The slider maximum width in px.
maxHeight
Type: (Number) - default: 800
The slider maximum height in px.
stopScrollingForPx
Type: (Number) - default: 620
Adds artificial scrolling (in pixels) to keep the slider visible in the viewport for a longer duration.
autoScale
Type: (String) - default: yes
This can be yes or no and applies if the displayType is reponsive. If set to yes this slider height will always be proportional to the slider width, if set to no the height will be fixed based on the maxHeight property.
paralax
Type: (String) - default: no
This can be yes or no ads parallax vertical scrolling.
stats
Type: (String) - default: yes
This can be yes or no, show the stats, FSP/memory usage.
gui
Type: (String) - default: yes
This can be yes or no, show the GUI live settings.
showPreloader
Type: (String) - default: yes
This can be yes or no, show the preloader.
preloaderColor
Type: (String) - default: #FFFFFF
The preloader color in HEX or RGB.
backgroundColor
Type: (String) - default: #000000
The main background color in HEX or RGB.
bendVertices
Type: (String) - default: yes
This can be yes or no, based on the type sets the vertices beding center type.
itemWidth
Type: (Number) - default: 2.6
The item width in uints.
itemHeight
Type: (Number) - default: 1.65
The item height in uints.
minItemScaleX
Type: (Number) - default: 0.1
The item min scale in uints.
maxItemScaleX
Type: (Number) - default: 1
The item max scale in uints.
minItemScaleY
Type: (Number) - default: 1
The item min scale in uints.
minimizedGap
Type: (Number) - default: 1
The item minimized gap between items in uints.
maximizedGap
Type: (Number) - default: 1
The item maximied gap between items in uints.
showMaskGradient
Type: (String) - default: yes
This can be yes or no, show a top and bottom gradient overlay.
useCaption
Type: (String) - default: yes
This can be yes or no, set this to no if you don't want to use a caption.
useBlackAndWhite
Type: (String) - default: yes
This can be yes or no, sets all meshes/items except the center/focus one to black and white.
addShiftBaseOnSpeed
Type: (String) - default: yes
This can be yes or no, this ads a shift on the item mesh image, moves it a bit based on the drag speed.
curveDistortionStrength
Type: (Number) - default: 0
The item mesh curve distortion based on the drag speed.
opacityStrength
Type: (Number) - default: 0.6
The default items opacity.
scrollSpeedStrength
Type: (Number) - default: 0.6
The scroll/drag speed factor.
scrollBendStrength
Type: (Number) - default: 1
The scroll/drag bending strength factor for the center beding effect.
mouseFollowStrength
Type: (Number) - default: 0
The strength of the rotation of the camera as the mouse moves.
noiseAmplitude
Type: (Number) - default: 0
The item noise amplitude.
noiseFrequency
Type: (Number) - default: 0
The item noise frequency.
noiseSpeed
Type: (Number) - default: 0.6
The item noise speed.
horizontalX
Type: (Number) - default: 0
Camera items x postion.
horizontalY
Type: (Number) - default: 0
Camera items y postion.
horizontalZ
Type: (Number) - default: 1.3
Camera items z postion.
horizontalRotationX
Type: (Number) - default: 0
Camera items x rotation.
horizontalRotationY
Type: (Number) - default: 0
Camera items y rotation.
horizontalRotationZ
Type: (Number) - default: 0
Camera items z rotation.
enableControlsAudio
Type: (String) - default: yes
This can be yes or no enable control buttons audio hover sound.
showControlButtons
Type: (String) - default: yes
This can be yes or no show control buttons.
controlsImageHeight
Type: (Number) - default: #80
The control buttons image tooltip image height.
controlButtonsNormalColor
Type: (String) - default: #FFFFFF
The control buttons color.
antialias
Type: (String) - default: yes
This can be yes or no It uses an anti-aliasing algorithm to enhance visual quality at a small performance cost.
fluid
Type: (String) - default: no
This can be yes or no Ads fulid post-processing effect.
fluidPassMainText
Type: (String) - default: LINEAR SLIDER
Fluid post-porcessing main text.
fluidPassSubText
Type: (String) - default: Hold to start experience
Fluid post-porcessing sub text.
uwaveFrequency
Type: (Number) - default: 0.1
Wave frequency.
waveAmplitude
Type: (Number) - default: 0.02
Wave amplitude.
rgbShiftStrength
Type: (Number) - default: 0
Wave RGB color shift.
mouseRippleStrength
Type: (Number) - default: 0.6
Ripple mouse strength.
glitch
Type: (String) - default: no
This can be yes or no, enable glitch post-processing effect.
buldge
Type: (String) - default: no
This can be yes or no, enable buldge post-processing effect.
buldgeDirection
Type: (String) - default: in
This can be in, out or both, enable buldge post-processing effect.
buldgeFixed
Type: (String) - default: no
This can be yes or no, enable budge fixed post-processing effect.
buldgeStrength
Type: (Number) - default: 1.3
The buldge post-processing strength.
noise
Type: (String) - default: no
This can be yes or no, enable noise post-processing effect.
noiseSize
Type: (Number) - default: 0.4
The noise post-porcessing efect size.
noiseFadeSize
Type: (Number) - default: 0.2
The noise post-porcessing efect fade size.
noiseBlurStrength
Type: (Number) - default: 0.3
The noise post-porcessing efect blur fade size.
grid
Type: (String) - default: no
This can be yes or no, enable grid post-porcessing effect.
gridAddRGBDistortion
Type: (String) - default: no
This can be yes or no, enable grid post-porcessing RGB shigt effect.
gridSize
Type: (Number) - default: 400
The grid post-processing grid size.
gridMouseRadiusFactor
Type: (Number) - default: 0.2
The grid post-processing grid radius size.
gridMouseStrengthFactor
Type: (Number) - default: 0.48
The grid post-processing grid strength factor.
gridMouseRelaxation
Type: (Number) - default: 0.9
The grid post-processing grid relaxation factor.
afterImage
Type: (String) - default: no
This can be yes or no, enable after-image post-porcessing effect.
afterImageDumping
Type: (Number) - default: 0.75
The after-image post-processing strength factor.
Methods
Methods are functions that can be called via the API to execute certain actions.
JavaScript methods look like fwdls0.methodName( /* arguments */ ), please note that fwdls0 is the slider instance name, if you are using multiple sliders don't forget to set the instance unique for each instance like this fwdls1, fwdls2, fwdls3, etc... depending on how many sliders are added.
goToItem
.goToItem(itemId:Number)
Go to a specific item, the couting starts from 0.
destory
.destory()
Destroy the instance and removes it from the DOM.
Events
Linear Slider has many events, they are added via the addEventListener method add accessed via the instance name.
The events must be registered when the API is ready.
// API.
let fwdlsAPI = setInterval(() =>{
if(window['fwdls0']){
console.log('LS API ready')
clearInterval(fwdlsAPI);
// Register the LIKE event.
fwdls0.addEventListener(FWDLS.ERROR, onEerror);
}
}, 100);
// Listen for the LIKE event.
function onEerror(e){
console.log(e)
}
FWDLS.ITEM_UPDATE
FWDLS.ITEM_UPDATE
Dispatched when the slider item postions are changing.
FWDLS.ERROR
FWDLS.ERROR
Dispatched when an error occurs with the slider like not finding the media.
Notes
Ever since I wrote my first lines of code back in the early 2000s, I’ve been chasing a single dream: to turn imagination into living, breathing digital art. Today, thanks to the boundless power of Three.js and the wizardry of GLSL, that dream erupts into reality—unleashing a new era of creative marvels at last!
For me this is more than a job, it is my passion, I love to create innovative tools that my clients can benefit from. @Tibi - FWD.
For support and customizations please write to me directly at this email.