我们先写实例,然后有必要在分装为插件,最后做更高级的处理!
封装插件基础学习 http://my.oschina.net/u/2352644/blog/487688
前面的7个实例在这里 http://my.oschina.net/u/2352644/blog/490827
效果目录:
8.商品数量加减效果
9.星星评分效果
10.刮刮卡效果
11.圆形大转盘抽奖效果
12.贪食蛇小游戏效果
13.video的html5视频播放器
14.可拖拽的登陆框
15.树形菜单效果
16.全选/反全选处理
17.瀑布流效果(未实现)
8.商品数量加减效果
这个效果,我们在看淘宝提交的时候,就会选择购买数量,很简单常见效果
废话不多说,已经做了7个效果,我们直接来布局静态结构:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
.num{ margin:100px;}
.num input{ height:30px; border:1px solid #ccc;}
.numinc,.numadd{ width:30px; text-align:center;}
.numshou{ width:100px; text-align:center;}
</style>
</head>
<body>
<div class="num">
<input type="button" class="numinc" value="-" />
<input type="text" class="numshou" value="1"/>
<input type="button" class="numadd" value="+" />
</div>
</body>
</html>
我们接下来给加减按钮添加事件,做出处理:
最小数量为1.作为临界值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
$(".numinc").click(function(){
if($(".numshou").val()<=1){
$(".numshou").val(1);
}else{
$(".numshou").val(parseInt($(".numshou").val())-1);
};
});
$(".numadd").click(function(){
$(".numshou").val(parseInt($(".numshou").val())+parseInt(1));
});
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
.num{ margin:100px;}
.num input{ height:30px; border:1px solid #ccc;}
.numinc,.numadd{ width:30px; text-align:center;}
.numshou{ width:100px; text-align:center;}
</style>
</head>
<body>
<div class="num">
<input type="button" class="numinc" value="-" />
<input type="text" class="numshou" value="1"/>
<input type="button" class="numadd" value="+" />
</div>
</body>
</html>
9.星星评分效果
给商品打分,点击到哪个,当前和以前都被选中,我们看代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
$(".ping").children().click(function(){
var i=$(this).index();
$(".ping").children().each(function(index, element) {
if(index<=i){
$(this).addClass("add");
}else{
$(this).removeClass("add");
};
});
});
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
.ping{ margin:100px; height:30px;}
.ping span{ float:left; height:20px; width:20px; margin:5px; background:#666; cursor:pointer;}
.ping span.add{ background:#C93;}
</style>
</head>
<body>
<div class="ping">
<span class="add"></span>
<span class="add"></span>
<span></span>
<span></span>
<span></span>
</div>
</body>
</html>
10.刮刮卡效果
刮刮卡是基础canvas的,
原理就是用带有颜色canvas盖住下面的奖项,我们去让canvas透明,显示出下面内容
用到对canvas的全局属性设置为原内容和后加内容相加变透明属性处理
globalCompositeOperation="destination-out";
直接代码处理:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
var cjcon=["一等奖","二等奖","三等奖","谢谢参与"];//奖项设置
var cjper=[3,10,20,100];//奖项率,次数
/*
* sjmes
* @Author 透笔度(1530341234@qq.com)
* @param {cjcon} 所有奖项
*/
var percjcon=[];
for(var i=0;i<cjper.length;i++){
peic(cjper[i],i);
};
function peic(len,ind){
for(var i=0;i<len;i++){
percjcon.push(cjcon[ind]);
};
};
var sjmes = $("#sjmes");
var numrandom=Math.floor(Math.random()*percjcon.length);
sjmes.html(percjcon[numrandom]);
var opacityb=0.5;//透明百分比,参考值,什么程度出现提示
var backcolorb="#ffaaaa";
var numl=200*80;//总像素个数
var nump;//出现backcolorb的个数
var opacitya;//透明百分比实际值
var canvas = $("#canvas")[0]; //获取canvas
var context = canvas.getContext('2d'); //canvas追加2d画图
var flag = 0; //标志,判断是按下后移动还是未按下移动 重要
var penwidth=20; //画笔宽度
context.fillStyle="#faa"; //填充的颜色
context.fillRect(0,0,200,80); //填充颜色 x y坐标 宽 高
canvas.addEventListener('mousemove', onMouseMove, false); //鼠标移动事件
canvas.addEventListener('mousedown', onMouseDown, false); //鼠标按下事件
canvas.addEventListener('mouseup', onMouseUp, false); //鼠标抬起事件
var movex=-1;
var movey=-1;
var imgData;//imagedada容器
var rgbabox=[];//存放读取后的rgba数据;
function onMouseMove(evt) {
if (flag == 1) {
movex=evt.layerX;
movey=evt.layerY;
context.fillStyle="#FF0000";
context.beginPath();
context.globalCompositeOperation="destination-out";
context.arc(movex,movey,penwidth,0,Math.PI*2,true); //Math.PI*2是JS计算方法,是圆
context.closePath();
context.fill();
}
}
function onMouseDown(evt) {
flag = 1; //标志按下
}
function onMouseUp(evt) {
flag = 0;
//读取像素数据
imgData=context.getImageData(0,0,200,80);//获取当前画布数据
//imgData.data.length 获取图片数据总长度,没4个为一组存放rgba
for(var i=0; i<imgData.data.length;i+=4){
var rval=imgData.data[i];
var gval=imgData.data[i+1];
var bval=imgData.data[i+2];
var aval=imgData.data[i+3];
var rgbaval=rval+"-"+gval+"-"+bval+"-"+aval;
rgbabox.push(rgbaval);
}
//end
for(var j=0;j<rgbabox.length;j++){
//alert(rgbabox[j].split("-")[0])
rgbabox[j]='#'+rgbToHex(rgbabox[j].split("-")[0],rgbabox[j].split("-")[1],rgbabox[j].split("-")[2]);
}
nump=countSubstr(rgbabox.join(","),backcolorb,true);
opacitya=(numl-nump)/numl;
if(opacitya>opacityb){
alert("恭喜你获得"+percjcon[numrandom])
}else{}
}
function rgbToHex(r, g, b) { return ((r << 16) | (g << 8) | b).toString(16); }//rgb转为16进制 #xxx形式
function countSubstr(str,substr,isIgnore){//计算字符串出现子字符串的个数
var count;
var reg="";
if(isIgnore==true){
reg="/"+substr+"/gi";
}else{
reg="/"+substr+"/g";
}
reg=eval(reg);
if(str.match(reg)==null){
count=0;
}else{
count=str.match(reg).length;
}
return count;
}
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
.cjbox{ margin:100px; height:80px; width:200px; background:#FFF; position:relative;}
#canvas{position:absolute; left:0px; top:0px;z-index:99;}
.sjmes{ position:absolute; left:0px; top:0px; height:80px; width:200px; text-align:center; font-size:40px; line-height:80px; z-index:9;}
</style>
</head>
<body>
<div style="position:relative; margin:20px 100px; background:#0CF; height:400px; width:500px; margin:0 auto;">
<div>刮刮卡简单抽奖</div>
<div class="cjbox">
<div class="sjmes" id="sjmes"></div>
<canvas width=200 height=80 id="canvas"></canvas>
</div>
</div>
</body>
</html>
11.圆形大转盘抽奖效果
我们已经做了九宫格大装盘,其实原理类似,这个是利用css3的2d旋转,转动中间的带指针图片
原理是元素transform-origin:center center;transform:rotate(0deg);的处理
我就不用图了,以免测试麻烦,
代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
var set;//存放间隔函数id,用于清除动画
var i=0;//初始位置,
var speed=10;//转动速度
var ok=Math.floor((Math.random()*361));//产生0-360度的整数,标记中奖位置
var okw=null;
if(ok>=0 && ok<30){
okw="1"
}else if(ok>=30 && ok<60){
okw="2"
}
else if(ok>=60 && ok<90){
okw="3"
}
else if(ok>=90 && ok<120){
okw="4"
}
else if(ok>=120 && ok<150){
okw="5"
}
else if(ok>=150 && ok<180){
okw="6"
}
else if(ok>=180 && ok<210){
okw="7"
}
else if(ok>=210 && ok<240){
okw="8"
}
else if(ok>=270 && ok<300){
okw="9"
}
else if(ok>=300 && ok<330){
okw="10"
}
else if(ok>=330 && ok<=360){
okw="11"
}
else{
okw="12"
}
var count=5*360+ok;//总圈数,一圈是360度
var nowcount=0;//当前的圈数
function dong(){
if(nowcount>count){
clearInterval(set);
alert("恭喜你,中了"+okw+"等奖")
}else{
nowcount+=10;
$(".start").css('transform','rotate('+i+'deg)')
i+=10;
};
};
$(".start").click(function(){
set=setInterval(dong,speed);
});
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
#lottery{width:400px;height:400px;margin:20px auto 0; position:relative;}
#lottery div{width:100px;height:100px;text-align:centerfont-size:24px;color:#333; float:left;}
#lottery .cent{ background:#FFF;}
#lottery .lottery-unit-0{ background:#CC6;}
#lottery .lottery-unit-1{ background:#F99;}
#lottery .lottery-unit-2{ background:#CC6;}
#lottery .lottery-unit-3{ background:#F99;}
#lottery .lottery-unit-4{ background:#CC6;}
#lottery .lottery-unit-5{ background:#F99;}
#lottery .lottery-unit-6{ background:#CC6;}
#lottery .lottery-unit-7{ background:#F99;}
#lottery .lottery-unit-8{ background:#CC6;}
#lottery .lottery-unit-9{ background:#F99;}
#lottery .lottery-unit-10{ background:#CC6;}
#lottery .lottery-unit-11{ background:#F99;}
#lottery div.select{background:#F0F;}
#lottery .start{ position:absolute; left:100px; top:100px; height:200px; width:200px;background:#C33; font-size:30px; text-align:center; cursor:pointer; line-height:200px; color:#fff; border-radius:100px;
transform-origin:center center;transform:rotate(0deg);
}
#lottery .start span{ height:20px; width:80px;background:#C33; position:absolute; left:200px; top:90px; z-index:9999}
</style>
</head>
<body>
<div id="lottery">
<div class="lottery-unit lottery-unit-0">8</div>
<div class="lottery-unit lottery-unit-1">9</div>
<div class="lottery-unit lottery-unit-2">10</div>
<div class="lottery-unit lottery-unit-3">11</div>
<div class="lottery-unit lottery-unit-11">7</div>
<div class="cent"></div>
<div class="cent"></div>
<div class="lottery-unit lottery-unit-4">12</div>
<div class="lottery-unit lottery-unit-10">6</div>
<div class="cent"></div>
<div class="cent"></div>
<div class="lottery-unit lottery-unit-5">1</div>
<div class="lottery-unit lottery-unit-9">5</div>
<div class="lottery-unit lottery-unit-8">4</div>
<div class="lottery-unit lottery-unit-7">3</div>
<div class="lottery-unit lottery-unit-6">2</div>
<div class="start">抽奖
<span></span>
</div>
</div>
</body>
</html>
12.贪食蛇小游戏效果
这个原理我就按步骤分析,最后放总的代码
我们要有一个舞台,存放贪食蛇还有食物,我们先有基本的html结构
<canvas id="canvas" width="450" height="450"></canvas>
接下来我们jq获取canvas和添加2d画布,
//获取canvas基本信息
var canvas = $("#canvas")[0];
var ctx = canvas.getContext("2d");
var w = $("#canvas").width();
var h = $("#canvas").height();
我们想象一下,一条蛇放在画布上,是有若干个矩形组成,看到多个,我们就知道是存放在数组里,数组里的每一项还要存放蛇的位置信息(x y坐标),同样矩形的的宽度我们要提前设置,还有开始蛇的方向,
//创建贪吃蛇对象
var snake_array; //由一个数组组成
//设置游戏变量
var cw = 10;//单元格像素宽度
//其他变量设置
var d;//方向
我们还需要一个矩形,表示食物,只有一个,我们存入一个变量就好,还有就是每次吃完的分数记录
var food;//食物
var score;//统计分数
接下来我们开始画出蛇,我们为了简单,蛇就初始为5个,在左上角位置,开始的话就往右走
创建一条横向,5节长度的蛇,坐标的话就是[{4,0},{3,0},{2,0},{1,0},{0,0}],第一项是蛇头,因为蛇头是最需要掌握的,
//创建蛇对象 函数
function create_snake()
{
var length = 5; //设置初始贪吃蛇长度
snake_array = []; //清空数组
for(var i = length-1; i>=0; i--)//让蛇头处在向右,第一行第四个格
{
//在左上方创建水平的贪吃蛇
snake_array.push({x: i, y:0});//[{4,0},{3,0},{2,0},{1,0},{0,0}]
}
}
我们要创建食物,这个要随机出现,位置在画布内部
//创建食物函数
function create_food()
{
food = {
x: Math.round(Math.random()*(w-cw)/cw),
//450以内随机数,保证在画布内
y: Math.round(Math.random()*(h-cw)/cw),
};
//在屏幕内随机产生坐标点
}
蛇和食物有了,我们要绘制出来,在画布上,我们绘制处理,包含在一个函数里
function paint()
{ }
下面的处理都是函数内部,绘制蛇头,根据方向做出改变,
//在每一帧图画中都必须首先清除上一帧内容。
//清屏,即以底色填充canvas
ctx.fillStyle = "#faa";
ctx.fillRect(0, 0, w, h);
//贪吃蛇运动逻辑:将贪吃蛇的尾部点放到头部
//获取贪吃蛇头部的位置信息
var nx = snake_array[0].x;
var ny = snake_array[0].y;
//根据贪吃蛇的运动方向计算最新头部的坐标信息
if(d == "right") nx++;
else if(d == "left") nx--;
else if(d == "up") ny--;
else if(d == "down") ny++;
是否碰撞到边际和身体,通过蛇头做参考判断
//判断是否超出屏幕界限或者碰到自己的身体,是则游戏结束
if(nx == -1 || nx == w/cw || ny == -1 || ny == h/cw || check_collision(nx, ny, snake_array))
{
//重启游戏
init();
return;
}
身体检测函数
//碰撞检测函数
function check_collision(x, y, array)
{
//检查当前坐标是否已经存在于贪吃蛇数组中
for(var i = 0; i < array.length; i++)
{
if(array[i].x == x && array[i].y == y)
return true;
}
return false;
}
检测与食物的碰撞和绘制
//如果贪吃蛇碰到食物,则在头部直接新增一个点
if(nx == food.x && ny == food.y)
{
var tail = {x: nx, y: ny};
score++;
//生成新的食物
create_food();
}
//如果贪吃蛇没有碰到食物,则在头部直接新增一个点,还需要去除尾部的一个点
else
//????????????????????????????????????????
{
var tail = snake_array.pop(); //去除尾部点
tail.x = nx; tail.y = ny;
}
snake_array.unshift(tail); //移动数组
//22
for(var i = 0; i < snake_array.length; i++)
{
var c = snake_array[i];
//绘制单元格,每个单元格为10像素
paint_cell(c.x, c.y);
}
//33
//绘制食物
paint_cell(food.x, food.y);
//绘制分数
var score_text = "Score: " + score;
ctx.fillText(score_text, 5, h-5);
运动起来
function init()
{
d = "right"; //默认方向
create_snake();//创建蛇对象 函数
create_food(); //创建食物对象 函数
//分数清零
score = 0;
//让贪吃蛇动起来!设置一个定时器以定时触发重绘函数
//设置定时时间为60ms,即60fps
//if(typeof game_loop != "undefined") clearInterval(game_loop);
game_loop = setInterval(paint, 300);//动画函数调用
}
方向处理
//添加键盘控制
$(document).keydown(function(e){
var key = e.which;
//注意不能直接逆向
if(key == "37" && d != "right") d = "left";
else if(key == "38" && d != "down") d = "up";
else if(key == "39" && d != "left") d = "right";
else if(key == "40" && d != "up") d = "down";
})
整体代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
//获取canvas基本信息
var canvas = $("#canvas")[0];
var ctx = canvas.getContext("2d");
var w = $("#canvas").width();
var h = $("#canvas").height();
//设置游戏变量
var cw = 10;//单元格像素宽度
//其他变量设置
var d;//方向
var food;//食物
var score;//统计分数
//创建贪吃蛇对象
var snake_array; //由一个数组组成
//主函数
function init()
{
d = "right"; //默认方向
create_snake();//创建蛇对象 函数
create_food(); //创建食物对象 函数
//分数清零
score = 0;
//让贪吃蛇动起来!设置一个定时器以定时触发重绘函数
//设置定时时间为60ms,即60fps
//if(typeof game_loop != "undefined") clearInterval(game_loop);
game_loop = setInterval(paint, 300);//动画函数调用
}
init();//执行主函数
//创建蛇对象 函数
function create_snake()
{
var length = 5; //设置初始贪吃蛇长度
snake_array = []; //清空数组
for(var i = length-1; i>=0; i--)//让蛇头处在向右,第一行第四个格
{
//在左上方创建水平的贪吃蛇
snake_array.push({x: i, y:0});//[{4,0},{3,0},{2,0},{1,0},{0,0}]
}
}
//var arr=[{x:0,y:0},{x:1,y:1}]
//创建食物函数
function create_food()
{
food = {
x: Math.round(Math.random()*(w-cw)/cw),
//450以内随机数,保证在画布内
y: Math.round(Math.random()*(h-cw)/cw),
};
//在屏幕内随机产生坐标点
}
//绘制函数
function paint()
{
//在每一帧图画中都必须首先清除上一帧内容。
//清屏,即以底色填充canvas
ctx.fillStyle = "#faa";
ctx.fillRect(0, 0, w, h);
//贪吃蛇运动逻辑:将贪吃蛇的尾部点放到头部
//获取贪吃蛇头部的位置信息
var nx = snake_array[0].x;
var ny = snake_array[0].y;
//根据贪吃蛇的运动方向计算最新头部的坐标信息
if(d == "right") nx++;
else if(d == "left") nx--;
else if(d == "up") ny--;
else if(d == "down") ny++;
//判断是否超出屏幕界限或者碰到自己的身体,是则游戏结束
if(nx == -1 || nx == w/cw || ny == -1 || ny == h/cw || check_collision(nx, ny, snake_array))
{
//重启游戏
init();
return;
}
//贪吃蛇吃食物逻辑
//如果贪吃蛇碰到食物,则在头部直接新增一个点
if(nx == food.x && ny == food.y)
{
var tail = {x: nx, y: ny};
score++;
//生成新的食物
create_food();
}
//如果贪吃蛇没有碰到食物,则在头部直接新增一个点,还需要去除尾部的一个点
else
//????????????????????????????????????????
{
var tail = snake_array.pop(); //去除尾部点
tail.x = nx; tail.y = ny;
}
snake_array.unshift(tail); //移动数组
//22
for(var i = 0; i < snake_array.length; i++)
{
var c = snake_array[i];
//绘制单元格,每个单元格为10像素
paint_cell(c.x, c.y);
}
//33
//绘制食物
paint_cell(food.x, food.y);
//绘制分数
var score_text = "Score: " + score;
ctx.fillText(score_text, 5, h-5);
}
//单元格绘制函数
function paint_cell(x, y)
{
ctx.fillStyle = "blue";
ctx.fillRect(x*cw, y*cw, cw, cw);
ctx.strokeStyle = "white";
ctx.strokeRect(x*cw, y*cw, cw, cw);
}
//碰撞检测函数
function check_collision(x, y, array)
{
//检查当前坐标是否已经存在于贪吃蛇数组中
for(var i = 0; i < array.length; i++)
{
if(array[i].x == x && array[i].y == y)
return true;
}
return false;
}
//添加键盘控制
$(document).keydown(function(e){
var key = e.which;
//注意不能直接逆向
if(key == "37" && d != "right") d = "left";
else if(key == "38" && d != "down") d = "up";
else if(key == "39" && d != "left") d = "right";
else if(key == "40" && d != "up") d = "down";
})
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
</style>
</head>
<body>
<!-- canvas对象 -->
<canvas id="canvas" width="450" height="450"></canvas>
</body>
</html>
总结:
贪食蛇的难点
蛇的存储(节数和坐标,头部信息存入数组顶部)
根据方向,移动后坐标的变化处理:我们以蛇头为参考,通过方向去改变蛇头坐标,然后下面的蛇身子的坐标依次等于上一个节点的坐标,我们可以知道,运动时,蛇头以后的部分,会移动到蛇身子上一节的位置,(最核心原理)
每次移动头部都会进行插入的操作,插入变化后的坐标,移除的与否与是否吃到食物有关
根据数组蛇信息,间隔的去清除绘制
13.video的html5视频播放器
调用video的api,构造自定义外观的播放器
测试时,需要一个mp4的视频文件,那些播放,静音需要图片,大家想象去看
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width; initial-scale=1.0">
<title></title>
<style>
*{ margin:0; padding:0;}
body{ font-size:12px; font-family:"微软雅黑"}
.html5demo{ width:300px; height:212px; position:relative; background:#000; margin:200px;}
.videotoolsback{ position:absolute; bottom:0px; left:0px; height:30px;width:300px; background:#0C9 repeat-x left top; opacity:0.9; z-index:5px;}
.videotools{ position:absolute; bottom:0px; left:0px; height:30px;width:300px;z-index:999px;}
.play{ float:left; height:14px; width:14px; margin:8px 8px; background:#F33 no-repeat left center; cursor:pointer;}
span.pause{background:#6C9 no-repeat left center;}
.current{ float:left; margin:8px 0; height:14px; line-height:14px; width:50px; text-align:right; color:#fff; font-size:12px;}
.time-s{float:left; margin:5px 0; width:8px; height:20px; background:#C93 no-repeat center top;}
.duration{float:left; margin:8px 0; height:14px; line-height:14px; width:50px;color:#fff; font-size:12px;}
.progressBar{position: relative;width:30px;height: 6px;background: #6495ed; float:left; margin:12px 0; border-radius:3px;}
.timeBar{position: absolute;top: -5px;left:0;height:16px; width:16px; background:url(default/handle.png) no-repeat left top;margin-left:-8px; cursor:pointer;}
.protimeBar{position: absolute; background:#a2cd5a;border-radius:3px; width:0;height: 6px; left:0px; top:0px;}
.muted{ float:right; height:14px; width:19px; margin:8px 8px; background:#CC3 no-repeat left top; cursor:pointer;}
span.truemuted{ background:#936 no-repeat left top;}
.volumeBar{float:right; position: relative;width:50px;height:6px;background: #6495ed; margin:12px 8px;border-radius:3px;}
.volume{ position: absolute;top: -5px;left: 50%;height:16px; width:16px; background:#C9C no-repeat left top; margin-left:-8px;cursor:pointer;}
.fullscreen{ float:right; height:14px; width:14px; margin:8px 14px 8px 0px; background:#F99 no-repeat left top; cursor:pointer;}
span.unfullscreen{ background:#FC6 no-repeat left top;}
div.full-html5demo{ margin:0; position:fixed; left:0; top:0; z-index:2;}
div.full-videotoolsw{ width:100%;}
.context-toggle{ position:absolute; top:100px; left:0px; width:100%; text-align:center; height:50px; line-height:50px; color:#FFF; display:none; z-index:9999; font-size:16px;}
</style>
</head>
<body>
<div class="html5demo">
<video class="video" width="300" height="212" id="video" preload>
</video>
<!--<audio class="video" width="300" height="212" id="video" preload>
<source src="" ></source>
</audio>-->
<div class="videotoolsback"></div>
<div class="videotools">
<span class="play" del="1" title="播放暂停"></span>
<span class="current"></span>
<span class="time-s"></span>
<span class="duration"></span>
<div class="progressBar" title="进程">
<div class="protimeBar"></div>
<div class="timeBar"></div>
</div>
<span class="fullscreen" del="1" title="全屏"></span>
<div class="volumeBar" title="音量">
<div class="volume"></div>
</div>
<span class="muted" del="1" title="静音"></span>
<!--<div class="control">
<span class="ff">快进</span>
<span class="rw">倒带</span>
<span class="sl">快退</span>
</div>-->
</div>
<div class="context-toggle">按 ESC 退出全屏</div>
</div>
<div style=" height:800px;"></div>
</body>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script>
$(function(){
videoPlay("movie.mp4");
function videoPlay(url){
var video=document.getElementById("video");
video.src=url;
var paly=$(".play");
//code
//video.autoplay=true;
//播放暂停
paly.click(function(){
if(paly.attr("del")==1){
video.play();
paly.addClass("pause");
paly.attr("del",0);
}else{
video.pause();
paly.removeClass("pause");
paly.attr("del",1);
}
});
//载入后显示视频文件总时间
video.onloadedmetadata=function(){
var temp_sub=video.duration.toString().substring(0,parseInt(video.duration.toString().indexOf("."))+3).replace(".", ":");
// alert(getCurrentTime(1000*video.duration));
$('.duration').text(getCurrentTime(1000*video.duration));
};
//视频播放时,进度条显示
$('.current').text(getCurrentTime(1000*video.currentTime));
video.ontimeupdate=function(){
var temp_sub=video.currentTime.toString().substring(0,parseInt(video.currentTime.toString().indexOf("."))+3).replace(".", ":");
$('.current').text(getCurrentTime(1000*video.currentTime));
var currentPos = video.currentTime;
var maxduration = video.duration;
var percentage = 100 * currentPos / maxduration;
$(".timeBar").css('left',percentage+'%');
$(".protimeBar").css('width',percentage+'%');
};
//进度条点击
var timeDrag = false;
$('.progressBar').mousedown(function(e) {
timeDrag = true;
updatebar(e.pageX);
});
//页面抬起
$(document).mouseup(function(e) {
if(timeDrag) {
timeDrag = false;
updatebar(e.pageX);
};
if(volumeDrag) {
volumeDrag = false;
updatevolume(e.pageX);
};
});
//页面移动
$(document).mousemove(function(e) {
if(timeDrag) {
updatebar(e.pageX);
};
if(volumeDrag) {
updatevolume(e.pageX);
};
});
//点击进度条跳转方法
var updatebar = function(x) {
var progress = $('.progressBar');
var maxduration = video.duration;
var position = x - progress.offset().left;
var percentage = 100 * position / progress.width();
//点击超出判断
if(percentage > 100) {
percentage = 100;
}
if(percentage < 0) {
percentage = 0;
}
//进度条跳转到点击位置
$('.timeBar').css('left', percentage+'%');
$(".protimeBar").css('width',percentage+'%');
video.currentTime = maxduration * percentage / 100;
};
//缓冲属性,缓存数据的最后一个值.
var startBuffer = function() {
var maxduration = video.duration;
var currentBuffer = video.buffered.end(0);
var percentage = 100 * currentBuffer / maxduration;
$('.bufferBar').css('width', percentage+'%');
if(currentBuffer < maxduration) {
setTimeout(startBuffer, 500);
}
};
setTimeout(startBuffer, 500);
//是否静音
$('.muted').click(function(){
video.muted = !video.muted;
if($(this).attr("del")==1){
$(this).addClass("truemuted");
$(this).attr("del",0);
}else{
$(this).removeClass("truemuted");
$(this).attr("del",1);
};
});
//声音控制
video.volume=0.5;
var volumeDrag = false;
$(".volumeBar").mousedown(function(e){
volumeDrag = true;
updatevolume(e.pageX);
});
//点击声音跳转方法
var updatevolume = function(x) {
var volumeBar= $('.volumeBar');
var position = x - volumeBar.offset().left;
var percentage = 100 * position / volumeBar.width();
//点击超出判断
if(percentage > 100) {
percentage = 100;
}
if(percentage < 0) {
percentage = 0;
}
//进度条跳转到点击位置
$('.volume').css('left', percentage+'%');
video.volume = percentage / 100;
};
//快进/快退 倒带控制
//$('.ff').on('click', function() {
// video.playbackrate = 3;
// });
//
// $('.rw').on('click', function() {
// video.playbackrate = -3;
// });
//
// $('.sl').on('click', function() {
// video.playbackrate = 0.5;
// });
//全屏播放
var winWidth=$(window).width();
var winHeight=$(window).height();
var prossw=winWidth-300;
var vidWidth=$(".html5demo").width();
var vidHeight=$(".html5demo").height();
var vidprossw=$(".progressBar").width();
$(window).resize(function(){
winWidth=$(window).width();
winHeight=$(window).height();
prossw=winWidth-300;
if($('.fullscreen').attr("del")==0){
$(".html5demo,.video").width(winWidth);
$(".html5demo,.video").height(winHeight);
$(".progressBar").width(prossw);
}else{
};
});
$('.fullscreen').click(function(){
if($(this).attr("del")==1){
$(".html5demo").addClass("full-html5demo");
$(".videotoolsback,.videotools").addClass("full-videotoolsw");
$(this).addClass("unfullscreen");
$(".html5demo,.video").width(winWidth);
$(".html5demo,.video").height(winHeight);
$(this).attr("del",0);
$(".progressBar").width(prossw);
$(".context-toggle").show();
setTimeout(function(){$(".context-toggle").hide()},2000);
}else{//unfull
$(".html5demo").removeClass("full-html5demo");
$(".videotoolsback,.videotools").removeClass("full-videotoolsw");
$(this).removeClass("unfullscreen");
$(".html5demo,.video").width(vidWidth);
$(".html5demo,.video").height(vidHeight);
$(this).attr("del",1);
$(".progressBar").width(vidprossw);
$(".context-toggle").hide();
};
//fullScreenCancel(video);
});
//keyunfull
/** Coding Here */
$(window).keydown(function(e){
if (e.which === 27) {
if($('.fullscreen').attr("del")==0){
$(".html5demo").removeClass("full-html5demo");
$(".videotoolsback,.videotools").removeClass("full-videotoolsw");
$('.fullscreen').removeClass("unfullscreen");
$(".html5demo,.video").width(vidWidth);
$(".html5demo,.video").height(vidHeight);
$('.fullscreen').attr("del",1);
$(".progressBar").width(vidprossw);
}
$(".context-toggle").hide();
}
});
//全屏播放方法
//function fullScreenCancel(video){
// if(video.requestFullScreen) {
// video.requestFullScreen();
// } else if(video .webkitRequestFullScreen ) {
// video.webkitRequestFullScreen();
// } else if(video .mozRequestFullScreen) {
// video.mozRequestFullScreen();
// }
// };
};
//从毫秒数得到一个时间格式
function getCurrentTime(ms) {
var s = parseInt(ms / 1000);
var m = parseInt(s / 60);
s -= m * 60;
var h;
h = parseInt(m / 60);
m -= h * 60;
return make2Str(m) + ":" + make2Str(s);
};
//使数字时钟保持两位
function make2Str(i) {
if (i < 10) return "0" + i;
else return "" + i;
};
});
</script>
</html>
14.可拖拽的登陆框
其实拖拽的实现,就是鼠标组合事件的处理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
var drag=$("#drag");
var isd=0;
var elex=0;
var eley=0;
drag.mousedown(function(event){
isd=1;
elex=event.pageX-drag.position().left;
eley=event.pageY-drag.position().top;
event.stopPropagation(); // do something
});
$(document).mousemove(function(event){
if(isd==1){
var evx=event.pageX;
var evy=event.pageY;
var cx=evx-elex;
var cy=evy-eley;
drag.css('left',cx);
drag.css('top',cy);
}else{}
event.stopPropagation(); // do something
});
$(document).mouseup(function(event){
if(isd==1){isd=0;}
isd=0;
event.stopPropagation(); // do something
});
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
</style>
</head>
<body>
<div id="drag" style="width:200px; height:200px; top:200px; left:400px; background:#990; position:absolute; padding:100px;">
登录<input type="text" /><br/>
密码<input type="text" /><br/>
<input type="button" value="ok" />
</div>
</body>
</html>
很简单的处理,不过有个问题,就是可以超出屏幕,我们需要做边界处理,移动事件修改如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
var drag=$("#drag");
var isd=0;
var elex=0;
var eley=0;
drag.mousedown(function(event){
isd=1;
elex=event.pageX-drag.position().left;
eley=event.pageY-drag.position().top;
event.stopPropagation(); // do something
});
$(document).mousemove(function(event){
if(isd==1){
var evx=event.pageX;
var evy=event.pageY;
var cx=evx-elex;
var cy=evy-eley;
if(cx<=0){cx=0;}
if(cx>$(window).width()-400){cx=$(window).width()-400;}
if(cy<=0){cy=0;}
drag.css('left',cx);
drag.css('top',cy);
}else{}
event.stopPropagation(); // do something
});
$(document).mouseup(function(event){
if(isd==1){isd=0;}
isd=0;
event.stopPropagation(); // do something
});
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
</style>
</head>
<body>
<div id="drag" style="width:200px; height:200px; top:200px; left:400px; background:#990; position:absolute; padding:100px;">
登录<input type="text" /><br/>
密码<input type="text" /><br/>
<input type="button" value="ok" />
</div>
</body>
</html>
15.树形菜单效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
$(".boxt li").has("ul").addClass("see")
$(".boxt .con1").hide();
$(".boxt .con2").hide();
$(".boxt .con3").hide();
$(".boxt .d1").first().find("ul").show();
$(".boxt .d1").first().removeClass("see");
$(".boxt .d1").first().find("li").removeClass("see");
//ge2
$(".boxt .d1").has("ul").click(function(){
$(this).children("ul").toggle()
$(this).toggleClass("see")
})
$(".boxt .d2").has("ul").click(function(event){
$(this).children("ul").toggle()
$(this).toggleClass("see")
event.stopPropagation()
})
$(".boxt .d3").has("ul").click(function(event){
$(this).children("ul").toggle()
$(this).toggleClass("see")
event.stopPropagation()
})
//ge3 mao
$(".boxt .d2").click(function(event){
event.stopPropagation()
})
$(".boxt .d3").click(function(event){
event.stopPropagation()
})
$(".boxt .d4").click(function(event){
event.stopPropagation()
})
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
.boxt{width:300px; background:#0CF; margin-top:30px;}
.boxt li{ padding-left:30px; background:#C00; margin:2px 0;}
.boxt div{ height:20px; background:#CF3; line-height:20px;}
.boxt li.see{ background:#03F;}
</style>
</head>
<body>
<ul class="wrapper boxt">
<li class="d1">
<div class="d11">我是一级1</div>
<ul class="con1">
<li class="d2">
<div class="d22">我是二级1</div>
<ul class="con2">
<li class="d3">
<div class="d33">我是三级1</div>
<ul class="con3">
<li class="d4">
<div class="d44">我是四级1</div>
</li>
</ul>
</li>
<li class="d3">
<div class="d33">我是三级2</div>
<ul class="con3">
<li class="d4">
<div class="d44">我是四级1</div>
</li>
<li class="d4">
<div class="d44">我是四级2</div>
</li>
</ul>
</li>
</ul>
</li>
<li class="d2">
<div class="d22">我是二级2</div>
<ul class="con2">
<li class="d3">
<div class="d33">我是三级1</div>
</li>
<li class="d3">
<div class="d33">我是三级2</div>
</li>
</ul>
</li>
<li class="d2">
<div class="d22">我是二级3</div>
</li>
</ul>
</li>
<li class="d1">
<div class="d11">我是一级2</div>
<ul class="con1">
<li class="d2">
<div class="d22">我是二级1</div>
</li>
<li class="d2">
<div>我是二级2</div>
</li>
<li class="d2">
<div class="d22">我是二级3</div>
</li>
</ul>
</li>
<li class="d1">
<div class="d11">我是一级3</div>
</li>
</ul>
</body>
</html>
16.全选/反全选处理
简单实现
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
var all=$("#all");
var boxlists=$("#box").find("input:checkbox");
all.change(function(){
//alert(all.checked)
if(all.is(":checked")){
boxlists.prop('checked',true);
}else{
boxlists.prop('checked',false);
};
});
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
</style>
</head>
<body>
<br>
<div style=" height:50px;"><input type="checkbox" id="all"> 全选</div>
<div style="width:200px; border:1px solid #000;" id="box">
<input type="checkbox"> 1<br><br>
<input type="checkbox"> 2<br><br>
<input type="checkbox"> 3<br><br>
<input type="checkbox"> 4<br><br>
<input type="checkbox"> 5<br><br>
<input type="checkbox"> 6<br><br>
<input type="checkbox"> 7<br><br>
</div>
</body>
</html>
我们实现另一种全选思路。也是树形菜单带有复选框用到的思路
全选后,上面的例子,在去取消被选中的子复选框,发现,全选还是处在选中中,现在,我们的子复选框有一个取消选中,父复选框就取消选中,代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jq插件简单开发</title>
<script type="text/javascript" src="js/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
//start
var all=$("#all");
var boxlists=$("#box").find("input:checkbox");
all.change(function(){
//alert(all.checked)
if(all.is(":checked")){
boxlists.prop('checked',true);
}else{
boxlists.prop('checked',false);
};
});
boxlists.change(function(){
var len=$("#box").find("input:checkbox").length;
var newlen=$("#box").find("input:checkbox:checked").length;
if(newlen!=len){
all.prop('checked',false);
}else{
all.prop('checked',true);
}
});
//end
});
</script>
<style type="text/css">
/*reset*/
*{ padding:0; margin:0}
body{ height: 100%; width: 100%; font-size:12px; color:#333;}
ul{ list-style:none;}
/*demo*/
</style>
</head>
<body>
<br>
<div style=" height:50px;"><input type="checkbox" id="all"> 全选</div>
<div style="width:200px; border:1px solid #000;" id="box">
<input type="checkbox"> 1<br><br>
<input type="checkbox"> 2<br><br>
<input type="checkbox"> 3<br><br>
<input type="checkbox"> 4<br><br>
<input type="checkbox"> 5<br><br>
<input type="checkbox"> 6<br><br>
<input type="checkbox"> 7<br><br>
</div>
</body>
</html>
原理:点击子复选框选择出当前选中的总长度与子复选框个数做长度比较
17.瀑布流效果(未实现)
我说出原理,然后大家自己去写就好了,这个的难度如果把上面的学会了,也是分分钟的了
等宽不等高
定位去排列
我们先拍第一行,加入我们做5列的效果,top都是0,left是width(等宽)*index(第1 2 3 4 5个)就是距离左侧的值
我们创建一个数组,长度是5,等于一行的数量,把第一行的每个高度对应存入,高度1-5是不同的
在数组的五个高度数值中,找出对小的,并且取出他在数组的位置
第2行开始插入,求除了最小高度位置,把第6个元素等位在下面,并且加上新高度,不断求出最小高度值的数组位置,根据位置,去设置top值(高度),和left值(位置)
一次显示5行,我们滚动加载,滚动事件判断,到达底部,继续加载6-10行
jq的就这些原理,我下面写个css3的,真是一行样式就实现了
.box{ width:1000px; margin:50px auto; border:1px solid #000;-moz-columns:300px;
-webkit-columns:300px;
columns:300px;}
</style>
根据总宽度1000px,通过多栏的300px去分配