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

先上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字俄罗斯方块的更多相关文章

  1. 旋转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. js实现简单的俄罗斯方块小游戏

    js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...

  5. JS/Jquery版本的俄罗斯方块(附源码分析)

    转载于http://blog.csdn.net/unionline/article/details/63250597 且后续更新于此 1.前言 写这个jQuery版本的小游戏的缘由在于我想通过从零到有 ...

  6. JS旋转和css旋转

    js旋转 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <styl ...

  7. d3.js 制作简单的俄罗斯方块

    d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏--俄罗斯方块.话不多说先上图片. 1. js tetris类 由于方法拆分 ...

  8. exif.js 旋转图片

    还是那个问题:网上的大胸弟们BB一大堆,没几个给的代码能用的,话不多说,直接上demo: 链接:https://pan.baidu.com/s/1jJ6vnt8 密码:swwm 不要忽视demo中的s ...

  9. 简单JS旋转实现转盘抽奖效果

    闲来没事,做了一个模拟转盘抽奖的HTML&JS的效果: 可以在设置的时候,选择几个区域,并且可以填写指针将要停止的区域 比如,我选择了"区域2",结果就是这样 具体可以见下 ...

随机推荐

  1. win10 在任务栏添加 desktop 快捷图标

    http://www.xitongcheng.com/jiaocheng/win10_article_11980.html [Shell] Command= IconFile=explorer.exe ...

  2. mark_save

    class BookConfig(ModelStark): def edit(self, obj=None, is_header=False): if is_header: return " ...

  3. Hive 的排名和跨行 窗口函数及其使用

    一.排序&去重分析 row_number() over(partititon by col1 order by col2) as rn 也可以用 row_number() over(distr ...

  4. Set接口——HashSet集合

    不重复,无索引,不能重复元素,没有索引: HashSet集合: 此时实现Set接口,有哈希表(HashMap的一个实例)支持,哈希表意味着查询速度很快, 是无序的,即元素的存取的顺序可能不一致: 且此 ...

  5. Web 应用架构基础课(转载)

    Web 应用架构基础课 初级 web 应用开发者必学的基础网络架构概念 web 应用主流架构概览 上图便是我司(Storyblocks)网络架构的很好展现.如果你还没成为经验老道的 web 工程师,可 ...

  6. Linux服务器---流量监控MRTG

    MRTG MRTG可以分析网络流量,但是它必须依赖SNMP协议.将收集到的数据生成HTML文件,以图片的形式展示出来 1.安装一些依赖软件 [root@localhost bandwidthd-2.0 ...

  7. 像黑客一样使用Linux命令行(转载)

    阅读目录 前言 使用 tmux 复用控制台窗口 在命令行中快速移动光标 在命令行中快速删除文本 快速查看和搜索历史命令 快速引用和修饰历史命令 录制屏幕并转换为 gif 动画图片 总结 回到顶部 前言 ...

  8. jboss的使用和安装

    1. 安装 1.1.软件安装 首先要安装JDK(仅仅安装JRE是不行的,因为JSP页面需要编译),最新的正式版是JDK1.4.2.然后把JBoss的压缩包解压到一个目录下,目录名一般是"Jb ...

  9. 爬虫之牛掰的scrapy框架

    一. Scrapy简介及安装 http://python.jobbole.com/86405/ Scrapy的详细介绍   1.简介   2.安装     1.window上安装:         先 ...

  10. php 查找字符串里面中文字符第一次出现的位置,并插入字符串

    //查找字符串里面中文字符第一次出现的位置,并插入字符串 function find_first_chinese_insert($str,$insert_str){ $count = mb_strle ...