基礎DOM | children | offset | 表格 | 表單 | BOM 筆記

背景

<ul id="ul">
    <li>001</li>
    <li>002</li>
    <li>003</li>
    <li>004</li>
</ul>

1、childNodes包含文本、元素、属性、等节点;
2、children只包含元素节点

var ul = document.getElementById('ul')
console.log( ul.childNodes.length ) //9
console.log( ul.children.lenght )  //4

// alert(ul.childNodes[0].nodeType)
// alert(ul.attributes.length)
//alert(ul.attributes[0].name)
//alert(ul.attributes[0].value)

使用children,IE7不会包含非法嵌套内容;
兼容写法:first/last/next/prev

var _first = ul.firstElementChild || ul.firstChild;
var _last = ul.lastElementChild || ul.lastChild;
var _next = _first.nextElementSibling || _first.nextSibling;
var _prev = _last.previousElementSibling || _last.previousSibling;

parentNode 无兼容性问题,得到的父节点只有一个;

<ul id="ul">
    <li>001 <a href="javascript:;">DEL</a></li>
    <li>002 <a href="javascript:;">DEL</a></li>
    <li>003 <a href="javascript:;">DEL</a></li>
    <li>004 <a href="javascript:;">DEL</a></li>
</ul>
var a = ul.getElementsByTagName('a')
for(var i=0;i<a.length;i++){
    a[i].onclick = function(){
        this.parentNode.style.display = 'none'
    }
}

offsetParent offsetLeft offsetTop

<div id="div1">
    <div id="div2">
        <div id="div3"></div>
    </div>
</div>
    var div1 = document.getElementById('div1')
    var div2 = document.getElementById('div2')
    var div3 = document.getElementById('div3')
console.log( div3.offsetLeft ) //自身无定位,则指向有定位父级,如果没有定位默认body
//自身有定位,父级无定位,则IE7指向html,其它指向body
//父级设置zoom,IE7指向html,其它指向body
console.log( div2.currentStyle.hasLayout ) //当前元素是否触发layout 
<div id='box' style='width:99px;height:99px;border:1px solid red;'></div>
var box = document.getElementById('box')
console.log( box.style.width )
console.log( box.clientWidth ) //可視區寬度 樣式寬+padding
console.log( box.offsetWidth ) //可視區寬+border

取得元素在頁面上left top方法

function getPos(obj) {
  var pos = { left: 0,top: 0 };
  while (obj) {
    pos.left += obj.offsetLeft;
    pos.top += obj.offsetTop;
    obj = obj.offsetParent;
  }
  return pos;
}
getPos(box).left;
getPos(box).top;

屬性操作
1、obj.attr 無法操作自定義屬性
2、obj['attr'] 無法操作自定義屬性
3、obj.getAttribute(attr) 可操作自定義屬性,如_a = '123'
4、_img.src _img['src'] 返回全鏈接值 _img.getAttribute('src') 返回相對鏈接值,IE7下還是返回全鏈接值

插入刪除
父級.appendChild( 要插入的元素 );
父級.removeChild( 要刪除的元素 );
父級.insertBefore( 新元素,被插入的元素 ) ;即在指定元素前面插入一個新元素;
父級.replaceChild( 新節點,被替換節點 );
obj.cloneNode( true ); 複製節點

兼容getClassName方法

function getClassName(parent, tagName, className) {
  var aEls = parent.getElementsByTagName(tagName)
  var arr = []
  for (var i = 0; i < aEls.length; i++) {
    var aClassName = aEls[i].className.split(' '); //当前classname拆分成数组
    for (var j = 0; j < aClassName.length; j++) {
      if (aClassName[j] == className) { //如果第j个class == classname
        arr.push(aEls[i]) //则把当前第i个class push进来
        break; //如果class='box box'相同名字,找到一个跳出for
      }
    }
  }
  return arr;
}
getClassName(document, 'li', 'box');

兼容addClass方法

function addClass(obj, className) {
  if (obj.className == '') { //原本无
    obj.className = className;
  } 
  else { //原本有
    var arrClassName = obj.className.split(' ');
    var _index = arrIndexOf(arrClassName, className);
    if (_index == - 1) { //不存在
      obj.className += ' ' + className;
    }
  }
}
//判斷一個數組裏是否存在元素
function arrIndexOf(arr, v) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == v) {
      return i; //当前重複的值出现位置
    }
  }
  return - 1;
}

addClass(box, 'box111');

兼容removeClass方法

function removeClass(obj, className) {
  if (obj.className != '') {   //如果有class
    var arrClassName = obj.className.split(' ');
    console.log(arrClassName);
    var _index = arrIndexOf(arrClassName, className);
    if (_index != - 1) {     //如果有需要移除的class
      arrClassName.splice(_index, 1); //删除数组裏需要移除的
      obj.className = arrClassName.join(' ');//再把處理完的數組class給obj
    } 
  }
}
//判斷一個數組裏是否存在元素
function arrIndexOf(arr, v) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == v) {
      return i; //当前重複的值出现位置
    }
  }
  return - 1;
}

removeClass(box, 'box3')

表格基本操作
tHead 表格頭
tHodie 表格正文 複合
tFoot 表格尾
rows 行 複合
cells 列 複合
數據操作:

var tb = document.getElementsTagName('table')[0];
console.log(tb.tBodies[0].rows[0].cells[0].innerHTML)
var data = [  //數組形式存放
    {id: 1, username: 'elos1', sex: '男'},
    {id: 2, username: 'edlo2', sex: '女'},
    {id: 3, username: 'elfo3', sex: '女'},
    {id: 4, username: 'elos4', sex: '男'}
]
for(var i=0;i<data.length;i++){
    var tr = document.createElement('tr'); //創建一行
//隔行變色
    if(i%2 == 0){
        tr.style.background = '#fff';
    }
    else{
        tr.style.background = '#ccc';
    }
    var td = document.createElement('td')//創建一列
    td.innerHTML = data[i].id;//列加內容
    tr.appendChild(td);//append到tr

    var td = document.createElement('td')
    td.innerHTML = data[i].username;
    tr.appendChild(td);

    var td = document.createElement('td')
    td.innerHTML = data[i].sex;
    tr.appendChild(td);

    tb.tBodies[0].appendChild(tr);
}

表單基本操作
重要屬性:name; form.name
onchange:當值發生改變時觸發,IE7下當值發生改變並且焦點離開時觸發
name屬性一個相同為單數,多個相同name則為複數,即[i]下標取值;
checked 選中屬性,都選中則以最後選中為准
onsubmit 提交時觸發
onreset reset時觸發

<form id="form1" action="">
    <input type="text" id="txt1" name="text1" value="內容"/>
    <input type="radio"  name="sex" value="男" checked/> 男
    <input type="radio"  name="sex" value="女" /> 女
</form>
var form = document.getElementById('form1')
console.log(form.text1.value);
    ofrom.sex[0].onchange = function (){
    ...
}
    if( ofrom.sex[i].checked ){
    ...
    }
form.onsubmit = function(){
    if(form.text1.value==''){
    alert('please input something')
    return false; //阻止提交
    }
}
form.onreset = function(){
    return confirm('are you sure to reset') //詢問對話
}

BOM操作
window.open (页面地址url,打开方式)
页面地址url为空,默认打开空页面
打开方式为空,默认新窗口打开,自身:_self

var opener = null;
opener = window.open();
alert( opener = window );
opener.document.body.style.background = 'red'  //新窗口背景为red

window.close() //兼容性,ff无效,ie chrome有效

opener.close();//关闭新窗口,无兼容性;

window.navigator.userAgent 浏览器信息,字符串

if(window.navigator.userAgent.indexOf('.NET') != -1){
    alert('IE')
}else{ alert('NOT IE') }

window.location 用户,浏览器地址信息
window.location.href
window.location.search: url? 问号后面的内容

window.location.hash: url# 后面的内容

可视区大小
document.documentElement.clientWidth;
document.documentElement.clientHeight

滚动距离
document.body.scrollTop / scrollLeft
document.documentElement.scrollTop / scrollLeft

内容高度
document.body.scrollHeight

文档高度
document.documentElement.offsetHeight
document.body.offsetHeight

//可视区宽
alert(document.documentElement.clientWidth)
//可视区大小兼容,chrome认为滚动是body的
var sTop1 = document.body.scrollTop || document.documentElement.scrollTop;
var sTop2 = Math.max(document.body.scrollTop, document.documentElement.scrollTop)
var sTop3 = document.body.scrollTop + document.documentElement.scrollTop
<div id="boxs" style = 'width: 100px;height: 100px;border: 1px solid red ;padding: 10px;margin: 10px;'>
        <div style="width: 100px;height: 200px;background: #000;"></div>  
</div>
//内容高度:抛开边框,外面的padding+内容内容高度,包括父级被撑开的高度,加隐藏内容不加border
alert(document.getElementById('boxs').scrollHeight)
/*
boxs不加overflow:hidden: 210;
boxs + overflow:hidden: 
    chrome: 220
    ff:210
    IE8+ 210
    IE8- 220
    safari 220
    opera  220
*/
alert( document.getElementById('boxs').offsetHeight ) //122  height + padding + border
alert( document.body.offsetHeight ) //142 height + padding + border + margin //如果body取值则需要加上margin

//IE下,body style =" height: 2000px;" 兼容问题,IE取不到
所以获取body内容高时,推荐使用: document.body.offsetHeight;

onscroll 当滚动条滚动时触发
onresize 当窗口大小发生改变时触发

//回到頂部 兼容寫法
var a = document.querySelector('a')
var timer = null;
window.onscroll = function () {
  var Dsroll = document.body.scrollTop || document.documentElement.scrollTop
Dsroll >= 200?a.style.display = 'block':a.style.display = 'none'
  a.onclick = function () {
    var Dsroll = document.body.scrollTop || document.documentElement.scrollTop
    timer = setInterval(function () {
      Dsroll -= 30;
      if (Dsroll <= 0) {
        clearInterval(timer)
      }
      document.body.scrollTop = Dsroll
      document.documentElement.scrollTop = Dsroll
    }, 30)
  }
}

select操作:

<select name="" id="s">
    <option value="0" selected>0</option>
    <option value="100">text文本100</option>
    <option value="200">text文本200</option>
</select>
<p>value是 <span id="sval"></span> text是 <span id="stxt"></span></p>
    var s = document.getElementById('s')
    var sval = document.getElementById('sval');
    var stxt = document.getElementById('stxt');
    s.onchange = function () {
        var sV = s.value;
        var sT = s.options[s.selectedIndex].text;
        sval.innerHTML = sV;
        stxt.innerHTML = sT;
    }

常用css3-持續更新-非深入

例子仅限于chrome

<div class="box"></div>
.box{width:100px;transition:1s width ease;}
.box:hover{width:300px;}


<style>
.box{width:100px;height:100px;background:#467B96;transition:1s width ease;}
.box:hover{width:300px;}
</style>

.box{-webkit-linear-gradient(top left,red 0%,yellow 100%)}


<style>
.box1{width:100px;height:100px;background: -webkit-linear-gradient(top left,red 0%,yellow 100%) ;transition:1s width ease;}
</style>


倒影:box-reflect: above | below | left | right

box-reflect:[倒影方向] [倒影距離] [倒影透明漸變]

-webkit-box-reflect: below 5px -webkit-linear-gradient(top,rgba(255,255,255,0) 0%,rgba(255,255,255,0.6) 100%);


<style>
.box2{width:100px;height:100px;background:#467B96;
-webkit-box-reflect: below 5px -webkit-linear-gradient(top,rgba(255,255,255,0) 0%,rgba(255,255,255,0.6) 100%);}
</style>









transform:rotate(0deg)

.img1{-webkit-transform: rotate(30deg);
        -webkit-transition:1s ease all;}
.img1:hover{-webkit-transform: rotate(360deg); }


<style>
.img1{width:200px;-webkit-transform: rotate(30deg);

    -webkit-transition:1s ease all;}

.img1:hover{-webkit-transform: rotate(360deg); }
</style>


transform:rotateY(0deg)

.img2{-webkit-transform: rotate(0deg);
        -webkit-transition:1s ease all;}
.img2:hover{-webkit-transform: rotateY(360deg); 


<style>
.img2{width:200px;-webkit-transform: rotate(0deg);

    -webkit-transition:1s ease all;}

.img2:hover{-webkit-transform: rotateY(360deg); }
</style>


顯示器中3D效果元素的透視點在顯示器上方(不是後面)perspective屬性,元素父級設置,如大小為1000px,即眼睛離顯示器的距離,子元素會有透視效果,不是元素本身
用戶元素3D空間Z平面之間的距離,其效應由其他值決定,值越小,用戶與3D空間Z平面越近,視覺效果深刻,反之越遠,視覺小

perspective: 0/none 無3D空間

perspective: 越小,3D越明顯,即眼晴越靠近真3D

perspective: 無窮大,與0/none效果一致

.p3{-webkit-perspective:400px;} //眼晴離顯示器的距離 先寫,避免bug ,值越小視覺越誇張,即視頻越遠
.img3{-webkit-transform: rotateY(0deg);transition:5s all ease; //沿Y軸轉
.img3.hover{-webkit-transform: rotateY(360deg)}
 }


<style>
.p3{-webkit-perspective:400px;}
.img3{width:200px;-webkit-transform: rotateY(0deg);transition:5s all ease;}
.img3:hover{-webkit-transform: rotateY(360deg)}
</style>


transform-style: preserve-3d; 有加與無加的區別

<div1 class="wrap">
    <div class="spin">  //border: 1px dashed orange;
        <div class="rotate">  //border: 5px solid yellow;
            <img src="../img/美女4.png" alt="" width="200" />  //border: 1px solid green;
        </div>
    </div>
</div1>

<div class="spin">
    <div class="rotate">
        <img src="../img/美女4.png" alt="" width="200" />
    </div>
</div>


<style>
.wrap {

width: 300px;
height: 200px;
margin: 30px auto;
position: relative;
background-size: 100% 100%;

}
/设置动画/
@keyframes spin{

0%{
    transform:rotateY(0deg)
}
100%{
    transform:rotateY(360deg)
}

}
.spin {

width: 142px;
height: 200px;
position: absolute;
top: 50%;
left: 50%;
margin-left: -72px;
margin-top: -101px;
border: 1px dashed orange;
cursor: pointer;
transform-style: preserve-3d;

}
/调用动画/
.spin:hover{

animation:spin 5s linear infinite;

}
.rotate {

background: url(../img/美女4.png) no-repeat center;
background-size: 100% 100%;
border: 5px solid #EFDF3B;
transform: perspective(200px) rotateY(45deg);

}
.rotate img{

border: 1px solid green;
transform: rotateX(15deg) translateZ(10px);
transform-origin: 0 0 40px;

}
/改变transform-style的默认值/
.three-d {

transform-style: preserve-3d;

}
</style>
加transform-style: preserve-3d;之後加class="rotate three-d"

<div class="spin">
    <div class="rotate three-d">
        <img src="../img/美女4.png" alt="" width="200" />
    </div>
</div>


-webkit-transform:translateX(0px);位移


<style>
.p4{-webkit-perspective:400px;}
.img4{width:200px;-webkit-transform: translateX(0);transition:3s all ease;}
.img4:hover{-webkit-transform: translateX(200px)}
</style>
-webkit-transform: translateY(0)類似
-webkit-transform:translateZ(0px);位移,Z軸相當於垂直電腦屏幕,電腦屏幕打個釘子;
數值越大離得越近,近大遠小原則;

.p5{-webkit-perspective:400px;}
.img5{width:200px;-webkit-transform: translateZ(0);transition:3s all ease;}
.img5:hover{-webkit-transform: translateZ(200px)}




<style>
.p5{-webkit-perspective:400px;}
.img5{width:200px;-webkit-transform: translateZ(0);transition:3s all ease;}
.img5:hover{-webkit-transform: translateZ(200px)}
</style>


理解perspective-origin,默認值:perspective-origin:50% 50%,如 perspective-origin:top left表示眼睛在文體元素的左上角看元素,下面的圖解析
</p
1、

http://codepen.io/HugoGiraudel/pen/jpnsH


2、

http://codepen.io/HugoGiraudel/pen/dhBlC



animation @keyframes


animation-name: 動畫默認none;

animation-duration:動畫持續時間;

animation-timing-function:動畫過度類型

linear:線性<br />
ease:平滑<br />
ease-in:由慢到快<br />
ease-out:由快到慢<br />
ease-in-out:由慢到快再到慢<br />
cubic-bezier(number, number, number, number):特定的贝塞尔曲线类型,number 在 [0, 1] 区间内取值<br />

animation-delay:動畫延遲時間

animation-iteration-count:動畫循環次數,正整數或 infinite 無限循環,默認 1

animation-direction:循環中是否執行往返運動,normal正向,alternate 交替 默認normal

animation-play-state:動畫狀態,默認running,如paused暫停,不建議使用

以上这些参数都可以同时赋予多个值,只要注意各参数顺序对应即可


最簡單例子:

#demo1{
animation-name:move;    /*必須*/
animation-duration:3s;  /*必須*/  
animation-iteration-count:1
}
@-webkit-keyframes move {    /*必須*/  
  from { left:0 }
  to { left:500px }
}


<style>

demo1{width: 99px;height: 99px;background: #467B96;position: relative; animation-name:move;animation-duration:3s;animation-iteration-count:1}

@-webkit-keyframes move {
from { left:0 }
to { left:500px }
}
</style>

#demo {
    animation-name: animation1, animation2;    /* 指定动画名称 */
    animation-duration: 2s 1s;    /* 指定动画时长 */
}

以上同時獲得兩個動畫事件,具體過程由@keyframes指定

#demo {
    animation-name: animation1;
    animation-duration: 2s;
    animation-timing-function: linear; 
}
@keyframes animation1{
    from{opacity: 0; }
    to{opacity: 1; }
}

一個超贊的效果:

<h1>hi,man</h1>

<style>
.circle{background:#fff;border-radius:100%;cursor:pointer;position:relative;margin:0 auto;width:15em;height:15em;overflow:hidden;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.circle h1{color:rgba(189,185,199,0);font-family:Lato,sans-serif;font-weight:900;font-size:1.6em;line-height:8.2em;text-align:center;text-transform:uppercase;-webkit-font-smoothing:antialiased;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:color .8s ease-in-out;-moz-transition:color .8s ease-in-out;-ms-transition:color .8s ease-in-out;transition:color .8s ease-in-out}.circle:after,.circle:before{border-radius:100%;content:"";position:absolute;top:0;left:0;width:inherit;height:inherit;box-shadow:inset 10.6em 0 0 rgba(30,140,209,.2),inset 0 10.6em 0 rgba(30,140,209,.2),inset -10.6em 0 0 rgba(30,140,209,.2),inset 0 -10.6em 0 rgba(30,140,209,.2);-webkit-transition:box-shadow .75s;-moz-transition:box-shadow .75s;-ms-transition:box-shadow .75s;transition:box-shadow .75s}.circle:after{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);transform:rotate(45deg)}.circle:hover:after,.circle:hover:before{box-shadow:inset .86em 0 0 rgba(255,0,0,.5),inset 0 .86em 0 rgba(252,150,0,.5),inset -.86em 0 0 rgba(0,255,0,.5),inset 0 -.86em 0 rgba(0,150,255,.5)}.circle:hover>h1{color:rgba(185,185,185,1)}
</style>

css3條紋背景

 background-color: #313131;
    background-image: -webkit-gradient(linear, 0 0, 100% 100%,
    color-stop(.25, rgba(255, 255, 255, .2)), color-stop(.25, transparent),
    color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .2)),
    color-stop(.75, rgba(255, 255, 255, .2)), color-stop(.75, transparent),
    to(transparent));
    background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
    transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
    transparent 75%, transparent);
    background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
    transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
    transparent 75%, transparent);
    background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
    transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
    transparent 75%, transparent);

    -webkit-background-size: 4px 4px;
    -moz-background-size: 4px 4px;
    background-size: 4px 4px; /* 控制条纹的大小 */