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

先上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(下一个方向)吧。

那么,还有没有更简单的方法呢?

旋转V字俄罗斯方块的更多相关文章

  1. js旋转V字俄罗斯方块

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

  2. JS随机生成100个DIV每10个换行(换色,生成V字和倒V)

    附图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  3. 原生js,一些小应用(逢10进一,生成V字,多个div抖动)

    第一题:每隔10个div换一行.并且鼠标移入 改变opacity. <!DOCTYPE html> <html lang="en"> <head> ...

  4. 自动生成V字型

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. 轮滑基础(一)(前摔,葫芦步,推步,A字转弯,弓步转弯)

    轮滑新手入门推荐? [柚子陪你学轮滑轮滑教学]第一集 轮滑安全 1,站: 站立:脚可以成v字,或者平行,手放膝盖或者前伸.平行站立 膝盖相距一拳头左右,两腿间距略小于肩宽.膝盖略弯,腰下压,抬头挺胸 ...

  6. 60行JS实现俄罗斯方块

    参考文献:http://www.cnblogs.com/jimaojin/p/5413857.html 原版: <!doctype html><html><head> ...

  7. V for Vendetta

    V for Vendetta V字仇杀队 复仇者V 安迪·沃卓斯基 and Larry Wachowski 思想,是最强大的武器.因为,世界上的独裁政府,有一个共同特点就是推行洗脑和愚民政策. 经典台 ...

  8. 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏

    早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用C写一个功能基本齐全的俄罗斯方块的话,大 ...

  9. 俄罗斯方块游戏JavaScript代码

    JavaScript代码俄罗斯方块游戏 早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用 ...

随机推荐

  1. Django concept

    1. MVC in Django http://stackoverflow.com/questions/6621653/django-vs-model-view-controller https:// ...

  2. lucene prefixQuery

    prefixQuery是lucene的一个前缀匹配的搜索功能,但是它的前缀匹配不是完全的前缀匹配,的query生成是:易* 但是能把所有带有易字的都搜到... 下面是实验:出现了交易...

  3. okhttp-utils的封装之okhttp的使用

    HTTP是现代应用的网络.这就是我们如何交换数据和媒体.让你的东西做HTTP有效负载的速度和节省带宽. okhttp是HTTP客户端的有效默认: HTTP 2支持允许所有请求相同的主机共享一个插座. ...

  4. Unity(二)生命周期LifetimeManager

    描述:Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理. //创建一个Unit ...

  5. python-->基础-->004-->迭代器

    http://blog.chinaunix.net/uid-23500957-id-3990473.html http://www.cnblogs.com/vamei/archive/2012/07/ ...

  6. Python学习之正则表达式

    引用类: import re 常用方法: re.compile(pattern) re.match() re.search() re.findall() group() groups() re.spl ...

  7. HtDP读后感

    我小时候很喜欢电脑. 不是听音乐,也不是玩游戏.纯粹是好奇:为什么一部冷冰冰的机器插上电源之后居然能如此强大.我每个月都期盼着订阅的电脑杂志快点到,到手以后总先上手试试里面的"奇淫巧技&qu ...

  8. 扩展欧几里德解的数量(51nod 1352)

    题意:给出N,A,B:求A*x+ B*y = N+1   的大于0 的解的数量: 思路:先用exgcd求出大于0的初始解x,rest = N - x*A; sum = rest/LCM(A, B); ...

  9. tcp/ip的一些概念

    MTU,即Maximum Transmission Unit(最大传输单元),此值设定TCP/IP协议传输数据报时的最大传输单元.以太网的MTU值是1500 bytes. 首先计算最大的IP包中IP净 ...

  10. 12.我们不是在真空里谈软件工程, 软件要运行在硬件芯片上面, 下面看看一个计算机芯片的发展历史: http://perspectives.mvdirona.com/2014/09/august-21-2014-computer-history-museum-presentation/ http://mvdirona.com/jrh/TalksAndPapers/DileepBhandar

    电脑芯片的诞生和发展是20世纪最伟大的发明之一,芯片技术决定了计算机升级换代的速度,决定了计算机小型化实现的程度,决定了计算机智能化的程度,决定了计算机普及化的应用深度. 1971年11月15日,英特 ...