一.分析需求
假如你的女朋友发给你一堆衣服的图片,然后问你哪件好看,只能选一件最好看的,你会如何做?为什么不交给程序来进行抉择呢?本文的主题就是开发一个选择程序来解决你的女朋友的选择问题。
页面最终效果如图所示:
我们来总结一下要实现的功能:
可以上传多张图片。(这里不需要写后台也是可以的,只不过如果要存储数据可以选择会话存储,当然本例没有被存储)。
点击开始的时候会开始在所有的图片之间来回选择。选择加了一个样式(阴影样式)。
点击停止的时候,出现选择的结果。
点击重置也就重置选择效果。
因为默认数据是以上的5张图。所以一旦点击了上传将会被替换掉,所以点击还原就是还原成默认的数据。
二.实现html与css
ok,需求分析完成。接下来开始设计整个界面,没错为了让界面看起来比较简洁明了。布局很简单。就是排列一堆图片以及图片名,然后结果显示在下方,最后就是排列一堆按钮。如此一来基本用浮动布局也可以办到。所以html和css都没什么好说的:
html:
<div id="list-image"></div> <div id="result"> 点击开始选择吧! </div> <div id="list-button"> <button class="upload-btn btn" id="upload-btn" type="button"> 上传 <input type="file" id="upload-input" class="upload-input" multiple> </button> <button class="start-btn btn" id="start-btn" type="button">开始</button> <button class="stop-btn btn" id="stop-btn" type="button">停止</button> <button class="reset-btn btn" id="reset-btn" type="button">重置</button> <button class="origin-btn btn" id="origin-btn" type="button">还原</button></div>
css:
* { margin: 0; padding: 0; } #list-image { position: relative; margin-top: 25px; } #list-image::after { content: ""; clear: both; height: 0; display: block; visibility: hidden; } #list-image .list-image-item { width: 120px; height: 150px; float: left; margin-left: 15px; } .list-image-item-active { box-shadow: 0 0 15px #2396ef; } #list-image .list-image-item img { width: 120px; height: 120px; display: block; } #list-image .list-image-item p { text-align: center; font-size: 18px; } #list-button { margin: 15px; } .btn { line-height: 1; white-space: nowrap; background: #fff; border: 1px solid #dcdfe6; color: #606266; -webkit-appearance: none; transition: 0.1s; font-weight: 500; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; padding: 12px 14px; font-size: 14px; text-align: center; display: inline-block; cursor: pointer; border-radius: 4px; outline: none; } .start-btn, .upload-btn { background: #66b1ff; border-color: #66b1ff; color: #fff; } .start-btn:hover, .upload-btn:hover, .start-btn:active, .upload-btn:active { color: #fff; background-color: #409eff; border-color: #409eff; } .stop-btn:hover, .stop-btn:active, .reset-btn:hover, .reset-btn:active, .origin-btn:hover, .origin-btn:active { color: #57a3f3; background-color: #fff; border-color: #57a3f3; } #result { color: #2396ef; font-size: 25px; margin: 2em; } @media screen and (max-width: 765px) { #list-image { padding: 20px; margin-top: 0; } #list-image .list-image-item { width: 50%; margin-left: 0; } #list-image .list-image-item img { width: 100px; height: 100px; margin: 10px auto; } #result { margin: 0; text-align: center; margin-bottom: 1em; } #list-button { margin: 0; margin-bottom: 1em; text-align: center; } } input[type="file"] { display: none !important; }
三.分析js逻辑代码
咱们来分析一下js代码,首先定义一堆默认数据:
//默认数据var data = [ { url: "./image/1.jpg", text: "1" }, { url: "./image/2.jpg", text: "2" }, { url: "./image/3.jpg", text: "3" }, { url: "./image/4.jpg", text: "4" }, { url: "./image/5.jpg", text: "5" }];
然后获取变量:
var startBtn = document.getElementById('start-btn');var stopBtn = document.getElementById('stop-btn');var originBtn = document.getElementById('origin-btn');var listImage = document.getElementById("list-image");var result = document.getElementById('result');var resetBtn = document.getElementById('reset-btn');var timer;//定时器var count;//当前选择的是var uploadInput = document.getElementById("upload-input");var uploadBtn = document.getElementById("upload-btn");
接着渲染默认的图片数据:
function renderList(data) { var str = ""; data.forEach(function (item) { str += '<div class="list-image-item">' + '<img src="' + item.url + '" alt="">' + '<p>' + item.text + '</p>' + '</div>'; }); listImage.innerHTML = str;}renderList(data);
然后点击上传按钮会重新替换数据:
uploadBtn.onclick = function () { return uploadInput.click();};uploadInput.onchange = function (event) { var file = event.target.files; if (typeof file !== 'object') return; var uploadData = []; for (var i = 0; i < file.length; i++) { if (/image\/\w+/.test(file[i].type)) { uploadData.push({ url: window.URL.createObjectURL(file[i]), text: (i + 1) }); } } renderList(uploadData);}
重要说明:这里要随机选择图片所以要用到定时器和随机函数,咱们先把随机函数定义下来:
function random(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min;}
好,接下来完成随机选择的功能:
function selectRandom() { count = random(1, data.length); for (var i = 0; i < listImage.children.length; i++) { if (i === count - 1) { listImage.children[i].classList.add('list-image-item-active'); } else { listImage.children[i].classList.remove('list-image-item-active'); } } timer = setTimeout(function () { selectRandom(); }, 50);}
点击开始按钮,开始随机选择:
startBtn.onclick = function () { if (!timer) { selectRandom(); } else { alert("请先停止再点击开始!") }}
点击结束按钮,结束选择:
stopBtn.onclick = function () { if (timer && count > 0) { clearTimeout(timer); timer = null; result.textContent = "最好看的是:" + count; count = 0; } else { alert("请先点击开始再停止!"); }}
点击重置按钮,重置选择的效果:
resetBtn.onclick = function () { result.textContent = "点击开始选择吧!"; for (var i = 0; i < listImage.children.length; i++) { listImage.children[i].classList.remove('list-image-item-active'); } }
点击还原按钮,还原默认数据:
originBtn.onclick = function () { renderList(data);}
到此为止,就算完了,以后你的女朋友要是再问你帮她选择,你实在选不出来,你可以理直气壮的说交给程序来选择吧。(ps:希望不要气到你的女朋友,哈哈哈!)。
一个已经完成的demo。
重要说明:(由于安卓手机的限制,input标签加multiple属性并不能多选,这也是这里的一个bug。)