zoukankan      html  css  js  c++  java
  • Fixed Gear DIY整车配色 JavaScript版制作过程

    在线效果预览:http://jsfiddle.net/dtdxrk/JTBvg/3/embedded/result/(需要加载3m左右的png 会慢点要等等)

    文件打包下载:https://files.cnblogs.com/dtdxrk/fixed-Js.rar

    由于一些原因今年没有时间去香山撒野了,心里又痒痒.不能这么平淡的过冬,于是整了辆死飞玩,正好练练技术.

    看到fixedchina有个配色的flash不错,正好巩固一下基础复刻一个Js版的练练手.

    页面截图:

    第一步 制作菜单

    菜单一共有4级,我采用json格式单独引用.(我手写的,手写数据吭爹啊)

    js引用地址:https://files.cnblogs.com/dtdxrk/fixed.js

    第二步 加载菜单

    数据写完后,我们把它加载出来.

    html采用的是li里嵌套ul,这是跟WordPress学的.

    这样做的好处就是可以用:hover伪类,搞定2级3级4级的show or hidden,不需要再写js.

    当然ie6这个奇葩除外,我这里没有针对ie6做特殊处理...

    那js要做的工作就简单多了,几个for循环把内容遍历出来就ok.

    html部分结构:

     1 <ul id="menu">
     2     <li>前叉
     3         <ul>
     4             <li>弯前叉
     5                 <ul>
     6                     <li>电镀银</li>
     7                     <li>阳极黑</li>
     8                 </ul>
     9             </li>
    10             <li>直前叉
    11                 <ul>
    12                     <li>黑色</li>
    13                     <li>白色</li>
    14                 </ul>
    15             </li>
    16         </ul>
    17     </li>
    18 </ul>

    css部分

    1     #menu{z-index: 100;left:20px; top: 20px; position:absolute;}
    2     #menu ul{z-index: 101;}
    3     #menu ul ul{z-index: 102;}
    4     #menu ul ul ul{z-index: 103;}
    5     #menu li{  80px; padding-left:3px;padding-right: 2px; height: 17px;cursor: default; margin-bottom: 2px; position: relative; background: url(images/menu.gif) no-repeat;}
    6     #menu li:hover, #menu li:hover a,#menu a:focus, #menu a:hover, #menu a:active {background-position: 0 -17px;}
    7     #menu ul {position:absolute;display:none;12em;left: 85px;top: 0;z-index: 1;}
    8     #menu li:hover ul ul, #menu li:hover ul ul ul, #menu li:hover ul ul ul ul{display:none;}
    9     #menu li:hover ul, #menu li li:hover ul, #menu li li li:hover ul, #menu li li li li:hover ul{display:block;}

    js部分

     1 var doc = document,
     2     ul = doc.getElementById('menu');
     3 
     4 //加载菜单
     5 for(var i=0, length=fixedgear.length; i<length; i++){
     6     var li = doc.createElement("li");
     7     li.innerText = fixedgear[i].name;
     8 
     9     //  2级
    10     if(fixedgear[i].classes){
    11         var ul2 = doc.createElement("ul");
    12         for(var ii=0, length2=fixedgear[i].classes.length; ii<length2; ii++){
    13             var li2 = doc.createElement("li"),
    14                 str = fixedgear[i].classes[ii];
    15             li2.innerText = str.name;
    16 
    17             // 3级
    18             if(str.classes){
    19                 var ul3 = doc.createElement("ul");
    20                 for (var iii=0, length3= str.classes.length; iii<length3; iii++){
    21                     var li3 = doc.createElement("li"),
    22                         str2 = str.classes[iii];
    23                     li3.innerText = str2.name;
    24 
    25                     // 4级
    26                     if(str2.classes){
    27                         var ul4 = doc.createElement("ul");
    28                         for (var iiii=0, length4=str2.classes.length; iiii<length4; iiii++){
    29                             var li4 = doc.createElement("li");
    30                                 str3 = str2.classes[iiii];
    31                             li4.innerText = str3.name;
    32                             ul4.appendChild(li4);
    33                         }
    34                         li3.appendChild(ul4);
    35                     }
    36 
    37                     ul3.appendChild(li3);
    38                 }
    39                 li2.appendChild(ul3);
    40             }  
    41             ul2.appendChild(li2);
    42             
    43         }
    44         li.appendChild(ul2);
    45     }
    46 
    47     ul.appendChild(li);
    48 }

    第三步 分解自行车在组装

    之所以搞个fixed gear玩就是因为它简单.

    整车从上到下只有19个零件,连刹车都没有...

    当然只是零件少就简单有点肤浅了,我理解的fixed gear更多是生活方式上的简单和自由.

    fixed gear的后轴和飞轮是一起旋转的,你往前骑前走,往后蹬后走,一般出现在场地竞技比赛和一些特技自行车上.

    置于这玩意怎么停住,就不是这里讨论的话题了...有兴趣的可以搜一下视频 fixed gear skid.

    言规正传,刚才说整车有19个零件,我们就要把这些零件做成漂浮的div.

    然后在给这些div添加样式设置 位置 宽 高和背景png.

    来个图片更直观点 这是dreamweaver设计模式的截图 很清楚了吧

    css部分

     1     #chejia{ 386px; height: 250px; background: url(images/chejia.png) no-repeat;z-index: 3;top:154px;left:187px;}
     2     #lunzu, #lunzu2{ 260px; height: 260px; background: url(images/lunzu.png) no-repeat;z-index: 2;top:245px;left:488px;}
     3     #lunzu2{top:245px;left:66px;}
     4     #waitai, #waitai2{ 272px; height: 273px; background: url(images/waitai.png) no-repeat;z-index: 2;top:240px;left:482px;}
     5     #waitai2{top:240px;left:60px;}
     6     #lt{ 230px; height: 88px; background: url(images/lt.png) no-repeat;z-index: 4;top:359px;left:182px;}
     7     #qiancha{ 66px; height: 143px; background: url(images/qiancha.png) no-repeat;z-index: 4;top:235px;left:558px;}
     8     #wanzu{ 40px; height: 93px; background: url(images/wanzu.png) no-repeat;z-index: 4;top:147px;left:535px;}
     9     #yapan{ 98px; height: 93px; background: url(images/yapan.png) no-repeat;z-index: 4;top:364px;left:325px;}
    10     #bali{ 59px; height: 28px; background: url(images/bali.png) no-repeat;z-index: 4;top:122px;left:530px;}
    11     #zuogan{ 45px; height: 71px; background: url(images/zuogan.png) no-repeat;z-index: 4;top:90px;left:259px;}
    12     #chezuo{ 120px; height: 32px; background: url(images/chezuo.png) no-repeat;z-index: 4;top:60px;left:215px;}
    13     #wanba{ 96px; height: 113px; background: url(images/wanba.png) no-repeat;z-index: 3;top:109px;left:563px;}
    14     #jiaota{ 61px; height: 70px; background: url(images/jiaota.png) no-repeat;z-index: 4;top:445px;left:383px;}
    15     #jiaota2{ 40px; height: 47px; background: url(images/jiaota2.png) no-repeat;z-index: 1;top:329px;left:280px;}

    html部分

     1 <div id="content">
     2     <ul id="menu"></ul>
     3     <div id="chejia"></div>
     4     <div id='lunzu'></div>
     5     <div id='lunzu2'></div>
     6     <div id="waitai"></div>
     7     <div id="waitai2"></div>
     8     <div id="lt"></div>
     9     <div id="qiancha"></div>
    10     <div id="wanzu"></div>
    11     <div id="yapan"></div>
    12     <div id="bali"></div>
    13     <div id="zuogan"></div>
    14     <div id="chezuo"></div>
    15     <div id="wanba"></div>
    16     <div id="jiaota"></div>
    17     <div id="jiaota2"></div>
    18 </div>

    第四步 添加事件 & CSS Sprites

    有了结构和数据,我们就把他们链接在一起.

    点击颜色或零件的时候加载对应的背景图片

     1 //如果有这个属性就给他添加点击事件
     2 if(str.div) addEvent(li2, "click", loadPic(str.div, str.x, str.y));
     3 
     4 function addEvent(elem, type, fn){
     5     if (elem.attachEvent) {
     6         elem.attachEvent('on' + type, fn);
     7         return;
     8     }
     9     if (elem.addEventListener) {
    10         elem.addEventListener(type, fn, false);
    11     }
    12 }
    13 
    14 function loadPic(div, x, y){
    15     return function(){
    16         var ele = document.getElementById(div);
    17         ele.style.backgroundPositionX = x + "px";
    18         ele.style.backgroundPositionY = y + "px";
    19     }   
    20 }

    制作CSS Sprites需要拼接图片,我这里没有把所有零件都扔一张图里.

    虽然这样做能减少线程,但我觉得不利于产品的后期维护.(当然这产品也不存在什么后期维护)

    页面到这里就做完了,大家帮我一起测测.

    用ff在jsfiddle.net在线预览时,点击菜单是没有响应的.应该是jsfiddle.net的页面框架问题,本地文件除了ie6以外所以浏览器通过测试.

    这里有个问题,透明png的锯齿在flash里是可以用一个滤镜消除的.

    但是在浏览器里不知道怎么搞定,我想搜搜外国的大佬们是怎么做的,可是google什么都打不开,baidu又tm啥都搜不到...

    如果哪位大神有解决方案请赐教,谢谢!

    全部页面:

      1 <!DOCTYPE html>
      2 <html lang="zh-CN">
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      5 <title>fixed</title>
      6 <script src="fixed.js" type="text/javascript"></script>
      7 <style type="text/css">
      8     *{margin: 0;padding: 0;list-style: none;}
      9     body{background: #333;font:12px '微软雅黑', arial, \5b8b\4f53, sans-serif;}
     10     
     11     h1{width: 800px;margin: 10px auto; padding:0 10px;background: #fff; line-height: 80px; height: 80px;}
     12     h1 a{float:right;font-size: 16px;color: #ff007f;text-decoration: none;}
     13     h1 a:hover{text-decoration: underline;}
     14 
     15     #content{background:#fff url(images/bg.jpg) no-repeat 10px 10px;padding: 10px; width: 800px; height:550px;margin: 0 auto; position: relative; color: #333;}
     16     #content div{position:absolute;}
     17 
     18     #chejia{width: 386px; height: 250px; background: url(images/chejia.png) no-repeat;z-index: 3;top:154px;left:187px;}
     19     #lunzu, #lunzu2{width: 260px; height: 260px; background: url(images/lunzu.png) no-repeat;z-index: 2;top:245px;left:488px;}
     20     #lunzu2{top:245px;left:66px;}
     21     #waitai, #waitai2{width: 272px; height: 273px; background: url(images/waitai.png) no-repeat;z-index: 2;top:240px;left:482px;}
     22     #waitai2{top:240px;left:60px;}
     23     #lt{width: 230px; height: 88px; background: url(images/lt.png) no-repeat;z-index: 4;top:359px;left:182px;}
     24     #qiancha{width: 66px; height: 143px; background: url(images/qiancha.png) no-repeat;z-index: 4;top:235px;left:558px;}
     25     #wanzu{width: 40px; height: 93px; background: url(images/wanzu.png) no-repeat;z-index: 4;top:147px;left:535px;}
     26     #yapan{width: 98px; height: 93px; background: url(images/yapan.png) no-repeat;z-index: 4;top:364px;left:325px;}
     27     #bali{width: 59px; height: 28px; background: url(images/bali.png) no-repeat;z-index: 4;top:122px;left:530px;}
     28     #zuogan{width: 45px; height: 71px; background: url(images/zuogan.png) no-repeat;z-index: 4;top:90px;left:259px;}
     29     #chezuo{width: 120px; height: 32px; background: url(images/chezuo.png) no-repeat;z-index: 4;top:60px;left:215px;}
     30     #wanba{width: 96px; height: 113px; background: url(images/wanba.png) no-repeat;z-index: 3;top:109px;left:563px;}
     31     #jiaota{width: 61px; height: 70px; background: url(images/jiaota.png) no-repeat;z-index: 4;top:445px;left:383px;}
     32     #jiaota2{width: 40px; height: 47px; background: url(images/jiaota2.png) no-repeat;z-index: 1;top:329px;left:280px;}
     33 
     34     #menu{z-index: 100;left:20px; top: 20px; position:absolute;}
     35     #menu ul{z-index: 101;}
     36     #menu ul ul{z-index: 102;}
     37     #menu ul ul ul{z-index: 103;}
     38     #menu li{ width: 80px; padding-left:3px;padding-right: 2px; height: 17px;cursor: default; margin-bottom: 2px; position: relative; background: url(images/menu.gif) no-repeat;}
     39     /*#menu a {display:block;padding:14px 25px 15px;color: #fff;border-bottom: 0;font-size: 0.95em;}
     40     #menu a:hover{ _border-bottom: 0;}
     41     #menu li li a {padding:0.75em 25px;border: 1px dotted #d1d1d1;_background-color:#fff;_color:#000;}*/
     42     #menu li:hover, #menu li:hover a,#menu a:focus, #menu a:hover, #menu a:active {background-position: 0 -17px;}
     43     /*#menu li li a:hover {background: #00a9da;color: #fff;}*/
     44     #menu ul {position:absolute;display:none;width:12em;left: 85px;top: 0;z-index: 1;}
     45     /*#menu li ul a{10em;height:auto;float:left;}*/  
     46     #menu li:hover ul ul, #menu li:hover ul ul ul, #menu li:hover ul ul ul ul{display:none;}
     47     #menu li:hover ul, #menu li li:hover ul, #menu li li li:hover ul, #menu li li li li:hover ul{display:block;}
     48 </style>
     49 </head>
     50 
     51 <body>
     52 <h1><a href="http://www.cnblogs.com/dtdxrk/" target="_black">文刀日月-BLOG</a>Fixed Gear-JavaScript版</h1>
     53 <div id="content">
     54     <ul id="menu"></ul>
     55     <div id="chejia"></div>
     56     <div id='lunzu'></div>
     57     <div id='lunzu2'></div>
     58     <div id="waitai"></div>
     59     <div id="waitai2"></div>
     60     <div id="lt"></div>
     61     <div id="qiancha"></div>
     62     <div id="wanzu"></div>
     63     <div id="yapan"></div>
     64     <div id="bali"></div>
     65     <div id="zuogan"></div>
     66     <div id="chezuo"></div>
     67     <div id="wanba"></div>
     68     <div id="jiaota"></div>
     69     <div id="jiaota2"></div>
     70 </div>
     71 
     72 <script type="text/javascript">
     73 function isIE(){ //ie? 
     74 if (window.navigator.userAgent.toLowerCase().indexOf("msie")>=1) 
     75     return true; 
     76 else 
     77     return false; 
     78 } 
     79 
     80 if(!isIE()){ //firefox innerText define
     81     HTMLElement.prototype.__defineGetter__("innerText", 
     82     function(){
     83         var anyString = "";
     84         var childS = this.childNodes;
     85         for(var i=0; i<childS.length; i++) { 
     86             if(childS[i].nodeType==1)
     87                 //anyString += childS[i].tagName=="BR" ? "\n" : childS[i].innerText;
     88                 anyString += childS[i].innerText;
     89             else if(childS[i].nodeType==3)
     90                 anyString += childS[i].nodeValue;
     91         }
     92         return anyString;
     93     } 
     94     ); 
     95     HTMLElement.prototype.__defineSetter__("innerText", 
     96         function(sText){
     97             this.textContent=sText; 
     98         } 
     99     ); 
    100 }
    101 
    102 var doc = document,
    103     ul = doc.getElementById('menu');
    104 
    105 //加载菜单
    106 for(var i=0, length=fixedgear.length; i<length; i++){
    107     var li = doc.createElement("li");
    108     li.innerText = fixedgear[i].name;
    109     if(fixedgear[i].name == "Bug?意见!"){
    110         li.style.color = "#ff007f";
    111         addEvent(li, "click", function(){window.open(fixedgear[i-1].blog)}); 
    112     }
    113 
    114     //  2级
    115     if(fixedgear[i].classes){
    116         var ul2 = doc.createElement("ul");
    117         for(var ii=0, length2=fixedgear[i].classes.length; ii<length2; ii++){
    118             var li2 = doc.createElement("li"),
    119                 str = fixedgear[i].classes[ii];
    120             li2.innerText = str.name;
    121             if(str.div) addEvent(li2, "click", loadPic(str.div, str.x, str.y));  
    122 
    123 
    124             // 3级
    125             if(str.classes){
    126                 var ul3 = doc.createElement("ul");
    127                 for (var iii=0, length3= str.classes.length; iii<length3; iii++){
    128                     var li3 = doc.createElement("li"),
    129                         str2 = str.classes[iii];
    130                     li3.innerText = str2.name;
    131                     if(str2.div) addEvent(li3, "click", loadPic(str2.div, str2.x, str2.y));
    132 
    133                     // 4级
    134                     if(str2.classes){
    135                         var ul4 = doc.createElement("ul");
    136                         for (var iiii=0, length4=str2.classes.length; iiii<length4; iiii++){
    137                             var li4 = doc.createElement("li");
    138                                 str3 = str2.classes[iiii];
    139                             li4.innerText = str3.name;
    140                             if(str3.div) addEvent(li4, "click", loadPic(str3.div, str3.x, str3.y));
    141                             ul4.appendChild(li4);
    142                         }
    143                         li3.appendChild(ul4);
    144                     }
    145 
    146                     ul3.appendChild(li3);
    147                 }
    148                 li2.appendChild(ul3);
    149             }  
    150             ul2.appendChild(li2);
    151             
    152         }
    153         li.appendChild(ul2);
    154     }
    155 
    156     ul.appendChild(li);
    157 }
    158 
    159 //如果有这个属性就给他添加点击事件
    160 if(str.div) addEvent(li2, "click", loadPic(str.div, str.x, str.y));
    161 
    162 function addEvent(elem, type, fn){
    163     if (elem.attachEvent) {
    164         elem.attachEvent('on' + type, fn);
    165         return;
    166     }
    167     if (elem.addEventListener) {
    168         elem.addEventListener(type, fn, false);
    169     }
    170 }
    171 
    172 function loadPic(div, x, y){
    173     return function(){
    174         var ele = document.getElementById(div);
    175         // ele.style.backgroundImage = "images/" + div + ".png";
    176         ele.style.backgroundPositionX = x + "px";
    177         ele.style.backgroundPositionY = y + "px";
    178     }   
    179 }
    180 
    181 </script>
    182 
    183 </body>
    184 </html>
  • 相关阅读:
    Java设计模式——装饰器模式
    Java设计模式——观察者模式
    Java设计模式——代理模式
    Java设计模式——适配器模式
    Java设计模式——建造者模式
    Java项目——聊天器
    Java设计模式——抽象工厂模式
    JDBC操作(总结)
    JDBC操作(大纲)
    JavaScript事件委托的技术原理
  • 原文地址:https://www.cnblogs.com/dtdxrk/p/2793236.html
Copyright © 2011-2022 走看看