发现今天居然没有要写,那我就写写之前做的笔记吧。
这是事件的深入:
拖拽逻辑:
第一个: onmousedown : 选择元素
第二个: onmousemove : 移动元素
第三个:onmouseup : 释放元素
各浏览器在拖拽上都有问题;就是选中文字,就会产生问题
原因:当鼠标按下的时候选中文字就可以拖拽文字,这是浏览器的默认行为;
解决:阻止默认行为 -》在onmousedown时return false;
ie8以下无效;
ie8以下 :
obj.setCapture(); 设置全局捕获,当我们给一个元素设置全局捕获以后,
那么这个意思就会监听后续触发生的所有事件,当有事件发生时候,就会被当前设置
了全局捕获的元素所触发
ie: 有,且效果
ff:有,但没有效果
非标准下ie :
obj.setCapture(); 可以是只执行目标函数,实现到不自动选中文字
//只执行一次,要不在函数里被调用会出现不断执行的怪事。
执行当前对象的所有的事件函数的一次,无论事件在哪被执行。
对应的释放全局捕获
obj.releaseCapture();
可以使用其来在ie里阻止默认行为
碰撞检测
在web里是没有真正的碰撞的;只是边界的重合检测
九宫格的思路方式,检测边界重合
排除不能重合的情况 使用或 ||
每日一推:
作业题:
在做时想到看到一个事情,就是都是运动,那能不能把运动都封装起来了,所以就做了个运动的封装。
运动代码:
/*使用调用,obj对象,attr属性,speed速度,想达到的值,回调函数*/
/*因为运动基本都是px为单位的,至于透明度是没有单位,所以在这里把它分开了,
其实也没有怎么改,就是判断是不是透明度这个属性,然后走透明度这条线
*/
function doMove(obj,attr,speed,iTarget,fn){
if(attr=="opacity"){
obj.len=iTarget-parseFloat(getStyle(obj,"opacity"))*100;
}else{
obj.len=iTarget-parseFloat(getStyle(obj,attr));
}
/*这里判断方向,在初始点后的为负数,在初始点前为正数*/
speed=obj.len>0?speed:-speed; clearInterval(obj.timer);
obj.timer=setInterval(function(){
if(!obj.num){
obj.num=0;
}
if(attr=="opacity"){
obj.num=parseFloat(getStyle(obj,attr))*100+speed;
}else{
obj.num=parseInt(getStyle(obj,attr))+speed;
}
/*这里是判断到了目标点没有,到了就停止定时器*/
if(obj.num>=iTarget && obj.len>0 || obj.num<=iTarget && obj.len<0){
obj.num=iTarget;
clearInterval(obj.timer);
fn && fn();
}
if(attr=="opacity"){
obj.style[attr]=obj.num/100;
}else{
obj.style[attr]=obj.num+"px";
}
},30); }
/*获取css属性值的,会获取表现出现的值*/
function getStyle(obj,attr){
return obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj)[attr];
}
后面题目的运动都是套用这个运动代码的。
第一题:
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
#imgBox{
list-style: none;
padding: 0;
margin: 0;
overflow: hidden;
}
#imgBox li{
position: relative;
float: left;
width: 400px;
height: 285px;
margin-left: 10px;
margin-top: 10px;
overflow: hidden;
opacity: 1;
}
#imgBox li img {
width: 400px;
height: 285px;
}
#imgBox li p{
position: absolute;
top: 45%;
left: -125px;
font-size: 20px;
width: 120px;
text-align: center;
line-height: 40px;
border:2px solid #ff7600;
background: rgba(0,0,0,0.6);
color: #fff;
font-weight: bold;
border-radius: 15px;
z-index: 5;
}
#imgBox li .mask,#imgBox li .Bubble{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
#imgBox li .Bubble{
z-index: 10;
}
#imgBox li .mask{
background: #000;
opacity: 0;
filter: alpha(opacity:40);
}
</style>
<script type="text/javascript" src="doMove.js"></script>
<script type="text/javascript"> window.onload=function(){
var aLi=document.getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
start(i);
}
} /*写成页面小组件,然后循环套用即可,index就是下标,只要获取li的下标
传参进出,就可以了
*/ function start(index){
var aLi=document.getElementsByTagName("li");
var oMask=aLi[index].querySelector(".mask");
var oP=aLi[index].querySelector(".text");
var oBubble=aLi[index].querySelector(".Bubble");
var w=aLi[index].offsetWidth;
var w1=w-oP.offsetWidth;
oBubble.onmouseover=function(){
oP.style.display="block";
oP.style.left=-oP.offsetWidth+'px';
doMove(oMask,"opacity",4,40);
doMove(oP,"left",10,w1);
}
oBubble.onmouseout=function(){
doMove(oMask,"opacity",4,0);
if(parseInt(oP.style.left)<w1){
oP.style.left=-oP.offsetWidth+'px';
oP.style.display="none";
}else{
doMove(oP,"left",10,w);
}
}
} </script>
</head>
<body>
<ul id="imgBox">
<li><img src="./img/1.jpg" alt=""><p class="text">dessert</p><div class="mask"></div><div class="Bubble"></div></li>
<li><img src="./img/2.jpeg" alt=""><p class="text">dessert</p><div class="mask"></div><div class="Bubble"></div></li>
<li><img src="./img/3.jpg" alt=""><p class="text">dessert</p><div class="mask"></div><div class="Bubble"></div></li>
<li><img src="./img/4.jpg" alt=""><p class="text">dessert</p><div class="mask"></div><div class="Bubble"></div></li>
<li><img src="./img/5.jpg" alt=""><p class="text">dessert</p><div class="mask"></div><div class="Bubble"></div></li>
<li><img src="./img/6.jpeg" alt=""><p class="text">dessert</p><div class="mask"></div><div class="Bubble"></div></li>
</ul>
</body>
</html>
第二题:
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>海贼王</title>
<!-- 这是基于html5做的,使用了HTML5里的disabled这个属性 -->
<script type="text/javascript" src="doMove.js"></script>
<script type="text/javascript">
window.onload=function(){
/*获取最外层的盒子,指的是包着这些内容,自己定义的盒子*/
var oImgBox=document.querySelector(".imgBox");
/*调用函数*/
pull(oImgBox); } function pull(obj){
/*默认速度,慢*/
var speed=1;
/*获取元素*/
var oBtn=obj.querySelectorAll(".btnG input[type='button']"),
oImg=obj.querySelector("img"),
oMask=obj.querySelector(".mask"),
aBtn=obj.querySelectorAll(".speed-btnG input[type='button']"),
aCount=obj.querySelectorAll(".count span"),
/*获取遮罩层初始高度*/
dh=oMask.offsetHeight,
/*获取图片高度*/
h=oImg.offsetHeight;
/*设置空变量预备装定时器(每个定时器都有一个id,而定时器返回的值就是这个id)*/
obj.timer=null;
/*获取图片高度,返回到页面的显示出来*/
aCount[1].innerHTML=h;
/*开档,快中慢*/
for(var i=0;i<aBtn.length;i++){
aBtn[i].index=i;
aBtn[i].onclick=function(){
speed=1;
for(var j=0;j<this.index;j++){
speed+=5;
}
}
}
/*开定时器是为了监听高度的变化,然后把高度返回到页面*/
clearInterval(obj.timer);
obj.timer=setInterval(function(){
obj.h1=parseInt(getStyle(oMask,"height"));
if(obj.h){
if(obj.h==obj.h1){
aCount[0].innerHTML=obj.h;
}else{
obj.h=obj.h1;
}
}else{
obj.h=obj.h1;
}
},10);
/*点击打开的点击事件*/
oBtn[0].onclick=function(){
this.disabled=true;
oBtn[1].disabled="";
doMove(oMask,"height",speed,h);
}
/*点击关闭的点击事件*/
oBtn[1].onclick=function(){
this.disabled=true;
oBtn[0].disabled="";
doMove(oMask,"height",speed,dh);
}
}
</script>
<style>
#container{
margin: 0 auto;
border:1px solid #888;
padding: 10px;
width: 300px;
}
#container .imgBox{
position: relative;
}
#container .count{
position: absolute;
top: 0;
left: 125px;
margin: 0;
z-index: 10;
color: #778899;
}
#container img{
width: 300px;
height: 500px;
display: block;
}
#container .mask{
position: absolute;
bottom: 0;
left: 0;
background: #fff;
width: 100%;
height: 35px;
}
#container .btnG{
position: absolute;
top: 20px;
left: 105px;
}
.speed-btnG{
position: absolute;
bottom: -45px;
left: 35%;
}
</style>
</head>
<body>
<div id="container">
<div class="imgBox">
<p class="count"><span>100</span>/<span>500</span></p>
<img src="./img/hzw.jpg" alt="">
<div class="mask">
<div class="btnG">
<input type="button" value="打开">
<input type="button" value="关闭" disabled>
</div>
</div>
<div class="speed-btnG">
<input type="button" value="慢">
<input type="button" value="中">
<input type="button" value="快">
</div>
</div>
</div>
</body>
</html>
第三题:
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>颜色表</title>
<script type="text/javascript">
window.onload=function(){
/*create(第一个参数,第二个参数)
*第一个参数:表格的宽度
*第二个参数:颜色的数量(这个数量是(255/参数)向上取整后得到的数字num
,然后这个数字三次方得到的值就是颜色数量了)
不过由于最后一行如果不能形成一行的宽度,就会删除掉这行,所以表现出来的
颜色数量很可能会少一些
*/ // 调用函数,传入参数,实现一步到位颜色表喔~~
// 妈妈再也不担心重复操作出错了
create(40,40); }
/*创建表格,和别的元素*/
function create(len,amount){
var table=document.createElement("table");
var p1=document.createElement("p");
var p2=document.createElement("p");
var num=0;
var count=Math.floor(colorBox(amount).length/len);
table.id="color-table";
p1.className="color-code";
p2.className="color-code";
p1.innerHTML="颜色代码:RGB(0,0,0)";
p2.innerHTML="颜色代码:#000000";
for(var i=0;i<count;i++){
var tr=document.createElement("tr");
for(var j=0;j<len;j++){
var td=document.createElement("td");
td.index=++num;
td.style.background="rgb("+colorBox(amount)[num]+")";
td.onclick=function(){
document.body.style.background="rgb("+colorBox(amount)[this.index]+")";
var arr=colorBox(amount)[this.index].split(",");
for(var i=0;i<arr.length;i++){
arr[i]=Number(arr[i]).toString(16);
if(arr[i].length<2){
arr[i]="0"+arr[i];
}
} p1.innerHTML="颜色代码:RGB("+colorBox(amount)[this.index]+")";
p2.innerHTML="颜色代码:#"+arr.join("");
}
tr.appendChild(td);
}
table.appendChild(tr);
}
document.body.appendChild(table);
document.body.appendChild(p1);
document.body.appendChild(p2);
} /*颜色代码数据的存储*/
function colorBox(num){
var box=[];
for(var i=0;i<=255;i+=num){
for(var j=0;j<=255;j+=num){
for(var z=0;z<=255;z+=num){
box.push(i+","+j+","+z);
}
}
}
return box;
} </script>
<style>
h1{
width: 100px;
margin: 0 auto;
}
#color-table{
margin: 0 auto;
}
td{
display: inline-block;
margin: 2px;
cursor: pointer;
border:1px solid #000;
width: 10px;
height: 10px;
padding: 5px;
}
.color-code{
width: 330px;
margin: 20px auto 0;
font-weight: bold;
background: #fff;
height: 30px;
color: #00BFFF;
text-align: center;
font-size: 20px;
line-height: 30px;
border-radius: 20px;
}
</style>
</head>
<body>
<h1>颜色表</h1>
</body>
</html>