純js實現選擇色卡效果

寫出html頁面
2.
要明白製作色卡的關鍵是從255到0的遞減,不管是r,g,b中的哪一個。
2.1首先我們獲得用戶所想製作的基本色卡顏色,這時候涉及一個用戶得16進制顏色格式是否正確問題,我們用焦點消失函數來判斷是否格式正確。
2.2正確並且獲得之後將其中最大的一個顏色點擊進去。
2.3由Js內部函數將他加到239-255這個區間內,其他倆個顏色隨之增加。
2.4增加到最大之後,開始在定時器的頻段之下遞減,定時器裏面要創造子節點,子節點顏色要逐漸變深
2.5這就要求我們增大之後的顏色10進制數值要開始遞減,當創建了16個子節點之後,退出定時器,色卡製作完成。
2.6爲了增加用戶實際的體驗,寫一個重新制作色卡的功能,其實就是將節點全部清除,然後再進行從第一步的循環!
核心呢就是對於顏色的遞減問題,這也是色卡的核心問題
接着難點就是對最大的r,g,b顏色其中一個進行增加到239-255這個區間,這一步很難想象
實現效果圖:
在這裏插入圖片描述
源碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../jquery-3.4.1.js"></script>
</head>
<style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    header{
        width: 100%;
        height: 100px;
        background-color: #e0e0e0;
    }
    header div{
        width:100%;
        height: 16px;
    }
    .main{
        width: 100%;
    }
    .color{
        width: 800px;
        height: 800px;
        border: lightgreen 2px solid;
        margin:  0 auto;
    }
    #submit{
        background-color: #FFFFFF;
    }
    .color div{
        height: 30px;
    }
</style>
<body>
<header>
    <div></div>
    <form action="">
        請嚴格按照步驟執行
        1.請選擇你的16進制顏色
        <input type="text" id="incolor" >
        <br>
        2.請選擇你的哪個顏色爲主顏色r,g,b
        R<input type="radio" name="gender" value="r" id="gender1">
        G<input type="radio" name="gender" value="g" id="gender2">
        B<input type="radio" name="gender" value="b" id="gender3">
        <br>
        3.點擊提交
        <button id="submit" type="button"> 提交選擇</button>
        <button type="reset" id="reset">重新選擇顏色</button>

    </form>
</header>
<div class="main">
    <div class="color"></div>
</div>
<script type="text/javascript">
    var R=0;
    var G=0;
    var B=0;
    var i=0;
    var timer=null;
    var value=null;
    main();
    reset();
    function main() {
        //在主函數裏面進行調用
        document.getElementById("incolor").addEventListener("blur",testColor);
    }
     function testColor() {
              value= document.getElementById("incolor").value;
             var flag=value.search("#[a-fA-F_0-9]{6}");
             var length=value.length;
             if (length==7&&flag==0){
                 //驗證成功之後
                 document.getElementsByTagName("header")[0].getElementsByTagName("div")[0].innerHTML="";
                 getcolor();
                 //找到最大顏色
                 maxcolor();
             }
             else {
                 document.getElementsByTagName("header")[0].getElementsByTagName("div")[0].innerHTML="16進制顏色格式錯誤";
                 document.getElementsByTagName("header")[0].getElementsByTagName("div")[0].style.color="red";
                 return;
             }
    }
    function getcolor() {
        var demo= document.getElementsByTagName("input")[0].value;
        var r;
        var g;
        var b;
        demo=demo.substring(1,7);
        r=demo.substring(0,2);
        g=demo.substring(2,4);
        b=demo.substring(4,6);
        R=parseInt(r,16);
        G=parseInt(g,16);
        B=parseInt(b,16);
    }
    function maxcolor() {
        document.getElementById("gender1").onclick=function () {
             //R最大
            var r=add0(R);
            R=r.substring(0,3);
            var addnum=r.substring(4,6);
            G=G+17*addnum;
            B=B+17*addnum;
            if(G>255){
                G=255;
            }
            if(B>255){
                B=255;
            }
            submit();

        }
        document.getElementById("gender2").onclick=function () {
            //R最大
            var r=add0(G);
            G=r.substring(0,3);
            var addnum=r.substring(4,6);
            R=R+17*addnum;
            B=B+17*addnum;
            if(R>255){
                R=255;
            }
            if(B>255){
                B=255;
            }
            submit();

        }
        document.getElementById("gender3").onclick=function () {
            //R最大
            var r=add0(B);
            B=r.substring(0,3);
            var addnum=r.substring(4,6);
            R=R+17*addnum;
            G=G+17*addnum;
            if(R>255){
                R=255;
            }
            if(G>255){
                G=255;
            }
          submit();
        }
    }
    function time() {
        timer=setInterval(function () {
            if (i>14){
                clearInterval(timer);
            }
             create();
             changecolor();
             i++;
        },100)
    }
    function create() {
        var child=document.createElement("div");
        document.getElementsByClassName("color")[0].appendChild(child);
    }
    function changecolor() {
        if(R<0){
            R=0;
        }
        if(G<0){
            G=0;
        }
        if(B<0){
            B=0;
        }
        var color= 'RGB('+R+','+G+','+B+')';
        document.getElementsByClassName("color")[0].getElementsByTagName("div")[i].innerHTML=color+" "+"#"+R.toString(16)+G.toString(16)+B.toString(16);
        document.getElementsByClassName("color")[0].getElementsByTagName("div")[i].style.color="green";
        document.getElementsByClassName("color")[0].getElementsByTagName("div")[i].style.background=color;
        R=R-17;
        G=G-17;
        B=B-17;
    }
    function add0(who) {
        var j=0;
        if(who>=239&&who<=255){
            j=0;
        }
        if(who>=222&&who<=238){
            who=who+17*1;
            j=1;
        }
        if(who>=205&&who<=221){
            who=who+17*2;
            j=2;
        }if(who>=188&&who<=204){
            who=who+17*3;
            j=3;
        }if(who>=171&&who<=187){
            who=who+17*4;
            j=4;
        }
        if(who>=154&&who<=170){
            who=who+17*5;
            j=5;
        }if(who>=137&&who<=153){
            who=who+17*6;
            j=6;
        }if(who>=120&&who<=136){
            who=who+17*7;
            j=7;
        }if(who>=103&&who<=119){
            who=who+17*8;
            i=8;
        }
        if(who>=86&&who<=102){
            who=who+17*9;
            j=9;
        }if(who>=69&&who<=85){
            who=who+17*10;
            j=10;
        }if(who>=52&&who<=68){
            who=who+17*11;
            j=11;
        }if(who>=35&&who<=51){
            who=who+17*12;
            j=12;
        }if(who>=18&&who<=34){
            who=who+17*13;
            j=13;
        }
        if(who>=0&&who<=17){
            who=who+17*14;
            j=14;
        }
         return who+"#"+j;


    }
    function submit() {
        document.getElementById("submit").onclick=function () {
             time();
        }
    }

    function reset() {
        document.getElementById("reset").onclick=function () {

            while(document.getElementsByClassName("color")[0].getElementsByTagName("div").length>=1){
                document.getElementsByClassName("color")[0].removeChild(document.getElementsByClassName("color")[0].lastChild);
            }
           i=0;
            main();
        }
    }
</script>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章