js旋转V字俄罗斯方块
实现效果如图,也就是一个图像的旋转。注意,旋转后的文字是相对应的,而且文字还是立起的。第一次点击时显示,第二次点击时开始旋转。下面是我做这个效果的记录,方法这么差,我也就不说什么了。

先上HTML/CSS部分,这部分都是相同的。JS放在 script 标签里。
<!--
Author: XiaoWen
Create a file: 2016-12-04 17:03:21
Last modified: 2016-12-05 17:34:58
Start to work:
Finish the work:
Other information:
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>V字方块</title>
<style>
body{
padding: 100px;
}
ul,li{
margin: 0;
padding: 0;
list-style:none;
width:500px;
height:500px;
background: #ccc;
}
ul{
position: relative;
}
li{
width: 100px;
height: 100px;
background: #f00;
color: #fff;
text-align: center;
line-height: 100px;
font-size: 16px;
font-weight:bold;
position:absolute;
display:none;
}
</style>
</head>
<body>
<button>旋转</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
//这里的 js 代码分次放在下面的文章里。
</script>
</body>
</html>
HTML/CSS
第一次实现的代码,一边写一边都感觉后怕……这是在写JS还是在写CSS?
代码太多了。不但多,而且感觉乱,条理不清晰,不易使用。
开始的思路是直接让所有方块相对于左边定位。
<script>
var w=100;
var l=0;
var t=0;
var dir=1;
var a_li=document.getElementsByTagName("ul")[0].getElementsByTagName("li");
var btn=document.getElementsByTagName("button")[0];
for(var i=0;i<a_li.length;i++){
a_li[i].style.display="none";
}
btn.onclick=function(){
for(var i=0;i<a_li.length;i++){
a_li[i].style.display="block";
}
l=0;
t=0;
i=0;
block(dir)
dir++
if(dir==5){
dir=1;
}
}
//dir 方向,1 left/2 top/3 right/4 bottom
function block(dir){
for(var i=0; i<a_li.length;i++){
switch(dir){
case 1:
/*左*/
if(i<2){
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
l++;
t++;
}else if(i==2){
console.log(l,t,i)
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}else{
l--;
t++;
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}
break;
case 2:
/*上*/
if(i<2){
a_li[i].style.left=((a_li.length-l)-1)*w+"px";
a_li[i].style.top=t*w+"px";
l++;
t++;
}else if(i==2){
console.log(l,t,i)
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}else{
l--;
t--;
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}
break;
case 3:
/*右*/
if(i<2){
a_li[i].style.left=((a_li.length-l)-1)*w+"px";
a_li[i].style.top=((a_li.length-t)-1)*w+"px";
l++;
t++;
}else if(i==2){
console.log(l,t,i)
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}else{
l++;
t--;
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}
break;
default:
/*下*/
if(i<2){
a_li[i].style.left=l*w+"px";
a_li[i].style.top=((a_li.length-t)-1)*w+"px";
l++;
t++;
}else if(i==2){
console.log(l,t,i)
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}else{
l++;
t++;
a_li[i].style.left=l*w+"px";
a_li[i].style.top=t*w+"px";
}
}
}
}
</script>
代码一
第二次实现的代码。上面写的
开始寻找新思路,然后一直看图……
发现:元素在每一边上的位置都是相同的。有一个方向的位置只增不减,有一个方向有增有减。如函数:fk(fx1,fx2)。然后,这种方法写出来的效果显然不符合要求,5的位置应该是1,没事,反正这是一个思路而已,办法总是人想的,代码行数正在减少中……

<script>
//思路:先不考虑具体元素,只考虑元素的位置。
//元素在每一边上的位置都是相同的。有一个方向的位置只增不减,有一个方向有增有减。如函数:fk(fx1,fx2)
var w=100;
var btn_num=0;
var a_li=document.getElementsByTagName("ul")[0].getElementsByTagName("li");
var btn=document.getElementsByTagName("button")[0];
btn.onclick=function(){
btn_num++;
switch(btn_num){
case 1:
for(var i=0;i<a_li.length;i++){
a_li[i].style.display="block";
}
fk("left","top");
break;
case 2:
fk("top","left");
break;
case 3:
fk("right","top");
break;
default:
fk("bottom","left");
btn_num=0;
}
}
//fx1 增减方向, fx2仅增方向
function fk(fx1,fx2){
for(var i=0;i<a_li.length;i++){
/*下面这四行用来消除上次的位置*/
a_li[i].style.left="auto";
a_li[i].style.top="auto";
a_li[i].style.right="auto";
a_li[i].style.bottom="auto";
if(i>parseInt(a_li.length/2)){ //取出中间以上的元素
a_li[i].style[fx1]=(a_li.length-i-1)*w+"px"; //a_li.length-i-1相当于a_li.length-(i+1),表示剩下的位置关系。
a_li[i].style[fx2]=i*w+"px";
}else{
a_li[i].style[fx1]=i*w+"px";
a_li[i].style[fx2]=i*w+"px";
}
}
}
</script>
代码二
第三次,感觉总算是像点样子了。思路:直接四个边分别考虑,元素只相对某一边定位。
<script>
//思路:直接四个边分别考虑,元素只相对某一边定位。
//
var w=100;
var btn_num=0;
var a_li=document.getElementsByTagName("ul")[0].getElementsByTagName("li");
var btn=document.getElementsByTagName("button")[0];
btn.onclick=function(){
btn_num++;
switch(btn_num){
case 1:
for(var i=0;i<a_li.length;i++){
a_li[i].style.display="block";
}
fk("left","top");
break;
case 2:
fk("top","right");
break;
case 3:
fk("right","bottom");
break;
default:
fk("bottom","left");
btn_num=0;
}
}
//fx1定位的方向, fx2开始增加方向(下一方向)
function fk(fx1,fx2){
for(var i=0;i<a_li.length;i++){
/*下面这四行用来消除上次的位置*/
a_li[i].style.left="auto";
a_li[i].style.top="auto";
a_li[i].style.right="auto";
a_li[i].style.bottom="auto";
/****/
a_li[i].style[fx1]=i*w+"px";
a_li[i].style[fx2]=i*w+"px";
if(i>parseInt(a_li.length/2)){
a_li[i].style[fx1]=(a_li.length-(i+1))*w+"px";
a_li[i].style[fx2]=i*w+"px";
}
}
}
</script>
代码三
第三次写的代码,感觉函数fk(fx1,fx2)的第二个参数的存在有点鸡肋。按分析fx2是能根据fx1算出来的(也就是如果第一个参数是top,第二个就是right。顺时针方向的下一个),所以其实不用这个参数也可以。
我最后还是要了,因为我的想法是,如果不要的话还得在函数里判断一下fx1的参数,配合已知的fx2继续计算。这就得多写几行判断语句了,大概得增加十行代码以上吧。所以就手工传送参数2(下一个方向)吧。
那么,还有没有更简单的方法呢?
js旋转V字俄罗斯方块的更多相关文章
- 旋转V字俄罗斯方块
实现效果如图,也就是一个图像的旋转.注意,旋转后的文字是相对应的,而且文字还是立起的.第一次点击时显示,第二次点击时开始旋转.下面是我做这个效果的记录,方法这么差,我也就不说什么了. 先上HTML/C ...
- JS随机生成100个DIV每10个换行(换色,生成V字和倒V)
附图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- 原生js,一些小应用(逢10进一,生成V字,多个div抖动)
第一题:每隔10个div换一行.并且鼠标移入 改变opacity. <!DOCTYPE html> <html lang="en"> <head> ...
- js实现简单的俄罗斯方块小游戏
js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...
- JS/Jquery版本的俄罗斯方块(附源码分析)
转载于http://blog.csdn.net/unionline/article/details/63250597 且后续更新于此 1.前言 写这个jQuery版本的小游戏的缘由在于我想通过从零到有 ...
- JS旋转和css旋转
js旋转 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <styl ...
- d3.js 制作简单的俄罗斯方块
d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏--俄罗斯方块.话不多说先上图片. 1. js tetris类 由于方法拆分 ...
- exif.js 旋转图片
还是那个问题:网上的大胸弟们BB一大堆,没几个给的代码能用的,话不多说,直接上demo: 链接:https://pan.baidu.com/s/1jJ6vnt8 密码:swwm 不要忽视demo中的s ...
- 简单JS旋转实现转盘抽奖效果
闲来没事,做了一个模拟转盘抽奖的HTML&JS的效果: 可以在设置的时候,选择几个区域,并且可以填写指针将要停止的区域 比如,我选择了"区域2",结果就是这样 具体可以见下 ...
随机推荐
- Linux服务器---邮件服务postfix安装
安装postfix postfix是一个快速.易于管理.安全性高的邮件发送服务,可以配合dovecot实现一个完美的邮箱服务器. 1.安装postfix [root@localhost ~]# rpm ...
- centos 6.8 配置csh的shell和环境变量
1.查看shell 查看系统中安装的所有版本的shell:cat /etc/shells 查看当前用户使用的shell:echo $SHELL 2.修改用户shell 可以在/etc/passwd ...
- 开始Nginx的SSL模块
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/n ...
- 详解:PHP加速器配置神器opcache
什么是opcode? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少CP ...
- 在linux中安装memcache服务器
挂载光盘 mkdir -p /media/cdrom mount /dev/cdrom /media/cdrom 设置yum cd /etc/yum.repos.d/ mv CentOS- ...
- oracle 12c多租户下的日常操作变化
Oracle 12c创建用户时出现“ORA-65096: invalid common user or role name”的错误 在oracle中,引入了多租户概念,以前是一个instance对应一 ...
- Windows死机的话,可能的一些猫病
一.由硬件引起的原因 [散热不良] 显示器.电源和CPU在工作中发热量非常大,因此保持良好的通风状况非常重要,如果显示器过热将会导致色彩.图象失真甚至缩短显示器寿命.工作时间太长也会导致电源或显示器散 ...
- k8s渐进
基本命令介绍(推荐) 1. The Almighty Pause Container 2. What are Kubernetes Pods Anyway? 3.中文版官方翻译[版本2] 提供了很多 ...
- windows模糊查询指定进程是否存在
习惯的查询 wmic process | findStr /i "**" /i 忽略大小写 我查考的链接 常用批处理命令总结3之Find和FindStr
- python简说(十)json模块
常用模块: 一个python文件就是一个模块 1.标准模块,python自带的 2.第三方模块,需要安装 3.自己写的python文件 json,就是一个字符串 1.json转为字典 json_str ...