index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<script src="main.js"></script>
<title>スライダーでRGB値を変化させる(補色機能追加)</title>
</head>
<body>
<div id="rgbColor" class="center-center">
<p id="hex"></p>
</div>
<p>
<label for="red">R</label>
<input id="red" type="range" min="0" max="255" value="128" step="1">
<span id="valueRed"></span>
</p>
<p>
<label for="green">G</label>
<input id="green" type="range" min="0" max="255" value="128" step="1">
<span id="valueGreen"></span>
</p>
<p>
<label for="blue">B</label>
<input id="blue" type="range" min="0" max="255" value="128" step="1">
<span id="valueBlue"></span>
</p>
<p><input type="button" value="補色" id="reverse"></p>
</body>
</html>
style.css
/* style.css */
@charset "utf-8";
*{
margin: 0;
padding: 0;
}
body{
margin: 20px;
}
/* 枠内の文字列を上下左右中央に表示 */
.center-center{
height: 60px;
display: grid;
place-items: center;
}
/* カラー表示枠 */
#rgbColor{
width: 300px;
height: 100px;
border: solid 1px #555;
}
/* 背景になるべくかぶらない文字色にするため */
#hex{
color: rgb(100, 100, 100);
mix-blend-mode:difference;
}
main.js
// スライダー値を取得する
let red, green, blue; // スライダー
let valueRed, valueGreen, valueBlue; // スライダー値表示
let rgbView; // RGBカラー表示
let hex; // 16進カラー表示
let reverse; // 補色ボタン
// {r: XXX, g: XXX, b: XXX} ⇒ #RRGGBB形式に変換
const hexColor = (color) => {
// 10進⇒16進2桁
const Dec2Hex = (n) => Number(n).toString(16).padStart(2, "0").toUpperCase();
return `#${Dec2Hex(color.red)}${Dec2Hex(color.green)}${Dec2Hex(color.blue)}`;
};
// 補色を求める
const Color2XRGB = (color) => {
let x;
if(color.red === "0" && color.green === "0" && color.blue === "0"){
x = 255;
}
else if(color.red === "255" && color.green === "255" && color.blue === "255"){
x = 255;
}
else{
let max = Math.max(color.red, color.green);
max = Math.max(max, color.blue);
let min = Math.min(color.red, color.green);
min = Math.min(min, color.blue);
x = max + min;
}
// RGBの補色を設定
const xColor = {
red: x - color.red,
green: x - color.green,
blue: x - color.blue
};
return xColor;
}
// スライダーのRGB値を取得
const getRGB = () => color = { red: red.value, green: green.value, blue: blue.value};
// CSS形式のRGB文字列を取得 ex) rgb(123, 5, 86)
const getRGBCssStyle = (color) => `rgb(${color.red}, ${color.green}, ${color.blue})`;
// スライダー値を取得して表示
const setRGB = ()=> {
// スライダー値取得
const color = getRGB();
// RGB値を表示
[valueRed.textContent, valueGreen.textContent, valueBlue.textContent] = [color.red, color.green, color.blue];
// rgb(red, green, blue)形式で表示領域に設定
const rgbColor = getRGBCssStyle(color);
rgbView.style.backgroundColor = rgbColor;
// 16進カラー表示
hex.textContent = hexColor(color);
}
const setXRGB = () =>{
const color = getRGB();
const reverseColor = Color2XRGB(color);
// rgb(red, green, blue)形式で表示領域に設定
const rgbColor = getRGBCssStyle(reverseColor);
rgbView.style.backgroundColor = rgbColor;
// 16進カラー表示
hex.textContent = hexColor(reverseColor);
// スライダー値のRGBを補色RGBに設定
[red.value, green.value, blue.value] = [reverseColor.red, reverseColor.green, reverseColor.blue];
};
// 起動時の処理
window.addEventListener("load", ()=>{
// スライダー、スライダー値、RGBカラー表示DOM取得
red = document.getElementById("red");
green = document.getElementById("green");
blue = document.getElementById("blue");
valueRed = document.getElementById("valueRed");
valueGreen = document.getElementById("valueGreen");
valueBlue = document.getElementById("valueBlue");
rgbView = document.getElementById("rgbColor");
hex = document.getElementById("hex");
reverse = document.getElementById("reverse");
// スライドさせたときのイベント処理
red.addEventListener("input", setRGB, false);
green.addEventListener("input", setRGB, false);
blue.addEventListener("input", setRGB, false);
reverse.addEventListener("click", setXRGB, false);
// スライダー初期値を表示
setRGB();
});
コメント