前端頁面中使用Spectrum 繪製調色板

概述

        在頁面開發時,有時我們需要在頁面中添加一個調色板,方便用戶自己喜歡的顏色。這時,我們需要在頁面中添加一個調色板。在input[type='color']中,可以直接調出調色板,而且界面也比較漂亮,但是我們很難控制它的樣式,最致命的是他的兼容性非常差,在ie10中無法進行顯示,因此選用Spectrum 繪製調色板。最終的展示效果爲:


操作目標

        在頁面中,我們需要將調色板的色值顯示,同時在調色板和顯示的值之間添加一個“自定義色值”的說明。我們可以通過輸入自定義色值的內容,設置調色板的顏色,也可以通過調色板選中自己喜歡的顏色,並將色值顯示在右邊的方框中。

實現步驟

1、簡單實現調色板

        在jsp頁面中,我們需要一個input框:

  <input id="color-input-diy"  name="color-input-diy"> 

        在js中,將當前input設置spectrum屬性和方法:

$("#color-input-diy").spectrum({
		color: "red",//初始化顏色
		showInput: true,//顯示輸入
//		allowEmpty:true,//允許爲空,顯示清楚顏色按鈕
		clickoutFiresChange: false,//單擊選擇器外部,如果顏色有改變則應用
		containerClassName: "full-spectrum",
		showInitial: true,//顯示初始顏色,提供現在選擇的顏色和初始顏色對比
		showPalette: true,//顯示選擇器面板,即左側有按鈕的面板
		showSelectionPalette: true,//記住選擇過的顏色
		showAlpha: true,//顯示透明度選擇
		maxPaletteSize: 7,//記住選擇過的顏色的最大數量
		cancelText: "取消",//取消按鈕,按鈕文字
		chooseText: "確定",//選擇按鈕,按鈕文字
		noColorSelectedText: "無顏色選擇",//清除,按鈕文字
		preferredFormat: "hex",//輸入框顏色格式,(hex十六進制,hex3十六進制可以的話只顯示3位,hsl,rgb三原色,name英文名顯示)
		localStorageKey: "spectrum.demo",//把選擇過的顏色存在瀏覽器上
		
		//選擇器右邊面板移動時觸發
		move: function (color) {
			updateBorders(color);
		},
		//選擇器面板顯示時觸發
		show: function () {
	
		},
		//選擇器面板顯示之前觸發,返回false時不顯示
		beforeShow: function () {

		},
		//關閉面板或點擊選擇按鈕,顏色變化時觸發
		change:function(){
			
		},
		//選擇器面板隱藏時觸發
		hide: function (color) {
			updateBorders(color);
		},
		//調色選擇器面板顯示的顏色
		palette: [
		      ["rgb(0, 0, 0)", "rgb(67, 67, 67)", "rgb(102, 102, 102)", "rgb(153, 153, 153)","rgb(183, 183, 183)",
		      "rgb(204, 204, 204)", "rgb(217, 217, 217)", "rgb(239, 239, 239)", "rgb(243, 243, 243)", "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)", "rgb(213, 166, 189)"],
		      ["rgb(204, 65, 37)", "rgb(224, 102, 102)", "rgb(246, 178, 107)", "rgb(255, 217, 102)", "rgb(147, 196, 125)",
		      "rgb(118, 165, 175)", "rgb(109, 158, 235)", "rgb(111, 168, 220)", "rgb(142, 124, 195)", "rgb(194, 123, 160)"],
		      ["rgb(166, 28, 0)", "rgb(204, 0, 0)", "rgb(230, 145, 56)", "rgb(241, 194, 50)", "rgb(106, 168, 79)",
		      "rgb(69, 129, 142)", "rgb(60, 120, 216)", "rgb(61, 133, 198)", "rgb(103, 78, 167)", "rgb(166, 77, 121)"],
		      ["rgb(133, 32, 12)", "rgb(153, 0, 0)", "rgb(180, 95, 6)", "rgb(191, 144, 0)", "rgb(56, 118, 29)",
		      "rgb(19, 79, 92)", "rgb(17, 85, 204)", "rgb(11, 83, 148)", "rgb(53, 28, 117)", "rgb(116, 27, 71)"],
		      ["rgb(91, 15, 0)", "rgb(102, 0, 0)", "rgb(120, 63, 4)", "rgb(127, 96, 0)", "rgb(39, 78, 19)",
		      "rgb(12, 52, 61)", "rgb(28, 69, 135)", "rgb(7, 55, 99)", "rgb(32, 18, 77)", "rgb(76, 17, 48)"]
		     ]
		
	});
     function updateBorders(color) {
                //hexColor表示上次調色板顯示的顏色
		var hexColor = "transparent";
		//如果當前設置顏色,則將顏色設置爲當前顏色,否則,如果沒有點擊確定,則將顏色恢復爲上次選擇的顏色
                if(color) {
		    hexColor = color.toHexString();
		}
                //如果沒有下面這行代碼,點擊選擇器面板時,即使不點擊保存,也會造成input框中的值改變
		$("#docs-content").css("border-color", hexColor);
	}

至此,對於各參數,代碼中已添加了詳細的註釋,更多的屬性和方法請參照參考文檔中的官網說明。現在顯示的效果爲

2、實現目標要求

        在jsp中我們添加其他元素,展示的顏色值、介紹文字。爲了控制佈局,使用div進行控制,jsp代碼如下所示

<!-- 調色板-->
        <div class="chat-windows-color-diy-div row">
            <div class="col-xs-5 col-sm-5 col-md-5">
	            <div class="col-xs-2 col-sm-2 col-md-2 diy-color-choose">
	                 <input id="color-input-diy"  name="color-input-diy"> 
	               <!--  <label for="color-input-diy"></label>   --> 
	            </div>
	            <div class="col-xs-4 col-sm-4 col-md-4 diy-color-value-div">
	                <span class="diy-color-value-span"> 自定義色值:</span>
	            </div>
	            <div class="col-xs-5 col-sm-5 col-md-5 diy-color-style">
	                <input id="color-input-diy-value" class="diy-color-style-input" onblur="setPalette()" type="text" name="color"> 
	            </div>
            </div>
        </div>

        其中,利用onblur屬性綁定到setPalette()函數上,當input輸入框輸入內容時,將會觸發js中的setpalette()方法,顯示的樣式爲:

        

        在js代碼中,我們增加兩部分,一個是將調色板的顏色值顯示到id="color-input-diy-value"中的input框中,另一個設置input框中輸入值時,賦值給調色板。

$("#color-input-diy").spectrum({
		color: "red",//初始化顏色
		showInput: true,//顯示輸入
//		allowEmpty:true,//允許爲空,顯示清楚顏色按鈕
		clickoutFiresChange: false,//單擊選擇器外部,如果顏色有改變則應用
		containerClassName: "full-spectrum",
		showInitial: true,//顯示初始顏色,提供現在選擇的顏色和初始顏色對比
		showPalette: true,//顯示選擇器面板
		showSelectionPalette: true,//記住選擇過的顏色
		showAlpha: true,//顯示透明度選擇
		maxPaletteSize: 7,//記住選擇過的顏色的最大數量
		cancelText: "取消",//取消按鈕,按鈕文字
		chooseText: "確定",//選擇按鈕,按鈕文字
		noColorSelectedText: "無顏色選擇",//清除,按鈕文字
		preferredFormat: "hex",//輸入框顏色格式,(hex十六進制,hex3十六進制可以的話只顯示3位,hsl,rgb三原色,name英文名顯示)
		localStorageKey: "spectrum.demo",//把選擇過的顏色存在瀏覽器上
		
		//選擇器右邊面板移動時觸發
		move: function (color) {
			updateBorders(color);
		},
		//選擇器面板顯示時觸發
		show: function () {
	
		},
		//選擇器面板顯示之前觸發,返回false時不顯示
		beforeShow: function () {

		},
		//關閉面板或點擊選擇按鈕,顏色變化時觸發
		change:function(){
			
		},
		//選擇器面板隱藏時觸發
		hide: function (color) {
			updateBorders(color);
		},
		//調色選擇器面板顯示的顏色
		palette: [
		      ["rgb(0, 0, 0)", "rgb(67, 67, 67)", "rgb(102, 102, 102)", "rgb(153, 153, 153)","rgb(183, 183, 183)",
		      "rgb(204, 204, 204)", "rgb(217, 217, 217)", "rgb(239, 239, 239)", "rgb(243, 243, 243)", "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)", "rgb(213, 166, 189)"],
		      ["rgb(204, 65, 37)", "rgb(224, 102, 102)", "rgb(246, 178, 107)", "rgb(255, 217, 102)", "rgb(147, 196, 125)",
		      "rgb(118, 165, 175)", "rgb(109, 158, 235)", "rgb(111, 168, 220)", "rgb(142, 124, 195)", "rgb(194, 123, 160)"],
		      ["rgb(166, 28, 0)", "rgb(204, 0, 0)", "rgb(230, 145, 56)", "rgb(241, 194, 50)", "rgb(106, 168, 79)",
		      "rgb(69, 129, 142)", "rgb(60, 120, 216)", "rgb(61, 133, 198)", "rgb(103, 78, 167)", "rgb(166, 77, 121)"],
		      ["rgb(133, 32, 12)", "rgb(153, 0, 0)", "rgb(180, 95, 6)", "rgb(191, 144, 0)", "rgb(56, 118, 29)",
		      "rgb(19, 79, 92)", "rgb(17, 85, 204)", "rgb(11, 83, 148)", "rgb(53, 28, 117)", "rgb(116, 27, 71)"],
		      ["rgb(91, 15, 0)", "rgb(102, 0, 0)", "rgb(120, 63, 4)", "rgb(127, 96, 0)", "rgb(39, 78, 19)",
		      "rgb(12, 52, 61)", "rgb(28, 69, 135)", "rgb(7, 55, 99)", "rgb(32, 18, 77)", "rgb(76, 17, 48)"]
		     ]
		
	});
     function updateBorders(color) {
		var hexColor = "transparent";
		if(color) {
		hexColor = color.toHexString();
		}
		$("#docs-content").css("border-color", hexColor);
                //將調色版的顏色放置到input框中
		$('#color-input-diy-value').val(hexColor);
	}
}

//設置調色板的顏色值
function setPalette(){
	var colorValue=$("#color-input-diy-value").val();
        //對input框輸入的顏色值進行簡單的校驗
	 if(colorValue.indexOf('#')==0&&colorValue.length==7){
		 $("#color-input-diy").spectrum("set", $("#color-input-diy-value").val());
	 }else if(colorValue==null||colorValue.length==0){
		 return;
	 }else{
		 alert("請輸入正確的色值");
	 }
}

    至此,我們完成了目標所示的功能,新添加的代碼已經用不同的顏色進行標註。最終的效果圖爲

                                   

注意事項:

1、原Spectrum調色板中,點擊選擇面板時,即時沒有確認,也會導致input框的值發生改變,因此,需在js頁面中的updateBorders(color) 方法中添加  $("#docs-content").css("border-color", hexColor); 。

2、使用 $("#color-input-diy").spectrum("set", $("#color-input-diy-value").val()); 方法對調色板進行賦值。


參考文檔

1、jQuery Colorpicker Spectrum api 中文 文檔 屬性 事件 方法

 2、Spectrum 官方說明文檔;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章