原生JS,让我抓狂让我欣喜---渐变色选分值

由于秉承我司一向自己动手丰衣足食的信念,我用纯原生JS完成了一组在渐变色块儿中随手势滑动定分值的效果,已经分别处理好移动端和PC端操作事件.......喏,个人表达能力有限,上图看效果先 ~

icon_move.jpg

这组效果需要实现以下一个功能:
1、布局吧,还是说说吧 具体见上图(还是懒得说 hiahiahiahia)。
2、首先加载渐变色块要考虑到一共多少块,每块变化的颜色值(RGB)
3、当鼠标/手指按下或滑动到其中一块,这块之前的色块都要渐变成一组新的颜色。
4、获取鼠标/手指抬起时的分值。

二话不说,先看html和css部分代码,(起名能力有限,见谅~):

<body>
  <div id="movescore" class="box"></div>
  <div  style=" left:45%;  position:absolute; top:70%;  " id="_div">
    <input type="button" value="下一题" id="next" style="width:80px; height:40px;     background:skyblue;" />
  </div>
 </body>

页面中只有容器和一个按钮,so,其他重要的元素就要通过JS来创建了:

window.onload=function(){
    page_load("movescore",10);
  }

这个page_load是什么呢,就是加载静态页面的函数,由于个人工作原因,现在习惯性的把一些以后会复用的静态布局整理成JS函数工具,

//加载页面
  function page_load(box_id,td_num){
    var oBox=document.getElementById(box_id);
    
    oBox.innerHTML='<div class="score" id="movescore_score">0分</div>'+
                    '<table class="list_style" id="movescore_number_list"                     border=0 width=100% cellspacing=0 cellpadding=0 ></table>'+
                    '<ul class="list_style" id="movescore_color_list"></ul>'+
                    '<div class="move_btn" id="move_area" ><span id="movescore_movebtn" class="movebtn"></span></div>'+
                    '<div style="margin-top:20px; " id="info">注:分值越高表示满意度越高。</div>'+
                    '<input type="hidden" id="movescore_hidden_res" value="0分"/>';

    var g = for_color('187||157||157',-20,td_num,1,'');
    var _g = for_color('255||255||255',-20,td_num,2,'change');
    var answer=0;
    
    var score_num=document.getElementById(box_id+"_score");

    var list=document.getElementById(box_id+'_color_list');
    var listnumber=document.getElementById(box_id+'_number_list');   
    var oTr=document.createElement('tr');
        listnumber.appendChild(oTr);
            for(var i=0;i<td_num;i++){
                var oLi=document.createElement('li');
                oLi.id='x_'+i;
                oLi.setAttribute("class","li_style");
                oLi.style.width=Number(100/td_num)+'%';
                oLi.style.background=g[i];
                list.appendChild(oLi);

                var oTd=document.createElement('td');
                oTd.align='center';
                oTd.width=Number(100/td_num)+'%';
                oTd.innerHTML=Number(i+1)+'分';
                oTr.appendChild(oTd);
            }
        //加载操作功能:
        move_iconaction(box_id,g,_g,score_num);
  }

接下来看这几个函数了:
1、for_color():循环遍历加载渐变色

    function for_color(sColor,step_value,step,t,_change){
            //参数info:
            //sColor第一个页面的初始颜色的起始浅色 例如:'187||157||157'
            //step_value同色系渐变的步长,默认为-20
            //step要渐变的单元格个数
            //t:(1:初始颜色)(2:覆盖颜色)
            //_change:('change':需要随机选择初始颜色);('':固定起始颜色,就是传入的颜色)
            if(_change=='change'){
                sColor=ran_color();
            }else{
                sColor=sColor;
            }

          if (t == 1){
            var colors=sColor.split('||');
          }else if(t == 2){
            var _colors=sColor.split('||');
            var _colors1=(-10+Number(_colors[0]))+'||'+(-5+Number(_colors[1]))+'||'+(12+Number(_colors[2]));
            var colors=_colors1.split('||');
          }else{
            var colors='255||255||255'.split('||');
          }
            //存要渐变的颜色组
          var colorArr=[];
          for(i=0;i<step;i++){
             var each_color='rgb('+(Number(colors[0])+step_value*i)+','+(Number(colors[1])+step_value*i)+','+(Number(colors[2])+step_value*i)+')';
             colorArr.push(each_color);
          }
          return colorArr;
    }

2、change_color():操作时渐变色效果

        function change_color(obj,init_color,second_color,_id,_score){
            for(var j=0;j<obj.length;j++){
                obj[j].style.background=init_color[j];
            }
            for(var k=0;k < _id;k++){   
                obj[k].style.background=second_color[k];
            }
            var res=_id;
            _score.innerHTML=res+'分';
        }

3、move_limit():1-10限制滑动范围

    function move_limit(ev_x,disX,old_left,inputid,move_icon,aLi,_score){
            var _left=ev_x-disX-old_left;
            if(Number(_left ) <= 0){
                    _left = 0;
            }else if(Number(_left) >=Number(document.getElementById(inputid+"_color_list").offsetWidth-move_icon.offsetWidth/2) ){
                            _left =Number(document.getElementById(inputid+"_color_list").offsetWidth-move_icon.offsetWidth/2)
                }
            return _left;
    }

4、move_iconaction():滑动按钮的操作事件

    function move_iconaction(inputid,g,_g,_score){
            var aLi=document.getElementById(inputid+"_color_list").children;
            var move_icon=document.getElementById(inputid+"_movebtn");
            var old_left=move_icon.offsetLeft;
            if(browser()==1){
            //PC端
            //鼠标按下
            move_icon.onmousedown=function(ev){
                var ev=ev ||  window.event;
                var disX=ev.clientX-move_icon.offsetLeft;
                var n1=parseInt((ev.clientX-old_left-disX+move_icon.offsetWidth/2)/aLi[0].offsetWidth)+1;
                change_color(aLi,g,_g,n1,_score);
                document.getElementById(inputid+"_hidden_res").value=n1+'分';
                ev.preventDefault(); 
                //鼠标滑动
                document.onmousemove=function(ev){
                    var ev=ev ||  window.event;
                    var _x=ev.clientX;
                    var _left=move_limit(_x,disX,old_left,inputid,move_icon,aLi,_score);//限制滑动范围
                    move_icon.style.left=_left+'px';
                    var a=_left+move_icon.offsetWidth/2-3;
                    var b=aLi[0].offsetWidth;
                    var n2=parseInt(a/b+1);
                    change_color(aLi,g,_g,n2,_score);
                    document.getElementById(inputid+"_hidden_res").value=n2+'分';
                    ev.preventDefault();    
                }
                document.onmouseup=function(){
                    document.onmousemove=null;
                    document.onmouseup=null;
                    document.releaseCapture&&document.releaseCapture();
                }
            }
        }else{
            //移动端:
            move_icon.addEventListener('touchstart',function(ev){
                   fnStart(inputid,this,ev,aLi,old_left,g,_g,_score);
            },false);
        }
        
        document.getElementById("_div").onclick=function(){
            alert(document.getElementById(inputid+"_hidden_res").value);
        }
    }

5、fnStart():移动端点击和滑动事件

        function fnStart(inputid,_this,ev,aLi,old_left,sc,ec,_score){
            //手指按下
            var x=ev.targetTouches[0].pageX;
            var dis_x=x-_this.offsetLeft;   
            var n_1= parseInt((x-dis_x-old_left+_this.offsetWidth/2)/aLi[0].offsetWidth+1);
            change_color(aLi,sc,ec,n_1,_score);
            document.getElementById(inputid+"_hidden_res").value=n_1+'分';
            ev.preventDefault();    
            
            //手指滑动
            _this.addEventListener('touchmove',function(ev){
                var ev=ev|| window.event;
                var x=ev.targetTouches[0].pageX;        
                var _left=move_limit(x,dis_x,old_left,inputid,_this,aLi,_score);//限制滑动范围
                _this.style.left=_left+'px';        
                var a=_left+_this.offsetWidth/2-3;
                var b=aLi[0].offsetWidth;
                var n2=parseInt(a/b+1);
                change_color(aLi,sc,ec,n2,_score);
                document.getElementById(inputid+"_hidden_res").value=n2+'分';
                ev.preventDefault();
             },false);
        }

6、常见获取随机数和检测浏览器设备的工具:

/*******获取换页时初始颜色的起始颜色的随机数********/
        function ran_color(){
            var r=parseInt(Math.random()*(255-200)+200);
            var g=parseInt(Math.random()*(255-200)+200);
            var b=parseInt(Math.random()*(255-200)+200);
            return r+'||'+g+'||'+b;
        }
    
/****分辨PC和移动端****/
        function browser(){
            try {
                document.createEvent("TouchEvent");
                // alert('移动端支持TouchEvent事件!');
                return 2;
            } catch (e) {
                return 1;
            }
        }

到此为止,这个货就搞完了,虽然原生JS hin浪费时间,但是不得不承认很锻炼人,目前由于个人封装能力有限,有些地方还有点拙劣和繁琐,欢迎各位童鞋在评论中指出或联系本人,不胜感激。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容