一. 分析需求
假如你的女朋友发给你一堆衣服的图片,然后问你哪件好看,只能选一件最好看的,你会如何做?为什么不交给程序来进行抉择呢?本文的主题就是开发一个选择程序来解决你的女朋友的选择问题。
页面最终效果如图所示:
我们来总结一下要实现的功能:
可以上传多张图片。(这里不需要写后台也是可以的,只不过如果要存储数据可以选择会话存储, 当然本例没有被存储)。
点击开始的时候会开始在所有的图片之间来回选择。选择加了一个样式(阴影样式)。
点击停止的时候,出现选择的结果。
点击重置也就重置选择效果。
因为默认数据是以上的 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。)