<h1>MonoChromey</h1>
<p>Hold down on the image to temporarily cancel the effect</p>
<form>
<input type="range" id="hue-input" min="0" max="360" value="60"><br>
<input type="text" id="style-output" readonly>
</form>
<p class="image-holder">
<img src="https://source.unsplash.com/1200x800/?nature,water" alt="Random water image from unsplash">
</p>
<p>Home: <a href="https://atornblad.se/">atornblad.se</a>, Twitter: <a href="https://twitter.com/atornblad">@atornblad</a>, Dev: <a href="https://dev.to/atornblad">@atornblad</a></p>
<p>Blog: <a href="https://atornblad.se/monochromey-css">atornblad.se/monochromey-css</a></p>
* {
box-sizing: border-box;
}
html, body {
margin: 0;
display: flex;
flex-direction: column;
justify-content: center;
}
html {
align-items: center;
}
body {
background: #333;
align-items: stretch;
min-height: 100vh;
font-family: sans-serif;
color: #eee;
text-align: center;
}
h1, p {
margin-bottom: 0;
}
a:link, a:visited {
color: #19f;
text-decoration: underline;
}
a:link::first-letter {
text-decoration: none;
}
body > * {
max-width: 90vw;
}
p.image-holder > img {
border-radius: 10px;
box-shadow: 0 2px 3px 1px black;
transition: filter 0.2s ease-in-out;
}
form {
margin-top: 1rem;
}
input[type=text] {
width: 100%;
margin-top: 20px;
font-family: monospace;
font-size: 20px;
border-radius: 5px;
padding: 10px;
}
input[type=range] {
-webkit-appearance: none;
width: 100%;
background: transparent;
}
input[type=range]:focus {
outline: none;
}
input[type=range]::-ms-track {
width: 100%;
cursor: pointer;
background: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00);
border-color: transparent;
color: transparent;
}
input[type=range]::-webkit-slider-runnable-track{
width: 100%;
height: 15px;
cursor: pointer;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
background: linear-gradient(to right, hsl(0deg 50% 50%), hsl(60deg 50% 50%), hsl(120deg 100% 50%), hsl(180deg 50% 50%), hsl(240deg 50% 50%), hsl(300deg 50% 50%), hsl(360deg 50% 50%));
border-radius: 3px;
border: 1px solid #010101;
}
input[type=range]:focus::-webkit-slider-runnable-track {
background: linear-gradient(to right, hsl(0deg 100% 50%), hsl(60deg 100% 50%), hsl(120deg 100% 50%), hsl(180deg 100% 50%), hsl(240deg 100% 50%), hsl(300deg 100% 50%), hsl(360deg 100% 50%));
}
input[type=range]::-moz-range-track{
width: 100%;
height: 15px;
cursor: pointer;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
background: linear-gradient(to right, hsl(0deg 50% 50%), hsl(60deg 50% 50%), hsl(120deg 100% 50%), hsl(180deg 50% 50%), hsl(240deg 50% 50%), hsl(300deg 50% 50%), hsl(360deg 50% 50%));
border-radius: 3px;
border: 1px solid #010101;
}
input[type=range]:focus::-moz-range-track {
background: linear-gradient(to right, hsl(0deg 100% 50%), hsl(60deg 100% 50%), hsl(120deg 100% 50%), hsl(180deg 100% 50%), hsl(240deg 100% 50%), hsl(300deg 100% 50%), hsl(360deg 100% 50%));
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
border: 1px solid #000000;
height: 36px;
width: 16px;
border-radius: 3px;
background: #ffffff;
cursor: pointer;
margin-top: -12px;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; /* Add cool effects to your sliders! */
}
input[type=range]::-moz-range-thumb {
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
border: 1px solid #000000;
height: 36px;
width: 16px;
border-radius: 3px;
background: #ffffff;
cursor: pointer;
}
@media (max-width: 1279px) {
p.image-holder > img {
width: 800px;
height: auto;
}
input[type=text] {
font-size: 16px;
padding: 8px;
}
}
@media (max-width: 879px) {
p.image-holder > img {
width: 500px;
height: auto;
}
input[type=text] {
font-size: 14px;
padding: 7px;
}
}
@media (max-width: 579px) {
p.image-holder > img {
width: 300px;
height: auto;
}
input[type=text] {
font-size: 12px;
padding: 6px;
}
}
const img = document.querySelector('p.image-holder > img');
const range = document.getElementById('hue-input');
const output = document.getElementById('style-output');
const setFilter = (filter) => {
output.value = `filter: ${filter}`;
img.style.filter = filter;
}
const handleHueInput = (hue) => {
const filter = `sepia() hue-rotate(${hue - 60}deg)`;
setFilter(filter);
};
const handleRange = (e) => {
e && e.preventDefault();
handleHueInput(parseInt(range.value, 10));
};
const handleMouseDown = (e) => {
e && e.preventDefault();
setFilter('none');
};
const handleMouseUp = handleRange;
handleRange();
range.addEventListener('input', handleRange );
img.addEventListener('mousedown', handleMouseDown);
img.addEventListener('mouseup', handleMouseUp);
img.addEventListener('touchstart', handleMouseDown);
img.addEventListener('touchend', handleMouseUp);
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.