js進(jìn)階小知識2

獲取選中內(nèi)容

   // 1.1 獲取選中的文字 兼容
         var selectedText;
            if(window.getSelection){ // 標(biāo)準(zhǔn)模式 獲取選中的文字
                selectedText = window.getSelection().toString();
            }else{ // IE 系列
                selectedText = document.selection.createRange().text;
            }

舉例:微博分享

window.onload=function () {
        var selectedText;
        $("word").onmouseup=function (event) {
            if(window.getSelection){ // 標(biāo)準(zhǔn)模式 獲取選中的文字
                selectedText = window.getSelection().toString();
            }else{ // IE 系列
                selectedText = document.selection.createRange().text;
            }
            $("share_weibo").style.display="block";
            var e=event || window.event;
            $("share_weibo").style.left=e.clientX+"px";
            $("share_weibo").style.top=e.clientY+"px";

        }
        //頁面點(diǎn)擊時取消選擇
        document.onmousedown=function (event) {
            var e=event || window.event;
            var targetId=e.target ? e.target.id :e.srcElement.id;
            if(targetId!="share_weibo"){
                $("share_weibo").style.display = "none";
            }else{
                //鏈接的路徑 微博分享的API接口
                window.location. + selectedText;
            }
            //清除選擇
         window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        }
    }
</script>

2.基本動畫原理 :left=offsetLeft+speed+"px"; 定時器實(shí)現(xiàn)累加
封裝基本動畫動畫

//封裝基本動畫
function move(obj,target,speed) {
    clearInterval( obj.timer);
    var speed=target>obj.offsetLeft ? speed : -speed;
    obj.timer=setInterval(function () {
        obj.style.left=obj.offsetLeft+speed+"px";
        //判斷是否超過目標(biāo)值或少于目標(biāo)值 可用差值與布長判斷 不管大于或小于 使她等于目標(biāo)值
        if(Math.abs(target-obj.offsetLeft)<Math.abs(speed)){
            clearInterval(obj.timer);
            obj.style.left=target+"px";
        }
    },20)
}

可運(yùn)用基本動畫做一個案例
仿淘寶輪播 原生js

<script>
        window.onload=function () {
            var aLi=$("ul").children;
            var olIndex=0,aLiIndex=0,timer=null;
            //創(chuàng)建元素 初始化
            $("ul").appendChild(aLi[0].cloneNode(true));
            for(var i=0;i<aLi.length-1;i++){
                var li=document.createElement('li');
                $("ol").appendChild(li);
            }
            $("ol").children[0].className="current";

            //添加事件
            var aOl= $("ol").children;
            for(var i=0;i<aOl.length;i++){
                //運(yùn)用閉包 讓里邊可以訪問外邊i
                (function (i) {
                    aOl[i].onmouseover=function () {
                        for(var j=0;j<aOl.length;j++){
                            aOl[j].className="";
                        }
                        this.className="current";
                        move($("ul"),-i*750,35);
                        olIndex=aLiIndex=i;
                    }
                })(i)
            }
            clearInterval(timer);
            timer=setInterval(lunbo,3000);
            //自動輪播的函數(shù)
            function lunbo() {
                olIndex++;
                if(olIndex>aOl.length-1){
                    olIndex=0;
                }
                for(var j=0;j<aOl.length;j++){
                    aOl[j].className="";
                }
                aOl[olIndex].className="current";

                aLiIndex++;
                //關(guān)鍵點(diǎn) 當(dāng)輪播到復(fù)制的圖片時 left為0 索引為1 
                if(aLiIndex>aLi.length-1){
                    $("ul").style.left=0+"px";
                    aLiIndex=1;
                }
                move($("ul"),- aLiIndex*750,25);
            }
            $("slider").onmouseover=function () {
                clearInterval(timer);
            }
            $("slider").onmouseout=function () {
                timer=setInterval(lunbo,3000);
            }
        }

3.Math常用函數(shù)
Math.random() //隨機(jī)獲取0~1隨機(jī)數(shù)
Math.round() //四舍五入取值
Math.ceil() //向上取值
Math.floor() //向下取值
Math.abs() //取正數(shù)

4.緩動動畫 例如:speed改變 left=offsetLeft+speed+"px" speed=(target-offsetLeft)*緩動系數(shù)
封裝緩動函數(shù)

**
 * 緩動動畫
 * @param obj
 * @param json
 * @param fuc
 */

function buffer(obj, json,fuc) {
    // 1.1 清除定時器
    clearInterval(obj.timer);
    // 1.2 設(shè)置定時器
    var begin = 0, target = 0, speed = 0;
    obj.timer = setInterval(function () {
        // 1.3.0 旗幟
        var flag = true;
        for(var k in json){
            // 1.3 獲取初始值
            begin = parseInt(getStyleAttr(obj, k)) || 0;
            target = parseInt(json[k]);

            // 1.4 求出步長
            speed = (target - begin) * 0.2;

            // 1.5 判斷是否向上取整
            speed = (target > begin) ? Math.ceil(speed) : Math.floor(speed);

            // 1.6 動起來
            obj.style[k] = begin + speed + "px";

            // 1.5 判斷
            if(begin !== target){
                flag = false;
            }
        }
        // 1.3 清除定時器
        if(flag){
            clearInterval(obj.timer);
            // 判斷有沒有回調(diào)函數(shù)
            if(fuc){
                fuc();
            }
        }
    }, 20);

}

舉例:緩動動畫未封裝時 返回頂部 原理:begin=scroll().top target=0;
scrollTo(0,begin)

window.onload=function () {

        //聲明變量
        var begin=0,end=0,timer=null;
        clearInterval(timer);
        //監(jiān)聽窗口滾動
        window.onscroll=function () {
            begin=scroll().top;
            begin>0 ? show($("top")) : hide($("top"));
            $("top").onclick=function () {
                timer=setInterval(function () {
                    //歡動動畫
                    begin+=(end-begin)*0.2;
                    scrollTo(0,begin);
                    console.log(begin,end);
                    //清除定時器
                    if(parseInt(begin)==end){
                        clearInterval(timer);
                    }
                },20)
            }

        }
    }

5.獲取css值 封裝函數(shù)

  function getStyleAttr(obj, attr) {
        if(obj.currentStyle){ // IE 和 opera
            return obj.currentStyle[attr];
        }else {
            return window.getComputedStyle(obj, null)[attr];
        }
    }

舉例:樓層特效 原理:鼠標(biāo)點(diǎn)擊 運(yùn)動相同位置 scrollTop=索引*client().height 滾動條滾動 左邊劃到相應(yīng)樓層原理:當(dāng)滾動條滾動距離>=當(dāng)前劃到大的內(nèi)容.offsetTop 設(shè)置當(dāng)前狀態(tài)

 window.onload=function () {
        //1.獲取元素
        var oLis=$("ol").children;
        var uLis=$("ul").children;
        //2.初始化li顏色
        var colorArr = ['red', 'green', 'blue', 'purple', 'yellow'];
        for(var i=0;i<colorArr.length;i++){
            uLis[i].style.backgroundColor=colorArr[i];

        }
        var iClick=false;
        //3.添加點(diǎn)擊事件 動畫實(shí)現(xiàn)
        for(var i=0;i<oLis.length;i++){
            (function (i) {
                var oI=oLis[i];
                oI.onmousedown=function () {
                    iClick=true;
                    for(var j=0;j<oLis.length;j++){
                        oLis[j].className="";
                    }
                    this.className="current";

                    //document.documentElement.scrollTop=通過索引*可視區(qū)域的高度
                    buffer(document.documentElement,{scrollTop:i*client().height});
                    iClick=false;
                }
            })(i)
        }
        //4.當(dāng)滾動條滾動時 左邊Li顯示當(dāng)前l(fā)i
        document.onscroll=function () {
            if(!iClick){
                //獲取滾動高度
                var roll=scroll().top;
                for(var i=0;i<uLis.length;i++){
                    if(roll>=uLis[i].offsetTop){
                        for(var j=0;j<oLis.length;j++){
                            oLis[j].className="";
                        }
                        oLis[i].className="current";
                    }
                }
            }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瀑晒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溯泣,更是在濱河造成了極大的恐慌,老刑警劉巖凤巨,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肿男,死亡現(xiàn)場離奇詭異,居然都是意外死亡骂铁,警方通過查閱死者的電腦和手機(jī)票从,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門漫雕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峰鄙,你說我怎么就攤上這事浸间。” “怎么了吟榴?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵魁蒜,是天一觀的道長。 經(jīng)常有香客問我吩翻,道長兜看,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任狭瞎,我火速辦了婚禮细移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熊锭。我一直安慰自己弧轧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布碗殷。 她就那樣靜靜地躺著精绎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锌妻。 梳的紋絲不亂的頭發(fā)上代乃,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機(jī)與錄音从祝,去河邊找鬼襟己。 笑死引谜,一個胖子當(dāng)著我的面吹牛牍陌,可吹牛的內(nèi)容都是我干的擎浴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼毒涧,長吁一口氣:“原來是場噩夢啊……” “哼贮预!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起契讲,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仿吞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捡偏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唤冈,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年银伟,在試婚紗的時候發(fā)現(xiàn)自己被綠了你虹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡彤避,死狀恐怖傅物,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琉预,我是刑警寧澤董饰,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站圆米,受9級特大地震影響卒暂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娄帖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一也祠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧块茁,春花似錦齿坷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至佩耳,卻和暖如春遂蛀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背干厚。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工李滴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留螃宙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓所坯,卻偏偏與公主長得像谆扎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芹助,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容