采用原生html、css、js 实现用户可以更改边框半径的所有 8 个可能值和颜色,以创建复杂形状

采用原生html、css、js 实现用户操作边框圆角的八个值、以及随意变换颜色

可制作随意形状

用户可以将生成的CSS复制到剪贴板

主要由两部分:颜色变换、边框圆角变换

在这里插入图片描述
在这里插入图片描述

html部分

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>多变的边框</title>

    <script src="./colorpicker.js"></script>

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .picker {
            width: 300px;
            height: 200px;
            cursor: pointer;
            left: 40px;
            top: 40px;
            color: #fff;
            margin-right: 50px;

        }
        #controls {

            background-color: white;
            padding: 10px;
            border-top-left-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.9);
            z-index: 1;
            margin-left: 40px;
        }
        #controls label {
            display: flex;
        }
        .cotainer {
            position: absolute;
            top: 40px;
            left: 40px;
            display: flex;
            /* 使用Flex布局 */
            justify-content: space-around;
        }
    </style>

</head>

<body>
    <div class="cotainer">
        <div class="picker" id="color-picker"></div>
        <div id="controls">
            <label>左上角水平半径:<input type="number" id="tlHorizontal" min="0" value="0"></label>
            <label>左上角垂直半径:<input type="number" id="tlVertical" min="0" value="0"></label>
            <label>右上角水平半径:<input type="number" id="trHorizontal" min="0" value="0"></label>
            <label>右上角垂直半径:<input type="number" id="trVertical" min="0" value="0"></label>
            <label>右下角水平半径:<input type="number" id="brHorizontal" min="0" value="0"></label>
            <label>右下角垂直半径:<input type="number" id="brVertical" min="0" value="0"></label>
            <label>左下角水平半径:<input type="number" id="blHorizontal" min="0" value="0"></label>
            <label>左下角垂直半径:<input type="number" id="blVertical" min="0" value="0"></label>
            <button class="btn">复制样式</button>
        </div>
    </div>




    <script src="./index.js"></script>
</body>

</html>

<script type="text/javascript">
    Colorpicker.create({
        el: "color-picker", //元素id
        color: "#000fff", //默认颜色
        change: function (elem, hex) {
            //选中颜色发生改变时事件
            elem.style.backgroundColor = hex;
        }
    })
</script>

js圆角边框部分


 // 获取所有输入框
  const inputs = document.querySelectorAll("input[type='number']");
  
  // 监听所有输入框的变化
  inputs.forEach(input => {
    input.addEventListener("input", updateBorderRadius);
  });

  function updateBorderRadius() {
    // 获取所有输入框的值
    const tlH = document.getElementById("tlHorizontal").value;
    const tlV = document.getElementById("tlVertical").value;
    const trH = document.getElementById("trHorizontal").value;
    const trV = document.getElementById("trVertical").value;
    const brH = document.getElementById("brHorizontal").value;
    const brV = document.getElementById("brVertical").value;
    const blH = document.getElementById("blHorizontal").value;
    const blV = document.getElementById("blVertical").value;

    // 应用到目标元素的样式
    document.getElementById("color-picker").style.borderTopLeftRadius = `${tlH}% ${tlV}%`;
    document.getElementById("color-picker").style.borderTopRightRadius = `${trH}% ${trV}%`;
    document.getElementById("color-picker").style.borderBottomRightRadius = `${brH}% ${brV}%`;
    document.getElementById("color-picker").style.borderBottomLeftRadius = `${blH}% ${blV}%`;
  }

document.querySelector('.btn').addEventListener('click', function (event) {
  // 获取颜色值
//   var color = document.getElementById('color-picker').value;
//   console.log(color);
let sty = document.getElementById("color-picker").style
let cs1=''
let cs2=''
if(sty.borderRadius || sty.backgroundColor){
    cs1 += sty.borderRadius
    cs2 += sty.backgroundColor
}
//   console.log(cs);
// //   console.log(a.borderRadius);
//   console.log(typeof(cs));
alert(`当前样式为:圆角:${cs1},背景颜色:${cs2}`)
})

/*  // 获取元素
 const container = document.getElementById('slider-container');
 const slider = document.getElementById('slider');

 let isDragging = false;
 let startCoords = { x: 0, y: 0 };
 let currentOffset = { x: 0, y: 0 };


 <div id="slider-container" style="width: 100px; height: 100px; position: relative; overflow: hidden; border-radius: 10px; box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.2);">
    <div id="slider" style="position: absolute; width: 40px; height: 40px; background-color: #4CAF50; border-radius: 50%; top: 30px; left: 30px; box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); cursor: grab;"></div>
  </div>
 // 鼠标按下或触摸开始时
 function handleStart(e) {
   e.preventDefault();
   isDragging = true;
   startCoords = { 
     x: e.clientX || e.touches[0].clientX, 
     y: e.clientY || e.touches[0].clientY 
   };
   slider.style.cursor = 'grabbing';
   document.addEventListener('mousemove', handleMove);
   document.addEventListener('touchmove', handleMove);
   document.addEventListener('mouseup', handleEnd);
   document.addEventListener('touchend', handleEnd);
 }

 // 移动时
 function handleMove(e) {
   if (!isDragging) return;
   e.preventDefault();
   const newX = currentOffset.x + (e.clientX || e.touches[0].clientX - startCoords.x);
   const newY = currentOffset.y + (e.clientY || e.touches[0].clientY - startCoords.y);

   // 限制滑块在容器内移动
   const maxLeft = container.clientWidth - slider.offsetWidth;
   const maxTop = container.clientHeight - slider.offsetHeight;

   let nextLeft = Math.min(Math.max(newX, 0), maxLeft);
   let nextTop = Math.min(Math.max(newY, 0), maxTop);

   slider.style.left = `${nextLeft}px`;
   slider.style.top = `${nextTop}px`;
 }

 // 鼠标抬起或触摸结束时
 function handleEnd() {
   isDragging = false;
   slider.style.cursor = 'grab';
   document.removeEventListener('mousemove', handleMove);
   document.removeEventListener('touchmove', handleMove);
   document.removeEventListener('mouseup', handleEnd);
   document.removeEventListener('touchend', handleEnd);
 }

 // 绑定事件
 slider.addEventListener('mousedown', handleStart);
 slider.addEventListener('touchstart', handleStart); */

js颜色部分

(function () {

   var util = {
   	css: function (elem, obj) {
   		for (var i in obj) {
   			elem.style[i] = obj[i];
   		}
   	},
   	hasClass: function (elem, classN) {
   		var className = elem.getAttribute("class");
   		return className.indexOf(classN) != -1;
   	}
   };

   function Colorpicker(opt) {
   	if (this === window) throw `Colorpicker: Can't call a function directly`;
   	this.init(opt);
   };

   Colorpicker.prototype = {
   	init(opt) {
   		let { el, initColor = "rgb(255,0,0)", allMode = ['hex', 'rgb'], color = '' } = opt;
   		var elem = document.getElementById(el);

   		if (!(elem && elem.nodeType && elem.nodeType === 1)) {
   			throw `Colorpicker: not found  ID:${el}  HTMLElement,not ${{}.toString.call(el)}`;
   		}
   		this.Opt = {
   			...opt,
   			el,
   			initColor,
   			allMode,
   			color
   		}
   		this.bindElem = elem; // 缁戝畾鐨勫厓绱�
   		this.elem_wrap = null; // 鏈€澶栧眰瀹瑰櫒
   		this.fixedBg = null; // 鎷捐壊鍣ㄥ悗闈㈠浐瀹氬畾浣嶇殑閫忔槑div 鐢ㄤ簬鐐瑰嚮闅愯棌鎷捐壊鍣�
   		this.elem_colorPancel = null; // 鑹插僵闈㈡澘
   		this.elem_picker = null; // 鎷捐壊鍣ㄨ壊鍧楁寜閽�
   		this.elem_barPicker1 = null; // 棰滆壊鏉�
   		this.elem_hexInput = null; // 鏄剧ずhex鐨勮〃鍗�
   		this.elem_showColor = null; // 鏄剧ず褰撳墠棰滆壊
   		this.elem_showModeBtn = null; // 鍒囨崲杈撳叆妗嗘ā寮忔寜閽�
   		this.elem_inputWrap = null; // 杈撳叆妗嗗灞傚鍣�
   		this.pancelLeft = 0;
   		this.pancelTop = 0;
   		this.downX = 0;
   		this.downY = 0;
   		this.moveX = 0;
   		this.moveY = 0;
   		this.pointLeft = 0;
   		this.pointTop = 0;
   		this.current_mode = 'hex'; // input妗嗗綋鍓嶇殑妯″紡
   		this.rgba = { r: 0, g: 0, b: 0, a: 1 };
   		this.hsb = { h: 0, s: 100, b: 100 };
   		var _this = this, rgb = initColor.slice(4, -1).split(",");
   		this.rgba.r = parseInt(rgb[0]);
   		this.rgba.g = parseInt(rgb[1]);
   		this.rgba.b = parseInt(rgb[2]);
   		var body = document.getElementsByTagName("body")[0],
   			div = document.createElement("div");
   		div.innerHTML = this.render();
   		body.appendChild(div);
   		this.elem_wrap = div;
   		this.fixedBg = div.children[0];
   		this.elem_colorPancel = div.getElementsByClassName("color-pancel")[0];
   		this.pancel_width = this.elem_colorPancel.offsetWidth;
   		this.pancel_height = this.elem_colorPancel.offsetHeight;
   		this.elem_picker = div.getElementsByClassName("pickerBtn")[0];
   		this.elem_colorPalette = div.getElementsByClassName("color-palette")[0];
   		this.elem_showColor = div.getElementsByClassName("colorpicker-showColor")[0];
   		this.elem_barPicker1 = div.getElementsByClassName("colorBar-color-picker")[0];
   		/*   this.elem_barPicker2 = div.getElementsByClassName("colorBar-opacity-picker")[0]; */
   		this.elem_hexInput = div.getElementsByClassName("colorpicker-hexInput")[0];
   		this.elem_showModeBtn = div.getElementsByClassName("colorpicker-showModeBtn")[0];
   		this.elem_inputWrap = div.getElementsByClassName("colorpicker-inputWrap")[0];
   		/*  this.elem_opacityPancel = this.elem_barPicker2.parentNode.parentNode.children[1]; */
   		// var rect = this.bindElem.getBoundingClientRect();
   		var elem = this.bindElem;
   		var top = elem.offsetTop;
   		var left = elem.offsetLeft;
   		while (elem.offsetParent) {
   			top += elem.offsetParent.offsetTop;
   			left += elem.offsetParent.offsetLeft;
   			elem = elem.offsetParent;
   		}
   		this.pancelLeft = left + this.elem_colorPalette.clientWidth;
   		this.pancelTop = top + this.bindElem.offsetHeight;
   		util.css(div, {
   			"position": "absolute",
   			"z-index": 2,
   			"display": 'none',
   			"left": left + "px",
   			"top": top + this.bindElem.offsetHeight + "px"
   		});
   		this.bindMove(this.elem_colorPancel, this.setPosition, true);
   		this.bindMove(this.elem_barPicker1.parentNode, this.setBar, false);
   		/*  this.bindMove(this.elem_barPicker2.parentNode,this.setBar,false); */
   		this.bindElem.addEventListener("click", function () {
   			_this.show();
   		}, false);
   		this.fixedBg.addEventListener("click", function (e) {
   			_this.hide();
   		}, false)
   		this.elem_showModeBtn.addEventListener("click", function () {
   			_this.switch_current_mode();
   		}, false)
   		this.elem_wrap.addEventListener("input", function (e) {
   			var target = e.target, value = target.value;
   			_this.setColorByInput(value);
   		}, false);
   		this.elem_colorPalette.addEventListener("click", function (e) {
   			if (e.target.tagName.toLocaleLowerCase() == "p") {
   				let colorStr = e.target.style.background;
   				let rgb = colorStr.slice(4, -1).split(",");
   				let rgba = {
   					r: parseInt(rgb[0]),
   					g: parseInt(rgb[1]),
   					b: parseInt(rgb[2])
   				}
   				switch (_this.current_mode) {
   					case "hex":
   						_this.setColorByInput("#" + _this.rgbToHex(rgba))
   						break;
   					case 'rgb':
   						let inputs = _this.elem_wrap.getElementsByTagName("input")
   						inputs[0].value = rgba.r;
   						inputs[1].value = rgba.g;
   						inputs[2].value = rgba.b;
   						_this.setColorByInput(colorStr)
   						/* 	_this.hsb = _this.rgbToHsb(rgba); */
   						break;
   				}
   			}
   		}, false);
   		(color != '' && this.setColorByInput(color));
   	},
   	render: function () {
   		var tpl =
   			`<div style="position: fixed; top: 0px; right: 0px; bottom: 0px; left: 0px;"></div>
   			<div style="position: inherit;z-index: 100;display: flex;box-shadow: rgba(0, 0, 0, 0.3) 0px 0px 2px, rgba(0, 0, 0, 0.3) 0px 4px 8px;">
   				<div style='width:180px;padding:10px;background: #f9f9f9;display: flex;flex-flow: row wrap;align-content: space-around;justify-content: space-around;' class='color-palette'>
   					${this.getPaletteColorsItem()}
   				</div>
   				<div class="colorpicker-pancel" style="background: rgb(255, 255, 255);box-sizing: initial; width: 225px; font-family: Menlo;">
   					<div style="width: 100%; padding-bottom: 55%; position: relative; border-radius: 2px 2px 0px 0px; overflow: hidden;">
   						<div class="color-pancel" style="position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; background: rgb(${this.rgba.r},${this.rgba.g},${this.rgba.b})">
   							<style>
   								.saturation-white {background: -webkit-linear-gradient(to right, #fff, rgba(255,255,255,0));background: linear-gradient(to right, #fff, rgba(255,255,255,0));}
   								.saturation-black {background: -webkit-linear-gradient(to top, #000, rgba(0,0,0,0));background: linear-gradient(to top, #000, rgba(0,0,0,0));}
   							</style>
   							<div class="saturation-white" style="position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px;">
   								<div class="saturation-black" style="position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px;">
   								</div>
   								<div class="pickerBtn" style="position: absolute; top: 0%; left: 100%; cursor: default;">
   									<div style="width: 12px; height: 12px; border-radius: 6px; box-shadow: rgb(255, 255, 255) 0px 0px 0px 1px inset; transform: translate(-6px, -6px);">
   									</div>
   								</div>
   							</div>
   						</div>
   					</div>
   					<div style="padding: 0 16px 20px;">
   						<div class="flexbox-fix" style="display: flex;align-items: center;height: 40px;">
   							<div style="width: 32px;">
   								<div style="width: 16px; height: 16px; border-radius: 8px; position: relative; overflow: hidden;">
   									<div class="colorpicker-showColor" style="position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; border-radius: 8px; box-shadow: rgba(0, 0, 0, 0.1) 0px 0px 0px 1px inset; background:rgb(${this.rgba.r},${this.rgba.g},${this.rgba.b}); z-index: 2;"></div>
   									<div class="" style="position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==&quot;) left center;"></div>
   								</div>
   							</div>
   							<div style="-webkit-box-flex: 1; flex: 1 1 0%;"><div style="height: 10px; position: relative;">
   								<div style="position: absolute; top: 0px;right: 0px; bottom: 0px; left: 0px;">
   									<div class="hue-horizontal" style="padding: 0px 2px; position: relative; height: 100%;">
   										<style>
   											.hue-horizontal {background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);background: -webkit-linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);}
   											.hue-vertical {background: linear-gradient(to top, #f00 0%, #ff0 17%, #0f0 33%,#0ff 50%, #00f 67%, #f0f 83%, #f00 100%);background: -webkit-linear-gradient(to top, #f00 0%, #ff0 17%,#0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);}
   										</style>
   										<div  class="colorBar-color-picker" style="position: absolute; left: 0%;">
   											<div style="width: 12px; height: 12px; border-radius: 6px; transform: translate(-6px, -1px); background-color: rgb(248, 248, 248); box-shadow: rgba(0, 0, 0, 0.37) 0px 1px 4px 0px;">
   											</div>
   										</div>
   									</div>
   								</div>
   							</div>
   						</div>
   					</div>
   					<div class="flexbox-fix" style="display: flex;">
   						<div class="flexbox-fix colorpicker-inputWrap" style="-webkit-box-flex: 1; flex: 1 1 0%; display: flex; margin-left: -6px;">
   								${this.getInputTpl()}
   						</div>
   						<div class="colorpicker-showModeBtn" style="width: 32px; text-align: right; position: relative;">
   							<div style="margin-right: -4px;  cursor: pointer; position: relative;">
   								<svg viewBox="0 0 24 24" style="width: 24px; height: 24px; border: 1px solid transparent; border-radius: 5px;"><path fill="#333" d="M12,5.83L15.17,9L16.58,7.59L12,3L7.41,7.59L8.83,9L12,5.83Z"></path><path fill="#333" d="M12,18.17L8.83,15L7.42,16.41L12,21L16.59,16.41L15.17,15Z"></path></svg>
   							</div>
   						</div>
   					</div>
   				</div>
   			</div>
   		</div>`;
   		return tpl;
   	},
   	getInputTpl: function () {
   		var current_mode_html = "";
   		switch (this.current_mode) {
   			case 'hex':
   				var hex = "#" + this.rgbToHex(this.HSBToRGB(this.hsb));
   				current_mode_html += `
   						<div style="padding-left: 6px; width: 100%;">
   							<div style="position: relative;">
   								<input class="colorpicker-hexInput" value="${hex}" spellcheck="false" style="font-size: 11px; color: rgb(51, 51, 51); width: 100%; border-radius: 2px; border: none; box-shadow: rgb(218, 218, 218) 0px 0px 0px 1px inset; height: 21px; text-align: center;">
   								<span style="text-transform: uppercase; font-size: 11px; line-height: 11px; color: rgb(150, 150, 150); text-align: center; display: block; margin-top: 12px;">hex</span>
   							</div>
   						</div>`;
   				break;
   			case 'rgb':
   				for (var i = 0; i < 3; i++) {
   					current_mode_html +=
   						`<div style="padding-left: 6px; width: 100%;">
   							<div style="position: relative;">
   								<input class="colorpicker-hexInput" value="${this.rgba['rgb'[i]]}" spellcheck="false" style="font-size: 11px; color: rgb(51, 51, 51); width: 100%; border-radius: 2px; border: none; box-shadow: rgb(218, 218, 218) 0px 0px 0px 1px inset; height: 21px; text-align: center;">
   								<span style="text-transform: uppercase; font-size: 11px; line-height: 11px; color: rgb(150, 150, 150); text-align: center; display: block; margin-top: 12px;">${'rgb'[i]}</span>
   							</div>
   						</div>`;
   				}
   			default:
   		}
   		return current_mode_html;
   	},
   	getPaletteColorsItem: function () {
   		let str = '';
   		let palette = ["rgb(0, 0, 0)", "rgb(67, 67, 67)", "rgb(102, 102, 102)", "rgb(204, 204, 204)", "rgb(217, 217, 217)", "rgb(255, 255, 255)",
   			"rgb(152, 0, 0)", "rgb(255, 0, 0)", "rgb(255, 153, 0)", "rgb(255, 255, 0)", "rgb(0, 255, 0)", "rgb(0, 255, 255)",
   			"rgb(74, 134, 232)", "rgb(0, 0, 255)", "rgb(153, 0, 255)", "rgb(255, 0, 255)", "rgb(230, 184, 175)", "rgb(244, 204, 204)",
   			"rgb(252, 229, 205)", "rgb(255, 242, 204)", "rgb(217, 234, 211)", "rgb(208, 224, 227)", "rgb(201, 218, 248)", "rgb(207, 226, 243)",
   			"rgb(217, 210, 233)", "rgb(234, 209, 220)", "rgb(221, 126, 107)", "rgb(234, 153, 153)", "rgb(249, 203, 156)", "rgb(255, 229, 153)",
   			"rgb(182, 215, 168)", "rgb(162, 196, 201)", "rgb(164, 194, 244)", "rgb(159, 197, 232)", "rgb(180, 167, 214)"]
   		palette.forEach(item => str += `<p style='width:20px;height:20px;background:${item};margin:0 5px;border: solid 1px #d0d0d0;'></p>`)
   		return str;
   	},
   	setPosition(x, y) {
   		var LEFT = parseInt(x - this.pancelLeft),
   			TOP = parseInt(y - this.pancelTop);
   		this.pointLeft = Math.max(0, Math.min(LEFT, this.pancel_width));
   		this.pointTop = Math.max(0, Math.min(TOP, this.pancel_height));
   		util.css(this.elem_picker, {
   			left: this.pointLeft + "px",
   			top: this.pointTop + "px"
   		})
   		this.hsb.s = parseInt(100 * this.pointLeft / this.pancel_width);
   		this.hsb.b = parseInt(100 * (this.pancel_height - this.pointTop) / this.pancel_height);
   		this.setShowColor();
   		this.setValue(this.rgba);
   	},
   	setBar: function (elem, x) {
   		var elem_bar = elem.getElementsByTagName("div")[0],
   			rect = elem.getBoundingClientRect(),
   			elem_width = elem.offsetWidth,
   			X = Math.max(0, Math.min(x - rect.x, elem_width));
   		if (elem_bar === this.elem_barPicker1) {
   			util.css(elem_bar, {
   				left: X + "px"
   			});
   			this.hsb.h = parseInt(360 * X / elem_width);
   		} else {
   			util.css(elem_bar, {
   				left: X + "px"
   			});
   			this.rgba.a = X / elem_width;
   		}
   		this.setPancelColor(this.hsb.h);
   		this.setShowColor();
   		this.setValue(this.rgba);
   	},
   	setPancelColor: function (h) {
   		var rgb = this.HSBToRGB({ h: h, s: 100, b: 100 });
   		util.css(this.elem_colorPancel, {
   			background: 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + this.rgba.a + ')'
   		});
   	},
   	setShowColor: function () {
   		var rgb = this.HSBToRGB(this.hsb);
   		this.rgba.r = rgb.r;
   		this.rgba.g = rgb.g;
   		this.rgba.b = rgb.b;
   		util.css(this.elem_showColor, {
   			background: 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + this.rgba.a + ')'
   		});
   	},
   	setValue: function (rgb) {
   		var hex = "#" + this.rgbToHex(rgb);
   		this.elem_inputWrap.innerHTML = this.getInputTpl();
   		this.Opt.change(this.bindElem, hex);
   	},
   	setColorByInput: function (value) {
   		var _this = this;
   		switch (this.current_mode) {
   			case "hex":
   				value = value.slice(1);
   				if (value.length == 3) {
   					value = '#' + value[0] + value[0] + value[1] + value[1] + value[2] + value[2];
   					this.hsb = this.hexToHsb(value);
   				} else if (value.length == 6) {
   					this.hsb = this.hexToHsb(value);
   				}
   				break;
   			case 'rgb':
   				var inputs = this.elem_wrap.getElementsByTagName("input"),
   					rgb = {
   						r: inputs[0].value ? parseInt(inputs[0].value) : 0,
   						g: inputs[1].value ? parseInt(inputs[1].value) : 0,
   						b: inputs[2].value ? parseInt(inputs[2].value) : 0
   					};
   				this.hsb = this.rgbToHsb(rgb);
   		}
   		this.changeViewByHsb();
   	},
   	changeViewByHsb: function () {
   		this.pointLeft = parseInt(this.hsb.s * this.pancel_width / 100);
   		this.pointTop = parseInt((100 - this.hsb.b) * this.pancel_height / 100);
   		util.css(this.elem_picker, {
   			left: this.pointLeft + "px",
   			top: this.pointTop + "px"
   		});
   		this.setPancelColor(this.hsb.h);
   		this.setShowColor();
   		util.css(this.elem_barPicker1, {
   			left: this.hsb.h / 360 * (this.elem_barPicker1.parentNode.offsetWidth) + "px"
   		});
   		var hex = '#' + this.rgbToHex(this.HSBToRGB(this.hsb));
   		this.Opt.change(this.bindElem, hex);
   	},
   	switch_current_mode: function () {
   		this.current_mode = this.current_mode == 'hex' ? 'rgb' : 'hex';
   		this.elem_inputWrap.innerHTML = this.getInputTpl();
   	},
   	bindMove: function (elem, fn, bool) {
   		var _this = this;
   		elem.addEventListener("mousedown", function (e) {
   			_this.downX = e.pageX;
   			_this.downY = e.pageY;
   			bool ? fn.call(_this, _this.downX, _this.downY) : fn.call(_this, elem, _this.downX, _this.downY);
   			document.addEventListener("mousemove", mousemove, false);
   			function mousemove(e) {
   				_this.moveX = e.pageX;
   				_this.moveY = e.pageY;
   				bool ? fn.call(_this, _this.moveX, _this.moveY) : fn.call(_this, elem, _this.moveX, _this.moveY);
   				e.preventDefault();
   			}
   			document.addEventListener("mouseup", mouseup, false);
   			function mouseup(e) {
   				document.removeEventListener("mousemove", mousemove, false)
   				document.removeEventListener("mouseup", mouseup, false)
   			}
   		}, false);
   	},
   	show: function () {
   		util.css(this.elem_wrap, {
   			"display": "block"
   		})
   	},
   	hide: function () {
   		util.css(this.elem_wrap, {
   			"display": "none"
   		})
   	},
   	HSBToRGB: function (hsb) {
   		var rgb = {};
   		var h = Math.round(hsb.h);
   		var s = Math.round(hsb.s * 255 / 100);
   		var v = Math.round(hsb.b * 255 / 100);
   		if (s == 0) {
   			rgb.r = rgb.g = rgb.b = v;
   		} else {
   			var t1 = v;
   			var t2 = (255 - s) * v / 255;
   			var t3 = (t1 - t2) * (h % 60) / 60;
   			if (h == 360) h = 0;
   			if (h < 60) { rgb.r = t1; rgb.b = t2; rgb.g = t2 + t3 }
   			else if (h < 120) { rgb.g = t1; rgb.b = t2; rgb.r = t1 - t3 }
   			else if (h < 180) { rgb.g = t1; rgb.r = t2; rgb.b = t2 + t3 }
   			else if (h < 240) { rgb.b = t1; rgb.r = t2; rgb.g = t1 - t3 }
   			else if (h < 300) { rgb.b = t1; rgb.g = t2; rgb.r = t2 + t3 }
   			else if (h < 360) { rgb.r = t1; rgb.g = t2; rgb.b = t1 - t3 }
   			else { rgb.r = 0; rgb.g = 0; rgb.b = 0 }
   		}
   		return { r: Math.round(rgb.r), g: Math.round(rgb.g), b: Math.round(rgb.b) };
   	},
   	rgbToHex: function (rgb) {
   		var hex = [
   			rgb.r.toString(16),
   			rgb.g.toString(16),
   			rgb.b.toString(16)
   		];
   		hex.map(function (str, i) {
   			if (str.length == 1) {
   				hex[i] = '0' + str;
   			}
   		});
   		return hex.join('');
   	},
   	hexToRgb: function (hex) {
   		var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
   		return { r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF) };
   	},
   	hexToHsb: function (hex) {
   		return this.rgbToHsb(this.hexToRgb(hex));
   	},
   	rgbToHsb: function (rgb) {
   		var hsb = { h: 0, s: 0, b: 0 };
   		var min = Math.min(rgb.r, rgb.g, rgb.b);
   		var max = Math.max(rgb.r, rgb.g, rgb.b);
   		var delta = max - min;
   		hsb.b = max;
   		hsb.s = max != 0 ? 255 * delta / max : 0;
   		if (hsb.s != 0) {
   			if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta;
   			else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta;
   			else hsb.h = 4 + (rgb.r - rgb.g) / delta;
   		} else hsb.h = -1;
   		hsb.h *= 60;
   		if (hsb.h < 0) hsb.h += 360;
   		hsb.s *= 100 / 255;
   		hsb.b *= 100 / 255;
   		return hsb;
   	}
   }
   Colorpicker.create = function (opt) {
   	return new Colorpicker(opt)
   }
   window.Colorpicker = Colorpicker;
})()

大致流程

  • 获取输入框:首先,脚本通过querySelectorAll方法选取页面中所有类型为’number’的输入框元素。

  • 监听输入变化:随后,对获取到的每个输入框使用forEach循环添加input事件监听器。当用户在这些输入框中输入内容,触发更改时,会调用updateBorderRadius函数。

  • 更新边框半径:updateBorderRadius函数内部,分别读取八个特定ID的输入框(代表四个角的水平与垂直半径)的值,然后将这些值应用到ID为’color-picker’的元素的CSS属性borderTopLeftRadius、borderTopRightRadius、borderBottomRightRadius、borderBottomLeftRadius上,实现动态更新元素的圆角效果。

  • 按钮点击事件:此外,有一个按钮监听点击事件。当用户点击这个按钮时,脚本会收集color-picker的当前borderRadius和backgroundColor,然后通过警告框(alert)展示这些样式信息,即当前的圆角大小和背景颜色

  • 35
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值