2013年7月

常用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; /* 控制条纹的大小 */

新浪圍脖登入

連接觸發兼容

if(ie){
this.inp.onpropertychange = function(){}
}
else{
this.inp.oninput = function(){}
}

定義方法:

function Suggset(){
this.inp = document.getElementById('input1')
...
}

定義原型:

Suggset.prototype = {
init:function(){}, //初始化
toChange:function(){}, //主方法
showul:function(){}, //顯示ul方法
toBlur:function (){}, //光標離開時隱藏方法
tips:function(){}, //動態提示方法,即顯示ul篩選
sel:function(){} //選中方法,鼠標及鍵盤
}

正則

var re = new RegExp('@' + value.substring(value.indexOf('@') + 1)); 
//带@判断 匹配@,截取@后面的,即從帶@的位置indexOf開始後1位,使用substring方法截取
re.test(String) //調用

自定義屬性,如果為空,返回false

var email = this.li[i].getAttribute('email') //获取自定义标签email
if(!email)

選擇用onmousedown,非onclick~!
其他:特別注意this指向問題~!
佈局

<div id="box">
<div class="detail">
        <input type="text" id="input1" placeholder="郵箱/會員賬號/手機號" autocomplete="off" node-type="loginname" class="name" tabindex="1" name="loginname"/>
    </div>
    <div class="detail">
        <input type="password" id="password" maxlength="24" placeholder="請輸入密碼" node-type="password" class="pass" tabindex="2" name="password"/>
    </div>
    <ul id="suggest">
        <li class="note">請選擇郵箱類型</li>
        <li email="" class="item"></li>
        <li email="@sina.com" class="item">@sina.com</li>
        <li email="@163.com" class="item">@163.com</li>
        <li email="@sohu.com" class="item">@sohu.com</li>
        <li email="@qq.com" class="item">@qq.com</li>
        <li email="@hotmail.com" class="item">@hotmail.com</li>
        <li email="@gmail.com" class="item">@gmail.com</li>
        <li email="@yahoo.com" class="item">@yahoo.com</li>
        <li email="@139.com" class="item">@139.com</li>
        <li email="@126.com" class="item">@126.com</li>
        <li email="@189.com" class="item">@189.com</li>
        <li email="@vip.qq.com" class="item">@vip.qq.com</li>
    </ul>
</div>
window.onload = function () {
    var s1 = new Suggset();
    s1.init()
}
function Suggset() {
    this.inp = document.getElementById('input1')
    this.ul = document.getElementById('suggest')
    this.li = this.ul.getElementsByTagName('li')
}
Suggset.prototype = {
    init: function () {
        this.toChange()
        this.toBlur();
    },
    toChange: function () {
        //ie:onpropertychange
        //標準:oninput
        var ie = !-[1,
        ]; //ie兼容
        var This = this;
        if (ie) {
            this.inp.onpropertychange = function () {
                if (This.inp.value == '') {
                    This.tips();
                    return
                } //IE下最后一个字母有问题,需要先This.tips(),再return
                else {
                    This.showul(); //注意不能写this.showul() this指  IE8下,onpropertychange打開即會觸發
                    This.tips();
                    This.sel(1);
                }
            }
        }
        else {
            this.inp.oninput = function () {
                This.showul(); //this.showul()
                This.tips();
                This.sel(1);//第一個li特殊處理
            }
        }
    },
    showul: function () {
        this.ul.style.display = 'block';
    },
    toBlur: function () { //光標離開時隱藏
        var This = this
        this.inp.onblur = function () {
            This.ul.style.display = 'none';
        }
    },
    tips: function () {
        var value = this.inp.value;
        var re = new RegExp('@' + value.substring(value.indexOf('@') + 1)); //带@判断 匹配@,截取@后面的
        for (var i = 1; i < this.li.length; i++) { //输入完后清空再输无法再显示,须在if前先全部显示出来!为
            this.li[i].style.display = 'block'
        }
        if (re.test(value)) {
            for (var i = 1; i < this.li.length; i++) {
                var email = this.li[i].getAttribute('email') //获取自定义标签email
                if (i == 1) {
                    this.li[i].innerHTML = value
                }
                else {
                    if (re.test(email)) {
                        this.li[i].style.display = 'block'
                    }
                    else {
                        this.li[i].style.display = 'none'
                    }
                }
            }
        }
        else {
            for (var i = 1; i < this.li.length; i++) {
                var email = this.li[i].getAttribute('email') //获取自定义标签email
                if (!email) { //如果没有自定义标签,即为空
                    this.li[i].innerHTML = value;
                }
                else {
                    this.li[i].innerHTML = value + email;
                }
            }
        }
    },
    sel: function (iNow) { //選中的方法,傳iNow進去
        var This = this
        for (var i = 1; i < this.li.length; i++) { //先還原,才不會出現第一個on與下面兩個同時出現
            this.li[i].className = 'item'
        }
        if (this.inp.value == '') {
            this.li[iNow].className = 'item'
        }
        else {
            this.li[iNow].className = 'on'
        }
        for (var i = 1; i < this.li.length; i++) {
            this.li[i].index = i
            this.li[i].onmouseover = function () {
                for (var i = 1; i < This.li.length; i++) { //再做循環還原class //this有問題
                    This.li[i].className = 'item' //this有問題 []此處的this應該指向父級,This.li[i].className
                }
                this.className = 'on' //當前選中加on //this 正確
                iNow = this.index //如果選到中間,鍵盤控制須在中間開始,所以iNow = this.index;
            }
            this.li[i].onmousedown = function () {
                This.inp.value = this.innerHTML
            }
        }
        this.inp.onkeydown = function (ev) {
            var ev = ev || event //獲取鍵值,
            if (ev.keyCode == 38) {//上
                if (iNow == 1) { //鍵盤控制第一個時返回最後一個
                    iNow = This.li.length - 1;
                }
                else {
                    iNow--;
                }
                for (var i = 1; i < This.li.length; i++) { //再做循環還原class //this有問題
                    This.li[i].className = 'item' //this有問題 []此處的this應該指向父級,This.li[i].className
                }
                This.li[iNow].className = 'on'
            }
            else if (ev.keyCode == 40) {  //下
                if (iNow == This.li.length - 1) { //鍵盤控制到最後一個時返回 == 1
                    iNow = 1;
                }
                else {
                    iNow++;
                }
                for (var i = 1; i < This.li.length; i++) { //再做循環還原class //this有問題
                    This.li[i].className = 'item' //this有問題 []此處的this應該指向父級,This.li[i].className
                }
                This.li[iNow].className = 'on'
            }
            else if (ev.keyCode == 13) { //回車
                This.inp.value = This.li[iNow].innerHTML; //當前選擇
                This.inp.onblur();
            }
        }
    }
};

運行

延遲菜單

獲取class兼容方法:

    function getByClass(oParent, sClass) {
        var aEle = oParent.getElementsByTagName('*');
        var result = [] //最后返回数组
        var re = new RegExp('\\b' + sClass + '\\b', 'i');//正则对象
        for (var i = 0; i < aEle.length; i++) {
            if (re.test(aEle[i].className)) {
                result.push(aEle[i])
            }
        }
        return result;
    }

js代碼:

window.onload = function(){
    var ul = document.getElementsByTagName('ul')[0]
    var a = getByClass(document, 'normal')
    var span1 = getByClass(document, 'float_layer');
    var timer = null;
    for (var i = 0; i < a.length; i++) {
        a[i].index = i;
        a[i].onmouseover = function () { //移到a.normal
            for (var i = 0; i < a.length; i++) { //清除所有顯示
                span1[i].style.display = 'none'
            }
            span1[this.index].style.display = 'block' //當前顯示
            clearInterval(timer) //在a.normal上也須清除定時器
        }
        a[i].onmouseout = function () { //移開a.normal
            var This = this
            timer = setTimeout(function () {
                span1[This.index].style.display = 'none' //this指setTimeout的對象window,改變this指向
            }, 1000)
        }
        span1[i].onmouseover = function () { //在span.float_layer也顯示,所以需要清除timer
            clearInterval(timer)
        }
        span1[i].onmouseout = function () { //離開span.float_layer,消失
            var This = this;
            timer = setTimeout(function () {
                This.style.display = 'none'
            }, 1000)
        }
    }
}

運行

CSS-Reset

html,body,h1,h2,h3,h4,h5,h6,hr,p,iframe,dl,dd,ul,ol,li,pre,form,fieldset,button,input,textarea,th,td{margin: 0;padding: 0}
html{background-color: #FFF}
body,button,input,select,textarea,fieldset,label{font: 12px/1.5 "Lucida Grande",tahoma,arial,\5b8b\4f53;-ms-overflow-style:scrollbar}
h1,h2,h3,h4,h5,h6{font-size: 100%}
ul,ol,menu{list-style: none}
fieldset,img{border: 0 none}
img{-ms-interpolation-mode: bicubic}
img,input,textarea,button,select{vertical-align:middle}
i,em,optgroup,address,cite{font-style: normal}
table{border-collapse: collapse;border-spacing: 0}
caption,th{text-align:inherit}
input,select,textarea,button{font-size: 100%;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box}
article,aside,footer,header,section,nav,figure,figcaption,hgroup,details,menu{display:block}
audio,canvas,video{display:inline-block;*display:inline;*zoom:1}
input,textarea,button,select,a{outline:0 none}
button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}
button,input[type=button],input[type=submit]{cursor: pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=search]{-webkit-appearance: textfield}
textarea{overflow-y: auto;resize: vertical}
sup,sub{vertical-align:baseline}
a{color: #333;text-decoration: none}
a:hover{text-decoration: underline}
.clearfix{zoom: 1}
.clearfix:after{content: ' ';display: block;clear: both;height: 0;visibility: hidden}

精簡版

html,body,h1,h2,h3,h4,h5,h6,hr,p,iframe,dl,dd,ul,ol,li,pre,form,fieldset,button,input,textarea,th,td{margin: 0;padding: 0}
body,button,input,select,textarea,fieldset,label{font: 12px/1.5 "Lucida Grande",tahoma,arial,\5b8b\4f53;}
h1,h2,h3,h4,h5,h6{font-size: 100%}
ul,ol{list-style: none}
fieldset,img{border: 0 none}
img,input,textarea,button,select{vertical-align:middle}
i,em{font-style: normal}
table{border-collapse: collapse;border-spacing: 0}
caption,th{text-align:inherit}
input,select,textarea,button{font-size: 100%;outline:0 none}
button,input[type=button],input[type=submit]{cursor: pointer}
textarea{overflow-y: auto;resize: vertical}
sup,sub{vertical-align:baseline}
a:hover{text-decoration: underline}
.clearfix{zoom: 1}
.clearfix:after{content: ' ';display: block;clear: both;height: 0;visibility: hidden}

新浪圍脖分享

選中文字方法

    function selectText() {
        if (document.selection) { //IE
            return document.selection.createRange().text;//字符串
        }
        else {
            return window.getSelection().toString(); //getSelection()對象,需轉成字符串
        }
    }

阻止冒泡方法

function (ev) {
    ev = ev || event
    if(ev.stopPropagation){
        ev.stopPropagation();
    }
    else{
        ev.cancelBubble = true;
    }
}

完整例子

window.onload = function () {
    //選中文字方法
    function selectText() {
        if (document.selection) { //IE
            return document.selection.createRange().text;//字符串
        }
        else {
            return window.getSelection().toString(); //getSelection()對象,需轉成字符串
        }
    }

    var p = document.getElementById('p1')
    var img = document.getElementById('img')
    p.onmouseup = function (ev) {
        var ev = ev || event
        var left = ev.clientX;
        var top = ev.clientY;
        ev.stopPropagation()
        if (selectText().length > 10) {
            setTimeout(function () {  //延遲觸發
                img.style.display = 'block'
                img.style.left = left + 'px'
                img.style.top = top + 'px'
            }, 100)
        }
        else {
            img.style.display = ''
        }
    }
    p.onclick = function (ev) {
        var ev = ev || event;
        ev.cancelBubble = true
        /*if(ev.stopPropagation){
         ev.stopPropagation()
         }
         else{
         ev.cancelBubble = true;
         } //低版本可能需要兼容*/
    }
    document.onclick = function () {
        img.style.display = ''
    }
    img.onclick = function () {
        window.location.href = 'http://service.weibo.com/share/share.php?searchPic=false&title=' + selectText() + '&url=' + window.location.href;
    }
}

運行

元素無縫切換

關注點:
cloneNode(true); 子節點所有節點一起複製;
cloneNode(false);不複製子節點下的內容;
思想:移動ul,動態設置ul寬度li.length oneSize,移動ul的距離-iNow oneSize; 每個li的寬度:元素.offsetWidth+1;循環ul.removeChild(元素),一個個刪除,所以總是刪除第一個;
簡陋佈局

<div id="box">
    <ul id="ul">
        <li><div>1</div></li>
        <li><div>2</div></li>
        <li><div>3</div></li>
        <li><div>4</div></li>
        <li><div>5</div></li>
    </ul>
</div>
<input type="button" value="切換" id="input1"/>
window.onload = function () {
    var inp = document.getElementById('input1')
    var box = document.getElementById('box')
    var ul = document.getElementById('ul')
    var li = ul.getElementsByTagName('li')
    var oneSize = li[0].offsetWidth + 1; //li寬度
    var iNum = 4; //一次走多少個元素
    var onoff = true;//連續點擊錯亂bug
    getWidth()
    function getWidth() { //獲取ul寬度方法
        ul.style.width = li.length * oneSize + 'px'
    }
    inp.onclick = function () {
        //cloneNode(),cloneNode(true) 一起複製子節點,cloneNode(false),不會複製子節點
        if (onoff) {
            onoff = false; //一上來 false
            for (var i = 0; i < iNum; i++) {
                var oli = li[i].cloneNode(true);
                ul.appendChild(oli)
                getWidth()
            }
            startMove(ul, {left: -iNum * oneSize}, function () { //運動結束後再刪除前面的,才能循環
                for (var i = 0; i < iNum; i++) {
                    ul.removeChild(li[0]); //刪除
                    ul.style.left = '0'
                }
                onoff = true  //運動線束後可點擊,onoff = true;
            })
        }
    }
}

運行

圍脖登入框

關注點:
onchange事件:光標消失時觸發1次
onpropertychange事件:連續觸發,IE下使用
oninput事件:連續觸發,現代下使用
判斷ie簡短方法:

var ie = !-[1,] //IE9已修復

推薦:

if(!window.VBArray){
    alert('Not IE')
}
else{
    alert('IE')
}

閃動背景:開定時器,var iNum = 0; iNum++
單字節變雙字節[計數]
return String(str).replace(/1/g, 'aa').length;

簡陋佈局:

<div id="box">
    <p>《新浪圍脖社區公約徵求意見》意見徵求</p>
    <textarea name="" id="" cols="30" rows="10"></textarea>
    <a class="dis" href="javascript:;">發布</a>
</div>
window.onload = function () {
    var box = document.getElementById('box');
    var p = box.getElementsByTagName('p')[0];
    var t = box.getElementsByTagName('textarea')[0];
    var a = box.getElementsByTagName('a')[0];
    var onoff = true;//開關焦點進來離開
    var ie = !-[1,];//簡短判斷ie
    var timer = null;//背景閃動定義
    var iNum = 0;//背景閃動定義
    t.onfocus = function () {
        if (onoff) {
            p.innerHTML = '打擊虛假信息,建設文明圍脖,還可輸入<span>140</span>字'
            onoff = false;
        }
    };
    t.onblur = function () {
        if (t.value == '') {
            p.innerHTML = '《新浪圍脖社區公約徵求意見》意見徵求'
            onoff = true;
        }
    }
    if (ie) {
        t.onpropertychange = toChange;
    }
    else {
        t.oninput = toChange;
    }
    function toChange() {
        var num = Math.ceil(getLength(t.value) / 2);//找到字數
        var span = box.getElementsByTagName('span')[0]
        if (num < 140) {
            span.innerHTML = 140 - num;
        }
        else {
            span.innerHTML = num - 140;
            span.style.color = 'red'
        }
        if (t.value == '' || num > 140) {
            a.className = 'dis'
        }
        else {
            a.className = ''
        }
    }
    a.onclick = function () {
        if (this.className == 'dis') {
            //閃動,定時器運動1s
            clearInterval(timer)
            timer = setInterval(function () {
                if (iNum == 4) { //走兩輸即可
                    clearInterval(timer)
                    iNum = 0;
                }
                else {
                    iNum++;
                }
                if (iNum % 2) { //1
                    t.style.background = 'rgb(255, 215, 215)'
                }
                else { //0
                    t.style.background = ''
                }
            }, 100)
        }
        else {
            alert('發布成功')
        }
    }
    function getLength(str) { //判斷單字節,0-255 使用 x = xx 記2字節
        return String(str).replace(/[^\x00-\xff]/g, 'aa').length; //aa轉為2字節
    }
}
body{font-size:12px}#box{width:400px;margin:20px auto}#box textarea{width:400px;height:100px;resize:none;overflow:hidden}#box p{float:right}#box a{width:80px;height:30px;font-size:16px;line-height:30px;text-align:center;float:right;background:#049E04;color:#fff;text-decoration:none;margin-right:-6px;margin-top:10px}#box a.dis{background:#ccc;color:#666}

運行


  1. x00-xff

基礎進度條

通用html代碼

<div id="box">
    <div id="boxBar">0%</div>
    <div id="boxText">0%</div>
</div>

通用方法

    function progressFn(cent) { //cent傳百分比
        var box = document.getElementById('box')
        var box2 = document.getElementById('box2');
        var boxBar = document.getElementById('boxBar')
        var boxText = document.getElementById('boxText')
        var allWidth = parseInt(getStyle(box, 'width')); //500
        boxBar.innerHTML = cent + '%'
        boxText.innerHTML = cent + '%'
        boxBar.style.clip = 'rect(0px,' + (cent / 100) * allWidth + 'px,40px,0px)';//改變第一層的寬度
    }

通用css

    #box{ width: 500px; height: 40px; border: 1px solid #c8c8c8; background: #fff; position: relative; margin-left: auto; margin-right: auto;}
    #boxBar{ position: absolute; left: 0; top: 0; z-index: 2; height: 40px; width: 100%; line-height: 40px; color: #ffffff; text-align: center; font-size: 20px; font-weight: bold; clip: rect(0px,0,40px,0px); background: #00a1f5;}
    #boxText{ position: absolute; left: 0; top: 0; z-index: 1; width: 100%; height: 40px; line-height: 40px; color: #000000; text-align: center; font-size: 20px; font-weight: bold;}

下面是硬編碼方式例子

<div id="box2" style="display: none;">
    <img src="http://b.zol-img.com.cn/desk/bizhi/image/6/1920x1080/1436965788437.jpg" rel="nofollow"/>
    <img src="http://attach.bbs.miui.com/forum/201405/24/093305l2tuzftkogegn1if.jpg" rel="nofollow"/>
    <img src="http://img.ivsky.com/img/bizhi/pic/201506/26/dal_shabet-005.jpg" rel="nofollow"/>
    <img src="http://i1.shouyou.itc.cn/2014/news/2014/09/11/1920x1080bz0912_06.jpg" rel="nofollow"/>
    <img src="http://i2.download.fd.pchome.net/g1/M00/10/18/ooYBAFWyD6WIMSmsAAeRvXnu1PwAACnFwIjKkkAB5HV807.jpg" rel="nofollow"/>
</div>
    //硬編碼方式
    var box = document.getElementById('box')
    var box2 = document.getElementById('box2');
    var img = box2.getElementsByTagName('img');
    var iNow = 0; //當前百分比
    for (var i = 0; i < img.length; i++) {
        (function (i) {
            var yimg = new Image();//圖片預加載對象  //頁面在window.onload之後執行,若生效則不加window.onload
            yimg.onload = function () {
                iNow++;
                progressFn(parseInt(iNow / img.length * 100));
                if (iNow == img.length) {
                    box2.style.display = 'block'
                    box.style.display = '';
                }
            }
            yimg.src = img[i].src;
        })(i)
    }

運行

瀑布流佈局

瀑布流佈局 - 浮動

<div id="box"><ul><li><img src="../img/p-1.jpg" alt=""><p>浮動瀑布流佈局1</p></li><li><img src="../img/p-2.jpg" alt=""><p>浮動瀑布流佈局2</p></li><li><img src="../img/p-3.jpg" alt=""><p>浮動瀑布流佈局3</p></li></ul><ul><li><img src="../img/p-4.jpg" alt=""><p>浮動瀑布流佈局4</p></li><li><img src="../img/p-5.jpg" alt=""><p>浮動瀑布流佈局5</p></li><li><img src="../img/p-6.jpg" alt=""><p>浮動瀑布流佈局6</p></li></ul><ul><li><img src="../img/p-7.jpg" alt=""><p>浮動瀑布流佈局7</p></li><li><img src="../img/p-8.jpg" alt=""><p>浮動瀑布流佈局8</p></li><li><img src="../img/p-9.jpg" alt=""></li></ul></div>
window.onload = function () {
        var ul = document.getElementsByTagName('ul')
        window.onscroll = function () {
            var veiwHeight = document.documentElement.clientHeight; //可視區的距離
            var scrollY = document.documentElement.scrollTop || document.body.scrollTop; //滾動條滾動的距離
            var bBtn = true //判斷是否需要加ajax
            //開始循環: 所有ul,找裏面對應最後一個Li,與屏蔽上面進行比較
            for (var i = 0; i < ul.length; i++) {
                var li = ul[i].getElementsByTagName('li');
                var lastli = li[li.length - 1] //找最後一個即可
                if (posTop(lastli) < veiwHeight + scrollY && bBtn) {  //必須發送請求加載
                    bBtn = false
                    ajax('data.js', function (str) { //xxx.php?page=1&num=10  //ajax(請求的地址,請求成功回調)
                        var json = eval('(' + str + ')')  //返回字符串,解析成js語句,用eval 兩邊加小括號
                        if (json.code) {  //json.code == 0 不發請求
                            bBtn = true; //無請求數據時為false
                        }
                        for (var i = 0; i < json.list.length; i++) { //三組數據添加到頁面,循環json裏的list == 9
                            var list = json.list[i];
                            for (var j = 0; j < list.src.length; j++) {
                                var li = document.createElement('li')
                                li.innerHTML = '<img src="' + list.src[j] + '"/><p>' + list.title[j] + '</p>'
                                ul[i].appendChild(li)
                            }
                        }
                    })
                }
            }
        };
        //觸發滾動條事件,每一個ul裏的li提前到達可視區,則分別添加數據;,先寫方法獲取距離下面的距離 ,offsetTop沒辦法直接獲取屏幕的距離,offsetTop是獲取到有定位的距離;
        function posTop(obj) { //最後一個li頂部距離瀏覽器上邊的距離
            var top = 0;
            while (obj) {
                top += obj.offsetTop;
                obj = obj.offsetParent;
            }
            return top;
        }
    }

運行

瀑布流佈局 - 定位

<div id="box"><ul><li><img src="p-1.jpg" alt=""><p>浮動瀑布流佈局1</p></li><li><img src="p-2.jpg" alt=""><p>浮動瀑布流佈局2</p></li><li><img src="p-3.jpg" alt=""><p>浮動瀑布流佈局3</p></li><li><img src="p-4.jpg" alt=""><p>浮動瀑布流佈局4</p></li><li><img src="p-5.jpg" alt=""><p>浮動瀑布流佈局5</p></li><li><img src="p-6.jpg" alt=""><p>浮動瀑布流佈局6</p></li><li><img src="p-7.jpg" alt=""><p>浮動瀑布流佈局7</p></li><li><img src="p-8.jpg" alt=""><p>浮動瀑布流佈局8</p></li><li><img src="p-9.jpg" alt=""><p>浮動瀑布流佈局9</p></li></ul></div>
    window.onload = function () {
        var li = document.getElementsByTagName('li');
        var aHeight = {L: [], C: [], R: []};//存高度對象
        for (var i = 0; i < li.length; i++) {
            var iNow = i % 3// 0,1,2
            switch (iNow) {
                case 0:
                    li[i].style.left = '5px'
                    aHeight.L.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.L[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
                case 1:
                    li[i].style.left = '200px'
                    aHeight.C.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        /*
                        * 1,2,3關三個Li top值為0
                        * 後面li top值為前面累加,如 3 4 5   3/3 = 1, 4/3 = 1 , 5/3 =1 向下取整 即前面有一個元素的高度
                        * 6 7 8 Math.floor(i/3) = 2,即有兩個元素高度
                        * */
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.C[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
                case 2:
                    li[i].style.left = '400px'
                    aHeight.R.push(li[i].offsetHeight)
                    var step = Math.floor(i / 3) //向下取整 0/3 1/3 2/3
                    if (!step) {  //前三個
                        li[i].style.top = 0;
                    }
                    else {           // 4/3 5/3....下面的每個累加
                        var sum = 0;//累加變量
                        for (var j = 0; j < step; j++) {
                            sum += aHeight.R[j] + 10
                        }
                        li[i].style.top = sum + 'px';
                    }
                    break;
            }
        }
    }

運行

百葉窗效果

簡陋佈局

<ul id="ul"><li><div><p>這是一個百葉窗效果,測試1</p><p>這是一個百葉窗效果,測試2</p></div></li><li><div><p>這是一個百葉窗效果,測試3</p><p>這是一個百葉窗效果,測試4</p></div></li><li><div><p>這是一個百葉窗效果,測試5</p><p>這是一個百葉窗效果,測試6</p></div></li><li><div><p>這是一個百葉窗效果,測試7</p><p>這是一個百葉窗效果,測試8</p></div></li><li><div><p>這是一個百葉窗效果,測試9</p><p>這是一個百葉窗效果,測試A</p></div></li></ul>
    window.onload = function () {
        var ul = document.getElementById('ul')
        var iNow = 0; //從第0個div - 第N個div,有層次變化,需要一個當前值;
        var timer = null;
        var onoff = true;//開關,一次真一次假
        toShow(ul)
        function toShow(obj) {
            var div = obj.getElementsByTagName('div')
            setInterval(function () {
                toChange();//有頻率的變化,層次效果
            }, 2000)
            function toChange() {
                timer = setInterval(function () { //第二個定時器,有層次效果
                    if (iNow == div.length) {  //需要判斷定時器何時結束,所以需要一個tiemr
                        clearInterval(timer);
                        iNow = 0;
                        onoff = !onoff;
                    }
                    else if (onoff) {
                        startMove(div[iNow], {top: 0}); //一次為0,一次為30,所以需要一個開關 onoff
                        iNow++;
                    }
                    else {
                        startMove(div[iNow], {top: -30});
                        iNow++;
                    }
                }, 100)
            }
        }
    }
*{ margin: 0; padding: 0;} li{list-style:none;} #ul{ width: 300px; height: auto;border-top:3px solid #333; margin: 20px auto;text-indent: 1em;} li{ width: 100%; height: 30px; overflow: hidden; position: relative; border-bottom:1px solid #2291AB;line-height: 30px;} li div{ position: absolute; top: -30px;} li div p{ height: 30px;}

運行