前端基本功--網(wǎng)頁特效3 11.17

一国章、client家族

  1. client 可視區(qū)域
    offsetWidth: width + padding + border (披著羊皮的狼)
    clientWidth: width + padding 不包含border
    scrollWidth: 大小是內(nèi)容的大小
    圖片1.png

二律想、檢測屏幕寬度(可視區(qū)域)

  1. ie9及其以上的版本 window.innerWidth
    標準模式 document.documentElement.clientWidth
    怪異模式 document.body.clientWidth
  • 封裝函數(shù)
 function client() {
        if(window.innerWidth != null)  // ie9 + 最新瀏覽器
        {
            return {
                width: window.innerWidth,
                height: window.innerHeight
            }
        }
        else if(document.compatMode === "CSS1Compat")  // 標準瀏覽器
        {
            return {
                width: document.documentElement.clientWidth,
                height: document.documentElement.clientHeight
            }
        }
        return {   // 怪異瀏覽器
            width: document.body.clientWidth,
            height: document.body.clientHeight

        }
    }
  1. 檢測屏幕分辨率
    clientWidth 返回的是 可視區(qū)大小 瀏覽器內(nèi)部的大小伴澄、
    window.screen.width 返回的是我們電腦的 分辨率 跟瀏覽器沒有關舟铜。

三、 window.onresize 事件(改變窗口大锌⒈摹)

onresize 事件會在窗口或框架被調整大小時發(fā)生橄霉,響應式常用嫌松。
function fun() { 語句 }
fun 是函數(shù)體的意思
fun() 調用函數(shù) 的意思

  • 改變窗口大小時改變背景顏色:
    reSize();//先執(zhí)行一遍绸罗,使窗口不改變時有初始效果
    window.onresize = reSize;//不能加括號,加括號相當于直接出執(zhí)行結果
    function reSize(){
        var clientW = client().width;
1. 
        if(clientW > 960){
            document.body.style.backgroundColor = "pink";
        }
        else if(clientW > 640){
            document.body.style.backgroundColor = "red";
        }
        else {
            document.body.style.backgroundColor = "yellow";
        }
    }

四豆瘫、冒泡機制

  1. 事件冒泡: 當一個元素上的事件被觸發(fā)的時候,比如說鼠標點擊了一個按鈕菊值,同樣的事件將會在那個元素的所有祖先元素中被觸發(fā)外驱。這一過程被稱為事件冒泡;這個事件從原始元素開始一直冒泡到DOM樹的最上層腻窒。
  2. 從里層到外層
    IE 6.0:
    div -> body -> html -> document
    其他瀏覽器:
    div -> body -> html -> document -> window
  3. 以下事件不冒泡:blur昵宇、focus、load儿子、unload
  4. 阻止冒泡
1  if(event && event.stopPropagation)
2          {
3              event.stopPropagation();  //  w3c 標準
4          }
5          else
6          {
7              event.cancelBubble = true;  // ie 678  ie瀏覽器
8   }

5.判斷當前對象
var targetId = event.target ? event.target.id : event.srcElement.id;

  • 點擊隱藏
        function $(id) {
            return document.getElementById(id);
        }
        $("login").onclick = function(event){
            $("mask").style.display = "block";
            $("show").style.display = "block";
            // 隱藏滾動條
            document.body.style.overflow = "hidden";
            var event = event || window.event ;
            // 取消冒泡
            if(event && event.stopPropagation){
                event.stopPropagation();
            }
            else {
                event.cancelBubble = true ;
            }
        }
        document.onclick = function(event){
            var event = event || window.event ;
          //判斷是不是當前的id
            var targetId = event.target ? event.target.id : event.srcElement.id;
            if(targetId!="show"){
            $("mask").style.display = "none";
            $("show").style.display = "none";  
            document.body.style.overflow = "visible";
            }
        }
  • 獲取選中文字 彈出框

思路:onmosueup事件瓦哎,鼠標彈起,彈出框,框的位置是clientX和clientY蒋譬。

獲取用戶選中內(nèi)容兼容性的寫法:
if(window.getSelection)
{
    txt = window.getSelection().toString();   // 轉換為字符串
}
else
{
    txt = document.selection.createRange().text;   // ie 的寫法
}

綜合代碼:

        $("text").onmouseup = function(event){
            var event = event || window.event ;
            var x = event.clientX;
            var y = event.clientY;
            var txt ;
            //獲取選中文字
            if(window.getSelection){
                txt = window.getSelection().toString();
            }
            else {
                txt = document.selectin.createRange().text;//ie 
            }
            //判斷文字是否為空
            if(txt){
                 show(x,y,txt);
            }

        }
        //     document.onclick = function(event){ //用onclick包括彈起和按下割岛,防止冒泡
        //     var event = event || window.event ;
        //     var targetId = event.target ? event.target.id : event.srcElement.id;
        //      if(targetId!="demo"){
        //     $("demo").style.display = "none";
        //     }
        // }
            document.oncmousedown = function(event){ //      用onclick包括彈起和按下,防止冒泡
            var event = event || window.event ;
            var targetId = event.target ? event.target.id : event.srcElement.id;
             if(targetId!="demo"){
            $("demo").style.display = "none";
            }
        }
        function show(xx,yy,txttxt){
            setTimeout(function(){ //加定時器防止選擇很多 有bug
            $("demo").style.display = "block";
            $("demo").style.left = xx +"px";
            $("demo").style.top = yy +"px";
            $("demo").innerHTML = txttxt;
            },400)
        }
  • 動畫原理
  1. 讓盒子的offsetLeft 每次都加上自己定義的步長犯助!
    10+10 = 20 + 10
  2. Math.abs(-5) 取絕對值函數(shù)
       function $(id) {
            return document.getElementById(id);
        }
        $("btn200").onclick = function(){
            animate($("box"),200);
             animate($("box1"),400);
        }
        $("btn400").onclick = function(){  //error
            animate($("box"),400);
             animate($("box1"),800);
        }
        var timer = null;
        var index = 20;
        var arr = [];//error
        arr.index = 10;
        function animate(obj,target){
            var speed = target > obj.offsetLeft ? 5 : -5 ;//判斷盒子左移還是右移
            obj.timer = setInterval(function(){
                var result = target - obj.offsetLeft;// 要定義在定時器里癣漆,每次的值不一樣
                if (Math.abs(result) <= 5) {
                    clearInterval(obj.timer);
                    obj.style.left = target +"px";//result的值有5px的誤差,使盒子移到該到的位置剂买。
                }
                obj.style.left = obj.offsetLeft + speed + "px";
            },30)
        }
  • 輪播圖
<script type="text/javascript">
    function animate(obj,target){
            clearInterval(obj.timer);
            var speed =  obj.offsetLeft<target ? 20 : -20 ;//判斷盒子左移還是右移
            obj.timer = setInterval(function(){
                var result = target - obj.offsetLeft;// 要定義在定時器里惠爽,每次的值不一樣
                obj.style.left = obj.offsetLeft + speed + "px"; //不能放在最后,要在最后矯正誤差
                if (Math.abs(result) <= 20) 
                 {
                    clearInterval(obj.timer);
                    obj.style.left = target +"px";//result的值有5px的誤差瞬哼,使盒子移到該到的位置婚肆。
                }
                
            },20)
        }
 window.onload = function () {
     var all = document.getElementById("all");
     var screen = document.getElementById("screen");
     var ul = document.getElementById("ul");
     var ullis = ul.children;
     var www = ul.children[0];
     //先克隆
     ul.appendChild(ul.children[0].cloneNode(true));//克隆第一張圖片放在最后面
     //創(chuàng)建小li
     var ol = document.createElement("ol");
     all.appendChild(ol);
     for(var i = 0 ;i < ullis.length-1; i++){
        var li = document.createElement("li");
        li.innerHTML = i+1;
        ol.appendChild(li);
     }
     ol.children[0].className = "current";
     //開始動
     var ollis = ol.children ;
     for(i = 0 ; i < ollis.length ; i ++) {
        ollis[i].index = i; //獲取索引值
        ollis[i].onmouseover  = function(){
            for(var j = 0;j < ollis.length;j++){
                ollis[j].className = ""; //清空所有類名
            }
            this.className = "current";
            animate(ul,-this.index*500);
            key = square = this.index;
        }
     }
     //添加定時器
     var timer = null; //不會沖突,這是輪播圖定時器
     var key = 0;//存圖片的張數(shù)
     var square = 0; //方塊
     timer = setInterval(auto,1000);//開啟
     function auto(){
        key++;
        if(key>ullis.length-1){
            ul.style.left = 0;//出錯
            key = 1;//第六張就是第一張坐慰,第六張之后就是第二張
        }
        animate(ul,-key*500);
        // 方塊
        square++;
        if(square>ollis.length-1){
            square = 0;
        }
        for (i = 0;i<ollis.length;i++){
            ollis[i].className = "";
        }
        ollis[square].className = "current"; 

     }
     all.onmouseover = function(){
        clearInterval(timer);
     }
     all.onmouseout = function(){
         timer = setInterval(auto,1000); 
     }
 }
</script>

總結:輪播圖寫了三遍弄清了整體思路较性。
第一步:獲取元素。
第二步:設置鼠標滑過的效果讨越。
第三步:設置整體定時器两残。
第四部:解決兩個定時器的矛盾問題。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末把跨,一起剝皮案震驚了整個濱河市人弓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌着逐,老刑警劉巖崔赌,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耸别,居然都是意外死亡健芭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門秀姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慈迈,“玉大人,你說我怎么就攤上這事省有⊙髁簦” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵蠢沿,是天一觀的道長伸头。 經(jīng)常有香客問我,道長舷蟀,這世上最難降的妖魔是什么恤磷? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任面哼,我火速辦了婚禮,結果婚禮上扫步,老公的妹妹穿的比我還像新娘魔策。我一直安慰自己,他們只是感情好锌妻,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布代乃。 她就那樣靜靜地躺著,像睡著了一般仿粹。 火紅的嫁衣襯著肌膚如雪搁吓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天吭历,我揣著相機與錄音堕仔,去河邊找鬼。 笑死晌区,一個胖子當著我的面吹牛摩骨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朗若,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恼五,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哭懈?” 一聲冷哼從身側響起灾馒,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遣总,沒想到半個月后睬罗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡旭斥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年容达,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垂券。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡花盐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菇爪,到底是詐尸還是另有隱情卒暂,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布娄帖,位于F島的核電站,受9級特大地震影響昙楚,放射性物質發(fā)生泄漏近速。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望削葱。 院中可真熱鬧奖亚,春花似錦、人聲如沸析砸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽首繁。三九已至作郭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弦疮,已是汗流浹背夹攒。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胁塞,地道東北人咏尝。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像啸罢,于是被迫代替她去往敵國和親编检。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 1扰才、client 家族 client 可視區(qū)域 offsetWidth: width + padding...
    越IT閱讀 931評論 2 1
  • offset家族三大家族和一個事件對象三大家族(offset/scroll/client)事件對象/event ...
    Yuann閱讀 960評論 0 5
  • js特效 - Day3 一允懂、client家族 1.1 clientWidth和clientHeight 網(wǎng)頁可見區(qū)...
    Jackson_yee_閱讀 411評論 0 1
  • 一、三大系列:offset家族训桶、scroll家族累驮、client 1、offset 1.1.簡介 offset家族就...
    magic_pill閱讀 862評論 0 4
  • 東見黃牛流水前舵揭, 西下浮云望橋山谤专。 空等白首三秋冷, 回馬又見兩少年午绳。
    程石閱讀 287評論 0 9