├── README.md ├── jquery-3.1.1.min.js ├── part1 ├── task1.html ├── task10.html ├── task11 │ ├── picture │ │ ├── article.png │ │ ├── col-1.png │ │ ├── col-2.png │ │ ├── col-3.png │ │ ├── head.png │ │ ├── label.png │ │ └── title.png │ ├── task11.css │ └── task11.html ├── task12.html ├── task2.html ├── task3.html ├── task4.html ├── task5.html ├── task6 │ ├── task6.css │ └── task6.html ├── task7 │ ├── picture │ │ ├── arrow.png │ │ ├── icon-1.png │ │ ├── icon-2.jpg │ │ ├── icon-3.jpg │ │ ├── icon-4.jpg │ │ ├── icon-5.jpg │ │ ├── icon-6.jpg │ │ ├── icon-7.png │ │ ├── icon-8.png │ │ ├── pic01.jpg │ │ ├── pic02.jpg │ │ ├── pic03.jpg │ │ ├── pic04.jpg │ │ ├── pic05.jpg │ │ ├── pic06.jpg │ │ ├── pic07.jpg │ │ ├── pic08.jpg │ │ ├── qq.png │ │ ├── twitter.png │ │ ├── web.png │ │ └── weibo.png │ ├── task7.css │ └── task7.html ├── task8.html └── task9 │ ├── picture │ ├── black_arrow.png │ ├── blue_arrow.png │ ├── change.png │ ├── close_arrow.png │ ├── doc_close.png │ ├── doc_open.png │ ├── file_close.png │ ├── file_cur.png │ ├── file_open.png │ ├── gou.png │ ├── history.png │ ├── login.png │ ├── logo.png │ ├── open_arrow.png │ ├── select_down.png │ ├── share.png │ ├── star.png │ ├── user_info.png │ └── zoom.png │ ├── task9.css │ └── task9.html ├── part2 ├── task13 │ ├── README.md │ └── task13.html ├── task14 │ ├── README.md │ └── task14.html ├── task15 │ ├── README.md │ └── task15.html ├── task16 │ ├── README.md │ ├── task16.html │ └── task16.js ├── task17 │ ├── README.md │ ├── task17.html │ └── task17.js ├── task18 │ ├── README.md │ ├── task18.html │ └── task18.js ├── task19 │ ├── README.md │ ├── task19.html │ └── task19.js ├── task20 │ ├── README.md │ ├── task20.html │ └── task20.js ├── task21 │ ├── README.md │ ├── task21.html │ └── task21.js ├── task22 │ ├── README.md │ ├── task22.html │ └── task22.js ├── task23 │ ├── README.md │ ├── task23.html │ └── task23.js ├── task24 │ ├── README.md │ ├── task24.html │ └── task24.js ├── task25 │ ├── README.md │ ├── task25.html │ └── task25.js ├── task26 │ ├── README.md │ ├── task26.html │ └── task26.js ├── task27 │ ├── README.md │ ├── task27.html │ └── task27.js ├── task28 │ ├── README.md │ ├── task28.html │ └── task28.js ├── task29 │ ├── README.md │ └── task29.html ├── task30 │ ├── README.md │ ├── task30.html │ └── task30.js ├── task31 │ ├── README.md │ └── task31.html ├── task32 │ ├── README.md │ ├── task32.html │ └── task32.js ├── task33 │ ├── README.md │ ├── task33.html │ └── task33.js ├── task34 │ ├── README.md │ ├── task34.html │ └── task34.js └── task35 │ ├── README.md │ ├── task35.html │ └── task35.js ├── part3 ├── task37 │ ├── README.md │ ├── task37.html │ └── task37.js ├── task38 │ ├── README.md │ ├── task38.html │ └── task38.js ├── task39 │ ├── README.md │ ├── task39.html │ └── task39.js ├── task40 │ ├── README.md │ ├── task40.html │ └── task40.js ├── task41 │ ├── README.md │ ├── task41.html │ └── task41.js ├── task42 │ ├── README.md │ ├── task42.html │ └── task42.js ├── task43 │ ├── README.md │ ├── images │ │ ├── 01.jpg │ │ ├── 02.jpg │ │ ├── 03.jpg │ │ ├── 04.jpg │ │ ├── 05.jpg │ │ └── 06.jpg │ ├── task43.css │ ├── task43.html │ └── task43.js ├── task44 │ ├── README.md │ ├── task44.css │ ├── task44.html │ └── task44.js └── task45 │ ├── README.md │ ├── task45.css │ ├── task45.html │ └── task45.js └── picture ├── task1.jpg ├── task2.jpg ├── 风景1.jpg ├── 风景2.jpg └── 风景3.jpg /README.md: -------------------------------------------------------------------------------- 1 | ## [百度前端技术学院2016任务](http://ife.baidu.com/2016/task/all) 2 | * [百度前端技术学院2017任务](https://github.com/woai3c/2017ife-task) 3 | * [百度前端技术学院2018任务](https://github.com/woai3c/2018ife-task) 4 | 5 | 6 | ## 任务Part1 Demo(html及css不含js代码) 7 | 1. [零基础HTML编码](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task1.html) 8 | 2. [零基础HTML及CSS编码(一)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task2.html) 9 | 3. [三栏式布局](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task3.html) 10 | 4. [定位和居中问题](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task4.html) 11 | 5. [零基础HTML及CSS编码(二)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task5.html) 12 | 6. [通过HTML及CSS模拟报纸排版](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task6/task6.html) 13 | 7. [实现常见的技术产品官网的页面架构及样式布局](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task7/task7.html) 14 | 8. [响应式网格(栅格化)布局](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task8.html) 15 | 9. [使用HTML/CSS实现一个复杂页面](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task9/task9.html) 16 | 10. [Flexbox 布局练习](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task10.html) 17 | 11. [移动Web页面布局实践](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task11/task11.html) 18 | 12. [学习CSS 3的新特性](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part1/task12.html) 19 | 20 | ## 任务Part2 Demo JS基础 21 | 13. [零基础JavaScript编码(一)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task13/task13.html) 22 | 14. [零基础JavaScript编码(二)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task14/task14.html) 23 | 15. [零基础JavaScript编码(三)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task15/task15.html) 24 | 16. [零基础JavaScript编码(四)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task16/task16.html) 25 | 17. [零基础JavaScript编码(五)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task17/task17.html) 26 | 18. [基础JavaScript练习(一)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task18/task18.html) 27 | 19. [基础JavaScript练习(二)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task19/task19.html) 28 | 20. [基础JavaScript练习(三)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task20/task20.html) 29 | 21. [基础JavaScript练习(四)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task21/task21.html) 30 | 22. [JavaScript和树(一)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task22/task22.html) 31 | 23. [JavaScript和树(二)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task23/task23.html) 32 | 24. [JavaScript和树(三)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task24/task24.html) 33 | 25. [JavaScript和树(四)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task25/task25.html) 34 | 26. [行星与飞船(一)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task26/task26.html) 35 | 27. [行星与飞船(二)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task27/task27.html) 36 | 28. [行星与飞船(三)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task28/task28.html) 37 | 29. [表单(一)单个表单项的检验](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task29/task29.html) 38 | 30. [表单(二)多个表单项的动态校验](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task30/task30.html) 39 | 31. [表单(三)联动](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task31/task31.html) 40 | 32. [表单(四)实现表单自动生成工厂](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task32/task32.html) 41 | 33. [听指令的小方块(一)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task33/task33.html) 42 | 34. [听指令的小方块(二)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task34/task34.html) 43 | 35. [听指令的小方块(三)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part2/task35/task35.html) 44 | 45 | ## 任务Part3 Demo 综合练习HTML,CSS,JavaScript 46 | 37. [UI组件之浮出层](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task37/task37.html) 47 | 38. [UI组件之排序表格](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task38/task38.html) 48 | 39. [UI组件之冻结行列表格](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task39/task39.html) 49 | 40. [UI组件之日历组件(一)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task40/task40.html) 50 | 41. [UI组件之日历组件(二)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task41/task41.html) 51 | 42. [UI组件之日历组件(三)](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task42/task42.html) 52 | 43. [多功能相册之拼图布局](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task43/task43.html) 53 | 44. [多功能相册之瀑布布局](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task44/task44.html) 54 | 45. [多功能相册之木桶布局](https://htmlpreview.github.io/?https://github.com/woai3c/2016ife-task/blob/master/part3/task45/task45.html) 55 | -------------------------------------------------------------------------------- /part1/task1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 任务一:零基础HTML编码 6 | 7 | 8 | 9 |

网站一级标题

10 | 16 | 17 |

文章一级标题

18 |

文章二级标题

19 |

文章作者 文章发表时间

20 |

这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这里有一个链接到我GITHUB的链接
21 | 22 | 这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落 23 |

24 | 25 |

另一篇文章一级标题

26 |

文章二级标题

27 | 这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这里有一个链接到我GITHUB的链接
28 | 29 | 这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落这是一个很长的段落 30 |

31 | 36 | 好看的图片
37 |
38 | 好看的图片
39 |
40 | 好看的图片
41 |
42 |

下面是一个表格

43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
例子例子例子
数字数字数字
数字数字数字
总计100
64 |

这里以后是一个侧栏,这是侧栏的标题
65 | 侧栏注册窗口标题 66 |

67 |
68 | 请输入邮箱地址: 69 |
70 | 请输入密码: 71 |
72 | 请重复输入密码: 73 |
74 | 密码为6-16位英文数字
75 | 性别: 76 | 女 77 | 城市: 78 | 84 | 爱好: 85 | 运动 86 | 艺术 87 | 科学 88 | 个人描述: 89 | 90 | 91 |
92 | 版权所有@ 93 | 94 | -------------------------------------------------------------------------------- /part1/task10.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 任务十:Flexbox 布局练习 6 | 43 | 44 | 45 |
46 |
47 |
48 |
49 |
50 |
51 | 52 | -------------------------------------------------------------------------------- /part1/task11/picture/article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task11/picture/article.png -------------------------------------------------------------------------------- /part1/task11/picture/col-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task11/picture/col-1.png -------------------------------------------------------------------------------- /part1/task11/picture/col-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task11/picture/col-2.png -------------------------------------------------------------------------------- /part1/task11/picture/col-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task11/picture/col-3.png -------------------------------------------------------------------------------- /part1/task11/picture/head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task11/picture/head.png -------------------------------------------------------------------------------- /part1/task11/picture/label.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task11/picture/label.png -------------------------------------------------------------------------------- /part1/task11/picture/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task11/picture/title.png -------------------------------------------------------------------------------- /part1/task11/task11.css: -------------------------------------------------------------------------------- 1 | @media (max-width: 320px) { 2 | html { 3 | font-size: 62.5%; 4 | } 5 | } 6 | @media (min-width: 321px) and (max-width: 360px) { 7 | html { 8 | font-size: 70%; 9 | } 10 | } 11 | @media (min-width: 361px) and (max-width: 414px) { 12 | html { 13 | font-size: 80%; 14 | } 15 | } 16 | @media (min-width: 415px) and (max-width: 435px) { 17 | html { 18 | font-size: 90%; 19 | } 20 | } 21 | @media (min-width: 600px) and (max-width: 768px) { 22 | html { 23 | font-size: 120%; 24 | } 25 | } 26 | @media (min-width: 1000px) { 27 | html { 28 | font-size: 200%; 29 | } 30 | } 31 | * { 32 | margin: 0; 33 | padding: 0; 34 | font-family: 微软雅黑; 35 | } 36 | img { 37 | width: 100%; 38 | height: 100%; 39 | } 40 | header #head { 41 | background: #91d4da; 42 | width: 100%; 43 | height: 5rem; 44 | color: #fff; 45 | font: 2.3rem 宋体; 46 | line-height: 5rem; 47 | text-align: center; 48 | } 49 | header #head span:first-child { 50 | font-size: 2rem; 51 | cursor: pointer; 52 | } 53 | header #head .left { 54 | position: absolute; 55 | left: 0; 56 | } 57 | header ul { 58 | font-size: 0px; 59 | list-style: none; 60 | width: 100%; 61 | height: 5rem; 62 | position: relative; 63 | } 64 | header ul li { 65 | box-sizing: border-box; 66 | line-height: 5rem; 67 | width: 20%; 68 | height: 5rem; 69 | font-size: 2rem; 70 | text-align: center; 71 | display: inline-block; 72 | cursor: pointer; 73 | } 74 | header ul #move { 75 | position: absolute; 76 | top: 5rem; 77 | left: 0; 78 | height: 0; 79 | border: 3px solid #91d4da; 80 | transition: left 0.4s ease-in-out; 81 | } 82 | header ul li:nth-child(1):hover~#move { 83 | left: 0; 84 | } 85 | header ul li:nth-child(2):hover~#move { 86 | left: 20%; 87 | } 88 | header ul li:nth-child(3):hover~#move { 89 | left: 40%; 90 | } 91 | header ul li:nth-child(4):hover~#move { 92 | left: 60%; 93 | } 94 | header ul li:nth-child(5):hover~#move { 95 | left: 80%; 96 | } 97 | header img { 98 | position: relative; 99 | top: 0.33rem; 100 | } 101 | article #part1 { 102 | width: 95%; 103 | height: 9rem; 104 | margin: auto; 105 | position: relative; 106 | top: 1rem; 107 | border-bottom: 3px solid #d3d3d3; 108 | } 109 | article #part1 ul { 110 | list-style: none; 111 | font-size: 0; 112 | text-align: center; 113 | } 114 | article #part1 ul li { 115 | display: inline-block; 116 | width: 17%; 117 | box-sizing: border-box; 118 | height: 5.3rem; 119 | font-size: 1.5rem; 120 | padding-top: 1rem; 121 | transition: color 0.4s ease-in-out; 122 | margin-right: 2%; 123 | } 124 | article #part1 ul li:hover { 125 | color: #E53C3C; 126 | } 127 | article #part2 { 128 | width: 95%; 129 | height: 15rem; 130 | margin: 5% auto 0 auto; 131 | border-bottom: 2rem solid rgba(211,211,211,0.2); 132 | } 133 | article #part2 ul { 134 | list-style: none; 135 | font-size: 0; 136 | text-align: center; 137 | } 138 | article #part2 ul li { 139 | display: inline-block; 140 | width: 33.33%; 141 | box-sizing: border-box; 142 | height: 9rem; 143 | font-size: 2rem; 144 | padding-top: 0.3rem; 145 | } 146 | article #part2 ul li span:last-child { 147 | font-size: 1.5rem; 148 | font-weight: 300; 149 | } 150 | article #part2 ul .border-right { 151 | border-right: 3px solid #d3d3d3; 152 | } 153 | article #part3 { 154 | width: 100%; 155 | } 156 | article #part3 .module { 157 | width: 100%; 158 | border-bottom: 2rem solid rgba(211,211,211,0.2); 159 | } 160 | article #part3 .module-1 { 161 | width: 90%; 162 | margin: auto; 163 | } 164 | article #part3 .module-1 p { 165 | font-size: 2rem; 166 | } 167 | article #part3 .module-1 hr { 168 | border: 1px solid #d3d3d3; 169 | } 170 | article #part3 .module-1 ul , .module-1 ul ol{ 171 | list-style: none; 172 | } 173 | article #part3 .module-1 img { 174 | width: 100%; 175 | height: 42%; 176 | } 177 | article #part3 .module-1 ul >li { 178 | display: inline-block; 179 | width: 32%; 180 | height: 18rem; 181 | vertical-align: top; 182 | text-align: center; 183 | margin-right: 1%; 184 | } 185 | article #part3 .module-1 ol >li { 186 | font-size: 1.5rem; 187 | height: 4rem; 188 | line-height: 4rem; 189 | margin-bottom: 4%; 190 | background: rgba(211,211,211,0.2); 191 | width: 100%; 192 | } 193 | article #part3 img { 194 | margin-bottom: 1rem; 195 | border: 2px solid #F4A460; 196 | } 197 | article #part3 .module-1 .bear { 198 | width: 30%; 199 | margin-left: 1%; 200 | } 201 | article #part3 .module-1 .li-3 { 202 | margin-right: 0; 203 | } 204 | article #part4 { 205 | width: 100%; 206 | } 207 | article #part4 .module { 208 | width: 100%; 209 | height: 9rem; 210 | border-bottom: 3px solid rgba(211,211,211,0.3); 211 | } 212 | article #part4 .module ul { 213 | width: 90%; 214 | list-style: none; 215 | } 216 | article #part4 .module ul li { 217 | display: inline-block; 218 | height: 7rem; 219 | vertical-align: top; 220 | font-size: 1rem; 221 | color: #a8a8a8; 222 | margin: 4% 0 0 6%; 223 | } 224 | article #part4 .module ul li:first-child { 225 | width: 30%; 226 | } 227 | article #part4 .module ul li:last-child { 228 | width: 56.5%; 229 | } 230 | article #part4 .module ul li h1 { 231 | font-size: 1.5rem; 232 | color: #666; 233 | } 234 | article #part 5 { 235 | width: 100%; 236 | } 237 | article #part5 .module { 238 | font-size: 1rem; 239 | color: #a8a8a8; 240 | line-height: 50px; 241 | margin-left: 10%; 242 | } 243 | article #part5 .module h1 { 244 | font-size: 1.5rem; 245 | color: #666; 246 | line-height: 6rem; 247 | } 248 | article #part5 .module img { 249 | width: 30%; 250 | height: 33%; 251 | } 252 | article #part6 { 253 | width: 100%; 254 | height: 3rem; 255 | background: rgba(211,211,211,0.2); 256 | } -------------------------------------------------------------------------------- /part1/task11/task11.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 任务十一:移动Web页面布局实践 用手机观看 13 | 14 | 15 | 16 |
17 | 21 | 29 | 30 |
31 |
32 |
33 | 40 |
41 |
42 | 47 |
48 |
49 |
50 |
51 |

模块一


52 |

53 |
    54 |
  • 55 |
  • 56 |
      57 |
    1. 这是文案
    2. 58 |
    3. 这是文案
    4. 59 |
    5. 这是文案
    6. 60 |
    7. 这是文案
    8. 61 |
    62 |
  • 63 |
  • 64 |
      65 |
    1. 这是文案
    2. 66 |
    3. 这是文案
    4. 67 |
    5. 这是文案
    6. 68 |
    7. 这是文案
    8. 69 |
    70 |
  • 71 |
72 |
73 |
74 |
75 |
76 |

模块二


77 |

78 |
    79 |
  • 80 |
  • 81 |
      82 |
    1. 这是文案
    2. 83 |
    3. 这是文案
    4. 84 |
    5. 这是文案
    6. 85 |
    7. 这是文案
    8. 86 |
    87 |
  • 88 |
  • 89 |
      90 |
    1. 这是文案
    2. 91 |
    3. 这是文案
    4. 92 |
    5. 这是文案
    6. 93 |
    7. 这是文案
    8. 94 |
    95 |
  • 96 |
97 |
98 |
99 |
100 |
101 |
102 |
    103 |
  • 104 |
  • 105 |

    这是文章标题字号是22的文章标题


    106 |

    文章来源 6分钟前

    107 |
  • 108 |
109 |
110 |
111 |
    112 |
  • 113 |
  • 114 |

    这是文章标题字号是22的文章标题


    115 |

    文章来源 6分钟前

    116 |
  • 117 |
118 |
119 |
120 |
121 |
122 |

这个也是文章标题字号是22的文章标题

123 | 124 | 125 | 126 |

文章来源 7分钟前

127 |
128 |
129 |
130 |
131 | 132 | 133 | -------------------------------------------------------------------------------- /part1/task12.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 任务十二:学习CSS 3的新特性 6 | 111 | 112 | 113 |
114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 |
排名网站热度
1. 百度前端技术学院13000
2. 百度前端技术学院12000
3. 百度前端技术学院11000
4. 百度前端技术学院10000
5. 百度前端技术学院9000
6. 百度前端技术学院8000
7. 百度前端技术学院7000
8. 百度前端技术学院6000
9. 百度前端技术学院5000
10. 百度前端技术学院4000
171 |
172 |
173 | 174 |
175 |
176 | 181 | 186 |
187 | 188 | 189 | -------------------------------------------------------------------------------- /part1/task3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 任务三:三栏式布局 6 | 52 | 53 | 54 |
55 |
56 | LOGO 57 |

团队名称

58 |

59 |
60 |

将进酒

61 | 君不见,黄河之水天上来,奔流到海不复回。 62 | 君不见,高堂明镜悲白发,朝如青丝暮成雪。 63 | 人生得意须尽欢,莫使金樽空对月。 64 | 天生我材必有用,千金散尽还复来。 65 | 烹羊宰牛且为乐,会须一饮三百杯。 66 | 岑夫子,丹丘生,将进酒,杯莫停。 67 | 与君歌一曲,请君为我倾耳听。 68 | 钟鼓馔玉不足贵,但愿长醉不复醒。 69 | 古来圣贤皆寂寞,惟有饮者留其名。 70 | 陈王昔时宴平乐,斗酒十千恣欢谑。 71 | 主人何为言少钱,径须沽取对君酌。 72 | 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 73 | 74 |

将进酒

75 | 君不见,黄河之水天上来,奔流到海不复回。 76 | 君不见,高堂明镜悲白发,朝如青丝暮成雪。 77 | 人生得意须尽欢,莫使金樽空对月。 78 | 天生我材必有用,千金散尽还复来。 79 | 烹羊宰牛且为乐,会须一饮三百杯。 80 | 岑夫子,丹丘生,将进酒,杯莫停。 81 | 与君歌一曲,请君为我倾耳听。 82 | 钟鼓馔玉不足贵,但愿长醉不复醒。 83 | 古来圣贤皆寂寞,惟有饮者留其名。 84 | 陈王昔时宴平乐,斗酒十千恣欢谑。 85 | 主人何为言少钱,径须沽取对君酌。 86 | 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 87 | 88 |

将进酒

89 | 君不见,黄河之水天上来,奔流到海不复回。 90 | 君不见,高堂明镜悲白发,朝如青丝暮成雪。 91 | 人生得意须尽欢,莫使金樽空对月。 92 | 天生我材必有用,千金散尽还复来。 93 | 烹羊宰牛且为乐,会须一饮三百杯。 94 | 岑夫子,丹丘生,将进酒,杯莫停。 95 | 与君歌一曲,请君为我倾耳听。 96 | 钟鼓馔玉不足贵,但愿长醉不复醒。 97 | 古来圣贤皆寂寞,惟有饮者留其名。 98 | 陈王昔时宴平乐,斗酒十千恣欢谑。 99 | 主人何为言少钱,径须沽取对君酌。 100 | 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 101 | 102 |

将进酒

103 | 君不见,黄河之水天上来,奔流到海不复回。 104 | 君不见,高堂明镜悲白发,朝如青丝暮成雪。 105 | 人生得意须尽欢,莫使金樽空对月。 106 | 天生我材必有用,千金散尽还复来。 107 | 烹羊宰牛且为乐,会须一饮三百杯。 108 | 岑夫子,丹丘生,将进酒,杯莫停。 109 | 与君歌一曲,请君为我倾耳听。 110 | 钟鼓馔玉不足贵,但愿长醉不复醒。 111 | 古来圣贤皆寂寞,惟有饮者留其名。 112 | 陈王昔时宴平乐,斗酒十千恣欢谑。 113 | 主人何为言少钱,径须沽取对君酌。 114 | 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 115 |
116 | 122 | 123 |
124 | 125 | -------------------------------------------------------------------------------- /part1/task4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 任务四:定位和居中问题 5 | 37 | 38 | 39 |
40 |
41 |
42 |
43 | 44 | -------------------------------------------------------------------------------- /part1/task6/task6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 任务六:通过HTML及CSS模拟报纸排版 5 | 6 | 7 | 8 |
9 | 13 |
14 |
15 |
16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 |

about

24 |

scenery

25 |

About scenery About scenery
26 | about scenery 27 |

28 | 700 29 |

3.2

30 |

css

31 |

cssssccssssccssssc

32 |
33 |
34 |
35 |
36 |

What


37 |

前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前前端前端前端前端端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前 38 |

39 |
40 |
41 |

When


42 |

前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前 43 |

44 |
45 |
46 |

How


47 |

前端前端前端前端前端

前端前端前端

前端前端前端前端

48 |

49 |

What--------40%

50 |

What--------30%

51 |

What--------30%

52 |
53 |
54 |
55 |
56 |
57 |

THE TECHNOLOGE
OF FRONT


58 |

前端技术领域


59 |
60 |
61 |
62 |
63 |

64 | 端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前 65 | 端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端。 66 |

67 |

68 | 前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端 前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端。 69 |

70 |

71 | 端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前端前。 72 |

73 |
74 |
75 |
76 | 77 |
78 |
79 |

潺潺小溪

80 |

潺潺小溪潺潺小溪

81 |
82 |

83 |

▲ 前端前端前端前端前端前端...................前端


84 |

▲ 前端前端前端前端..........................前端前


85 |

▲ 前端前端前端前端前端前端前端...............前端


86 |
87 |

0

88 |
89 |

ONE TWO
THREE FORE FIVE

90 |

hello world hello world

hello world

91 |
92 |

93 | world hello world
94 | hello world hello world
95 | hello world hello world
96 | hello world hello world
97 | hello world hello world
98 | hello world 99 |

100 |
101 |
102 |
103 | 106 |
107 | 108 | -------------------------------------------------------------------------------- /part1/task7/picture/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/arrow.png -------------------------------------------------------------------------------- /part1/task7/picture/icon-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-1.png -------------------------------------------------------------------------------- /part1/task7/picture/icon-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-2.jpg -------------------------------------------------------------------------------- /part1/task7/picture/icon-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-3.jpg -------------------------------------------------------------------------------- /part1/task7/picture/icon-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-4.jpg -------------------------------------------------------------------------------- /part1/task7/picture/icon-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-5.jpg -------------------------------------------------------------------------------- /part1/task7/picture/icon-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-6.jpg -------------------------------------------------------------------------------- /part1/task7/picture/icon-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-7.png -------------------------------------------------------------------------------- /part1/task7/picture/icon-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/icon-8.png -------------------------------------------------------------------------------- /part1/task7/picture/pic01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic01.jpg -------------------------------------------------------------------------------- /part1/task7/picture/pic02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic02.jpg -------------------------------------------------------------------------------- /part1/task7/picture/pic03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic03.jpg -------------------------------------------------------------------------------- /part1/task7/picture/pic04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic04.jpg -------------------------------------------------------------------------------- /part1/task7/picture/pic05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic05.jpg -------------------------------------------------------------------------------- /part1/task7/picture/pic06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic06.jpg -------------------------------------------------------------------------------- /part1/task7/picture/pic07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic07.jpg -------------------------------------------------------------------------------- /part1/task7/picture/pic08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/pic08.jpg -------------------------------------------------------------------------------- /part1/task7/picture/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/qq.png -------------------------------------------------------------------------------- /part1/task7/picture/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/twitter.png -------------------------------------------------------------------------------- /part1/task7/picture/web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/web.png -------------------------------------------------------------------------------- /part1/task7/picture/weibo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task7/picture/weibo.png -------------------------------------------------------------------------------- /part1/task8.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 任务八:响应式网格(栅格化)布局 6 | 38 | 39 | 40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | 54 | -------------------------------------------------------------------------------- /part1/task9/picture/black_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/black_arrow.png -------------------------------------------------------------------------------- /part1/task9/picture/blue_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/blue_arrow.png -------------------------------------------------------------------------------- /part1/task9/picture/change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/change.png -------------------------------------------------------------------------------- /part1/task9/picture/close_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/close_arrow.png -------------------------------------------------------------------------------- /part1/task9/picture/doc_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/doc_close.png -------------------------------------------------------------------------------- /part1/task9/picture/doc_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/doc_open.png -------------------------------------------------------------------------------- /part1/task9/picture/file_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/file_close.png -------------------------------------------------------------------------------- /part1/task9/picture/file_cur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/file_cur.png -------------------------------------------------------------------------------- /part1/task9/picture/file_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/file_open.png -------------------------------------------------------------------------------- /part1/task9/picture/gou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/gou.png -------------------------------------------------------------------------------- /part1/task9/picture/history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/history.png -------------------------------------------------------------------------------- /part1/task9/picture/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/login.png -------------------------------------------------------------------------------- /part1/task9/picture/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/logo.png -------------------------------------------------------------------------------- /part1/task9/picture/open_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/open_arrow.png -------------------------------------------------------------------------------- /part1/task9/picture/select_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/select_down.png -------------------------------------------------------------------------------- /part1/task9/picture/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/share.png -------------------------------------------------------------------------------- /part1/task9/picture/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/star.png -------------------------------------------------------------------------------- /part1/task9/picture/user_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/user_info.png -------------------------------------------------------------------------------- /part1/task9/picture/zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part1/task9/picture/zoom.png -------------------------------------------------------------------------------- /part2/task13/README.md: -------------------------------------------------------------------------------- 1 | 13 任务目的 2 | 3 | JavaScript初体验 4 | 初步明白JavaScript的简单基本语法,如变量、函数 5 | 初步了解JavaScript的事件是什么 6 | 初步了解JavaScript中的DOM是什么 7 | 任务描述 8 | 9 | 参考以下示例代码,补充其中的JavaScript功能,完成一个JavaScript代码的编写 10 | 本任务完成的功能为:用户可以在输入框中输入任何内容,点击“确认填写”按钮后,用户输入的内容会显示在“您输入的值是”文字的右边 11 | 12 | 13 | 14 | 15 | IFE JavaScript Task 01 16 | 17 | 18 | 19 | 20 | 21 | 22 |
您输入的值是:尚无录入
23 | 24 | 37 | 38 | 39 | 任务注意事项 40 | 41 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 42 | 请注意代码风格的整齐、优雅 43 | 代码中含有必要的注释 44 | 可以不考虑输入的合法性 45 | 建议不使用任何第三方库、框架 46 | 示例代码仅为示例,可以直接使用,也可以完全自己重写 -------------------------------------------------------------------------------- /part2/task13/task13.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 零基础JavaScript编码(一) 6 | 7 | 8 | 9 | 10 | 11 | 12 |
您输入的值是:尚无录入
13 | 14 | 37 | 38 | -------------------------------------------------------------------------------- /part2/task14/README.md: -------------------------------------------------------------------------------- 1 | 14 任务目的 2 | 3 | 在上一任务基础上继续JavaScript的体验 4 | 学习JavaScript中的if判断语法,for循环语法 5 | 学习JavaScript中的数组对象 6 | 学习如何读取、处理数据,并动态创建、修改DOM中的内容 7 | 任务描述 8 | 9 | 参考以下示例代码,页面加载后,将提供的空气质量数据数组,按照某种逻辑(比如空气质量大于60)进行过滤筛选,最后将符合条件的数据按照一定的格式要求显示在网页上 10 | 11 | 12 | 13 | 14 | IFE JavaScript Task 01 15 | 16 | 17 | 18 |

污染城市列表

19 | 24 | 25 | 47 | 48 | 49 | 任务注意事项 50 | 51 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 52 | 请注意代码风格的整齐、优雅 53 | 代码中含有必要的注释 54 | 其中的数据以及60的判断逻辑可以自行设定 55 | 建议不使用任何第三方库、框架 56 | 示例代码仅为示例,可以直接使用,也可以完全自己重写 -------------------------------------------------------------------------------- /part2/task14/task14.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 零基础JavaScript编码(二) 6 | 7 | 8 | 9 |

污染城市列表

10 | 15 | 16 | 44 | 45 | -------------------------------------------------------------------------------- /part2/task15/README.md: -------------------------------------------------------------------------------- 1 | 15 任务目的 2 | 3 | 在上一任务基础上继续JavaScript的体验 4 | 接触一下JavaScript中的高级选择器 5 | 学习JavaScript中的数组对象遍历、读写、排序等操作 6 | 学习简单的字符串处理操作 7 | 任务描述 8 | 9 | 参考以下示例代码,读取页面上已有的source列表,从中提取出城市以及对应的空气质量 10 | 将数据按照某种顺序排序后,在resort列表中按照顺序显示出来 11 | 12 | 13 | 14 | 15 | IFE JavaScript Task 01 16 | 17 | 18 | 19 | 28 | 29 | 37 | 38 | 39 | 40 | 98 | 99 | 100 | 任务注意事项 101 | 102 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 103 | 请注意代码风格的整齐、优雅 104 | 代码中含有必要的注释 105 | 建议不使用任何第三方库、框架 106 | 示例代码仅为示例,可以直接使用,也可以完全自己重写 -------------------------------------------------------------------------------- /part2/task15/task15.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 零基础JavaScript编码(三) 6 | 7 | 8 | 9 | 18 | 19 | 27 | 28 | 29 | 30 | 107 | 108 | -------------------------------------------------------------------------------- /part2/task16/README.md: -------------------------------------------------------------------------------- 1 | 16 任务目的 2 | 3 | 在上一任务基础上继续JavaScript的体验 4 | 深入学习JavaScript的事件机制及DOM操作 5 | 学习事件代理机制 6 | 学习简单的表单验证功能 7 | 学习外部加载JavaScript文件 8 | 任务描述 9 | 10 | 参考以下示例代码,用户输入城市名称和空气质量指数后,点击“确认添加”按钮后,就会将用户的输入在进行验证后,添加到下面的表格中,新增一行进行显示 11 | 用户输入的城市名必须为中英文字符,空气质量指数必须为整数 12 | 用户输入的城市名字和空气质量指数需要进行前后去空格及空字符处理(trim) 13 | 用户输入不合规格时,需要给出提示(允许用alert,也可以自行定义提示方式) 14 | 用户可以点击表格列中的“删除”按钮,删掉那一行的数据 15 | task.html 16 | 17 | 18 | 19 | 20 | 21 | IFE JavaScript Task 01 22 | 23 | 24 | 25 | 26 |
27 |
28 |
29 | 30 |
31 | 32 | 43 |
44 | 45 | 46 | 47 | task.js 48 | 49 | /** 50 | * aqiData,存储用户输入的空气指数数据 51 | * 示例格式: 52 | * aqiData = { 53 | * "北京": 90, 54 | * "上海": 40 55 | * }; 56 | */ 57 | var aqiData = {}; 58 | 59 | /** 60 | * 从用户输入中获取数据,向aqiData中增加一条数据 61 | * 然后渲染aqi-list列表,增加新增的数据 62 | */ 63 | function addAqiData() { 64 | 65 | } 66 | 67 | /** 68 | * 渲染aqi-table表格 69 | */ 70 | function renderAqiList() { 71 | 72 | } 73 | 74 | /** 75 | * 点击add-btn时的处理逻辑 76 | * 获取用户输入,更新数据,并进行页面呈现的更新 77 | */ 78 | function addBtnHandle() { 79 | addAqiData(); 80 | renderAqiList(); 81 | } 82 | 83 | /** 84 | * 点击各个删除按钮的时候的处理逻辑 85 | * 获取哪个城市数据被删,删除数据,更新表格显示 86 | */ 87 | function delBtnHandle() { 88 | // do sth. 89 | 90 | renderAqiList(); 91 | } 92 | 93 | function init() { 94 | 95 | // 在这下面给add-btn绑定一个点击事件,点击时触发addBtnHandle函数 96 | 97 | // 想办法给aqi-table中的所有删除按钮绑定事件,触发delBtnHandle函数 98 | 99 | } 100 | 101 | init(); 102 | 103 | 任务注意事项 104 | 105 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 106 | 请注意代码风格的整齐、优雅 107 | 代码中含有必要的注释 108 | 验证输入逻辑可以在失去焦点时判断,也可以在点击按钮时判断 109 | 建议不使用任何第三方库、框架 110 | 示例代码仅为示例,可以直接使用,也可以完全自己重写 -------------------------------------------------------------------------------- /part2/task16/task16.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 零基础JavaScript编码(四) 6 | 7 | 8 | 9 |
10 |
11 |
12 | 13 |
14 | 15 | 26 |
27 | 28 | 29 | -------------------------------------------------------------------------------- /part2/task16/task16.js: -------------------------------------------------------------------------------- 1 | /** 2 | * aqiData,存储用户输入的空气指数数据 3 | * 示例格式: 4 | * aqiData = { 5 | * "北京": 90, 6 | * "上海": 40 7 | * }; 8 | */ 9 | var $ = function(id) { 10 | return document.getElementById(id); 11 | } 12 | var aqiData = {}; 13 | /** 14 | * 从用户输入中获取数据,向aqiData中增加一条数据 15 | * 然后渲染aqi-list列表,增加新增的数据 16 | */ 17 | function addAqiData() { 18 | var city = $("aqi-city-input").value.trim(); 19 | var num = $("aqi-value-input").value.trim(); 20 | if(!city.match(/^[A-Za-z\s\u4E00-\u9FA5]+$/)){ 21 | alert("城市名必须为中英文字符!"); 22 | return; 23 | } 24 | if(!num.match(/^\d+$/)) { 25 | alert("空气质量指数必须为整数!"); 26 | return; 27 | } 28 | aqiData[city] = num; 29 | } 30 | 31 | /** 32 | * 渲染aqi-table表格 33 | */ 34 | function renderAqiList() { 35 | var content = "城市空气质量操作"; 36 | for(var city in aqiData){ 37 | content += "" + city + "" + aqiData[city] + ""; 38 | } 39 | $("aqi-table").innerHTML = city ? content : ""; 40 | } 41 | 42 | /** 43 | * 点击add-btn时的处理逻辑 44 | * 获取用户输入,更新数据,并进行页面呈现的更新 45 | */ 46 | function addBtnHandle() { 47 | addAqiData(); 48 | renderAqiList(); 49 | } 50 | 51 | /** 52 | * 点击各个删除按钮的时候的处理逻辑 53 | * 获取哪个城市数据被删,删除数据,更新表格显示 54 | */ 55 | function delBtnHandle(city) { 56 | // do sth. 57 | delete aqiData[city]; 58 | renderAqiList(); 59 | } 60 | 61 | function init() { 62 | 63 | // 在这下面给add-btn绑定一个点击事件,点击时触发addBtnHandle函数 64 | $("add-btn").onclick = addBtnHandle; 65 | // 想办法给aqi-table中的所有删除按钮绑定事件,触发delBtnHandle函数 66 | $("aqi-table").addEventListener("click", function(event){ 67 | delBtnHandle(event.target.dataset.city); 68 | }) 69 | } 70 | init(); -------------------------------------------------------------------------------- /part2/task17/README.md: -------------------------------------------------------------------------------- 1 | 17 任务目的 2 | 3 | 在上一任务基础上继续JavaScript的体验 4 | 接触更加复杂的表单对象 5 | 实现页面上的一个完整交互功能 6 | 用DOM实现一个柱状图图表 7 | 任务描述 8 | 9 | 参考以下示例代码,原始数据包含几个城市的空气质量指数数据 10 | 用户可以选择查看不同的时间粒度,以选择要查看的空气质量指数是以天为粒度还是以周或月为粒度 11 | 天:显示每天的空气质量指数 12 | 周:以自然周(周一到周日)为粒度,统计一周7天的平均数为这一周的空气质量数值,如果数据中缺少一个自然周的几天,则按剩余天进行计算 13 | 月:以自然月为粒度,统一一个月所有天的平均数为这一个月的空气质量数值 14 | 用户可以通过select切换城市 15 | 通过在"aqi-chart-wrap"里添加DOM,来模拟一个柱状图图表,横轴是时间,纵轴是空气质量指数,参考图(点击打开)。天、周、月的数据只根据用户的选择显示一种。 16 | 天:每天的数据是一个很细的矩形 17 | 周:每周的数据是一个矩形 18 | 月:每周的数据是一个很粗的矩形 19 | 鼠标移动到柱状图的某个柱子时,用title属性提示这个柱子的具体日期和数据 20 | task.html 21 | 22 | 23 | 24 | 25 | 26 | IFE JavaScript Task 01 27 | 28 | 29 | 30 |
31 | 请选择日期粒度: 32 | 33 | 34 | 35 |
36 | 37 |
38 | 请选择查看的城市: 39 | 42 |
43 | 44 |
45 |
46 | 47 | 48 | task.js 49 | 50 | /* 数据格式演示 51 | var aqiSourceData = { 52 | "北京": { 53 | "2016-01-01": 10, 54 | "2016-01-02": 10, 55 | "2016-01-03": 10, 56 | "2016-01-04": 10 57 | } 58 | }; 59 | */ 60 | 61 | // 以下两个函数用于随机模拟生成测试数据 62 | function getDateStr(dat) { 63 | var y = dat.getFullYear(); 64 | var m = dat.getMonth() + 1; 65 | m = m < 10 ? '0' + m : m; 66 | var d = dat.getDate(); 67 | d = d < 10 ? '0' + d : d; 68 | return y + '-' + m + '-' + d; 69 | } 70 | function randomBuildData(seed) { 71 | var returnData = {}; 72 | var dat = new Date("2016-01-01"); 73 | var datStr = '' 74 | for (var i = 1; i < 92; i++) { 75 | datStr = getDateStr(dat); 76 | returnData[datStr] = Math.ceil(Math.random() * seed); 77 | dat.setDate(dat.getDate() + 1); 78 | } 79 | return returnData; 80 | } 81 | 82 | var aqiSourceData = { 83 | "北京": randomBuildData(500), 84 | "上海": randomBuildData(300), 85 | "广州": randomBuildData(200), 86 | "深圳": randomBuildData(100), 87 | "成都": randomBuildData(300), 88 | "西安": randomBuildData(500), 89 | "福州": randomBuildData(100), 90 | "厦门": randomBuildData(100), 91 | "沈阳": randomBuildData(500) 92 | }; 93 | 94 | // 用于渲染图表的数据 95 | var chartData = {}; 96 | 97 | // 记录当前页面的表单选项 98 | var pageState = { 99 | nowSelectCity: -1, 100 | nowGraTime: "day" 101 | } 102 | 103 | /** 104 | * 渲染图表 105 | */ 106 | function renderChart() { 107 | 108 | } 109 | 110 | /** 111 | * 日、周、月的radio事件点击时的处理函数 112 | */ 113 | function graTimeChange() { 114 | // 确定是否选项发生了变化 115 | 116 | // 设置对应数据 117 | 118 | // 调用图表渲染函数 119 | } 120 | 121 | /** 122 | * select发生变化时的处理函数 123 | */ 124 | function citySelectChange() { 125 | // 确定是否选项发生了变化 126 | 127 | // 设置对应数据 128 | 129 | // 调用图表渲染函数 130 | } 131 | 132 | /** 133 | * 初始化日、周、月的radio事件,当点击时,调用函数graTimeChange 134 | */ 135 | function initGraTimeForm() { 136 | 137 | } 138 | 139 | /** 140 | * 初始化城市Select下拉选择框中的选项 141 | */ 142 | function initCitySelector() { 143 | // 读取aqiSourceData中的城市,然后设置id为city-select的下拉列表中的选项 144 | 145 | // 给select设置事件,当选项发生变化时调用函数citySelectChange 146 | 147 | } 148 | 149 | /** 150 | * 初始化图表需要的数据格式 151 | */ 152 | function initAqiChartData() { 153 | // 将原始的源数据处理成图表需要的数据格式 154 | // 处理好的数据存到 chartData 中 155 | } 156 | 157 | /** 158 | * 初始化函数 159 | */ 160 | function init() { 161 | initGraTimeForm() 162 | initCitySelector(); 163 | initAqiChartData(); 164 | } 165 | 166 | init(); 167 | 168 | 任务注意事项 169 | 170 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 171 | 请注意代码风格的整齐、优雅 172 | 代码中含有必要的注释 173 | 示例图仅为参考,不需要完全一致 174 | 点击select或者radio选项时,如果没有发生变化,则图表不需要重新渲染 175 | 建议不使用任何第三方库、框架 176 | 示例代码仅为示例,可以直接使用,也可以完全自己重写 -------------------------------------------------------------------------------- /part2/task17/task17.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 零基础JavaScript编码(五) 6 | 17 | 18 | 19 |
20 | 请选择日期粒度: 21 | 22 | 23 | 24 |
25 | 26 |
27 | 请选择查看的城市: 28 | 39 |
40 | 41 |
42 |
43 | 44 | 45 | -------------------------------------------------------------------------------- /part2/task17/task17.js: -------------------------------------------------------------------------------- 1 | /* 数据格式演示 2 | var aqiSourceData = { 3 | "北京": { 4 | "2016-01-01": 10, 5 | "2016-01-02": 10, 6 | "2016-01-03": 10, 7 | "2016-01-04": 10 8 | } 9 | }; 10 | */ 11 | 12 | // 以下两个函数用于随机模拟生成测试数据 13 | function getDateStr(dat) { 14 | var y = dat.getFullYear(); 15 | var m = dat.getMonth() + 1; 16 | m = m < 10 ? '0' + m : m; 17 | var d = dat.getDate(); 18 | d = d < 10 ? '0' + d : d; 19 | return y + '-' + m + '-' + d; 20 | } 21 | function randomBuildData(seed) { 22 | var returnData = {}; 23 | var dat = new Date("2016-01-01"); 24 | var datStr = '' 25 | for (var i = 1; i < 92; i++) { 26 | datStr = getDateStr(dat); 27 | returnData[datStr] = Math.ceil(Math.random() * seed); 28 | dat.setDate(dat.getDate() + 1); 29 | } 30 | return returnData; 31 | } 32 | 33 | var aqiSourceData = { 34 | "北京": randomBuildData(500), 35 | "上海": randomBuildData(300), 36 | "广州": randomBuildData(200), 37 | "深圳": randomBuildData(100), 38 | "成都": randomBuildData(300), 39 | "西安": randomBuildData(500), 40 | "福州": randomBuildData(100), 41 | "厦门": randomBuildData(100), 42 | "沈阳": randomBuildData(500) 43 | }; 44 | 45 | var $ = function(id) { 46 | return document.getElementById(id); 47 | }; 48 | var graTime = document.getElementsByName("gra-time"), 49 | citySelect = $("city-select"), 50 | num, 51 | div = $("aqi-chart-wrap"), 52 | number = ["一","二","三","四","五","六","七","八","九","十","十一","十二","十三"]; 53 | // 随机颜色 54 | function getColor(){ 55 | var colorElements = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f", 56 | colorArray = colorElements.split(","), 57 | color ="#"; 58 | for(var i =0;i<6;i++){ 59 | color+=colorArray[Math.floor(Math.random()*16)]; 60 | } 61 | return color; 62 | } 63 | // 城市每日天气展示函数 64 | function disDay(num) { 65 | var content = ""; 66 | for (var i in num) { 67 | content += "
"; 68 | } 69 | div.innerHTML = content; 70 | } 71 | // 城市周平均天气展示函数 72 | function disWeek(num) { 73 | var temp = 0, 74 | tempNum, 75 | j=0, 76 | k=0, 77 | content = ""; 78 | for (var i in num) { 79 | j++; 80 | temp += num[i]; 81 | if (j%7 == 0) { 82 | tempNum = Math.round(temp/7); 83 | content += "
"; 84 | temp = 0; 85 | k++; 86 | } 87 | } 88 | div.innerHTML = content; 89 | } 90 | // 城市月平均天气展示函数 91 | function disMonth(num) { 92 | var re1 = /2016-01/, 93 | re2 = /2016-02/, 94 | re3 = /2016-03/, 95 | temp1 = 0, 96 | temp2 = 0, 97 | temp3 = 0, 98 | n1 = 0, 99 | n2 = 0, 100 | n3 = 0, 101 | content = ""; 102 | for (var i in num) { 103 | if (re1.test(i)) { 104 | temp1 += num[i]; 105 | n1++; 106 | } 107 | else if (re2.test(i)) { 108 | temp2 += num[i]; 109 | n2++; 110 | } 111 | else if (re3.test(i)) { 112 | temp3 += num[i]; 113 | n3++; 114 | } 115 | } 116 | var temp =[], 117 | k = 0; 118 | temp.push(Math.round(temp1/n1)); 119 | temp.push(Math.round(temp2/n2)); 120 | temp.push(Math.round(temp3/n3)); 121 | for (i of temp) { 122 | content += "
"; 123 | k++; 124 | } 125 | div.innerHTML = content; 126 | } 127 | //检测选项选中的值并调用图表渲染函数 128 | function checkState() { 129 | //单选框 130 | var checkValue; 131 | for (var i in graTime) { 132 | if (graTime[i].checked) { 133 | checkValue = graTime[i].value; 134 | } 135 | } 136 | //下拉项 137 | var index = citySelect.selectedIndex; 138 | var checkCity = citySelect.options[index].text; 139 | num = aqiSourceData[checkCity]; 140 | switch (checkValue) { 141 | case 'day': 142 | disDay(num); 143 | break; 144 | case 'week': 145 | disWeek(num); 146 | break; 147 | case 'month': 148 | disMonth(num); 149 | break; 150 | default: alert("程序出错"); 151 | } 152 | } 153 | //监测单选框 下拉项变动事件 154 | function init() { 155 | checkState(); 156 | citySelect.onchange = checkState; 157 | $("form-gra-time").onchange = checkState; 158 | } 159 | init(); -------------------------------------------------------------------------------- /part2/task18/README.md: -------------------------------------------------------------------------------- 1 | 18 任务目的 2 | 3 | 学习与实践JavaScript的基本语法、语言特性 4 | 初步了解JavaScript的事件是什么 5 | 初步了解JavaScript中的DOM是什么 6 | 任务描述 7 | 8 | 如图,模拟一个队列,队列的每个元素是一个数字,初始队列为空 9 | 有一个input输入框,以及4个操作按钮 10 | 点击"左侧入",将input中输入的数字从左侧插入队列中; 11 | 点击"右侧入",将input中输入的数字从右侧插入队列中; 12 | 点击"左侧出",读取并删除队列左侧第一个元素,并弹窗显示元素中数值; 13 | 点击"右侧出",读取并删除队列又侧第一个元素,并弹窗显示元素中数值; 14 | 点击队列中任何一个元素,则该元素会被从队列中删除 15 | 任务注意事项 16 | 17 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 18 | 请注意代码风格的整齐、优雅 19 | 代码中含有必要的注释 20 | 示例图仅为参考,不需要完全一致 21 | 需要考虑数字输入的合法性 22 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task18/task18.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 基础JavaScript练习(一) 6 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /part2/task18/task18.js: -------------------------------------------------------------------------------- 1 | // 获取每个ID对象 2 | var $ = function(id) { 3 | return document.getElementById(id); 4 | } 5 | var inval = $("inval"), 6 | leftin = $("leftin"), 7 | rightin = $("rightin"), 8 | leftout = $("leftout"), 9 | rightout = $("rightout"), 10 | dis = $("dis"); 11 | // 初始化数组并为每个按钮绑定事件和处理函数 12 | var disarry = []; 13 | leftin.onclick = function() { 14 | disarry.unshift(inval.value); 15 | showVal(); 16 | } 17 | rightin.onclick = function() { 18 | disarry.push(inval.value); 19 | showVal(); 20 | } 21 | leftout.onclick = function() { 22 | alert(disarry.shift()); 23 | showVal(); 24 | } 25 | rightout.onclick = function() { 26 | alert(disarry.pop()); 27 | showVal(); 28 | } 29 | // 展示函数 获取数组的值 并用列表UL展示出来 30 | function showVal() { 31 | var content = ""; 32 | for (var i in disarry) { 33 | content += "
  • " + disarry[i] + "
  • "; 34 | } 35 | dis.innerHTML = content; 36 | } 37 | // 点击数组中的某个值并删除 38 | function DelData(num) { 39 | for (var i in disarry) { 40 | if (disarry[i] == num) { 41 | delete disarry[i]; 42 | break; 43 | } 44 | } 45 | showVal(); 46 | } 47 | //事件绑定函数,兼容浏览器差异 48 | function addEvent(element, event, func) { 49 | if (element.addEventListener) { 50 | element.addEventListener(event, func); 51 | } 52 | else if (element.attachEvent) { 53 | element.attachEvent("on" + event, func); 54 | } 55 | else { 56 | element["on" + event] = func; 57 | } 58 | } 59 | // 获取点击时对应数组的值 并把它传到删除函数 60 | addEvent(dis,"click",function() { 61 | DelData(event.target.innerText); 62 | }); -------------------------------------------------------------------------------- /part2/task19/README.md: -------------------------------------------------------------------------------- 1 | 19 任务目的 2 | 3 | 学习与实践JavaScript的基本语法、语言特性 4 | 练习使用JavaScript实现简单的排序算法 5 | 任务描述 6 | 7 | 基于任务18 8 | 限制输入的数字在10-100 9 | 队列元素数量最多限制为60个,当超过60个时,添加元素时alert出提示 10 | 队列展现方式变化,直接用高度表示数字大小 11 | 实现一个简单的排序功能,如冒泡排序(不限制具体算法),用可视化的方法表达出来,参考见下方参考资料 12 | 任务注意事项 13 | 14 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 15 | 请注意代码风格的整齐、优雅 16 | 代码中含有必要的注释 17 | 示例图仅为参考,不需要完全一致 18 | 具体算法及可视化的形式不做特别限制,只要求能够展现出算法的过程 19 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task19/task19.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 基础JavaScript练习(二) 6 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /part2/task19/task19.js: -------------------------------------------------------------------------------- 1 | // 获取每个ID对象 2 | var $ = function(id) { 3 | return document.getElementById(id); 4 | } 5 | var inval = $("inval"), 6 | leftin = $("leftin"), 7 | rightin = $("rightin"), 8 | leftout = $("leftout"), 9 | rightout = $("rightout"), 10 | dis = $("dis"), 11 | bubble = $("bubble"), 12 | ran = $("ran"); 13 | // 初始化数组并为每个按钮绑定事件和处理函数 14 | var disarry = []; 15 | leftin.onclick = function() { 16 | if (disarry.length > 60) { 17 | alert("元素数量最多60个"); 18 | return; 19 | } 20 | if (inval.value >= 10 && inval.value <= 100) { 21 | disarry.unshift(inval.value); 22 | showVal(); 23 | } 24 | else 25 | alert("输入的数字必须在10-100"); 26 | 27 | } 28 | rightin.onclick = function() { 29 | if (disarry.length > 60) { 30 | alert("元素数量最多60个"); 31 | return; 32 | } 33 | if (inval.value >= 10 && inval.value <= 100) { 34 | disarry.push(inval.value); 35 | showVal(); 36 | } 37 | else 38 | alert("输入的数字必须在10-100"); 39 | } 40 | leftout.onclick = function() { 41 | alert(disarry.shift(inval.value)); 42 | showVal(); 43 | } 44 | rightout.onclick = function() { 45 | alert(disarry.pop(inval.value)); 46 | showVal(); 47 | } 48 | // 冒泡排序 49 | bubble.onclick = function () { 50 | disarry.sort(function(a,b){return a-b;}); 51 | showVal(); 52 | } 53 | // 随机产生50个数 54 | ran.onclick = function () { 55 | disarry = []; 56 | var n, 57 | i = 0; 58 | while (i<50) { 59 | n = Math.round(Math.random()*100); 60 | if (n >= 10 && n <= 100) { 61 | disarry.push(n); 62 | i++; 63 | } 64 | } 65 | showVal(); 66 | } 67 | // 展示函数 获取数组的值 并用列表UL展示出来 68 | function showVal() { 69 | var content = ""; 70 | for (var i in disarry) { 71 | content += "
  • " + "
  • "; 72 | } 73 | dis.innerHTML = content; 74 | } 75 | // 点击数组中的某个值并删除 76 | function DelData(num) { 77 | for (var i in disarry) { 78 | if (disarry[i] == num) { 79 | delete disarry[i]; 80 | break; 81 | } 82 | } 83 | showVal(); 84 | } 85 | //事件绑定函数,兼容浏览器差异 86 | function addEvent(element, event, func) { 87 | if (element.addEventListener) { 88 | element.addEventListener(event, func); 89 | } 90 | else if (element.attachEvent) { 91 | element.attachEvent("on" + event, func); 92 | } 93 | else { 94 | element["on" + event] = func; 95 | } 96 | } 97 | // 获取点击时对应数组的值 并把它传到删除函数 98 | addEvent(dis,"click",function() { 99 | DelData(event.target.dataset.num); 100 | }); -------------------------------------------------------------------------------- /part2/task20/README.md: -------------------------------------------------------------------------------- 1 | 20 任务目的 2 | 3 | 实践JavaScript数组、字符串相关操作 4 | 任务描述 5 | 6 | 基于任务18进行升级 7 | 将新元素输入框从input改为textarea 8 | 允许一次批量输入多个内容,格式可以为数字、中文、英文等,可以通过用回车,逗号(全角半角均可),顿号,空格(全角半角、Tab等均可)等符号作为不同内容的间隔 9 | 增加一个查询文本输入框,和一个查询按钮,当点击查询时,将查询词在各个元素内容中做模糊匹配,将匹配到的内容进行特殊标识,如文字颜色等。举例,内容中有abcd,查询词为ab或bc,则该内容需要标识 10 | 任务注意事项 11 | 12 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 13 | 请注意代码风格的整齐、优雅 14 | 代码中含有必要的注释 15 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task20/task20.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 基础JavaScript练习(三) 6 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /part2/task20/task20.js: -------------------------------------------------------------------------------- 1 | // 获取每个ID对象 2 | var $ = function(id) { 3 | return document.getElementById(id); 4 | } 5 | var inval = $("inval"), 6 | leftin = $("leftin"), 7 | rightin = $("rightin"), 8 | leftout = $("leftout"), 9 | rightout = $("rightout"), 10 | searchInput = $("searchInput"), 11 | search = $("search"), 12 | dis = $("dis"); 13 | // 初始化数组并为每个按钮绑定事件和处理函数 14 | var disarry = []; 15 | search.onclick = function() { 16 | var content = ""; 17 | var str = searchInput.value.trim(); 18 | dis.innerHTML = disarry.map(function(data) { 19 | data = data.replace(new RegExp(str,"g"), "" + str + ""); 20 | return "
  • " + data + "
  • "; 21 | }).join(""); 22 | } 23 | leftin.onclick = function() { 24 | var temp = clear().reverse(); 25 | for (var i of temp) { 26 | disarry.unshift(i); 27 | } 28 | showVal(); 29 | }; 30 | rightin.onclick = function() { 31 | var temp = clear(); 32 | for (var i of temp) { 33 | disarry.push(i); 34 | } 35 | showVal(); 36 | }; 37 | leftout.onclick = function() { 38 | alert(disarry.shift()); 39 | showVal(); 40 | }; 41 | rightout.onclick = function() { 42 | alert(disarry.pop()); 43 | showVal(); 44 | }; 45 | //去除多余符号 空格 46 | function clear() { 47 | var str = inval.value.trim(); 48 | var tempArry = str.split(/[^0-9a-zA-Z\u4e00-\u9fa5]+/).filter(function(data) { 49 | if (data != null && data.length > 0) { 50 | return true; 51 | } else { 52 | return false; 53 | } 54 | }); 55 | return tempArry; 56 | } 57 | // 展示函数 获取数组的值 并用列表UL展示出来 58 | function showVal() { 59 | var content = ""; 60 | for (var i in disarry) { 61 | content += "
  • " + disarry[i] + "
  • "; 62 | } 63 | dis.innerHTML = content; 64 | } 65 | // 点击数组中的某个值并删除 66 | function delData(num) { 67 | for (var i in disarry) { 68 | if (disarry[i] == num) { 69 | delete disarry[i]; 70 | break; 71 | } 72 | } 73 | showVal(); 74 | } 75 | //事件绑定函数,兼容浏览器差异 76 | function addEvent(element, event, func) { 77 | if (element.addEventListener) { 78 | element.addEventListener(event, func); 79 | } 80 | else if (element.attachEvent) { 81 | element.attachEvent("on" + event, func); 82 | } 83 | else { 84 | element["on" + event] = func; 85 | } 86 | } 87 | // 获取点击时对应数组的值 并把它传到删除函数 88 | addEvent(dis,"click",function() { 89 | delData(event.target.innerText); 90 | }); -------------------------------------------------------------------------------- /part2/task21/README.md: -------------------------------------------------------------------------------- 1 | 21 任务目的 2 | 3 | 学习与实践JavaScript的基本语法、语言特性 4 | 练习使用JavaScript实现拖拽功能 5 | 任务描述 6 | 7 | 基于任务20,将任务20的代码进行抽象、封装,然后在此基础上实现如图中的两个需求:Tag输入和兴趣爱好输入 8 | 如示例图上方,实现一个tag输入框 9 | 要求遇到用户输入空格,逗号,回车时,都自动把当前输入的内容作为一个tag放在输入框下面。 10 | Tag不能有重复的,遇到重复输入的Tag,自动忽视。 11 | 每个Tag请做trim处理 12 | 最多允许10个Tag,多于10个时,按照录入的先后顺序,把最前面的删掉 13 | 当鼠标悬停在tag上时,tag前增加删除二字,点击tag可删除 14 | 如示例图下方,实现一个兴趣爱好输入的功能 15 | 通过一个Textarea进行兴趣爱好的输入,可以通过用回车,逗号(全角半角均可),顿号,空格(全角半角、Tab等均可)等符号作为间隔。 16 | 当点击“确认兴趣爱好”的按钮时,将textarea中的输入按照你设定的间隔符,拆解成一个个的爱好,显示在textarea下方 17 | 爱好不能重复,所以在下方呈现前,需要做一个去重 18 | 每个爱好内容需要做trim处理 19 | 最多允许10个兴趣爱好,多于10个时,按照录入的先后顺序,把最前面的删掉 20 | 任务注意事项 21 | 22 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 23 | 示例图仅为参考,不需要完全一致 24 | 请注意代码风格的整齐、优雅 25 | 代码中含有必要的注释 26 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task21/task21.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 基础JavaScript练习(四) 6 | 25 | 26 | 27 | Tag: 28 | 31 |
    32 | 33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /part2/task21/task21.js: -------------------------------------------------------------------------------- 1 | //事件绑定兼容 2 | function addEvent(ele, event, func) { 3 | if (ele.addEventListener) { 4 | ele.addEventListener(event, func); 5 | } else if (ele.attachEvent) { 6 | ele.attachEvent("on"+event, func); 7 | } else { 8 | ele["on" + event] = func; 9 | } 10 | } 11 | //读取各个ID对象 12 | var $ = function(id) { 13 | return document.getElementById(id); 14 | }; 15 | var tagVal = $("tagVal"), 16 | disTag = $("disTag"), 17 | hobbyVal = $("hobbyVal"), 18 | hobbyBtn = $("hobbyBtn"), 19 | disHobby = $("disHobby"); 20 | //实例对象 21 | var tagObj = new CreatList(disTag), 22 | hobbyObj = new CreatList(disHobby); 23 | //构造函数模式与原型模式结合 24 | function CreatList(divList) { 25 | this.queue = []; 26 | this.render = function () { 27 | this.queue = clearRepeat(this.queue); 28 | if (this.queue.length > 10) { 29 | this.queue.shift(); 30 | } 31 | var content = ""; 32 | for (var i in this.queue) { 33 | content += "
  • " + this.queue[i] + "
  • "; 34 | } 35 | divList.innerHTML = content; 36 | 37 | }; 38 | } 39 | //读取兴趣爱好的值并去除符号 40 | function hobbyClear() { 41 | var str = hobbyVal.value.trim(); 42 | hobbyVal.value = null; 43 | var tempArry = str.split(/[^0-9a-zA-Z\u4e00-\u9fa5]+/).filter(function(data) { 44 | if (data != null && data.length > 0) { 45 | return true; 46 | } else { 47 | return false; 48 | } 49 | }); 50 | return tempArry; 51 | } 52 | //数组去重 53 | function clearRepeat(arry) { 54 | var tempArry = []; 55 | for(var i of arry) { 56 | if (tempArry.indexOf(i) == -1) { 57 | tempArry.push(i); 58 | } 59 | } 60 | return tempArry; 61 | } 62 | //按钮点击事件绑定函数 63 | hobbyBtn.onclick = function() { 64 | hobbyObj.queue = hobbyObj.queue.concat(hobbyClear()); 65 | hobbyObj.render(); 66 | }; 67 | //点击项目的值并删除 68 | addEvent(disTag,"click",function(event){ 69 | var str = event.target.innerText.replace("点击删除", ""); 70 | var index = tagObj.queue.indexOf(str); 71 | tagObj.queue.splice(index,1); 72 | tagObj.render(); 73 | }); 74 | addEvent(disHobby,"click",function(event){ 75 | var index = hobbyObj.queue.indexOf(event.target.innerText); 76 | hobbyObj.queue.splice(index,1); 77 | hobbyObj.render(); 78 | }); 79 | //鼠标OVER事件 80 | addEvent(disTag,"mouseover",function(event){ 81 | if (event.target.nodeName == "LI") { 82 | event.target.innerText = "点击删除" + event.target.innerText; 83 | event.target.style.background = "red"; 84 | } 85 | }); 86 | //鼠标OUT事件 87 | addEvent(disTag,"mouseout",function(event){ 88 | if (event.target.nodeName == "LI") { 89 | event.target.innerText = event.target.innerText.replace("点击删除", ""); 90 | event.target.style.background = "#EE82EE"; 91 | } 92 | }); 93 | //监测键盘事件 检测到输入特定的符号即执行if语句 94 | addEvent(tagVal,"keyup",function(event){ 95 | if (/[,.;,。;\n\s]+/.test(tagVal.value) || event.keyCode == 13) { 96 | var str = tagVal.value.split(/[,.;,。;\n\s]+/)[0]; 97 | tagVal.value = null; 98 | if(str.length != 0) { 99 | tagObj.queue.push(str); 100 | tagObj.render(); 101 | } 102 | } 103 | }); -------------------------------------------------------------------------------- /part2/task22/README.md: -------------------------------------------------------------------------------- 1 | 22 任务目的 2 | 3 | 熟练JavaScript 4 | 学习树这种数据结构的基本知识 5 | 6 | 任务描述 7 | 在页面中展现一颗二叉树的结构 8 | 提供一个按钮,显示开始遍历,点击后,以动画的形式呈现遍历的过程 9 | 二叉树的遍历算法和方式自定,前序中序后序皆可,但推荐可以提供多种算法的展示(增加多个按钮,每个按钮对应不同的算法) 10 | 当前被遍历到的节点做一个特殊显示(比如不同的颜色) 11 | 每隔一段时间(500ms,1s等时间自定)再遍历下一个节点 12 | 任务注意事项 13 | 14 | 如果按照示例图中展示树,可以使用flexbox布局 15 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 16 | 请注意代码风格的整齐、优雅 17 | 代码中含有必要的注释 18 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task22/task22.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JavaScript和树(一) 6 | 31 | 32 | 33 |
    34 |
    35 |
    36 |
    37 |
    38 |
    39 |
    40 |
    41 |
    42 |
    43 |
    44 |
    45 |
    46 |
    47 |
    48 |
    49 |
    50 |
    51 |
    52 |
    53 |
    54 |
    55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /part2/task22/task22.js: -------------------------------------------------------------------------------- 1 | var $ = function(id) { 2 | return document.getElementById(id); 3 | }; 4 | var root = $("root"), 5 | pre = $("pre"), 6 | mid = $("mid"), 7 | wide = $("wide"), 8 | arry = [], 9 | timer = null, 10 | last = $("last"); 11 | //按钮点击事件 绑定函数 12 | pre.onclick = function() { 13 | reSet(); 14 | preOrder(root); 15 | render(); 16 | } 17 | mid.onclick = function() { 18 | reSet(); 19 | midOrder(root); 20 | render(); 21 | } 22 | last.onclick = function() { 23 | reSet(); 24 | lastOrder(root); 25 | render(); 26 | } 27 | wide.onclick = function() { 28 | reSet(); 29 | wideOrder(root); 30 | render(); 31 | } 32 | //递归二叉树算法 33 | function preOrder(node) { 34 | if (node) { 35 | arry.push(node); 36 | preOrder(node.children[0]); 37 | preOrder(node.children[1]); 38 | } 39 | } 40 | function midOrder(node) { 41 | if (node) { 42 | midOrder(node.children[0]); 43 | arry.push(node); 44 | midOrder(node.children[1]); 45 | } 46 | } 47 | function lastOrder(node) { 48 | if (node) { 49 | lastOrder(node.children[0]); 50 | lastOrder(node.children[1]); 51 | arry.push(node); 52 | } 53 | } 54 | function wideOrder(node) { 55 | var temp = []; 56 | temp.push(node); 57 | while (temp.length) { 58 | var node = temp.shift(); 59 | arry.push(node); 60 | if (node.children[0]) 61 | temp.push(node.children[0]); 62 | if (node.children[1]) 63 | temp.push(node.children[1]); 64 | } 65 | } 66 | //数组渲染 67 | function render() { 68 | var i = 0; 69 | arry[i].style.background = "blue"; 70 | timer = setInterval(function () { 71 | i++; 72 | if (i < arry.length) { 73 | arry[i-1].style.background = "#fff"; 74 | arry[i].style.background = "blue"; 75 | } else { 76 | clearInterval(timer); 77 | arry[arry.length-1].style.background = "#fff"; 78 | } 79 | },500) 80 | } 81 | //初始化样式 82 | function reSet() { 83 | arry = []; 84 | clearInterval(timer); 85 | } -------------------------------------------------------------------------------- /part2/task23/README.md: -------------------------------------------------------------------------------- 1 | 23 任务目的 2 | 3 | 熟练JavaScript 4 | 学习树这种数据结构的基本知识 5 | 任务描述 6 | 7 | 基于任务22,将二叉树变成了多叉树,并且每一个节点中带有内容 8 | 提供一个按钮,显示开始遍历,点击后,以动画的形式呈现遍历的过程 9 | 当前被遍历到的节点做一个特殊显示(比如不同的颜色) 10 | 每隔一段时间(500ms,1s等时间自定)再遍历下一个节点 11 | 增加一个输入框及一个“查询”按钮,点击按钮时,开始在树中以动画形式查找节点内容和输入框中内容一致的节点,找到后以特殊样式显示该节点,找不到的话给出找不到的提示。查询过程中的展示过程和遍历过程保持一致 12 | 任务注意事项 13 | 14 | 树的遍历算法和方式自定,但推荐可以提供多种算法的展示(增加多个按钮,每个按钮对应不同的算法) 15 | 如果按照示例图中展示树,可以使用flexbox布局 16 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 17 | 请注意代码风格的整齐、优雅 18 | 代码中含有必要的注释 19 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task23/task23.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JavaScript和树(二) 6 | 31 | 32 | 33 |
    1 34 |
    2 35 |
    3 36 |
    4
    37 |
    5
    38 |
    6
    39 |
    40 |
    7 41 |
    8
    42 |
    9
    43 |
    10
    44 |
    45 |
    a 46 |
    apple
    47 |
    c
    48 |
    apple
    49 |
    50 |
    51 |
    e 52 |
    f 53 |
    g
    54 |
    ab
    55 |
    ab
    56 |
    57 |
    ee 58 |
    xw
    59 |
    w-resize
    60 |
    df
    61 |
    62 |
    10
    63 |
    CAT
    64 |
    ee
    65 |
    CAT
    66 |
    67 |
    68 | 69 | 70 |

    71 | 72 |

    输入查询值 然后选择"前后广"其中一种方式开始查询

    73 | 74 | 75 | -------------------------------------------------------------------------------- /part2/task23/task23.js: -------------------------------------------------------------------------------- 1 | var $ = function(id) { 2 | return document.getElementById(id); 3 | }; 4 | var root = $("root"), 5 | pre = $("pre"), 6 | wide = $("wide"), 7 | arry = [], 8 | timer = null, 9 | last = $("last"), 10 | searchVal = $("searchVal"); 11 | //按钮点击事件 绑定函数 12 | pre.onclick = function() { 13 | reSet(); 14 | preOrder(root); 15 | render(); 16 | } 17 | last.onclick = function() { 18 | reSet(); 19 | lastOrder(root); 20 | render(); 21 | } 22 | wide.onclick = function() { 23 | reSet(); 24 | wideOrder(root); 25 | render(); 26 | } 27 | //多叉树算法 28 | function preOrder(node) { 29 | if (node) { 30 | arry.push(node); 31 | for (var i = 0, len = node.children.length; i < len; i++) { 32 | preOrder(node.children[i]); 33 | } 34 | } 35 | } 36 | function lastOrder(node) { 37 | if (node) { 38 | for (var i = 0, len = node.children.length; i < len; i++) { 39 | lastOrder(node.children[i]); 40 | } 41 | arry.push(node); 42 | } 43 | } 44 | function wideOrder(node) { 45 | var temp = []; 46 | temp.push(node); 47 | while (temp.length) { 48 | var node = temp.shift(); 49 | arry.push(node); 50 | for (var i = 0, len = node.children.length; i < len; i++) { 51 | temp.push(node.children[i]); 52 | } 53 | } 54 | } 55 | //数组渲染 56 | function render() { 57 | var i = 0; 58 | var str = searchVal.value.trim(); 59 | arry[i].style.background = "blue"; 60 | timer = setInterval(function () { 61 | i++; 62 | if (i < arry.length) { 63 | arry[i-1].style.background = "#fff"; 64 | arry[i].style.background = "blue"; 65 | if (arry[i-1].firstChild.nodeValue.trim() == str) { 66 | arry[i-1].style.background = "red"; 67 | arry[i-1].style.color = "#fff"; 68 | } 69 | } else { 70 | clearInterval(timer); 71 | arry[arry.length-1].style.background = "#fff"; 72 | if (arry[i-1].firstChild.nodeValue.trim() == str) { 73 | arry[i-1].style.background = "red"; 74 | arry[i-1].style.color = "#fff"; 75 | } 76 | } 77 | },500) 78 | } 79 | //初始化样式 80 | function reSet() { 81 | arry = []; 82 | clearInterval(timer); 83 | var divs = document.getElementsByTagName("div"); 84 | for (var i = 0, len = divs.length; i < len; i++) { 85 | divs[i].style.background = "#fff"; 86 | divs[i].style.color = "black"; 87 | } 88 | } -------------------------------------------------------------------------------- /part2/task24/README.md: -------------------------------------------------------------------------------- 1 | 24任务目的 2 | 3 | 熟练JavaScript 4 | 学习树这种数据结构的基本知识 5 | 任务描述 6 | 7 | 基于任务23,添加节点的选择、增加与删除的功能 8 | 点击某个节点元素,则该节点元素呈现一个特殊被选中的样式 9 | 增加一个删除按钮,当选中某个节点元素后,点击删除按钮,则将该节点及其所有子节点删除掉 10 | 增加一个输入框及一个“添加”按钮当选中某个节点元素后,点击增加按钮,则在该节点下增加一个子节点,节点内容为输入框中内容,插入在其子节点的最后一个位置 11 | 任务注意事项 12 | 13 | 实现简单功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 14 | 请注意代码风格的整齐、优雅 15 | 代码中含有必要的注释 16 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task24/task24.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JavaScript和树(三) 6 | 36 | 37 | 38 |
    39 |
    1 40 |
    2 41 |
    3 42 |
    4
    43 |
    5
    44 |
    6
    45 |
    46 |
    7 47 |
    8
    48 |
    9
    49 |
    10
    50 |
    51 |
    a 52 |
    apple
    53 |
    c
    54 |
    apple
    55 |
    56 |
    57 |
    e 58 |
    f 59 |
    g
    60 |
    ab
    61 |
    ab
    62 |
    63 |
    ee 64 |
    xw
    65 |
    w-resize
    66 |
    df
    67 |
    68 |
    10
    69 |
    CAT
    70 |
    ee
    71 |
    CAT
    72 |
    73 |
    74 |
    75 | 76 | 77 |

    78 | 79 |

    输入查询值 然后选择"前后广"其中一种方式开始查询

    80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /part2/task24/task24.js: -------------------------------------------------------------------------------- 1 | var $ = function(id) { 2 | return document.getElementById(id); 3 | }; 4 | var root = $("root"), 5 | pre = $("pre"), 6 | wide = $("wide"), 7 | arry = [], 8 | selectNode, 9 | timer = null, 10 | last = $("last"), 11 | searchVal = $("searchVal"), 12 | container = $("container"); 13 | nodeVal = $("nodeVal"), 14 | addNode = $("addNode"), 15 | delNode = $("delNode"), 16 | divs = container.getElementsByTagName("div"); 17 | //按钮点击事件 绑定函数 18 | pre.onclick = function() { 19 | reSet(); 20 | preOrder(root); 21 | render(); 22 | }; 23 | last.onclick = function() { 24 | reSet(); 25 | lastOrder(root); 26 | render(); 27 | }; 28 | wide.onclick = function() { 29 | reSet(); 30 | wideOrder(root); 31 | render(); 32 | }; 33 | //增加节点 34 | addNode.onclick = function() { 35 | var str = nodeVal.value.trim(); 36 | if (!str) { 37 | alert("请输入要添加的内容"); 38 | return; 39 | } 40 | if (!selectNode) { 41 | alert("请选中一个节点"); 42 | return; 43 | } 44 | var newNode = document.createElement("div"); 45 | newNode.innerHTML = str; 46 | selectNode.appendChild(newNode); 47 | addClickEvent(); 48 | }; 49 | //删除节点 50 | delNode.onclick = function() { 51 | if (!selectNode) { 52 | alert("请选中一个节点"); 53 | return; 54 | } 55 | var parNode = selectNode.parentNode; 56 | parNode.removeChild(selectNode); 57 | }; 58 | //遍历每个节点并添加点击事件 59 | function addClickEvent() { 60 | for (var i = 0, len = divs.length; i < len; i++) { 61 | divs[i].onclick = function(e) { 62 | reSet(); 63 | this.style.background = "yellow"; 64 | e.stopPropagation(); 65 | selectNode = this; 66 | }; 67 | } 68 | } 69 | //多叉树算法 70 | function preOrder(node) { 71 | if (node) { 72 | arry.push(node); 73 | for (var i = 0, len = node.children.length; i < len; i++) { 74 | preOrder(node.children[i]); 75 | } 76 | } 77 | } 78 | function lastOrder(node) { 79 | if (node) { 80 | for (var i = 0, len = node.children.length; i < len; i++) { 81 | lastOrder(node.children[i]); 82 | } 83 | arry.push(node); 84 | } 85 | } 86 | function wideOrder(node) { 87 | var temp = []; 88 | temp.push(node); 89 | while (temp.length) { 90 | var node = temp.shift(); 91 | arry.push(node); 92 | for (var i = 0, len = node.children.length; i < len; i++) { 93 | temp.push(node.children[i]); 94 | } 95 | } 96 | } 97 | //div渲染 98 | function render() { 99 | var i = 0; 100 | var str = searchVal.value.trim(); 101 | arry[i].style.background = "blue"; 102 | timer = setInterval(function () { 103 | i++; 104 | if (i < arry.length) { 105 | arry[i-1].style.background = "#fff"; 106 | arry[i].style.background = "blue"; 107 | if (arry[i-1].firstChild.nodeValue.trim() == str) { 108 | arry[i-1].style.background = "red"; 109 | arry[i-1].style.color = "#fff"; 110 | } 111 | } else { 112 | clearInterval(timer); 113 | arry[arry.length-1].style.background = "#fff"; 114 | if (arry[i-1].firstChild.nodeValue.trim() == str) { 115 | arry[i-1].style.background = "red"; 116 | arry[i-1].style.color = "#fff"; 117 | } 118 | } 119 | },500) 120 | } 121 | //初始化样式 122 | function reSet() { 123 | arry = []; 124 | clearInterval(timer); 125 | for (var i = 0, len = divs.length; i < len; i++) { 126 | divs[i].style.background = "#fff"; 127 | divs[i].style.color = "black"; 128 | } 129 | } 130 | addClickEvent(); -------------------------------------------------------------------------------- /part2/task25/README.md: -------------------------------------------------------------------------------- 1 | 25任务目的 2 | 3 | 熟练JavaScript 4 | 学习树这种数据结构的基本知识 5 | 任务描述 6 | 7 | 基于任务24的基本代码,实现一个树形组件,样式自定义,不做限制 8 | 要求有以下功能: 9 | 节点的折叠与展开 10 | 允许增加节点与删除节点 11 | 按照内容进行节点查找,并且把找到的节点进行特殊样式呈现,如果找到的节点处于被父节点折叠隐藏的状态,则需要做对应的展开 12 | 任务注意事项 13 | 14 | 实现功能的同时,请仔细学习JavaScript基本语法、事件、DOM相关的知识 15 | 尽量做到样式交互、节点数据、节点操作的解耦 16 | 请注意代码风格的整齐、优雅 17 | 代码中含有必要的注释 18 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task25/task25.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JavaScript和树(四) 6 | 29 | 30 | 31 | 32 | 33 |

    34 | 35 |

    输入查询值 然后选择"前后广"其中一种方式开始查询

    36 | 37 | 38 | 39 |
    40 |
    41 | +地球 42 |
    43 | +亚洲 44 |
    45 | +中国 46 |
    -北京
    47 |
    -天津
    48 |
    -上海
    49 |
    50 |
    51 | +韩国 52 |
    -首尔
    53 |
    -釜山
    54 |
    55 |
    56 | +日本 57 |
    -东京
    58 |
    -大坂
    59 |
    60 |
    61 |
    62 | +欧洲 63 |
    64 | +英国 65 |
    -伦敦
    66 | 67 |
    68 |
    69 | +法国 70 |
    -巴黎
    71 |
    72 |
    73 |
    74 | +北美洲 75 |
    76 | -美国 77 |
    78 |
    79 | -加拿大 80 |
    81 |
    82 |
    83 |
    84 | 85 | 86 | -------------------------------------------------------------------------------- /part2/task25/task25.js: -------------------------------------------------------------------------------- 1 | var $ = function(id) { 2 | return document.getElementById(id); 3 | }; 4 | var root = $("root"), 5 | pre = $("pre"), 6 | wide = $("wide"), 7 | arry = [], 8 | selectNode, 9 | timer = null, 10 | last = $("last"), 11 | searchVal = $("searchVal"), 12 | container = $("container"); 13 | nodeVal = $("nodeVal"), 14 | addNode = $("addNode"), 15 | delNode = $("delNode"), 16 | divs = container.getElementsByTagName("div"); 17 | //按钮点击事件 绑定函数 18 | pre.onclick = function() { 19 | reSet(); 20 | preOrder(root); 21 | openAllDiv(); 22 | render(); 23 | }; 24 | last.onclick = function() { 25 | reSet(); 26 | lastOrder(root); 27 | openAllDiv(); 28 | render(); 29 | }; 30 | wide.onclick = function() { 31 | reSet(); 32 | wideOrder(root); 33 | openAllDiv(); 34 | render(); 35 | }; 36 | //增加节点 37 | addNode.onclick = function() { 38 | //在添加节点时 如果选中的节点关闭并有子节点 则将所有子节点展开 39 | if (selectNode.children.length) { 40 | for (var i = 0, len = selectNode.children.length; i < len; i++) { 41 | selectNode.children[i].style.display = "block"; 42 | } 43 | } 44 | var str = nodeVal.value.trim(); 45 | if (!str) { 46 | alert("请输入要添加的内容"); 47 | return; 48 | } 49 | if (!selectNode) { 50 | alert("请选中一个节点"); 51 | return; 52 | } 53 | var newNode = document.createElement("div"); 54 | newNode.innerHTML = "-" + str; 55 | selectNode.appendChild(newNode); 56 | addClickEvent(); 57 | }; 58 | //删除节点 59 | delNode.onclick = function() { 60 | if (!selectNode) { 61 | alert("请选中一个节点"); 62 | return; 63 | } 64 | var parNode = selectNode.parentNode; 65 | parNode.removeChild(selectNode); 66 | }; 67 | //遍历每个节点并添加点击事件 68 | function addClickEvent() { 69 | for (var i = 0, len = divs.length; i < len; i++) { 70 | divs[i].onclick = function(e) { 71 | reSet(); 72 | //判断每个节点是否有子节点 如果有 每次点击的时候看子节点是隐藏还是显示而将子节点设置为相反样式 //这样就能在点击的时候出现隐藏或显示的效果 73 | if (this.children.length) { 74 | for (var j = 0, l = this.children.length; j < l; j++) { 75 | if (this.children[j].style.display == "none") { 76 | this.children[j].style.display = "block"; 77 | this.firstChild.nodeValue = this.firstChild.nodeValue.replace("+", "-"); 78 | } 79 | else { 80 | this.children[j].style.display = "none"; 81 | this.firstChild.nodeValue = this.firstChild.nodeValue.replace("-", "+"); 82 | } 83 | } 84 | } 85 | else { 86 | this.style.display = "block"; 87 | } 88 | this.style.background = "#d3d3d3"; 89 | e.stopPropagation(); 90 | selectNode = this; //将选中的节点赋值给selectNode 91 | }; 92 | } 93 | } 94 | //多叉树算法 95 | //递归 96 | function preOrder(node) { 97 | if (node) { 98 | arry.push(node); 99 | for (var i = 0, len = node.children.length; i < len; i++) { 100 | preOrder(node.children[i]); 101 | } 102 | } 103 | } 104 | //递归 105 | function lastOrder(node) { 106 | if (node) { 107 | for (var i = 0, len = node.children.length; i < len; i++) { 108 | lastOrder(node.children[i]); 109 | } 110 | arry.push(node); 111 | } 112 | } 113 | //队列 114 | function wideOrder(node) { 115 | var temp = []; 116 | temp.push(node); 117 | while (temp.length) { 118 | var node = temp.shift(); 119 | arry.push(node); 120 | for (var i = 0, len = node.children.length; i < len; i++) { 121 | temp.push(node.children[i]); 122 | } 123 | } 124 | } 125 | //div渲染 126 | function render() { 127 | var i = 0; 128 | var re = /[+-]/; 129 | var str = searchVal.value.trim().replace(re, "");//在搜索时将DIV里的字符串把+和-号去掉再作对比 130 | arry[i].style.background = "#d3d3d3"; 131 | timer = setInterval(function () { 132 | i++; 133 | if (i < arry.length) { 134 | arry[i-1].style.background = "#fff"; 135 | arry[i].style.background = "#d3d3d3"; 136 | if (arry[i-1].firstChild.nodeValue.trim().replace(re, "") == str) { 137 | arry[i-1].style.background = "red"; 138 | arry[i-1].style.color = "#fff"; 139 | } 140 | } else { 141 | clearInterval(timer); 142 | arry[arry.length-1].style.background = "#fff"; 143 | if (arry[i-1].firstChild.nodeValue.trim().replace(re, "") == str) { 144 | arry[i-1].style.background = "red"; 145 | arry[i-1].style.color = "#fff"; 146 | } 147 | } 148 | },500) 149 | } 150 | //在每次查询的时候将所有列表展开 151 | function openAllDiv() { 152 | for (var i = 0, len = arry.length; i < len; i++) { 153 | arry[i].style.display = "block"; 154 | } 155 | } 156 | //初始化样式 在每次点击的时候将全部节点背景色设为白色 不然点下一个节点 上一个节点还是灰色 157 | function reSet() { 158 | arry = []; 159 | clearInterval(timer); 160 | for (var i = 0, len = divs.length; i < len; i++) { 161 | divs[i].style.background = "#fff"; 162 | divs[i].style.color = "black"; 163 | } 164 | } 165 | addClickEvent(); -------------------------------------------------------------------------------- /part2/task26/README.md: -------------------------------------------------------------------------------- 1 | 26任务目的 2 | 3 | 练习JavaScript面向对象设计 4 | 实践一些基础的设计模式 5 | 任务描述 6 | 7 | 创建一个虚拟宇宙,包括一个行星和飞船 8 | 每个飞船由以下部分组成 9 | 动力系统,可以完成飞行和停止飞行两个行为,暂定所有飞船的动力系统飞行速度是一致的,比如每秒20px,飞行过程中会按照一定速率消耗能源(比如每秒减5%) 10 | 能源系统,提供能源,并且在宇宙中通过太阳能充电(比如每秒增加2%,具体速率自定) 11 | 信号接收处理系统,用于接收行星上的信号 12 | 自爆系统,用于自我销毁 13 | 每个飞船的能源是有限的,用一个属性来表示能源剩余量,这是一个百分比,表示还剩余多少能源。 14 | 能源耗尽时,飞船会自动停止飞行 15 | 飞船有两个状态:飞行中和停止,飞船的行为会改变这个属性状态 16 | 飞船的自我销毁方法会立即销毁飞船自身 17 | 行星上有一个指挥官(不需要在页面上表现出其形象),指挥官可以通过行星上的信号发射器发布如下命令 18 | 创建一个新的飞船进入轨道,最多可以创建4个飞船,刚被创建的飞船会停留在某一个轨道上静止不动 19 | 命令某个飞船开始飞行,飞行后飞船会围绕行星做环绕运动,需要模拟出这个动画效果 20 | 命令某个飞船停止飞行 21 | 命令某个飞船销毁,销毁后飞船消失、飞船标示可以用于下次新创建的飞船 22 | 你需要设计类似如下指令格式的数据格式 23 | { 24 | id: 1, 25 | commond: 'stop' 26 | } 27 | 28 | 指挥官通过信号发射器发出的命令是通过一种叫做Mediator的介质进行广播 29 | Mediator是单向传播的,只能从行星发射到宇宙中,在发射过程中,有30%的信息传送失败(丢包)概率,你需要模拟这个丢包率,另外每次信息正常传送的时间需要1秒 30 | 指挥官并不知道自己的指令是不是真的传给了飞船,飞船的状态他是不知道的,他只能通过自己之前的操作来假设飞船当前的状态 31 | 每个飞船通过信号接收器,接受到通过Mediator传达过来的指挥官的广播信号,但因为是广播信号,所以每个飞船能接受到指挥官发出给所有飞船的所有指令,因此需要通过读取信息判断这个指令是不是发给自己的 -------------------------------------------------------------------------------- /part2/task26/task26.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 行星与飞船(一) 6 | 91 | 92 | 93 |
    94 |
    95 |
    96 |
    97 |
    98 | 99 |
    100 |
    101 | 102 |
    103 |
    104 | 105 | 106 | -------------------------------------------------------------------------------- /part2/task26/task26.js: -------------------------------------------------------------------------------- 1 | var $ = function(id) { 2 | return document.getElementById(id); 3 | }; 4 | var ships = [], // 存储飞船的数组 5 | tships = [], // 一个临时的数组 为了在直接操作删除ships时不出错 6 | r = 115, // 行星圆心到第一个飞船圆心的半径 7 | creatShip = $("creatShip"), 8 | universe = $("universe"), 9 | control = $("control"), 10 | log = $("log"), 11 | speed = 0.1, 12 | x = 386, // 圆心位置X轴坐标 13 | y = 245; // 圆心位置Y轴坐标 14 | log.value = ""; // 输出日记信息 15 | 16 | var Ship = function(id) { 17 | this.id = id; 18 | this.state = null; // 飞船状态是为了 手动点击停止飞行时 即时充满能量也不会恢复飞行 19 | // 如果是能量自然耗完 则在充满能量后继续飞行 20 | this.energy = 1000; 21 | this.r = r + this.id * 40; 22 | this.deg = 0; 23 | this.timer = null; // 飞船能量计数器 24 | this.chargeTimer = null; // 飞船充电计数器 25 | } 26 | 27 | Ship.prototype.creat = function() { 28 | this.shipDiv = document.createElement("div"); 29 | this.shipDiv.innerHTML = "100%"; 30 | // 飞船当前的角度 31 | var b = Math.sin(this.deg * Math.PI / 180) * this.r; 32 | var a = Math.cos(this.deg * Math.PI / 180) * this.r; 33 | a = a + x; 34 | b = b + y; 35 | this.shipDiv.style.left = a + "px"; 36 | this.shipDiv.style.top = b + "px"; 37 | this.shipDiv.className = "ship"; 38 | universe.appendChild(this.shipDiv); 39 | ships.push(this); 40 | tships.push(this); // 一个临时的数组 为了在直接操作删除ships时不出错 41 | var ele = document.createElement("div"); 42 | ele.innerHTML = '
    ' + 43 | '' + 44 | '' + 45 | '' + 46 | '' + 47 | '
    '; 48 | control.appendChild(ele); 49 | }; 50 | 51 | Ship.prototype.fly = function() { // 飞行时能量计数器 52 | this.state = "fly"; 53 | if (this.timer) { // 防止不断点击开始飞行 速度越来越快 54 | clearInterval(this.timer); 55 | } 56 | this.timer = setInterval(function() { 57 | this.energy--; 58 | this.shipDiv.innerHTML = Math.floor(this.energy/1000*100) + "%"; 59 | if (this.energy == 0 ) { 60 | clearInterval(this.timer); 61 | this.charge(); 62 | } 63 | this.deg++; 64 | this.deg = this.deg % 360; 65 | var b = Math.sin(this.deg * Math.PI / 180) * this.r; 66 | var a = Math.cos(this.deg * Math.PI / 180) * this.r; 67 | a = a + x; 68 | b = b + y; 69 | this.shipDiv.style.left = a + "px"; 70 | this.shipDiv.style.top = b + "px"; 71 | }.bind(this),50); // 在计数器里this指向windows 所以用bind()绑定上下文this 来指向上下文里的this 72 | }; 73 | 74 | Ship.prototype.stop = function() { 75 | clearInterval(this.timer); 76 | this.state = "static"; 77 | this.charge(); 78 | }; 79 | 80 | Ship.prototype.destroy = function() { 81 | clearInterval(this.timer); 82 | clearInterval(this.chargeTimer); 83 | this.shipDiv.parentNode.removeChild(this.shipDiv); // 清除飞船 84 | var ele = document.getElementById("control-" + this.id); // 清除控制台按钮 85 | ele.parentNode.removeChild(ele); 86 | for (var i = 0; i < ships.length; i++) { 87 | if (this.id == ships[i].id) { 88 | ships.splice(i, 1); // 删除存储飞船的数组相关项 89 | break; 90 | } 91 | } 92 | if (ships.length == 0) { 93 | tships = []; 94 | } 95 | }; 96 | 97 | Ship.prototype.charge = function() { // 充电计数器 98 | if (this.chargeTimer) { // 防止不断点击停止飞行 充电超过100% 99 | clearInterval(this.chargeTimer); 100 | } 101 | this.chargeTimer = setInterval(function() { 102 | this.energy++; 103 | if (this.energy > 1000) { 104 | clearInterval(this.chargeTimer); 105 | if (this.state == "static") { 106 | return; 107 | } 108 | this.fly(); 109 | } 110 | this.shipDiv.innerHTML = Math.floor(this.energy/1000*100) + "%"; 111 | }.bind(this),20); 112 | }; 113 | 114 | // 指挥官 有4个命令 115 | var Commander = { 116 | creat: function() { 117 | id = Mediator.getShipId(); 118 | if (id == null) { 119 | Logger.log("指挥官: 无可用的飞船"); 120 | return; 121 | } 122 | Logger.log("指挥官: 创建飞船"); 123 | Mediator.creat(id); 124 | }, 125 | fly: function(id) { 126 | Logger.log("指挥官: " + (id+1) + "号飞船开始起飞"); 127 | Mediator.fly(id); 128 | }, 129 | stop: function(id) { 130 | Logger.log("指挥官: " + (id+1) + "号飞船停止飞行"); 131 | Mediator.stop(id); 132 | }, 133 | destroy: function(id) { 134 | Logger.log("指挥官: 销毁" + (id+1) + "号飞船"); 135 | Mediator.destroy(id); 136 | } 137 | }; 138 | 139 | // 相当于一个观察者 观看指挥官的命令有没有成功发送以及后续执行情况 140 | var Mediator = { 141 | init: function () { 142 | this.tempShip = []; 143 | for (var i = 0; i < 4; i++) { 144 | this.tempShip[i] = undefined; 145 | } 146 | }, 147 | getShipId: function() { 148 | for (var i = 0, len = this.tempShip.length; i < len; i++) { 149 | if (this.tempShip[i] == undefined) { 150 | return i; 151 | } 152 | } 153 | return null; 154 | }, 155 | creat: function(id) { 156 | if (!loss()) { 157 | return; 158 | } 159 | Logger.log("Mediator: 命令传输成功," + (id+1) + "号飞船创建成功"); 160 | ship = new Ship(id); 161 | this.tempShip[id] = id; 162 | ship.creat(); 163 | }, 164 | fly: function(id) { 165 | setTimeout(function () { // 命令延迟函数 有一秒的延迟 166 | if (!loss()) { 167 | return; 168 | } 169 | Logger.log("Mediator: 命令传输成功, 让编号为" + (id+1) + "的飞船起飞"); 170 | ships[id].fly(); 171 | }, 1000); 172 | }, 173 | stop: function(id) { 174 | setTimeout(function () { 175 | if (!loss()) { 176 | return; 177 | } 178 | Logger.log("Mediator: 命令传输成功, 让编号为" + (id+1) + "的停止飞行"); 179 | ships[id].stop(); 180 | }, 1000); 181 | }, 182 | destroy: function(id) { 183 | setTimeout(function () { 184 | if (!loss()) { 185 | return; 186 | } 187 | Logger.log("Mediator: 命令传输成功, 销毁编号为" + (id+1) + "的飞船"); 188 | this.tempShip[id] = undefined; 189 | tships[id].destroy(); // 如果不用这个临时数组 在删除飞船时 从头开始删会有一个删不下去 190 | }.bind(this), 1000); 191 | } 192 | }; 193 | 194 | // 日记输出 195 | var Logger = { 196 | log: function (text) { 197 | log.value += text + "\n"; 198 | log.scrollTop = log.scrollHeight; // 让滚动条自动滚动 199 | } 200 | }; 201 | 202 | // 命令丢包函数 203 | function loss() { 204 | if (Math.random() <= 0.3) { 205 | Logger.log("Mediator: 指令丢包,接收命令失败"); 206 | return false; 207 | } 208 | return true; 209 | } 210 | 211 | // 初始化 一个数组 只有数组里面的项是undefined才能创建飞船 212 | Mediator.init(); -------------------------------------------------------------------------------- /part2/task27/README.md: -------------------------------------------------------------------------------- 1 | 27任务目的 2 | 3 | 练习JavaScript面向对象设计 4 | 实践一些基础的设计模式 5 | 任务描述 6 | 7 | 基于任务二十六,我们继续改善我们的任务 8 | 第一代宇宙飞船系统真是糟糕的实现,所以我们需要进行改进飞船自身,我们在几个部件进行了更多的组合可能性,在创建新飞船时可以自行选择, 9 | 我们新增了几种动力系统,能够让飞船飞得更快,相应的能源消耗也会不同 10 | 我们新增了集中能源系统,能够让飞船能量补充能源速度越快 11 | 接下来改进的是指令的传播问题 12 | 我们发明了新一代的传播介质BUS,它的单次传播失败率降低到10%,传播速度提升到300ms,而且他增加了多次重试的功能,可以保证信息一定能够传递出去,请你实现这个可以通过多次重试保证在10%丢包率情况下顺利将信息传递出去的BUS传播介质 13 | 但BUS有个弱点,就是无法直接传递JSON格式,它只能传递二进制码,但指挥官并不能够直接下达二进制编码指令,所以我们需要在行星上的发射器部分增加一个模块Adapter,把原来的指令格式翻译成二进制码。同时还需要在飞船的接收器部分增加一个Adapter,用来把二进制码翻译成原来能够理解的指令格式 14 | 二进制码格式自定,可以参考的例子:前四位标示飞船编号,后四位标示具体指令(0001:开始飞行,0010:停止飞行,1100:自我销毁) 15 | 任务注意事项 16 | 17 | 实现功能的同时,请仔细学习JavaScript相关的知识 18 | 相关信息发送、接受等,建议在控制台中输出 19 | 任务说明中的各种数值说明只是参考,可能存在不合理性,可以自行设定 20 | 实现各种功能、模块时,不需要生搬硬套设计模式,但希望你就设计模式相关知识进行学习,并进行合理的借鉴运用 21 | 请注意代码风格的整齐、优雅 22 | 代码中含有必要的注释 23 | 允许使用jQuery等库,但不建议使用React、Angular等框架 -------------------------------------------------------------------------------- /part2/task27/task27.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 行星与飞船(二) 6 | 63 | 64 | 65 |
    66 |
    67 |
    68 |
    69 |
    70 | 71 | 前进号(速率30px/s, 能耗5%/s) 72 | 奔腾号(速率50px/s, 能耗7%/s) 73 | 超越号(速率80px/s, 能耗9%/s) 74 | 75 |
    76 | 劲量型(补充能源速度2%/s) 77 | 光能型(补充能源速度3%/s) 78 | 永久型(补充能源速度4%/s) 79 |
    80 |
    81 |
    82 | 83 |
    84 |
    85 | 86 | 87 | -------------------------------------------------------------------------------- /part2/task28/README.md: -------------------------------------------------------------------------------- 1 | 28任务目的 2 | 3 | 练习JavaScript面向对象设计 4 | 实践一些基础的设计模式 5 | 任务描述 6 | 7 | 基于任务二十七,我们继续改善 8 | 第二代宇宙飞船系统进步了很多,但是我们依然无法知道飞船的能源消耗情况,可能有的时候我们发出开始飞行的指令,但飞船早就没有能量了,所以我们再次进行升级,这次我们需要增加一个飞船状态的监视系统 9 | 我们为每个飞船增加一个信号发射器,飞船会通过BUS系统定时(比如每秒)广播自己的飞行状态。发送的时候,我们通过已经安装在飞船上的Adapter把状态数据翻译成二进制码形式,把飞船自身标示,飞行状态,能量编码成一个16位的二进制串,前四位用于飞船自身标示,接下来4位表示飞行状态,0010为停止,0001为飞行,1100表示即将销毁,后八位用于记录飞船剩余能源百分比 10 | 行星上有一个信号接收器,用于通过BUS系统接受各个飞船发送过来的信号 11 | 当信号接收器接收到飞船信号后,会把信息传给数据处理中心(DC),数据处理中心依然是调用Adapter模块,把这些二进制数据转为对象格式存储在DC中 12 | 实现一个行星上的监视大屏幕,用来显示所有飞船的飞行状态及能源情况,当数据处理中心飞船数据发生变化时,它会相应在监视器上做出变化 13 | 任务注意事项 14 | 15 | 实现功能的同时,请仔细学习JavaScript相关的知识 16 | 相关信息发送、接受等,建议在控制台中输出 17 | 实现各种功能、模块时,不需要生搬硬套设计模式,但希望你就设计模式相关知识进行学习,并进行合理的借鉴运用 18 | 任务说明中的各种数值说明只是参考,可能存在不合理性,可以自行设定 19 | 请注意代码风格的整齐、优雅 20 | 代码中含有必要的注释 21 | 允许使用jQuery等库,但不建议使用React、Angular等框架 -------------------------------------------------------------------------------- /part2/task28/task28.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 行星与飞船(三) 6 | 82 | 83 | 84 |
    85 |
    86 |
    87 |
    88 |
    89 | 90 | 前进号(速率30px/s, 能耗5%/s) 91 | 奔腾号(速率50px/s, 能耗7%/s) 92 | 超越号(速率80px/s, 能耗9%/s) 93 | 94 |
    95 | 劲量型(补充能源速度2%/s) 96 | 光能型(补充能源速度3%/s) 97 | 永久型(补充能源速度4%/s) 98 |
    99 |
    100 |
    101 | 102 |
    103 |
    104 |
    105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 |
    飞船动力系统能源系统当前飞行状态剩余能耗
    114 |
    115 | 116 | 117 | -------------------------------------------------------------------------------- /part2/task29/README.md: -------------------------------------------------------------------------------- 1 | 29任务目的 2 | 3 | 加强对JavaScript的掌握 4 | 熟悉常用表单处理逻辑 5 | 任务描述 6 | 7 | 如示例图中所示,在页面中实现一个输入框与按钮,要求点击验证按钮后,对输入框中内容进行格式校验,并在其下方显示校验结果 8 | 校验规则: 9 | 1.字符数为4~16位 10 | 2.每个英文字母、数字、英文符号长度为1 11 | 3.每个汉字,中文符号长度为2 12 | 任务注意事项 13 | 14 | 要求功能实现与任务描述中完全一致 15 | 示例图仅为参考,样式不需要完全实现一致 16 | 请注意代码风格的整齐、优雅 17 | 代码中含有必要的注释 18 | 不允许借助任何第三方组件库实现 -------------------------------------------------------------------------------- /part2/task29/task29.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 表单(一)单个表单项的检验 6 | 28 | 29 | 30 | 名称 31 | 32 |
    33 | 必填,长度为4~16个字符 34 | 68 | 69 | -------------------------------------------------------------------------------- /part2/task30/README.md: -------------------------------------------------------------------------------- 1 | 30任务目的 2 | 3 | 加强对JavaScript的掌握 4 | 熟悉常用表单处理逻辑 5 | 任务描述 6 | 7 | 基于上一个任务(任务29),在页面中添加多个表单 8 | 要求: 9 | 表单获得焦点时,下方显示表单填写规则 10 | 表单失去焦点时校验表单内容 11 | 校验结果正确时,表单边框显示绿色,并在下方显示验证通过的描述文字 12 | 校验结果错误时,表单边框显示红色,并在下方显示验证错误的描述文字 13 | 点击提交按钮时,对页面中所有输入进行校验,校验结果显示方式同上。若所有表单校验通过,弹窗显示“提交成功”,否则显示“提交失败” 14 | 任务注意事项 15 | 16 | 要求功能实现与任务描述中完全一致 17 | 示例图仅为参考,样式不需要完全实现一致 18 | 实现中,尽可能考虑代码的可读性和可复用性 19 | 请注意代码风格的整齐、优雅 20 | 代码中含有必要的注释 21 | 不允许借助任何第三方组件库实现 -------------------------------------------------------------------------------- /part2/task30/task30.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 表单(二)单个表单项的检验 6 | 45 | 46 | 47 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /part2/task30/task30.js: -------------------------------------------------------------------------------- 1 | //取得各个ID的对象 2 | var $ = function(id) { 3 | return document.getElementById(id); 4 | }; 5 | var inputName = $("inputName"), 6 | inputPwd1 = $("inputPwd1"), 7 | inputPwd2 = $("inputPwd2"), 8 | mail = $("mail"), 9 | tel = $("tel"), 10 | btn = $("btn"), 11 | re = /[\u4e00-\u9fa5]/g; 12 | 13 | //检测名称 取得label中的值 14 | function onFocus(event) { 15 | var label = event.target.parentNode.children[0]; //名称 16 | var span = event.target.parentNode.children[3]; //SPAN的提示信息 17 | switch(label.innerHTML) { 18 | case "名称": span.innerHTML = "长度必须为4~16个字符"; 19 | break; 20 | case "密码": span.innerHTML = "长度必须为4~16个字符"; 21 | break; 22 | case "确认密码": span.innerHTML = "两次密码必须一致"; 23 | break; 24 | case "邮箱": span.innerHTML = "邮箱格式为带@的字符集合"; 25 | break; 26 | case "手机": span.innerHTML = "长度必须为11个数字"; 27 | break; 28 | default: break; 29 | } 30 | } 31 | 32 | function onBlur(event) { 33 | var label = event.target.parentNode.children[0]; //名称 34 | var span = event.target.parentNode.children[3]; //SPAN的提示信息 35 | var str = event.target.value.trim(); 36 | if (!str) { 37 | span.innerHTML = label.innerHTML + "不能为空"; 38 | event.target.style.border = "2px solid red"; 39 | span.style.color = "red"; 40 | } 41 | var len; 42 | var tempArry = str.match(re); 43 | str = str.replace(re, ""); 44 | if (tempArry) { //检测是否有中文 45 | len = tempArry.length*2 + str.length; 46 | } 47 | else { 48 | len = str.length; 49 | } 50 | //验证格式 51 | switch(label.innerHTML) { 52 | case "名称": formatName(event.target,span,len); 53 | break; 54 | case "密码": formatName(event.target,span,len); 55 | break; 56 | case "确认密码": formatPwd(event.target,span,len); 57 | break; 58 | case "邮箱": formatMail(event.target,span,str); 59 | break; 60 | case "手机": formatTel(event.target,span,str); 61 | break; 62 | default: break; 63 | } 64 | } 65 | //验证名字格式 66 | function formatName(obj,span,len) { 67 | if (len < 4 || len > 16 ) { 68 | span.innerHTML = "长度必须为4~16个字符"; 69 | obj.style.border = "2px solid red"; 70 | span.style.color = "red"; 71 | } 72 | else { 73 | span.innerHTML = "格式正确"; 74 | obj.style.border = "2px solid lightgreen"; 75 | span.style.color = "lightgreen"; 76 | } 77 | } 78 | //验证密码格式 79 | function formatPwd(obj,span,len) { 80 | if ((inputPwd1.value.trim() == inputPwd2.value.trim()) && len < 17 && len >3) { 81 | span.innerHTML = "密码可用"; 82 | obj.style.border = "2px solid lightgreen"; 83 | span.style.color = "lightgreen"; 84 | } 85 | else { 86 | span.innerHTML = "两次密码必须一致"; 87 | obj.style.border = "2px solid red"; 88 | span.style.color = "red"; 89 | } 90 | } 91 | //验证邮箱格式 92 | function formatMail(obj,span,str) { 93 | var re = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 94 | if (re.test(str)) { 95 | span.innerHTML = "格式正确"; 96 | obj.style.border = "2px solid lightgreen"; 97 | span.style.color = "lightgreen"; 98 | } 99 | else { 100 | span.innerHTML = "邮箱格式不正确"; 101 | obj.style.border = "2px solid red"; 102 | span.style.color = "red"; 103 | } 104 | } 105 | //验证手机格式 106 | function formatTel(obj,span,str) { 107 | var re = /^\d{11}$/; 108 | if (re.test(str)) { 109 | span.innerHTML = "格式正确"; 110 | obj.style.border = "2px solid lightgreen"; 111 | span.style.color = "lightgreen"; 112 | } 113 | else { 114 | span.innerHTML = "手机格式不正确"; 115 | obj.style.border = "2px solid red"; 116 | span.style.color = "red"; 117 | } 118 | } 119 | //名称 120 | inputName.addEventListener("focus",onFocus); 121 | inputName.addEventListener("blur",onBlur); 122 | 123 | //密码 124 | inputPwd1.addEventListener("focus",onFocus); 125 | inputPwd1.addEventListener("blur",onBlur); 126 | 127 | //确认密码 128 | inputPwd2.addEventListener("focus",onFocus); 129 | inputPwd2.addEventListener("blur",onBlur); 130 | 131 | //邮箱 132 | mail.addEventListener("focus",onFocus); 133 | mail.addEventListener("blur",onBlur); 134 | 135 | //手机 136 | tel.addEventListener("focus",onFocus); 137 | tel.addEventListener("blur",onBlur); 138 | 139 | //提交的时候验证所有格式 140 | btn.onclick = function() { 141 | var spans = document.getElementsByTagName("span"); 142 | var str = "格式正确密码可用"; 143 | for (var i = 0, len = spans.length; i < len; i++) { 144 | if (spans[i].innerHTML == "") { 145 | alert("提交失败"); 146 | return; 147 | } 148 | else if (str.indexOf(spans[i].innerHTML) == -1) { 149 | alert("提交失败"); 150 | return; 151 | } 152 | } 153 | alert("提交成功"); 154 | } -------------------------------------------------------------------------------- /part2/task31/README.md: -------------------------------------------------------------------------------- 1 | 31任务目的 2 | 3 | 加强对JavaScript的掌握 4 | 熟悉常用表单处理逻辑 5 | 任务描述 6 | 7 | 如示例图中所示,在页面中完成两个单选框,切换单选框的不同选项时下方显示的表单随之切换。 8 | 当选择在校生时,出现两个select下拉菜单,一个选择城市,一个选择学校,当选择非在校生时,出一个文本输入框 9 | 学校下拉菜单里的学校名单均为城市下拉菜单中所选的城市中的大学,当城市发生变化时,学校一起发生变化 10 | 城市及学校的数据随意编造即可,无需真实完整 11 | 任务注意事项 12 | 13 | 要求功能实现与任务描述中完全一致 14 | 示例图仅为参考,样式不需要完全实现一致 15 | 请注意代码风格的整齐、优雅 16 | 代码中含有必要的注释 17 | 不允许借助任何第三方组件库实现 -------------------------------------------------------------------------------- /part2/task31/task31.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 表单(三)联动 6 | 22 | 23 | 24 | 在校生 25 | 非在校生
    26 | 学校 27 | 31 | 35 | 36 | 73 | 74 | -------------------------------------------------------------------------------- /part2/task32/README.md: -------------------------------------------------------------------------------- 1 | 32任务目的 2 | 3 | 加强对JavaScript的掌握 4 | 熟悉常用表单处理逻辑 5 | 学习如何模块如何设计,不同模块间如何尽量解耦 6 | 任务描述 7 | 8 | 实现以JavaScript对象的方式定义表单及验证规则 9 | 表单配置参考示例如下:(不需要一致,仅为参考) 10 | 11 | { 12 | label: '名称', // 表单标签 13 | type: 'input', // 表单类型 14 | validator: function () {...}, // 表单验证规 15 | rules: '必填,长度为4-16个字符', // 填写规则提示 16 | success: '格式正确', // 验证通过提示 17 | fail: '名称不能为空' // 验证失败提示 18 | } 19 | 20 | 基于该配置项,实现一套逻辑,可以自动生成表单的展现、交互、验证 21 | 使用你制作的表单工厂,在一个页面上创建两套样式不同的表单 22 | 任务注意事项 23 | 24 | 实现中,尽可能考虑代码的可读性和可复用性 25 | 尽量时表单配置、生成、样式、验证几个逻辑之间的耦合度足够低 26 | 请注意代码风格的整齐、优雅 27 | 代码中含有必要的注释 28 | 不允许借助任何第三方组件库实现 -------------------------------------------------------------------------------- /part2/task32/task32.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 表单(四)实现表单自动生成工厂 6 | 46 | 47 | 48 |
    49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |
    57 | 58 | 59 | 60 |
    61 | 62 |
    63 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /part2/task32/task32.js: -------------------------------------------------------------------------------- 1 | //取得各个ID的对象 2 | var $ = function(id) { 3 | return document.getElementById(id); 4 | }; 5 | var data = { 6 | 名称: "inputName", 7 | 密码: "inputPwd1", 8 | 确认密码: "inputPwd2", 9 | 邮箱: "mail", 10 | 手机: "tel" 11 | }; 12 | var generator = $("generator"), 13 | inputArry = generator.getElementsByTagName("input"), 14 | creatBtn = $("creatBtn"), 15 | re = /[\u4e00-\u9fa5]/g, 16 | ulForm = $("form"); 17 | //表单生成 18 | function creatForm() { 19 | var arry = [], 20 | flag = 1, 21 | spanRe = //g; 22 | content = ""; 23 | for (var i = 0, len = inputArry.length; i < len; i++) { 24 | if (inputArry[i].checked) { 25 | if (inputArry[i].name.trim() != "style") 26 | arry.push(inputArry[i]); 27 | if (inputArry[i].value == "two") { 28 | flag = 2; 29 | } 30 | } 31 | } 32 | for (var j = 0, l = arry.length; j < l; j++) { 33 | content += "

  • "; 34 | if (arry[j].value == "密码") { 35 | content += "

  • "; 36 | } 37 | } 38 | if (flag ==2) { 39 | content = content.replace(spanRe, ""); 40 | } 41 | content += "
  • "; 42 | ulForm.innerHTML = content; 43 | var inputs = ulForm.getElementsByTagName("input"); 44 | for (var n = 0, nlen = inputs.length; n < nlen; n++) { 45 | switch(inputs[n].id) { 46 | case "inputName"://名称 47 | inputName.addEventListener("focus",onFocus); 48 | inputName.addEventListener("blur",onBlur); 49 | break; 50 | case "inputPwd1"://密码 51 | inputPwd1.addEventListener("focus",onFocus); 52 | inputPwd1.addEventListener("blur",onBlur); 53 | break; 54 | case "inputPwd2"://确认密码 55 | inputPwd2.addEventListener("focus",onFocus); 56 | inputPwd2.addEventListener("blur",onBlur); 57 | break; 58 | case "mail"://邮箱 59 | mail.addEventListener("focus",onFocus); 60 | mail.addEventListener("blur",onBlur); 61 | break; 62 | case "tel"://手机 63 | tel.addEventListener("focus",onFocus); 64 | tel.addEventListener("blur",onBlur); 65 | break; 66 | default: break; 67 | 68 | } 69 | } 70 | btn.addEventListener("click",function() { 71 | var spans = ulForm.getElementsByTagName("span"); 72 | var str = "格式正确密码可用"; 73 | for (var k = 0, klen = spans.length; k < klen; k++) { 74 | if (spans[k].innerHTML == "") { 75 | alert("提交失败"); 76 | return; 77 | } 78 | else if (str.indexOf(spans[k].innerHTML) == -1) { 79 | alert("提交失败"); 80 | return; 81 | } 82 | } 83 | alert("提交成功"); 84 | }); 85 | } 86 | 87 | //检测名称 取得label中的值 88 | function onFocus(event) { 89 | var label = event.target.parentNode.children[0]; //名称 90 | var span = event.target.parentNode.children[3]; //SPAN的提示信息 91 | switch(label.innerHTML) { 92 | case "名称": span.innerHTML = "长度必须为4~16个字符"; 93 | break; 94 | case "密码": span.innerHTML = "长度必须为4~16个字符"; 95 | break; 96 | case "确认密码": span.innerHTML = "两次密码必须一致"; 97 | break; 98 | case "邮箱": span.innerHTML = "邮箱格式为带@的字符集合"; 99 | break; 100 | case "手机": span.innerHTML = "长度必须为11个数字"; 101 | break; 102 | default: break; 103 | } 104 | } 105 | 106 | function onBlur(event) { 107 | var label = event.target.parentNode.children[0]; //名称 108 | var span = event.target.parentNode.children[3]; //SPAN的提示信息 109 | var str = event.target.value.trim(); 110 | if (!str) { 111 | span.innerHTML = label.innerHTML + "不能为空"; 112 | event.target.style.border = "2px solid red"; 113 | span.style.color = "red"; 114 | } 115 | var len; 116 | var tempArry = str.match(re); 117 | str = str.replace(re, ""); 118 | if (tempArry) { //检测是否有中文 119 | len = tempArry.length*2 + str.length; 120 | } 121 | else { 122 | len = str.length; 123 | } 124 | //验证格式 125 | switch(label.innerHTML) { 126 | case "名称": formatName(event.target,span,len); 127 | break; 128 | case "密码": formatName(event.target,span,len); 129 | break; 130 | case "确认密码": formatPwd(event.target,span,len); 131 | break; 132 | case "邮箱": formatMail(event.target,span,str); 133 | break; 134 | case "手机": formatTel(event.target,span,str); 135 | break; 136 | default: break; 137 | } 138 | } 139 | //验证名字格式 140 | function formatName(obj,span,len) { 141 | if (len < 4 || len > 16 ) { 142 | span.innerHTML = "长度必须为4~16个字符"; 143 | obj.style.border = "2px solid red"; 144 | span.style.color = "red"; 145 | } 146 | else { 147 | span.innerHTML = "格式正确"; 148 | obj.style.border = "2px solid lightgreen"; 149 | span.style.color = "lightgreen"; 150 | } 151 | } 152 | //验证密码格式 153 | function formatPwd(obj,span,len) { 154 | if ((inputPwd1.value.trim() == inputPwd2.value.trim()) && len < 17 && len >3) { 155 | span.innerHTML = "密码可用"; 156 | obj.style.border = "2px solid lightgreen"; 157 | span.style.color = "lightgreen"; 158 | } 159 | else { 160 | span.innerHTML = "两次密码必须一致"; 161 | obj.style.border = "2px solid red"; 162 | span.style.color = "red"; 163 | } 164 | } 165 | //验证邮箱格式 166 | function formatMail(obj,span,str) { 167 | var re = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 168 | if (re.test(str)) { 169 | span.innerHTML = "格式正确"; 170 | obj.style.border = "2px solid lightgreen"; 171 | span.style.color = "lightgreen"; 172 | } 173 | else { 174 | span.innerHTML = "邮箱格式不正确"; 175 | obj.style.border = "2px solid red"; 176 | span.style.color = "red"; 177 | } 178 | } 179 | //验证手机格式 180 | function formatTel(obj,span,str) { 181 | var re = /^\d{11}$/; 182 | if (re.test(str)) { 183 | span.innerHTML = "格式正确"; 184 | obj.style.border = "2px solid lightgreen"; 185 | span.style.color = "lightgreen"; 186 | } 187 | else { 188 | span.innerHTML = "手机格式不正确"; 189 | obj.style.border = "2px solid red"; 190 | span.style.color = "red"; 191 | } 192 | } 193 | creatBtn.addEventListener("click",creatForm); 194 | 195 | //提交的时候验证所有格式 196 | 197 | 198 | -------------------------------------------------------------------------------- /part2/task33/README.md: -------------------------------------------------------------------------------- 1 | 33任务目的 2 | 3 | 练习JavaScript在DOM、字符串处理相关知识 4 | 练习对于复杂UI,如何进行数据机构建模 5 | 任务描述 6 | 实现一个类似棋盘的格子空间,每个格子用两个数字可以定位,一个红正方形的DOM在这个空间内,正方形中的蓝色边表示这是他的正面,有一个input输入框 7 | 在输入框中允许输入如下指令,按下按钮后,使得正方形做相应动作 8 | GO:向蓝色边所面向的方向前进一格(一格等同于正方形的边长) 9 | TUN LEF:向左转(逆时针旋转90度) 10 | TUN RIG:向右转(顺时针旋转90度) 11 | TUN BAC:向右转(旋转180度) 12 | 移动不能超出格子空间 13 | 任务注意事项 14 | 15 | 实现功能的同时,请仔细学习JavaScript相关的知识 16 | 请注意代码风格的整齐、优雅 17 | 代码中含有必要的注释 18 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task33/task33.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 听指令的小方块(一) 6 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 |
    12345678910
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    175 | 176 |

    R向右转 B向反方向转 L向左转 GO为前进 不区分大小写

    177 | 178 | 179 | -------------------------------------------------------------------------------- /part2/task33/task33.js: -------------------------------------------------------------------------------- 1 | var $ = function(id) { 2 | return document.getElementById(id); 3 | }; 4 | var table= $("table").children[0], 5 | input = $("input"), 6 | button = $("button"), 7 | className = "smallBox", 8 | block = { 9 | x: 5, 10 | y: 5, 11 | index: 3,// 0上 1右 2下 3左 代表四个方向 12 | now: getBlock(5,5) 13 | }; 14 | //初始化设置小方块 15 | setDiv(block.now); 16 | divDirection(block.now, className); 17 | block.now.style.transform = "rotateZ(0deg)"; 18 | //获取小方块位置 19 | function getBlock(x, y) { 20 | return table.children[y].children[x]; 21 | } 22 | //小方块里面蓝色方块 23 | function setDiv(block) { 24 | block.innerHTML = "
    "; 25 | } 26 | function divDirection(block, className) { 27 | block.className = className; 28 | } 29 | //点击旋转时 改变角度 30 | function setDirection(degree) { 31 | var preDegree = parseInt((block.now.style.transform).match(/[-]*\d+/g)); 32 | block.now.style.transform = "rotateZ(" + (degree + preDegree) + "deg)"; 33 | } 34 | button.onclick = function () { 35 | switch(input.value.toUpperCase()) { 36 | case "GO": go(); 37 | break; 38 | case "R": setDirection(90); 39 | block.index = (block.index + 1) % 4; 40 | break; 41 | case "B": setDirection(180); 42 | block.index = (block.index + 2) % 4; 43 | break; 44 | case "L": setDirection(-90); 45 | block.index = ((block.index - 1) >= 0? (block.index-1):3) % 4; 46 | break; 47 | default: break; 48 | } 49 | } 50 | //当小广场向前移动时 取得下一个位置的小方块 并把原来的小方块隐藏掉 然后把下一个小方块重新赋值给block 51 | function repeatSet(blockNext) { 52 | setDiv(blockNext); 53 | divDirection(blockNext, className); 54 | divDirection(block.now, ""); 55 | blockNext.style.transform = block.now.style.transform; 56 | block.now = blockNext; 57 | } 58 | //移动函数 59 | function go() { 60 | switch(block.index) { 61 | case 0: if (block.y > 1) { 62 | block.y--; 63 | blockNext = getBlock(block.x, block.y); 64 | repeatSet(blockNext); 65 | } 66 | break; 67 | case 1: if (block.x < 10) { 68 | block.x++; 69 | blockNext = getBlock(block.x, block.y); 70 | repeatSet(blockNext); 71 | } 72 | break; 73 | case 2: if (block.y < 10) { 74 | block.y++; 75 | blockNext = getBlock(block.x, block.y); 76 | repeatSet(blockNext); 77 | } 78 | break; 79 | case 3: if (block.x > 1) { 80 | block.x--; 81 | blockNext = getBlock(block.x, block.y); 82 | repeatSet(blockNext); 83 | } 84 | break; 85 | default: break; 86 | } 87 | } -------------------------------------------------------------------------------- /part2/task34/README.md: -------------------------------------------------------------------------------- 1 | 34任务目的 2 | 3 | 练习JavaScript在DOM、字符串处理相关知识 4 | 练习对于复杂UI,如何进行数据机构建模 5 | 任务描述 6 | 7 | 对于正方形的移动增加相应动画,包括移动和旋转 8 | 每个指令的执行时间是1s(可以自己调整) 9 | 增加新的指令如下: 10 | TRA LEF:向屏幕的左侧移动一格,方向不变 11 | TRA TOP:向屏幕的上面移动一格,方向不变 12 | TRA RIG:向屏幕的右侧移动一格,方向不变 13 | TRA BOT:向屏幕的下面移动一格,方向不变 14 | MOV LEF:方向转向屏幕左侧,并向屏幕的左侧移动一格 15 | MOV TOP:方向转向屏幕上面,向屏幕的上面移动一格 16 | MOV RIG:方向转向屏幕右侧,向屏幕的右侧移动一格 17 | MOV BOT:方向转向屏幕下面,向屏幕的下面移动一格 18 | 任务注意事项 19 | 20 | 实现功能的同时,请仔细学习JavaScript相关的知识 21 | 请注意代码风格的整齐、优雅 22 | 代码中含有必要的注释 23 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task34/task34.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 听指令的小方块(二) 6 | 32 | 33 | 34 |
    35 |
    36 |
    37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 |
    12345678910
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    182 | 183 |

    0向上进一格 1向右进一格 2向下进一格 3向左进一格

    184 |

    TT方向转向上并进一格 RT方向转向右并进一格 BT方向转向下并进一格 LT方向转向左并进一格

    185 | 186 | 187 | -------------------------------------------------------------------------------- /part2/task34/task34.js: -------------------------------------------------------------------------------- 1 | //看了其他团队的代码 学习到了另一种方法 任务34和任务33分别用了不同的方法 感觉任务34这种比较简单直观并且实现了动画效果 2 | var $ = function(id) { 3 | return document.getElementById(id); 4 | }; 5 | var input = $("input"), 6 | smallBox = $("smallBox"), 7 | index = "3", //数字标志方向 0上 1右 2下 3左 8 | button = $("button"); 9 | //初始化设置小方块 10 | smallBox.style.transform = "rotateZ(0deg)"; 11 | smallBox.style.top = "208px"; 12 | smallBox.style.left = "208px"; 13 | //点击旋转时 改变角度 14 | function setDirection(degree) { 15 | smallBox.style.transform = "rotateZ(" + degree + "deg)"; 16 | } 17 | button.onclick = function () { 18 | switch(input.value.toUpperCase()) { 19 | case "TT": setDirection(90); 20 | index = "0"; 21 | go(index); 22 | break; 23 | case "RT": setDirection(180); 24 | index = "1"; 25 | go(index); 26 | break; 27 | case "BT": setDirection(270); 28 | index = "2"; 29 | go(index); 30 | break; 31 | case "LT": setDirection(0); 32 | index = "3"; 33 | go(index); 34 | break; 35 | default: if (/[0123]/.test(input.value)) { 36 | go(input.value); 37 | } 38 | } 39 | } 40 | //移动函数 41 | function go(index) { 42 | switch(index) { 43 | case "0": if (smallBox.style.top == "48px") 44 | break; 45 | smallBox.style.top = (parseInt(smallBox.style.top) - 40) + "px"; 46 | break; 47 | case "1": if (smallBox.style.left == "408px") 48 | break; 49 | smallBox.style.left = (parseInt(smallBox.style.left) + 40) + "px"; 50 | break; 51 | 52 | case "2": if (smallBox.style.top == "408px") 53 | break; 54 | smallBox.style.top = (parseInt(smallBox.style.top) + 40) + "px"; 55 | break; 56 | case "3": if (smallBox.style.left == "48px") 57 | break; 58 | smallBox.style.left = (parseInt(smallBox.style.left) - 40) + "px"; 59 | break; 60 | default: break; 61 | } 62 | } -------------------------------------------------------------------------------- /part2/task35/README.md: -------------------------------------------------------------------------------- 1 | 35任务目的 2 | 3 | 练习JavaScript在DOM、字符串处理相关知识 4 | 练习对于复杂UI,如何进行数据机构建模 5 | 任务描述 6 | 7 | 命令输入框由input变为textarea,可以允许输入多条指令,每一行一条 8 | textarea左侧有一列可以显示当前行数的列(代码行数列),列数保持和textarea中一致 9 | 当textarea发生上下滚动时,代码行数列同步滚动 10 | 能够判断指令是否合法,不合法的指令给出提示(如图) 11 | 点击执行时,依次逐条执行所有命令 12 | 对于GO,TRA以及MOV指令增加可以移动格子数量的参数,例如 13 | GO 3:向当前方向前进三格 14 | TRA TOP 2:向屏幕上方平移两格 15 | MOV RIG 4:方向转向屏幕右侧,向屏幕的右侧移动四格 16 | 任务注意事项 17 | 18 | 实现功能的同时,请仔细学习JavaScript相关的知识 19 | 请注意代码风格的整齐、优雅 20 | 代码中含有必要的注释 21 | 建议不使用任何第三方库、框架 -------------------------------------------------------------------------------- /part2/task35/task35.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 听指令的小方块(三) 6 | 56 | 57 | 58 |
    59 |
    60 |
    61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 |
    12345678910
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    206 | 207 |
    208 |
    209 | 210 |
    211 | 212 | 213 |

    0向上进一格 1向右进一格 2向下进一格 3向左进一格

    214 |

    TT方向转向上并进一格 RT方向转向右并进一格 BT方向转向下并进一格 LT方向转向左并进一格

    215 |

    注: 每输完一条命令必须按回车另起一行输入命令 否则会报错 输完所有命令点击“执行”开始执行 指令+空格+数字代表执行次数

    216 | 217 | 218 | -------------------------------------------------------------------------------- /part2/task35/task35.js: -------------------------------------------------------------------------------- 1 | // 看了其他团队的代码 学习到了另一种方法 任务34和任务33分别用了不同的方法 感觉任务34这种比较简单直观并且实现了动画效果 2 | // 先看前面16行代码 再从button点击事件开始看 3 | var $ = function(id) { 4 | return document.getElementById(id); 5 | }; 6 | var input = $("input"), // 命令输入框 7 | smallBox = $("smallBox"), // 小方块 8 | index = "3", // 数字标志方向 0上 1右 2下 3左 9 | refresh = $("refresh"), // 命令清空按钮 10 | timer = null, // 计时器 11 | button = $("button"), // 执行命令按钮 12 | disRow = $("disRow"); 13 | // 初始化设置小方块 14 | smallBox.style.transform = "rotateZ(0deg)"; 15 | smallBox.style.top = "208px"; 16 | smallBox.style.left = "208px"; 17 | // 点击旋转时 改变角度 18 | function setDirection(degree) { 19 | smallBox.style.transform = "rotateZ(" + degree + "deg)"; 20 | } 21 | button.onclick = function () { 22 | if (timer) { // 清除计数器 23 | clearInterval(timer); 24 | } 25 | var inputArry = input.value.trim().toUpperCase().split("\n"), 26 | i = 0, 27 | len = inputArry.length, 28 | divs = disRow.getElementsByTagName("div"); 29 | timer = setInterval(function(){ 30 | if (i < len) { 31 | var tempArry = inputArry[i].split(" "); 32 | console.log(tempArry[1]); 33 | if (tempArry[1]) { 34 | checkCommand(tempArry[0], i, tempArry[1], divs); 35 | i++; 36 | } 37 | else { 38 | checkCommand(tempArry[0], i, 1, divs); 39 | i++; 40 | } 41 | } 42 | },500); 43 | }; 44 | // 检查指令后面是否有执行次数 四个参数依次为命令 命令所在数组的索引 执行次数 左边标注行数的DIV 45 | function checkCommand(value, i, num, divs) { 46 | while (num) { 47 | switch(value) { 48 | case "TT": setDirection(90); 49 | index = "0"; // 为了在向前移动的时候判断当前朝向 50 | go(index); 51 | break; 52 | case "RT": setDirection(180); 53 | index = "1"; 54 | go(index); 55 | break; 56 | case "BT": setDirection(270); 57 | index = "2"; 58 | go(index); 59 | break; 60 | case "LT": setDirection(0); 61 | index = "3"; 62 | go(index); 63 | break; 64 | default: if (/[0123]/.test(value)) { 65 | go(value); 66 | } 67 | else { 68 | divs[i].style.background = "red"; 69 | } 70 | break; 71 | } 72 | num--; 73 | } 74 | } 75 | // 移动函数 76 | function go(index) { 77 | switch(index) { 78 | case "0": if (smallBox.style.top == "48px") 79 | break; 80 | smallBox.style.top = (parseInt(smallBox.style.top) - 40) + "px"; 81 | break; 82 | case "1": if (smallBox.style.left == "408px") 83 | break; 84 | smallBox.style.left = (parseInt(smallBox.style.left) + 40) + "px"; 85 | break; 86 | 87 | case "2": if (smallBox.style.top == "408px") 88 | break; 89 | smallBox.style.top = (parseInt(smallBox.style.top) + 40) + "px"; 90 | break; 91 | case "3": if (smallBox.style.left == "48px") 92 | break; 93 | smallBox.style.left = (parseInt(smallBox.style.left) - 40) + "px"; 94 | break; 95 | default: break; 96 | } 97 | } 98 | // 清空命令 99 | refresh.onclick = function() { 100 | input.value = null; 101 | disRow.innerHTML = ""; 102 | }; 103 | // 监听文本域键盘事件 104 | input.addEventListener("keyup", function() { 105 | rowHasChange(); 106 | }); 107 | function rowHasChange() { 108 | var rows = input.value.trim().toUpperCase().split("\n"), 109 | arr = [], 110 | top = input.scrollTop; 111 | for (var i = 0; i < rows.length; i++) { 112 | arr.push("

    " + (i + 1) + "
    "); 113 | } 114 | disRow.innerHTML = arr.join(""); 115 | disRow.scrollTop = top; 116 | } -------------------------------------------------------------------------------- /part3/task37/README.md: -------------------------------------------------------------------------------- 1 | 37任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 练习对于代码的抽象与封装 5 | 为第四阶段的RIA任务做准备 6 | 任务描述 7 | 8 | 实现一个浮出层的UI组件实现 9 | 10 | 浮出层的中心默认在屏幕正中 11 | 当浮出层显示时,屏幕滚动时,浮出层始终保持位置固定在屏幕正中,不随屏幕滚动而变化位置。或者禁止页面在有浮出层出现时滚动 12 | 当浮出层显示时,点击浮出层以外的部分,默认为关闭浮出层。可以实现一个半透明的遮罩来挡住浮出层外的部分 13 | 浮出层的样式、内容和逻辑尽量解耦 14 | 提供使用JavaScript控制浮出层展现和关闭的接口 15 | 浮出层的窗口大小可以是一个默认固定值,也可以是随内容变化而自适应变化,也可以是通过接口参数进行调整,自行根据自己能力进行选择 16 | 有能力的同学可以实现浮出层的拖拽移动浮出窗口位置以及拖拽边缘来放大缩小浮出窗口的功能 17 | 任务注意事项 18 | 19 | 请注意代码风格的整齐、优雅 20 | 代码中含有必要的注释 21 | 可以合理选择使用其它第三方类库,但不建议 -------------------------------------------------------------------------------- /part3/task37/task37.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UI组件之浮出层 6 | 57 | 58 | 59 | 60 |
    61 |
    62 |

    这是一个浮出层

    63 |

    这是一个浮出层

    64 | 65 | 66 |
    67 |
    68 | 69 | 70 | -------------------------------------------------------------------------------- /part3/task37/task37.js: -------------------------------------------------------------------------------- 1 | // 兼容的事件方法 2 | function addEvent(ele, event, hanlder) { 3 | if (ele.addEventListener) { 4 | ele.addEventListener(event, hanlder, false); 5 | } else if (ele.attachEvent) { 6 | ele.attachEvent('on' + event, hanlder); 7 | } else { 8 | ele['on' + event] = hanlder; 9 | } 10 | } 11 | function removeEvent(ele, event, hanlder) { 12 | if (ele.removeEventListener) { 13 | ele.removeEventListener(event, hanlder, false); 14 | } else if (ele.detachEvent) { 15 | ele.detachEvent('on' + event, hanlder); 16 | } else { 17 | ele['on' + event] = null; 18 | } 19 | } 20 | 21 | function $(id) { 22 | return document.getElementById(id); 23 | } 24 | 25 | // 创建一个对象 参数是遮罩层和浮出层的节点 26 | function MaskLayer(maskNode, floNode) { 27 | this.mask = maskNode; 28 | this.flo = floNode; 29 | } 30 | // 原型方法 31 | MaskLayer.prototype = { 32 | init: function() { 33 | this.mask.style.width = window.screen.width + "px"; 34 | this.mask.style.height = window.screen.height + "px"; 35 | this.drag(this.flo); 36 | this.show(); 37 | }, 38 | show: function() { 39 | this.mask.style.display = "block"; 40 | }, 41 | hide: function() { 42 | this.mask.style.display = "none"; 43 | }, 44 | drag: function(node) { 45 | node.style.cursor = "move" 46 | addEvent(node, "mousedown", function(event) { 47 | var disX = event.clientX - node.offsetLeft, 48 | disY = event.clientY - node.offsetTop; 49 | function move(event) { 50 | node.style.left = event.clientX - disX + "px"; 51 | node.style.top = event.clientY - disY + "px"; 52 | } 53 | addEvent(document, "mousemove", move); 54 | addEvent(document, "mouseup", function(){ 55 | removeEvent(document, "mousemove", move); 56 | }); 57 | }); 58 | } 59 | } 60 | 61 | function creatMaskLayer(maskNode, floNode) { 62 | return new MaskLayer(maskNode, floNode); 63 | } 64 | 65 | (function() { 66 | var maskLayer = creatMaskLayer($("mask"), $("floatLayer")); 67 | maskLayer.init(); 68 | 69 | addEvent($("floatLayer"), "click", function(event) { 70 | event.stopPropagation(); 71 | }); 72 | addEvent($("mask"), "click", function() { 73 | maskLayer.hide(); 74 | }); 75 | addEvent($("sure"), "click", function() { 76 | maskLayer.hide(); 77 | }); 78 | addEvent($("cancel"), "click", function() { 79 | maskLayer.hide(); 80 | }); 81 | addEvent($("login"), "click", function() { 82 | maskLayer.show(); 83 | }); 84 | })(); -------------------------------------------------------------------------------- /part3/task38/README.md: -------------------------------------------------------------------------------- 1 | 38任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 练习对于代码的抽象与封装 5 | 为第四阶段的RIA任务做准备 6 | 任务描述 7 | 8 | 实现一个支持列排序的表格组件 9 | 10 | 提供生成表格的接口,表格中的数据,表格样式尽量低耦合 11 | 可以配置对哪些列支持排序功能,并在表头进行排序按钮的显示,图中的样式为示意参考,可自行设定样式及交互方式 12 | 提供点击排序按钮后的响应接口,并提供默认的排序方法,当提供的接口没有具体实现时,按默认的排序方法进行排序操作,并更新表格中的数据显示。 13 | 任务注意事项 14 | 15 | 请注意代码风格的整齐、优雅 16 | 代码中含有必要的注释 17 | 可以合理选择使用其它第三方类库,但不建议 -------------------------------------------------------------------------------- /part3/task38/task38.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UI组件之排序表格 6 | 53 | 54 | 55 |
    56 | 57 | 58 | -------------------------------------------------------------------------------- /part3/task38/task38.js: -------------------------------------------------------------------------------- 1 | // 兼容的事件方法 2 | function addEvent(ele, event, hanlder) { 3 | if (ele.addEventListener) { 4 | ele.addEventListener(event, hanlder, false); 5 | } else if (ele.attachEvent) { 6 | ele.attachEvent('on' + event, hanlder); 7 | } else { 8 | ele['on' + event] = hanlder; 9 | } 10 | } 11 | 12 | function $(id) { 13 | return document.getElementById(id); 14 | } 15 | 16 | function ce(nodeName) { 17 | return document.createElement(nodeName); 18 | } 19 | 20 | // 随机产生分数 21 | function randomData(n) { 22 | var arry = [], 23 | sum = 0; 24 | for (var i = 0; i < n; i++) { 25 | var num = Math.floor(Math.random()*100)+1; 26 | sum += num; 27 | arry.push(num); 28 | } 29 | arry.push(sum); 30 | return arry; 31 | } 32 | 33 | var sourceData = { 34 | "小明": randomData(3), 35 | "小红": randomData(3), 36 | "小亮": randomData(3), 37 | "小华": randomData(3), 38 | "小花": randomData(3) 39 | }; 40 | var object = ["姓名", "语文", "数学", "英语", "总分"]; 41 | 42 | function SortTable(data, object, table) { 43 | this.table = table; 44 | this.data = data; 45 | this.object = object; 46 | this.name = null; 47 | } 48 | 49 | SortTable.prototype = { 50 | init: function() { 51 | this.name = []; 52 | for (var i in this.data) { 53 | this.name.push(i); 54 | } 55 | this.render(); 56 | }, 57 | render: function() { // 按照名字的排序方式来渲染表格 58 | var content = ""; 59 | content += ""; 60 | for (var i in this.object) { 61 | content += "" + this.object[i] + ""; 62 | } 63 | content += ""; 64 | for (var j in this.name) { 65 | content += "" + "" + this.name[j] + ""; 66 | for(var k in this.data[this.name[j]]) { 67 | content += "" + this.data[this.name[j]][k] + ""; 68 | } 69 | content += ""; 70 | } 71 | this.table.innerHTML = content; 72 | this.addArrow(); 73 | }, 74 | addArrow: function() { 75 | var self = this; 76 | 77 | // 给每个三角箭头赋上点击事件 点击的时候排序 78 | function addSortEvent(index) { 79 | var container = ce("div"), 80 | divUp = ce("div"), 81 | divDown = ce("div"); 82 | 83 | divUp.className = "up"; 84 | divDown.className = "down"; 85 | container.className = "container"; 86 | container.appendChild(divUp); 87 | container.appendChild(divDown); 88 | self.table.children[0].children[0].children[i].appendChild(container); // 取得th节点 再把三角箭头添加进去 89 | 90 | addEvent(divUp, "click", function(event) { 91 | self.name.sort(function(a, b){ 92 | return self.data[b][index - 1] - self.data[a][index - 1]; 93 | }); 94 | self.render(); 95 | }); 96 | addEvent(divDown, "click", function(event) { 97 | self.name.sort(function(a, b){ 98 | return self.data[a][index - 1] - self.data[b][index - 1]; 99 | }); 100 | self.render(); 101 | }); 102 | } 103 | 104 | // 在这先把索引值弄好 再把值传到addSortEvent函数 这样索引值就固定不变 105 | for(var i = 1, len = self.object.length; i < len; i++) { 106 | addSortEvent(i); 107 | } 108 | } 109 | } 110 | var sortTab = new SortTable(sourceData, object, $("tab")); 111 | sortTab.init(); -------------------------------------------------------------------------------- /part3/task39/README.md: -------------------------------------------------------------------------------- 1 | 39任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 练习对于代码的抽象与封装 5 | 为第四阶段的RIA任务做准备 6 | 任务描述 7 | 8 | 实现一个支持首行冻结的表格组件 9 | 10 | 当页面向下滚动,使得第一行已经在屏幕外时,则第一行则变成始终固定在屏幕最上方 11 | 当整个表格都滚动出屏幕时,固定的第一行也消失 12 | 任务注意事项 13 | 14 | 请注意代码风格的整齐、优雅 15 | 代码中含有必要的注释 16 | 可以合理选择使用其它第三方类库,但不建议 -------------------------------------------------------------------------------- /part3/task39/task39.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UI组件之冻结行列表格 6 | 61 | 62 | 63 |
    64 |

    .

    .

    65 |

    .

    .

    66 |

    .

    .

    67 |

    .

    .

    68 |

    .

    .

    69 |

    .

    .

    70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /part3/task39/task39.js: -------------------------------------------------------------------------------- 1 | // 兼容的事件方法 2 | function addEvent(ele, event, hanlder) { 3 | if (ele.addEventListener) { 4 | ele.addEventListener(event, hanlder, false); 5 | } else if (ele.attachEvent) { 6 | ele.attachEvent('on' + event, hanlder); 7 | } else { 8 | ele['on' + event] = hanlder; 9 | } 10 | } 11 | 12 | function $(id) { 13 | return document.getElementById(id); 14 | } 15 | 16 | function ce(nodeName) { 17 | return document.createElement(nodeName); 18 | } 19 | 20 | // 随机产生分数 21 | function randomData(n) { 22 | var arry = [], 23 | sum = 0; 24 | for (var i = 0; i < n; i++) { 25 | var num = Math.floor(Math.random()*100)+1; 26 | sum += num; 27 | arry.push(num); 28 | } 29 | arry.push(sum); 30 | return arry; 31 | } 32 | 33 | var sourceData = { 34 | "小明": randomData(3), 35 | "小红": randomData(3), 36 | "小亮": randomData(3), 37 | "小华": randomData(3), 38 | "小a": randomData(3), 39 | "小b": randomData(3), 40 | "小c": randomData(3), 41 | "小d": randomData(3), 42 | "小e": randomData(3), 43 | "小f": randomData(3), 44 | "小h": randomData(3), 45 | "小1": randomData(3), 46 | "小1": randomData(3), 47 | "小11": randomData(3), 48 | "小111": randomData(3), 49 | "小21": randomData(3), 50 | "小121": randomData(3), 51 | "小122": randomData(3), 52 | "小1231": randomData(3), 53 | "小31": randomData(3), 54 | "小1411": randomData(3) 55 | }; 56 | var object = ["姓名", "语文", "数学", "英语", "总分"]; 57 | 58 | function SortTable(data, object, table) { 59 | this.table = table; 60 | this.data = data; 61 | this.object = object; 62 | this.name = null; 63 | } 64 | 65 | SortTable.prototype = { 66 | init: function() { 67 | this.name = []; 68 | for (var i in this.data) { 69 | this.name.push(i); 70 | } 71 | this.render(); 72 | }, 73 | render: function() { // 按照名字的排序方式来渲染表格 74 | var content = ""; 75 | content += ""; 76 | for (var i in this.object) { 77 | content += "" + this.object[i] + ""; 78 | } 79 | content += ""; 80 | for (var j in this.name) { 81 | content += "" + "" + this.name[j] + ""; 82 | for(var k in this.data[this.name[j]]) { 83 | content += "" + this.data[this.name[j]][k] + ""; 84 | } 85 | content += ""; 86 | } 87 | this.table.innerHTML = content; 88 | this.addArrow(); 89 | }, 90 | addArrow: function() { 91 | var self = this; 92 | 93 | addEvent(document, "scroll", function(event) { 94 | console.log(self.table.offsetHeight); 95 | if (document.body.scrollTop >= self.table.offsetHeight) { 96 | self.table.children[0].children[0].style.position = "relative"; 97 | } 98 | else { 99 | self.table.children[0].children[0].style.position = "fixed"; 100 | } 101 | }); 102 | 103 | // 给每个三角箭头赋上点击事件 点击的时候排序 104 | function addSortEvent(index) { 105 | var container = ce("div"), 106 | divUp = ce("div"), 107 | divDown = ce("div"); 108 | 109 | divUp.className = "up"; 110 | divDown.className = "down"; 111 | container.className = "container"; 112 | container.appendChild(divUp); 113 | container.appendChild(divDown); 114 | self.table.children[0].children[0].children[i].appendChild(container); // 取得th节点 再把三角箭头添加进去 115 | 116 | addEvent(divUp, "click", function(event) { 117 | self.name.sort(function(a, b){ 118 | return self.data[b][index - 1] - self.data[a][index - 1]; 119 | }); 120 | self.render(); 121 | }); 122 | addEvent(divDown, "click", function(event) { 123 | self.name.sort(function(a, b){ 124 | return self.data[a][index - 1] - self.data[b][index - 1]; 125 | }); 126 | self.render(); 127 | }); 128 | } 129 | 130 | // 在这先把索引值弄好 再把值传到addSortEvent函数 这样索引值就固定不变 131 | for(var i = 1, len = self.object.length; i < len; i++) { 132 | addSortEvent(i); 133 | } 134 | }, 135 | 136 | } 137 | var sortTab = new SortTable(sourceData, object, $("tab")); 138 | sortTab.init(); -------------------------------------------------------------------------------- /part3/task40/README.md: -------------------------------------------------------------------------------- 1 | 40任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 练习对于代码的抽象与封装 5 | 为第四阶段的RIA任务做准备 6 | 任务描述 7 | 8 | 实现一个日历选择组件 9 | 10 | 组件默认一直呈显示状态 11 | 通过某种方式选择年、月,选择了年月后,日期列表做相应切换 12 | 通过单击某个具体的日期进行日期选择 13 | 组件初始化时,可配置可选日期的上下限。可选日期和不可选日期需要有样式上的区别 14 | 提供设定日期的接口,指定具体日期,日历面板相应日期选中 15 | 提供获取日期的接口,获取日历面板中当前选中的日期,返回一个日期对象(或其他形式,自定) 16 | 任务注意事项 17 | 18 | 示例图仅为参考,样式及交互方式不需要完全实现一致 19 | 可以使用JQuery等类库,不可直接使用现成的日历组件 20 | 请注意代码风格的整齐、优雅 21 | 代码中含有必要的注释 -------------------------------------------------------------------------------- /part3/task40/task40.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UI组件之日历组件(一) 6 | 46 | 47 | 48 | 49 | 50 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
    51 | < 52 | < 53 | 54 | > 55 | > 56 |
    SunMonTueWedThuFriSat
    72 | 73 | 74 | -------------------------------------------------------------------------------- /part3/task40/task40.js: -------------------------------------------------------------------------------- 1 | function $(id) { 2 | return document.getElementById(id); 3 | } 4 | 5 | // 构造函数 6 | function Calender(table) { 7 | this.table = table; 8 | } 9 | 10 | // 原型方法 11 | Calender.prototype = { 12 | init: function() { // 初始化并获取当前年月 13 | var now = new Date(); 14 | var y = now.getFullYear(); 15 | var m = now.getMonth(); 16 | this.repeat(y, m); 17 | }, 18 | repeat: function(y, m) { // 获取当月1号是星期几 19 | var start = new Date(y, m, 1); 20 | var indexDay = start.getDay(); 21 | var currentDate = $("currentDate"); 22 | currentDate.innerHTML = y + "年" + (m+1) + "月"; // 把当前日期显示在caption 23 | this.creatTab(); // 绘制表格 24 | this.renderTab(y, m, indexDay); // 渲染表格 25 | this.returnDate(y, m); // 点击日期的时候把日期显示在INPUT当中 26 | this.chooseDate(y, m); // 为SPAN添加点击事件 可以显示上年 上月 下年 下月的日期 27 | }, 28 | creatTab: function() { 29 | var tbody = this.table.tBodies[0]; // 获取tbody的内容 30 | tbody.innerHTML = ""; // 初始化 31 | for (var i = 0; i < 6; i++) { // 创建6行TR 每行TR 7个TD 32 | var tr = document.createElement("tr"); 33 | tbody.appendChild(tr); 34 | for (var j = 0; j < 7; j++) { 35 | var td = document.createElement("td"); 36 | td.innerHTML = " "; 37 | td.className = "hover"; 38 | tr.appendChild(td); 39 | } 40 | } 41 | }, 42 | renderTab: function(y, m, indexDay) { // 渲染表格 为表格添加内容 43 | var trs = this.table.tBodies[0].rows; 44 | var count = 1; 45 | var allDay; 46 | var tmp = new Date(); 47 | var tmpY = tmp.getFullYear(); 48 | var tmpM = tmp.getMonth(); 49 | var tmpD = tmp.getDate(); 50 | var tempIndex = indexDay; 51 | while (tempIndex > 0) { // 日期1号前面没有日期的格子不设置样式 所以将类名设置为空 52 | tempIndex--; 53 | trs[0].cells[tempIndex].className = ""; 54 | } 55 | for (; indexDay < 7; indexDay++) { // 第一行的日期 56 | trs[0].cells[indexDay].innerHTML = count; 57 | count++; 58 | } 59 | for (var i = 1; i < 6; i++) { // 后续行的日期 60 | for (var j = 0; j < 7; j++) { 61 | trs[i].cells[j].innerHTML = count; 62 | count++; 63 | } 64 | } 65 | 66 | switch(m) { // 判断月份并设置当月的天数 67 | case 0: 68 | case 2: 69 | case 4: 70 | case 6: 71 | case 7: 72 | case 9: 73 | case 11: 74 | allDay = 31; 75 | break; 76 | case 3: 77 | case 5: 78 | case 8: 79 | case 10: 80 | allDay = 30; 81 | break; 82 | case 1: 83 | if ((y%400 == 0) || (y%4 == 0 && y%100 != 0)) 84 | allDay = 29; // 闰年 85 | else 86 | allDay = 28; // 平年 87 | break; 88 | default: break; 89 | } 90 | for (var k = 0; k < 6; k++) { // 将超过当月天数的TD 内容设为空 91 | for (var n = 0; n < 7; n++) { 92 | if (trs[k].cells[n].innerHTML > allDay) { 93 | trs[k].cells[n].innerHTML = " "; 94 | trs[k].cells[n].className = ""; 95 | } 96 | else if (trs[k].cells[n].innerHTML == tmpD && y == tmpY && m == tmpM) { 97 | trs[k].cells[n].style.color = "blue"; // 当天日期高亮显示 98 | } 99 | } 100 | } 101 | }, 102 | returnDate: function(y, m) { // 点击日期时将日期的内容显示在INPUT 103 | var trs = this.table.tBodies[0].rows; 104 | var input = $("date"); 105 | for (var i = 0; i < 6; i++) { 106 | for (var j = 0; j < 7; j++) { 107 | trs[i].cells[j].onclick = function() { 108 | var d = this.innerHTML; 109 | if (d != " ") { 110 | input.value = y + "-" + (m+1) + "-" + d; 111 | } 112 | } 113 | } 114 | } 115 | }, 116 | chooseDate: function(y, m) { // 为SPAN添加点击事件 117 | var self = this; 118 | var spans = document.getElementsByTagName("span"); 119 | for (var i = 0, len = spans.length; i < len; i++) { 120 | spans[i].index = i; // 如果不将I这样赋值给spans[i].index 后面的点击事件绑定的全是I的最大值 121 | spans[i].onclick = function() { 122 | switch(this.index) { 123 | case 0: 124 | m--; 125 | break; 126 | case 1: 127 | y--; 128 | break; 129 | case 3: 130 | y++; 131 | break; 132 | case 4: 133 | m++; 134 | break; 135 | default: break; 136 | } 137 | if (m < 0) { // 如果M为1月 在点击上一月时 自动减一年 将月份设为12月 138 | y--; 139 | m = 11; 140 | } 141 | if (m > 11) { // 如果M为12月 在点击下一月时 自动加一年 将月份设为1月 142 | y++; 143 | m = 0; 144 | } 145 | if (y < 1970 || y > 2030) { 146 | alert("当前日历只能显示1970-2030年"); // 设定日期上限下限 超过将弹窗提示 147 | y = 2017; 148 | return; 149 | } 150 | self.repeat(y, m); 151 | } 152 | } 153 | } 154 | } 155 | 156 | function creatCalender(table) { // 创建一个函数来创建对象 157 | return new Calender(table); 158 | } 159 | (function() { // 在打开页面的同时创建对象并执行init(); 160 | var calender = creatCalender($("tab")); 161 | calender.init(); 162 | })(); -------------------------------------------------------------------------------- /part3/task41/README.md: -------------------------------------------------------------------------------- 1 | 41任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 练习对于代码的抽象与封装 5 | 为第四阶段的RIA任务做准备 6 | 任务描述 7 | 8 | 基于任务40,进行升级 9 | 10 | 日期选择面板默认隐藏,会显示一个日期显示框和一个按钮,点击这两个部分,会浮出日历面板。再点击则隐藏。 11 | 点击选择具体日期后,面板隐藏,日期显示框中显示选取的日期 12 | 增加一个接口,用于当用户选择日期后的回调处理 13 | 任务注意事项 14 | 15 | 示例图仅为参考,样式及交互方式不需要完全实现一致 16 | 可以使用JQuery等类库,不可直接使用现成的日历组件 17 | 请注意代码风格的整齐、优雅 18 | 代码中含有必要的注释 -------------------------------------------------------------------------------- /part3/task41/task41.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UI组件之日历组件(二) 6 | 56 | 57 | 58 | 59 | 60 | 61 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 |
    62 | < 63 | < 64 | 65 | > 66 | > 67 |
    SunMonTueWedThuFriSat
    83 | 84 | 85 | -------------------------------------------------------------------------------- /part3/task41/task41.js: -------------------------------------------------------------------------------- 1 | function $(id) { 2 | return document.getElementById(id); 3 | } 4 | 5 | // 构造函数 6 | function Calender(table) { 7 | this.table = table; 8 | } 9 | 10 | // 原型方法 11 | Calender.prototype = { 12 | init: function() { // 初始化并获取当前年月 13 | var self = this; 14 | var btn = $("btn"); 15 | btn.onclick = function () { // 为BUTTON添加一个事件 点击将显示或隐藏日历 16 | if (self.table.style.visibility == "visible") { 17 | self.table.style.visibility = "hidden"; 18 | btn.innerHTML = "显示日历"; 19 | } 20 | else { 21 | self.table.style.visibility = "visible"; 22 | btn.innerHTML = "隐藏日历"; 23 | } 24 | } 25 | 26 | var now = new Date(); 27 | var y = now.getFullYear(); 28 | var m = now.getMonth(); 29 | this.repeat(y, m); 30 | }, 31 | repeat: function(y, m) { // 获取当月1号是星期几 32 | var start = new Date(y, m, 1); 33 | var indexDay = start.getDay(); 34 | var currentDate = $("currentDate"); 35 | currentDate.innerHTML = y + "年" + (m+1) + "月"; // 把当前日期显示在caption 36 | this.creatTab(); // 绘制表格 37 | this.renderTab(y, m, indexDay); // 渲染表格 38 | this.returnDate(y, m, null); // 点击日期的时候把日期显示在INPUT当中 39 | this.chooseDate(y, m); // 为SPAN添加点击事件 可以显示上年 上月 下年 下月的日期 40 | }, 41 | creatTab: function() { 42 | var tbody = this.table.tBodies[0]; // 获取tbody的内容 43 | tbody.innerHTML = ""; // 初始化 44 | for (var i = 0; i < 6; i++) { // 创建6行TR 每行TR 7个TD 45 | var tr = document.createElement("tr"); 46 | tbody.appendChild(tr); 47 | for (var j = 0; j < 7; j++) { 48 | var td = document.createElement("td"); 49 | td.innerHTML = " "; 50 | td.className = "hover"; 51 | tr.appendChild(td); 52 | } 53 | } 54 | }, 55 | renderTab: function(y, m, indexDay) { // 渲染表格 为表格添加内容 56 | var trs = this.table.tBodies[0].rows; 57 | var count = 1; 58 | var allDay; 59 | var tmp = new Date(); 60 | var tmpY = tmp.getFullYear(); 61 | var tmpM = tmp.getMonth(); 62 | var tmpD = tmp.getDate(); 63 | var tempIndex = indexDay; 64 | while (tempIndex > 0) { // 日期1号前面没有日期的格子不设置样式 所以将类名设置为空 65 | tempIndex--; 66 | trs[0].cells[tempIndex].className = ""; 67 | } 68 | for (; indexDay < 7; indexDay++) { // 第一行的日期 69 | trs[0].cells[indexDay].innerHTML = count; 70 | count++; 71 | } 72 | for (var i = 1; i < 6; i++) { // 后续行的日期 73 | for (var j = 0; j < 7; j++) { 74 | trs[i].cells[j].innerHTML = count; 75 | count++; 76 | } 77 | } 78 | 79 | switch(m) { // 判断月份并设置当月的天数 80 | case 0: 81 | case 2: 82 | case 4: 83 | case 6: 84 | case 7: 85 | case 9: 86 | case 11: 87 | allDay = 31; 88 | break; 89 | case 3: 90 | case 5: 91 | case 8: 92 | case 10: 93 | allDay = 30; 94 | break; 95 | case 1: 96 | if ((y%400 == 0) || (y%4 == 0 && y%100 != 0)) 97 | allDay = 29; // 闰年 98 | else 99 | allDay = 28; // 平年 100 | break; 101 | default: break; 102 | } 103 | for (var k = 0; k < 6; k++) { // 将超过当月天数的TD 内容设为空 104 | for (var n = 0; n < 7; n++) { 105 | if (trs[k].cells[n].innerHTML > allDay) { 106 | trs[k].cells[n].innerHTML = " "; 107 | trs[k].cells[n].className = ""; 108 | } 109 | else if (trs[k].cells[n].innerHTML == tmpD && y == tmpY && m == tmpM) { 110 | trs[k].cells[n].style.color = "blue"; // 当天日期高亮显示 111 | this.returnDate(tmpY, tmpM, tmpD); 112 | } 113 | } 114 | } 115 | }, 116 | returnDate: function(y, m, d) { // 点击日期时将日期的内容显示在INPUT 117 | var self = this; 118 | var trs = this.table.tBodies[0].rows; 119 | var input = $("date"); 120 | if (d) { 121 | input.value = y + "-" + (m+1) + "-" + d; 122 | return; 123 | } 124 | for (var i = 0; i < 6; i++) { 125 | for (var j = 0; j < 7; j++) { 126 | trs[i].cells[j].onclick = function() { 127 | var d = this.innerHTML; 128 | if (d != " ") { 129 | input.value = y + "-" + (m+1) + "-" + d; 130 | self.table.style.visibility = "hidden"; // 选中一个日期后会隐藏日历 131 | $("btn").innerHTML = "显示日历"; 132 | } 133 | } 134 | } 135 | } 136 | }, 137 | chooseDate: function(y, m) { // 为SPAN添加点击事件 138 | var self = this; 139 | var spans = document.getElementsByTagName("span"); 140 | for (var i = 0, len = spans.length; i < len; i++) { 141 | spans[i].index = i; // 如果不将I这样赋值给spans[i].index 后面的点击事件绑定的全是I的最大值 142 | spans[i].onclick = function() { 143 | switch(this.index) { 144 | case 0: 145 | m--; 146 | break; 147 | case 1: 148 | y--; 149 | break; 150 | case 3: 151 | y++; 152 | break; 153 | case 4: 154 | m++; 155 | break; 156 | default: break; 157 | } 158 | if (m < 0) { // 如果M为1月 在点击上一月时 自动减一年 将月份设为12月 159 | y--; 160 | m = 11; 161 | } 162 | if (m > 11) { // 如果M为12月 在点击下一月时 自动加一年 将月份设为1月 163 | y++; 164 | m = 0; 165 | } 166 | if (y < 1970 || y > 2030) { 167 | alert("当前日历只能显示1970-2030年"); // 设定日期上限下限 超过将弹窗提示 168 | y = 2017; 169 | return; 170 | } 171 | self.repeat(y, m); 172 | } 173 | } 174 | } 175 | } 176 | 177 | function creatCalender(table) { // 创建一个函数来创建对象 178 | return new Calender(table); 179 | } 180 | (function() { // 在打开页面的同时创建对象并执行init(); 181 | var calender = creatCalender($("tab")); 182 | calender.init(); 183 | })(); -------------------------------------------------------------------------------- /part3/task42/README.md: -------------------------------------------------------------------------------- 1 | 42任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 练习对于代码的抽象与封装 5 | 为第四阶段的RIA任务做准备 6 | 任务描述 7 | 8 | 基于任务41,进行升级 9 | 10 | 增加一个参数及相应接口方法,来决定这个日历组件是选择具体某天日期,还是选择一个时间段 11 | 当设置为选择时间段时,需要在日历面板上点击两个日期来完成一次选择,两个日期中,较早的为起始时间,较晚的为结束时间,选择的时间段用特殊样式标示 12 | 增加参数及响应接口方法,允许设置时间段选择的最小或最大跨度,并提供当不满足跨度设置时的默认处理及回调函数接口 13 | 在弹出的日期段选择面板中增加确认和取消按钮 14 | 任务注意事项 15 | 16 | 示例图仅为参考,样式及交互方式不需要完全实现一致 17 | 可以使用JQuery等类库,不可直接使用现成的日历组件 18 | 请注意代码风格的整齐、优雅 19 | 代码中含有必要的注释 -------------------------------------------------------------------------------- /part3/task42/task42.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UI组件之日历组件(三) 6 | 76 | 77 | 78 |

    可以点击两个日期来选择一个时间段 时间段必须大于或等于3天 小于或等于100天

    79 | 80 | 81 | 82 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 108 | 111 | 112 | 113 | 114 | 115 | 116 |
    83 | < 84 | < 85 | 86 | > 87 | > 88 |
    SunMonTueWedThuFriSat
    106 | 107 | 109 | 110 |    
    117 | 118 | 119 | -------------------------------------------------------------------------------- /part3/task43/README.md: -------------------------------------------------------------------------------- 1 | 43任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 为第四阶段的相册任务做准备 5 | 结合CSS,JavaScript掌握更加复杂的布局方式 6 | 任务描述 7 | 8 | 使用JavaScript、CSS,实现在不同图片数量时的不同布局 9 | 实现封装为一个JavaScript的库 10 | 11 | 任务注意事项 12 | 13 | 请注意代码风格的整齐、优雅 14 | 代码中含有必要的注释 15 | 可以合理选择使用其它第三方类库,但不建议 -------------------------------------------------------------------------------- /part3/task43/images/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part3/task43/images/01.jpg -------------------------------------------------------------------------------- /part3/task43/images/02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part3/task43/images/02.jpg -------------------------------------------------------------------------------- /part3/task43/images/03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part3/task43/images/03.jpg -------------------------------------------------------------------------------- /part3/task43/images/04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part3/task43/images/04.jpg -------------------------------------------------------------------------------- /part3/task43/images/05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part3/task43/images/05.jpg -------------------------------------------------------------------------------- /part3/task43/images/06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/part3/task43/images/06.jpg -------------------------------------------------------------------------------- /part3/task43/task43.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | .layout { 6 | width: 800px; 7 | height: 450px; 8 | position: relative; 9 | object-fit: cover; 10 | margin: auto; 11 | border: 3px solid red; 12 | } 13 | .layout1 img{ 14 | width: 100%; 15 | height: 100%; 16 | } 17 | 18 | .layout2 img { 19 | width: 100%; 20 | height: 100%; 21 | position: absolute; 22 | } 23 | .layout2 img:nth-child(2) { 24 | -webkit-clip-path: polygon(67% 0, 33% 100%, 100% 100%, 100% 0); 25 | } 26 | .layout3 img:nth-child(n+1) { 27 | width: 33%; 28 | height: 50%; 29 | float: right; 30 | } 31 | .layout3 img:nth-child(1) { 32 | width: 67%; 33 | height: 100%; 34 | float: left; 35 | } 36 | .layout4 img { 37 | width: 50%; 38 | height: 50%; 39 | } 40 | .layout4 img:nth-child(odd) { 41 | float: left; 42 | } 43 | .layout4 img:nth-child(even) { 44 | float: right; 45 | } 46 | .layout5 img:nth-child(1) { 47 | float: left; 48 | width: 66.66%; 49 | height: 66.66%; 50 | } 51 | .layout5 img:nth-child(2) { 52 | float: right; 53 | width: 33.33%; 54 | height: 33.33%; 55 | } 56 | .layout5 img:nth-child(3) { 57 | float: right; 58 | width: 33.33%; 59 | height: 66.66%; 60 | } 61 | .layout5 img:nth-child(4) { 62 | float: left; 63 | width: 33.33%; 64 | height: 33.33%; 65 | } 66 | .layout5 img:nth-child(5) { 67 | float: left; 68 | width: 33.33%; 69 | height: 33.33%; 70 | } 71 | .layout6 img:nth-child(n) { 72 | float: left; 73 | width: 33.33%; 74 | height: 33.33%; 75 | } 76 | .layout6 img:nth-child(1) { 77 | float: left; 78 | width: 66.66%; 79 | height: 66.66%; 80 | } -------------------------------------------------------------------------------- /part3/task43/task43.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 图库 6 | 7 | 8 | 9 | 10 | 11 |
    12 | 21 | 22 | -------------------------------------------------------------------------------- /part3/task43/task43.js: -------------------------------------------------------------------------------- 1 | // 这也算是一个插件 只要参数正确 就能生成对应的图库 图片参数必须为一个数组 数组里有1-6张图片的相对路径 HTML里有调用方法 2 | ;(function($, undefined){ 3 | $.fn.creatGallery = function(imgArry) { // 添加一个jQuery原型方法用来创建图库 4 | var myGallery = new Gallery(imgArry, this); 5 | return myGallery; // 返回一个图库的对象 6 | } 7 | 8 | function Gallery(imgArry, container) { // 图库构造函数 值是图片数组和容器DIV 9 | this.imgArry = imgArry; 10 | this.container = container; 11 | } 12 | Gallery.prototype = { 13 | init: function() { 14 | var i, 15 | len = this.imgArry.length; 16 | this.container.attr("class","layout layout" + len); // 根据图片的数量给容器添加类名 然后CSS里有对应1-6张图片不同的样式 17 | for (i = 0; i < len; i++) { 18 | var $img = $(""); 19 | $img.attr("src", this.imgArry[i]); 20 | this.container.append($img); 21 | } 22 | } 23 | } 24 | })(jQuery); -------------------------------------------------------------------------------- /part3/task44/README.md: -------------------------------------------------------------------------------- 1 | 44任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 为第四阶段的相册任务做准备 5 | 结合CSS,JavaScript掌握瀑布布局方式 6 | 任务描述 7 | 8 | 使用JavaScript、CSS,实现如图的瀑布布局 9 | 10 | 实现封装为一个JavaScript的库 11 | 在瀑布式布局中,每一栏的宽度是相同的,下图中的黑色数字表示图片被添加的顺序 12 | 每次添加新的图片时,都将其放在高度最小的一栏,以保证每一栏的高度尽可能相近。 13 | 点击一张图片后,全屏显示该图(有能力的同学可以适当增加动画效果)。黑色遮罩的不透明度是 80%,点击黑色部分退出全屏浏览。 14 | 15 | 有能力的同学可以实现,当页面滚动到瀑布图最下方后,通过Ajax动态加载下一批图片 16 | 任务注意事项 17 | 18 | 请注意代码风格的整齐、优雅 19 | 代码中含有必要的注释 20 | 可以合理选择使用其它第三方类库,但不建议。不能直接使用现成的瀑布布局的库 -------------------------------------------------------------------------------- /part3/task44/task44.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | font-family: 微软雅黑; 5 | } 6 | #container { 7 | margin: auto; 8 | font-size: 0; 9 | position: relative; 10 | transition: all 1s; 11 | } 12 | .box { 13 | margin: auto; 14 | display: inline-block; 15 | position: absolute; 16 | } 17 | img { 18 | width: 100%; 19 | height: 100%; 20 | } 21 | input { 22 | width: 200px; 23 | height: 20px; 24 | border-radius: 3px; 25 | color: #d3d3d3; 26 | } 27 | button { 28 | width: 50px; 29 | height: 25px; 30 | color: #fff; 31 | background: #f00; 32 | border: 1px solid #f00; 33 | border-radius: 3px; 34 | } 35 | .floatLay { 36 | background: rgba(0,0,0,0.8); 37 | position: fixed; 38 | top: 50%; 39 | left: 50%; 40 | transform: translate(-50%, -50%); 41 | display: none; 42 | } 43 | .floatLay div { 44 | position: fixed; 45 | top: 50%; 46 | left: 50%; 47 | transform: translate(-50%, -50%); 48 | } -------------------------------------------------------------------------------- /part3/task44/task44.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 多功能相册之瀑布流 6 | 7 | 8 | 9 | 10 | 11 | 12 |
    13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /part3/task45/README.md: -------------------------------------------------------------------------------- 1 | 45任务目的 2 | 3 | 练习综合运用HTML、CSS、JavaScript实现局部功能 4 | 为第四阶段的相册任务做准备 5 | 结合CSS,JavaScript掌握木桶布局方式 6 | 任务描述 7 | 8 | 使用JavaScript、CSS,实现如图的木桶布局。我们在一些摄影网站(如 500px、flickr 等)有时会看到如下图的布局,每张图片的占位长宽比和图片本身的长宽比是一致的;每一行的高度是不固定的,但是要尽可能接近;每行的图片数也是不同的,在一定范围内(这题中我们规定每行 3-6 张,最后一行除外)通过控制图片是否加入当前行,保证行高尽可能接近。这里我们方便起见给这种布局起名叫“木桶布局”,因为它和木桶一样,不在乎你放多少块木头,以及不同圈的木头高度是否一致,只要每圈都把桶围成同样宽度。 9 | 10 | 实现封装为一个JavaScript的库 11 | 任务注意事项 12 | 13 | 请注意代码风格的整齐、优雅 14 | 代码中含有必要的注释 15 | 可以合理选择使用其它第三方类库,但不建议。不能直接使用木桶布局的库 -------------------------------------------------------------------------------- /part3/task45/task45.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | font-family: 微软雅黑; 5 | } 6 | #container { 7 | margin: 0 auto; 8 | } 9 | .box { 10 | display: inline-block; 11 | box-sizing:border-box; 12 | } 13 | img { 14 | height: 100%; 15 | } 16 | .floatLay { 17 | background: rgba(0,0,0,0.8); 18 | position: fixed; 19 | top: 50%; 20 | left: 50%; 21 | transform: translate(-50%, -50%); 22 | display: none; 23 | } 24 | .floatLay div { 25 | position: fixed; 26 | top: 50%; 27 | left: 50%; 28 | transform: translate(-50%, -50%); 29 | } -------------------------------------------------------------------------------- /part3/task45/task45.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 多功能相册之木桶布局 6 | 7 | 8 | 9 |
    10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /part3/task45/task45.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | $.fn.creatCask = function(imgNum, width) { 3 | var cask = new Cask(this, imgNum, width); 4 | return cask; 5 | } 6 | 7 | function Cask(container, imgNum, width) { // 参数依次为 容器对象 图片数量 容器总宽度 8 | this.$container = container; 9 | this.minHeight = 200; 10 | this.imgNum = imgNum; 11 | this.containerWidth = width; 12 | this.divArry = []; // 保存着包含图片DIV的数组 13 | } 14 | 15 | Cask.prototype = { 16 | init: function() { 17 | var $container = this.$container; 18 | $container.width(this.containerWidth); // 设置容器总宽度 19 | var imgs = []; 20 | for (var i = 0, len = this.imgNum; i < len; i++) { // 获取每张图片的地址 21 | imgs.push(this.getImg()); 22 | } 23 | this.render(imgs); // 加载完图片时返回各列总高度的最小值 24 | var that = this; // 开始增加滚动事件 25 | var $body = $("body"); 26 | var screenW = window.screen.width; 27 | var screenH = window.screen.height; 28 | window.onscroll = function(){ // 当滚动到一定的高度开始再次加载图片 29 | if ($body.scrollTop() + screenH > $container.height()) { 30 | that.init(); 31 | } 32 | }; 33 | 34 | $container.off("click"); // 初始化先去掉容器绑定事件 否则每次滚动到底部的时候 再次加载图片时 绑定事件会叠加 导致浮出层叠加 35 | 36 | $container.click(function(event){ // 为容器添加点击事件 当点击图片时 放大图片 用图片原尺寸显示 37 | var $that = $(this); 38 | var url = event.target.src; // 用正则从图片URL中取得宽高 再赋值给包裹着图片的DIV 39 | var re = /\d{3}/g; 40 | var arry = url.match(re); 41 | var $floatLay = $("
    "); 42 | $floatLay.width(screenW).height(screenH).addClass("floatLay"); 43 | var $imgDiv = $("
    "); 44 | $imgDiv.width(arry[0]).height(arry[1]); 45 | var $img = $(""); 46 | $img.attr("src", url); 47 | $imgDiv.append($img); 48 | $floatLay.append($imgDiv); 49 | $body.append($floatLay); 50 | $floatLay.fadeIn(); // 添加动画事件 淡入 51 | $floatLay.click(function(){ // 当点击遮罩层时 先淡出 再移除遮罩层 52 | var $that = $(this); 53 | $that.fadeOut(500,function(){ 54 | $that.remove(); 55 | }); 56 | }); 57 | }); 58 | }, 59 | getImg: function() { 60 | var width = this.getRandom(); 61 | var height = this.getRandom(); 62 | var img = "https://placehold.it/" + width + "x" + height + "/" + this.getColor(); // width height为宽高 getColor方法获取图片背景颜色 63 | return img; 64 | }, 65 | getColor: function() { 66 | var color = Math.floor(Math.random()*0xffffff+1).toString(16); // 1个16进制数颜色 67 | while (color.length < 6) { 68 | color += "0"; 69 | } 70 | return color; 71 | }, 72 | getRandom: function() { // 随机获取高度 73 | return Math.floor(Math.random()*450+150); 74 | }, 75 | rowcal: function(min, max, divArry) { //min-max 每行能容纳的最小和最大DIV数 76 | var conWidth = this.containerWidth; 77 | var width = 0; 78 | var count = 0; 79 | var minheight = this.minHeight; 80 | var rows = []; 81 | for (var i = 0, len = divArry.length; i < len; i++) { 82 | divArry[i].height(minheight); 83 | divArry[i].width(divArry[i].height()/divArry[i].attr("ratio")); 84 | width += divArry[i].width(); 85 | count++; 86 | if ((width > conWidth && count > min) || count > max) { 87 | var totalwidth = width - divArry[i].width(); 88 | var rowheight = conWidth*(minheight/totalwidth); 89 | rows.push({num: count - 1, height: rowheight}); // 每行DIV数量 每行的高度 90 | width = divArry[i].width(); 91 | count = 1; 92 | } 93 | } 94 | return [rows, count]; // 返回行数量的数组 和剩下不够一行的DIV数量 95 | }, 96 | render: function(imgs) { // 开始加载图片 97 | var $container = this.$container; 98 | var divArry = this.divArry; 99 | var index; 100 | for (var i = 0, len = this.imgNum; i < len; i++) { 101 | var $box = $("
    "); 102 | var $img = $(""); 103 | $img.attr("src", imgs[i]); 104 | $box.append($img); 105 | $box.addClass("box"); 106 | var re = /\d{3}/g; 107 | var arry = $img.attr("src").match(re); // 通过正则提取宽高 108 | $box.attr("ratio", (parseInt(arry[1]))/(parseInt(arry[0]))); // ratio 高宽比率 109 | divArry.push($box); // 不直接添加到容器DIV里而添加到数组是为了优化性能 110 | } 111 | var tempArry = this.rowcal(3, 6, divArry); 112 | var rows = tempArry[0]; 113 | var count = tempArry[1]; 114 | for (i = 0, len = rows.length; i < len; i++) { 115 | var $row = $("
    "); 116 | $row.height(rows[i].height); 117 | for (var j = 0, jlen = rows[i].num; j < jlen; j++) { 118 | $row.append(divArry.shift().height("100%").width("")); // 设置高度100% 宽度会自动调整 119 | } 120 | $container.append($row); 121 | } 122 | for (i = 0, len = divArry.length; i < len; i++) { // 最后剩下不够一行的 直接添加到容器后面 然后下一次加载图片时用appen动作添加到行容器时 会从原来的位置移除再添加到新的行容器里 所以不必担心重复添加 123 | $container.append(divArry[i]); 124 | } 125 | } 126 | } 127 | $("#container").creatCask(20, 1000).init(); 128 | }); -------------------------------------------------------------------------------- /picture/task1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/picture/task1.jpg -------------------------------------------------------------------------------- /picture/task2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/picture/task2.jpg -------------------------------------------------------------------------------- /picture/风景1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/picture/风景1.jpg -------------------------------------------------------------------------------- /picture/风景2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/picture/风景2.jpg -------------------------------------------------------------------------------- /picture/风景3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/2016ife-task/707f7393d3ddf81ebc0c63c6677a44039223e7ed/picture/风景3.jpg --------------------------------------------------------------------------------