#TIL
Yesterday I wrote about HTML's native color picker. Today I learned about HTML's native slider element, which looks like <input type="range">
.
Once again I crafted a nifty Codesandbox to demonstrate how to incorporate a slider into a background gradient generator.
While it is mobile responsive, and works as intended here, it's a better UX on a full screen. Click "Open in New Window" in the upper right-hand corner of the embedded Codesandbox below.
The Code
My input
element for the first color slider looks like this.
<input type="range" min="0" max="100" value={firstPercentage} onChange={selectfirstPercentage} />
-
type="range"
is how we define what type of input we want. A slider! -
min="0"
is the minimum value the slider will allow a user to select. -
max="100"
is the maximum value the slider will allow a user to select. -
value={firstPercentage}
is a variable held in state that gets updated by the next line of code: -
onChange={selectFirstPercentage}
listens for user input and updates state withselectFirstPercentage
.
// initialize to 0 based on how CSS gradient is defined const [firstPercentage, setFirstPercentage] = useState(0); ... const selectfirstPercentage = (e) => { setFirstPercentage(e.target.value); };
And the code for the second percentage slider is exactly the same, except everything refers to secondPercentage
and setSecondPercentage
.
// initialize to 100 based on how CSS gradient is defined const [secondPercentage, setSecondPercentage] = useState(100); ... const selectSecondPercentage = (e) => { setSecondPercentage(e.target.value); }; ... <input type="range" min="0" max="100" value={firstPercentage} onChange={selectfirstPercentage} />
And I use the slider values of firstPercentage
and secondPercentage
to update the <div>
that holds the actual gradient.
<div className="gradient-div" style={{ background: `linear-gradient(to ${direction}, ${firstColor} ${firstPercentage}%, ${secondColor} ${secondPercentage}%)`}} />
Pretty cool, right?! And not too difficult to use at all!
The Entire Component
import "./styles.css"; import { useState } from "react"; const directions = [ { type: "Right" }, { type: "Top" }, { type: "Bottom" }, { type: "Left" } ]; export default function App() { const [firstColor, setFirstColor] = useState("#1595d5"); const [secondColor, setSecondColor] = useState("#eb3dbc"); const [firstPercentage, setFirstPercentage] = useState(0); const [secondPercentage, setSecondPercentage] = useState(100); const [selectedDirection, setSelectedDirection] = useState("Right"); const [direction, setDirection] = useState("right"); const selectFirstColor = (e) => { setFirstColor(e.target.value); }; const selectSecondColor = (e) => { setSecondColor(e.target.value); }; const selectfirstPercentage = (e) => { setFirstPercentage(e.target.value); }; const selectSecondPercentage = (e) => { setSecondPercentage(e.target.value); }; const toggleDirection = (e) => { setSelectedDirection(e.target.id); setDirection(e.target.value); }; return ( <div className="App"> <div className="main-wrapper"> <h1>Gradient Playground</h1> <div className="flex-wrapper"> <div className="color-select-bg"> <h2 htmlFor="firstColor">First Color</h2> <input type="color" id="firstColor" name="firstColor" value={firstColor} onChange={selectFirstColor} /> <div className="flex-wrapper"> <input type="range" min="0" max="100" value={firstPercentage} onChange={selectfirstPercentage} /> <p>{firstPercentage}%</p> </div> </div> <div className="color-select-bg"> <h2 htmlFor="secondColor">Second Color</h2> <input type="color" id="secondColor" name="secondColor" value={secondColor} onChange={selectSecondColor} /> <div className="flex-wrapper"> <input type="range" min="0" max="100" value={secondPercentage} onChange={selectSecondPercentage} /> <p>{secondPercentage}%</p> </div> </div> </div> <h2 htmlFor="secondColor">Gradient Direction</h2> <div> {directions.map(({ type }) => ( <button key={type} id={type} value={type.toLowerCase()} onClick={toggleDirection} className={ type === selectedDirection ? "selected-direction-btn" : "direction-btn" } > {type} </button> ))} </div> <div className="gradient-div" style={{ background: `linear-gradient(to ${direction}, ${firstColor} ${firstPercentage}%, ${secondColor} ${secondPercentage}%)` }} /> <h2>The CSS</h2> <div className="css-wrapper"> <p className="css"> background-image: linear-gradient(to {direction}, {firstColor}{" "} {firstPercentage}%, {secondColor} {secondPercentage}%); </p> </div> </div> </div> ); }
Conclusion
HTML gives us so many useful tools that solve what can seem like big problems. Learning how to incorporate those into fun and interactive projects like this gradient playground has been a blast! I hope you learned something like I did, and feel empowered to try this yourself!
Thanks for reading and as always, I welcome feedback, corrections, criticism, whatever!
Until next time...
Top comments (0)