Image Comparison Slider in CSS without using JavaScript
In Previous tutorial I made the 'Image Comparison Slider
' with one line of JavaScript code. Here we are going to do without using JavaScript
.
Lets create input range slider and two divs below it with class names '.front', '.back' inside parent div with class name ''.img-before-after''.
Assign inline CSS variable to input range style="--timeline:--_slider"
<div class="img-before-after">
<input type="range" class="range" style="--timeline:--_slider" value="50">
<div class="front"></div>
<div class="back"></div>
</div>
Lets create CSS. First lets create CSS custom @property --_slider
with syntax: number, inherits: true
, and initial-value: 0
@property --_slider {
syntax: "<number>";
inherits: true;
initial-value: 0;
}
Lets declare global variables.
:root {
--min-size: 0%; // min size when the slider is 0 (to left)
--max-size: 100%; // max size when the slider is 100% (to right)
}
Tricky part: Lets append the slider value to width of .front
div dynamically using CSS variables(--min-size and --max-size values with --_slider). Also assign Property variable name --_slider to timeline-scope
, and animation-name
and animation-timeline
and create @keyframe
:root {
--min-size: 0%;
--max-size: 100%;
--width: calc(var(--max-size)*var(--_slider) + var(--min-size)*(1 - var(--_slider)));
animation: linear;
animation-name: --_slider;
timeline-scope: --_slider;
animation-timeline: --_slider;
}
@keyframes --_slider {
0% {
--_slider: 1;
}
}
Create CSS for elements img-before-after
, input-range
, input-slider-thumb
.
body {
background: #d6d6d6;
}
.img-before-after {
position: relative;
width: 900px;
height: 600px;
}
input[type="range"] {
background: transparent;
width: 100%;
height: 100%;
margin: 0;
outline: none;
position: absolute;
z-index: 2;
-webkit-appearance: none;
overflow: hidden;
}
input[type="range"]::-webkit-slider-thumb {
width: 10px;
height: 600px;
cursor: pointer;
-webkit-appearance: none;
background: black;
view-timeline: var(--timeline) inline;
}
input[type="range"]::-moz-range-thumb {
view-timeline: var(--timeline) inline;
}
Lets add background image for both .front
and .back
divs. Lets assign width property value to var(--width)
. We are appending this from slider value
where we declared in global variables in :root
.
.front, .back {
position: absolute;
height: 600px;
width: var(--width);
background: url("https://shorturl.at/kbKhz") no-repeat;
background-size: cover;
z-index: 1;
}
Lets send .back
div behind .front
div with z-index
and make it grayscale
.
.back {
filter: grayscale(1);
width: 100%;
z-index: 0;
}
Output:
You can try with different variations in CSS like blur
, invert
etc like below.
.back {
filter: blur(5px);
width: 100%;
z-index: 0;
}
invert
.back {
filter: invert(1);
width: 100%;
z-index: 0;
}
Thank you for watching...
Top comments (0)