JavaScript十 - 元素(PC網(wǎng)頁特效)

13.1 元素偏移量offset系列

13.1.1 offset 概述

offset 翻譯過來就是偏移量吮廉, 我們使用 offset系列相關(guān)屬性可以動態(tài)的得到該元素的位置(偏移)苞尝、大小等

  1. 獲得元素距離帶有定位父元素的位置
  2. 獲得元素自身的大小(寬度高度)
  3. 注意:返回的數(shù)值都不帶單位


    圖片1.png

    圖片2.png

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .father {
            /* position: relative; */
            width: 200px;
            height: 200px;
            background-color: pink;
            margin: 150px;
        }
        .son {
            width: 100px;
            height: 100px;
            background-color: purple;
            margin-left: 45px;
        }
        .w {
            height: 200px;
            background-color: skyblue;
            margin: 0 auto 200px;
            padding: 10px;
            border: 15px solid red;
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <div class="w"></div>
    <script>
        // offset 系列
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        // 1.可以得到元素的偏移 位置 返回的不帶單位的數(shù)值  
        console.log(father.offsetTop);
        console.log(father.offsetLeft);
        // 它以帶有定位的父親為準(zhǔn)  如果么有父親或者父親沒有定位 則以 body 為準(zhǔn)
        console.log(son.offsetLeft);
        var w = document.querySelector('.w');
        // 2.可以得到元素的大小 寬度和高度 是包含padding + border + width 
        console.log(w.offsetWidth);
        console.log(w.offsetHeight);
        // 3. 返回帶有定位的父親 否則返回的是body
        console.log(son.offsetParent); // 返回帶有定位的父親 否則返回的是body
        console.log(son.parentNode); // 返回父親 是最近一級的父親 親爸爸 不管父親有沒有定位
    </script>
</body>
</html>

13.1.2 offset 與 style 區(qū)別

offset:

  • offset 可以得到任意樣式表中的樣式值

  • offset 系列獲得的數(shù)值是沒有單位的

  • offsetWidth 包含padding+border+width

  • offsetWidth 等屬性是只讀屬性宦芦,只能獲取不能賦值

  • 所以宙址,我們想要獲取元素大小位置,用offset更合適

style:

  • style 只能得到行內(nèi)樣式表中的樣式值

  • style.width 獲得的是帶有單位的字符串

  • style.width 獲得不包含padding和border 的值

  • style.width 是可讀寫屬性踪旷,可以獲取也可以賦值

  • 所以曼氛,我們想要給元素更改值,則需要用style改變

因為平時我們都是給元素注冊觸摸事件令野,所以重點記住 targetTocuhes

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            background-color: pink;
            padding: 10px;
        }
    </style>
</head>
<body>
    <div class="box" style="width: 200px;"></div>
    <script>
        // offset與style的區(qū)別
        var box = document.querySelector('.box');
        console.log(box.offsetWidth);
        console.log(box.style.width);
        // box.offsetWidth = '300px';
        box.style.width = '300px';
    </script>
</body>

</html>

13.1.3 案例講解-獲取鼠標(biāo)在盒子內(nèi)的坐標(biāo)

思路:

  1. 我們在盒子內(nèi)點擊舀患,想要得到鼠標(biāo)距離盒子左右的距離。
  2. 首先得到鼠標(biāo)在頁面中的坐標(biāo)(e.pageX, e.pageY)
  3. 其次得到盒子在頁面中的距離 ( box.offsetLeft, box.offsetTop)
  4. 用鼠標(biāo)距離頁面的坐標(biāo)減去盒子在頁面中的距離气破,得到 鼠標(biāo)在盒子內(nèi)的坐標(biāo)
  5. 如果想要移動一下鼠標(biāo)聊浅,就要獲取最新的坐標(biāo),使用鼠標(biāo)移動

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .box {
            width: 300px;
            height: 300px;
            background-color: pink;
            margin: 200px;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        // 我們在盒子內(nèi)點擊现使, 想要得到鼠標(biāo)距離盒子左右的距離低匙。
        // 首先得到鼠標(biāo)在頁面中的坐標(biāo)( e.pageX, e.pageY)
        // 其次得到盒子在頁面中的距離(box.offsetLeft, box.offsetTop)
        // 用鼠標(biāo)距離頁面的坐標(biāo)減去盒子在頁面中的距離, 得到 鼠標(biāo)在盒子內(nèi)的坐標(biāo)
        var box = document.querySelector('.box');
        box.addEventListener('mousemove', function(e) {
            // console.log(e.pageX);
            // console.log(e.pageY);
            // console.log(box.offsetLeft);
            var x = e.pageX - this.offsetLeft;
            var y = e.pageY - this.offsetTop;
            this.innerHTML = 'x坐標(biāo)是' + x + ' y坐標(biāo)是' + y;
        })
    </script>
</body>
</html>

13.1.4 案例講解-模態(tài)框拖拽

彈出框碳锈,我們也稱為模態(tài)框

  1. 點擊彈出層顽冶,會彈出模態(tài)框, 并且顯示灰色半透明的遮擋層
  2. 點擊關(guān)閉按鈕售碳,可以關(guān)閉模態(tài)框强重,并且同時關(guān)閉灰色半透明遮擋層
  3. 鼠標(biāo)放到模態(tài)框最上面一行,可以按住鼠標(biāo)拖拽模態(tài)框在頁面中移動
  4. 鼠標(biāo)松開贸人,可以停止拖動模態(tài)框移動

思路:

  1. 點擊彈出層间景, 模態(tài)框和遮擋層就會顯示出來 display:block;
  2. 點擊關(guān)閉按鈕,模態(tài)框和遮擋層就會隱藏起來 display:none;
  3. 在頁面中拖拽的原理:鼠標(biāo)按下并且移動艺智, 之后松開鼠標(biāo)
  4. 觸發(fā)事件是鼠標(biāo)按下mousedown倘要,鼠標(biāo)移動mousemove 鼠標(biāo)松開 mouseup
  5. 拖拽過程: 鼠標(biāo)移動過程中,獲得最新的值賦值給模態(tài)框的left和top值十拣,這樣模態(tài)框可以跟著鼠標(biāo)走了
  6. 鼠標(biāo)按下觸發(fā)的事件源是最上面一行封拧,就是 id 為 title
  7. 鼠標(biāo)的坐標(biāo)減去 鼠標(biāo)在盒子內(nèi)的坐標(biāo), 才是模態(tài)框真正的位置夭问。
  8. 鼠標(biāo)按下哮缺,我們要得到鼠標(biāo)在盒子的坐標(biāo)。
  9. 鼠標(biāo)移動甲喝,就讓模態(tài)框的坐標(biāo) 設(shè)置為 :鼠標(biāo)坐標(biāo) 減去盒子坐標(biāo)即可尝苇,注意移動事件寫到按下事件里面。
  10. 鼠標(biāo)松開埠胖,就停止拖拽糠溜,就是可以讓鼠標(biāo)移動事件解除

代碼演示:

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {
            padding: 0px;
            margin: 0px;
        }
        .login-header {
            width: 100%;
            text-align: center;
            height: 30px;
            font-size: 24px;
            line-height: 30px;
        }
        .login {
            display: none;
            width: 512px;
            height: 280px;
            position: fixed;
            border: #ebebeb solid 1px;
            left: 50%;
            top: 50%;
            background: #ffffff;
            box-shadow: 0px 0px 20px #ddd;
            z-index: 9999;
            transform: translate(-50%, -50%);
        }
        .login-title {
            width: 100%;
            margin: 10px 0px 0px 0px;
            text-align: center;
            line-height: 40px;
            height: 40px;
            font-size: 18px;
            position: relative;
            cursor: move;
        }
        .login-input-content {
            margin-top: 20px;
        }
        .login-button {
            width: 50%;
            margin: 30px auto 0px auto;
            line-height: 40px;
            font-size: 14px;
            border: #ebebeb 1px solid;
            text-align: center;
        }
        .login-bg {
            display: none;
            width: 100%;
            height: 100%;
            position: fixed;
            top: 0px;
            left: 0px;
            background: rgba(0, 0, 0, .3);
        }
        a {
            text-decoration: none;
            color: #000000;
        }
        .login-button a {
            display: block;
        }
        .login-input input.list-input {
            float: left;
            line-height: 35px;
            height: 35px;
            width: 350px;
            border: #ebebeb 1px solid;
            text-indent: 5px;
        }
        .login-input {
            overflow: hidden;
            margin: 0px 0px 20px 0px;
        }
        .login-input label {
            float: left;
            width: 90px;
            padding-right: 10px;
            text-align: right;
            line-height: 35px;
            height: 35px;
            font-size: 14px;
        }
        .login-title span {
            position: absolute;
            font-size: 12px;
            right: -20px;
            top: -30px;
            background: #ffffff;
            border: #ebebeb solid 1px;
            width: 40px;
            height: 40px;
            border-radius: 20px;
        }
    </style>
</head
<body>
    <div class="login-header"><a id="link" href="javascript:;">點擊,彈出登錄框</a></div>
    <div id="login" class="login">
        <div id="title" class="login-title">登錄會員
            <span><a id="closeBtn" href="javascript:void(0);" class="close-login">關(guān)閉</a></span>
        </div>
        <div class="login-input-content">
            <div class="login-input">
                <label>用戶名:</label>
                <input type="text" placeholder="請輸入用戶名" name="info[username]" id="username" class="list-input">
            </div>
            <div class="login-input">
                <label>登錄密碼:</label>
                <input type="password" placeholder="請輸入登錄密碼" name="info[password]" id="password" class="list-input">
            </div>
        </div>
        <div id="loginBtn" class="login-button"><a href="javascript:void(0);" id="login-button-submit">登錄會員</a></div>
    </div>
    <!-- 遮蓋層 -->
    <div id="bg" class="login-bg"></div>
    <script>
        // 1. 獲取元素
        var login = document.querySelector('.login');
        var mask = document.querySelector('.login-bg');
        var link = document.querySelector('#link');
        var closeBtn = document.querySelector('#closeBtn');
        var title = document.querySelector('#title');
        // 2. 點擊彈出層這個鏈接 link  讓mask 和login 顯示出來
        link.addEventListener('click', function() {
                mask.style.display = 'block';
                login.style.display = 'block';
            })
            // 3. 點擊 closeBtn 就隱藏 mask 和 login 
        closeBtn.addEventListener('click', function() {
                mask.style.display = 'none';
                login.style.display = 'none';
            })
            // 4. 開始拖拽
            // (1) 當(dāng)我們鼠標(biāo)按下直撤, 就獲得鼠標(biāo)在盒子內(nèi)的坐標(biāo)
        title.addEventListener('mousedown', function(e) {
            var x = e.pageX - login.offsetLeft;
            var y = e.pageY - login.offsetTop;
            // (2) 鼠標(biāo)移動的時候非竿,把鼠標(biāo)在頁面中的坐標(biāo),減去 鼠標(biāo)在盒子內(nèi)的坐標(biāo)就是模態(tài)框的left和top值
            document.addEventListener('mousemove', move)
            function move(e) {
                login.style.left = e.pageX - x + 'px';
                login.style.top = e.pageY - y + 'px';
            }
            // (3) 鼠標(biāo)彈起谋竖,就讓鼠標(biāo)移動事件移除
            document.addEventListener('mouseup', function() {
                document.removeEventListener('mousemove', move);
            })
        })
    </script>
</body>
</html>

13.1.5 案例講解-仿京東放大鏡

思路:

  1. 黃色的遮擋層跟隨鼠標(biāo)功能。
  2. 把鼠標(biāo)坐標(biāo)給遮擋層不合適。因為遮擋層坐標(biāo)以父盒子為準(zhǔn)唇兑。
  3. 首先是獲得鼠標(biāo)在盒子的坐標(biāo)勇边。
  4. 之后把數(shù)值給遮擋層做為left 和top值。
  5. 此時用到鼠標(biāo)移動事件,但是還是在小圖片盒子內(nèi)移動。
  6. 發(fā)現(xiàn),遮擋層位置不對袍暴,需要再減去盒子自身高度和寬度的一半。
  7. 遮擋層不能超出小圖片盒子范圍隶症。
  8. 如果小于零政模,就把坐標(biāo)設(shè)置為0
  9. 如果大于遮擋層最大的移動距離,就把坐標(biāo)設(shè)置為最大的移動距離
  10. 遮擋層的最大移動距離:小圖片盒子寬度 減去 遮擋層盒子寬度

案例目錄結(jié)構(gòu):

放大鏡目錄結(jié)構(gòu).png

代碼演示:

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>手機詳情頁蚂会!</title>
    <meta name="description" content="品優(yōu)購JD.COM-專業(yè)的綜合網(wǎng)上購物商城,銷售家電淋样、數(shù)碼通訊、電腦胁住、家居百貨习蓬、服裝服飾、母嬰措嵌、圖書躲叼、食品等數(shù)萬個品牌優(yōu)質(zhì)商品.便捷、誠信的服務(wù)企巢,為您提供愉悅的網(wǎng)上購物體驗!" />
    <meta name="Keywords" content="網(wǎng)上購物,網(wǎng)上商城,手機,筆記本,電腦,MP3,CD,VCD,DV,相機,數(shù)碼,配件,手表,存儲卡,品優(yōu)購" />
    <!-- 引入facicon.ico網(wǎng)頁圖標(biāo) -->
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
    <!-- 引入css 初始化的css 文件 -->
    <link rel="stylesheet" href="css/base.css">
    <!-- 引入公共樣式的css 文件 -->
    <link rel="stylesheet" href="css/common.css">
    <!-- 引入詳情頁面的css文件 -->
    <link rel="stylesheet" href="css/detail.css">
    <!-- 引入我們的js 文件 -->
    <script src="js/detail.js"></script>
</head>
<body>
    <!-- 頂部快捷導(dǎo)航start -->
    <div class="shortcut">
        <div class="w">
            <div class="fl">
                <ul>
                    <li>品優(yōu)購歡迎您枫慷! </li>
                    <li>
                        <a href="#">請登錄</a>
                        <a href="#" class="style-red">免費注冊</a>
                    </li>
                </ul>
            </div>
            <div class="fr">
                <ul>
                    <li><a href="#">我的訂單</a></li>
                    <li class="spacer"></li>
                    <li>
                        <a href="#">我的品優(yōu)購</a>
                        <i class="icomoon">?</i>
                    </li>
                    <li class="spacer"></li>
                    <li><a href="#">品優(yōu)購會員</a></li>
                    <li class="spacer"></li>
                    <li><a href="#">企業(yè)采購</a></li>
                    <li class="spacer"></li>
                    <li><a href="#">關(guān)注品優(yōu)購</a> <i class="icomoon">?</i></li>
                    <li class="spacer"></li>
                    <li><a href="#">客戶服務(wù)</a> <i class="icomoon">?</i></li>
                    <li class="spacer"></li>
                    <li><a href="#">網(wǎng)站導(dǎo)航</a> <i class="icomoon">?</i></li>
                </ul>
            </div>
        </div>
    </div>
    <!-- 頂部快捷導(dǎo)航end  -->
    <!-- header制作 -->
    <div class="header w">
        <!-- logo -->
        <div class="logo">
            <h1>
                <a href="index.html" title="品優(yōu)購">品優(yōu)購</a>
            </h1>
        </div>
        <!-- search -->
        <div class="search">
            <input type="text" class="text" value="請搜索內(nèi)容...">
            <button class="btn">搜索</button>
        </div>
        <!-- hotwrods -->
        <div class="hotwrods">
            <a href="#" class="style-red">優(yōu)惠購首發(fā)</a>
            <a href="#">億元優(yōu)惠</a>
            <a href="#">9.9元團(tuán)購</a>
            <a href="#">美滿99減30</a>
            <a href="#">辦公用品</a>
            <a href="#">電腦</a>
            <a href="#">通信</a>
        </div>
        <div class="shopcar">
            <i class="car">? </i>我的購物車 <i class="arrow"> ? </i>
            <i class="count">80</i>
        </div>
    </div>
    <!-- header 結(jié)束 -->
    <!-- nav start -->
    <div class="nav">
        <div class="w">
            <div class="dropdown fl">
                <div class="dt"> 全部商品分類 </div>
                <div class="dd" style="display: none;">
                    <ul>
                        <li class="menu_item"><a href="#">家用電器</a> <i> ? </i> </li>
                        <li class="menu_item">
                            <a href="list.html">手機</a> 、
                            <a href="#">數(shù)碼</a> 浪规、
                            <a href="#">通信</a>
                            <i> ? </i>
                        </li>
                        <li class="menu_item"><a href="#">電腦或听、辦公</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">家居、家具笋婿、家裝誉裆、廚具</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">男裝、女裝缸濒、童裝足丢、內(nèi)衣</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">個戶化妝、清潔用品庇配、寵物</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">鞋靴斩跌、箱包、珠寶捞慌、奢侈品</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">運動戶外耀鸦、鐘表</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">汽車、汽車用品</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">母嬰啸澡、玩具樂器</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">食品袖订、酒類氮帐、生鮮、特產(chǎn)</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">醫(yī)藥保健</a> <i> ? </i> </li>
                        <li class="menu_item"><a href="#">圖書洛姑、音像上沐、電子書</a> <i> ?</i> </li>
                        <li class="menu_item"><a href="#">彩票、旅行吏口、充值奄容、票務(wù)</a> <i> ?</i> </li>
                        <li class="menu_item"><a href="#">理財冰更、眾籌产徊、白條、保險</a> <i> ? </i> </li>
                    </ul>
                </div>
            </div>
            <!-- 右側(cè)導(dǎo)航 -->
            <div class="navitems fl">
                <ul>
                    <li><a href="#">服裝城</a></li>
                    <li><a href="#">美妝館</a></li>
                    <li><a href="#">傳智超市</a></li>
                    <li><a href="#">全球購</a></li>
                    <li><a href="#">閃購</a></li>
                    <li><a href="#">團(tuán)購</a></li>
                    <li><a href="#">拍賣</a></li>
                    <li><a href="#">有趣</a></li>
                </ul>
            </div>
        </div>
    </div>
    <!-- nav end -->
    <!-- 詳情頁內(nèi)容部分     -->
    <div class="de_container w">
        <!-- 面包屑導(dǎo)航 -->
        <div class="crumb_wrap">
            <a href="#">手機蜀细、數(shù)碼舟铜、通訊</a> 〉 <a href="#">手機   </a> 〉 <a href="#">Apple蘋果   </a> 〉 <a href="#">iphone 6S Plus系類</a>
        </div>
        <!-- 產(chǎn)品介紹模塊 -->
        <div class="product_intro clearfix">
            <!-- 預(yù)覽區(qū)域 -->
            <div class="preview_wrap fl">
                <div class="preview_img">
                    <img src="upload/s3.png" alt="">
                    <div class="mask"></div>
                    <div class="big">
                        <img src="upload/big.jpg" alt="" class="bigImg">
                    </div>
                </div>
                <div class="preview_list">
                    <a href="#" class="arrow_prev"></a>
                    <a href="#" class="arrow_next"></a>
                    <ul class="list_item">
                        <li>
                            <img src="upload/pre.jpg" alt="">
                        </li>
                        <li class="current">
                            <img src="upload/pre.jpg" alt="">
                        </li>
                        <li>
                            <img src="upload/pre.jpg" alt="">
                        </li>
                        <li>
                            <img src="upload/pre.jpg" alt="">
                        </li>
                        <li>
                            <img src="upload/pre.jpg" alt="">
                        </li>
                    </ul>
                </div>
            </div>
            <!-- 產(chǎn)品詳細(xì)信息 -->
            <div class="itemInfo_wrap fr">
                <div class="sku_name">
                    Apple iPhone 6s(A1700)64G玫瑰金色 移動通信電信4G手機
                </div>
                <div class="news">
                    推薦選擇下方[移動優(yōu)惠購],手機套餐齊搞定,不用換號,每月還有花費返
                </div>
                <div class="summary">
                    <dl class="summary_price">
                        <dt>價格</dt>
                        <dd>
                            <i class="price">¥5299.00 </i>
                            <a href="#">降價通知</a>
                            <div class="remark">累計評價612188</div>
                        </dd>
                    </dl>
                    <dl class="summary_promotion">
                        <dt>促銷</dt>
                        <dd>
                            <em>加購價</em> 滿999.00另加20.00元,或滿1999.00另加30.00元奠衔,或滿2999.00另加40.00元谆刨,即可在購物車換 購熱銷商品 詳情 》
                        </dd>
                    </dl>
                    <dl class="summary_support">
                        <dt>支持</dt>
                        <dd>以舊換新,閑置手機回收 4G套餐超值搶 禮品購</dd>
                    </dl>
                    <dl class="choose_color">
                        <dt>選擇顏色</dt>
                        <dd>
                            <a href="javascript:;" class="current">玫瑰金</a>
                            <a href="javascript:;">金色</a>
                            <a href="javascript:;">白色</a>
                            <a href="javascript:;">土豪色</a>
                        </dd>
                    </dl>
                    <dl class="choose_version">
                        <dt>選擇版本</dt>
                        <dd>
                            <a href="javascript:;" class="current">公開版</a>
                            <a href="javascript:;">移動4G</a>
                        </dd>
                    </dl>
                    <dl class="choose_type">
                        <dt>購買方式</dt>
                        <dd>
                            <a href="javascript:;" class="current">官方標(biāo)配</a>
                            <a href="javascript:;">移動優(yōu)惠購</a>
                            <a href="javascript:;">電信優(yōu)惠購</a>
                        </dd>
                    </dl>
                    <div class="choose_btns">
                        <div class="choose_amount">
                            <input type="text" value="1">
                            <a href="javascript:;" class="add">+</a>
                            <a href="javascript:;" class="reduce">-</a>
                        </div>
                        <a href="#" class="addcar">加入購物車</a>
                    </div>
                </div>
            </div>
        </div>
        <!-- 產(chǎn)品細(xì)節(jié)模塊 product_detail   -->
        <div class="product_detail clearfix">
            <!-- aside -->
            <div class="aside fl">
                <div class="tab_list">
                    <ul>
                        <li class="first_tab ">相關(guān)分類</li>
                        <li class="second_tab current">推薦品牌</li>
                    </ul>
                </div>
                <div class="tab_con">
                    <ul>
                        <li>
                            <img src="upload/aside_img.jpg" alt="">
                            <h5>華為 HUAWEI P20 Pro 全面屏徠卡</h5>
                            <div class="aside_price">¥19</div>
                            <a href="#" class="as_addcar">加入購物車</a>
                        </li>
                        <li>
                            <img src="upload/aside_img.jpg" alt="">
                            <h5>華為 HUAWEI P20 Pro 全面屏徠卡</h5>
                            <div class="aside_price">¥19</div>
                            <a href="#" class="as_addcar">加入購物車</a>
                        </li>
                        <li>
                            <img src="upload/aside_img.jpg" alt="">
                            <h5>華為 HUAWEI P20 Pro 全面屏徠卡</h5>
                            <div class="aside_price">¥19</div>
                            <a href="#" class="as_addcar">加入購物車</a>
                        </li>
                        <li>
                            <img src="upload/aside_img.jpg" alt="">
                            <h5>華為 HUAWEI P20 Pro 全面屏徠卡</h5>
                            <div class="aside_price">¥19</div>
                            <a href="#" class="as_addcar">加入購物車</a>
                        </li>
                        <li>
                            <img src="upload/aside_img.jpg" alt="">
                            <h5>華為 HUAWEI P20 Pro 全面屏徠卡</h5>
                            <div class="aside_price">¥19</div>
                            <a href="#" class="as_addcar">加入購物車</a>
                        </li>
                        <li>
                            <img src="upload/aside_img.jpg" alt="">
                            <h5>華為 HUAWEI P20 Pro 全面屏徠卡</h5>
                            <div class="aside_price">¥19</div>
                            <a href="#" class="as_addcar">加入購物車</a>
                        </li>
                    </ul>
                </div>
            </div>
            <!-- detail -->
            <div class="detail fr">
                <div class="detail_tab_list">
                    <ul>
                        <li class="current">商品介紹</li>
                        <li>規(guī)格與包裝</li>
                        <li>售后保障</li>
                        <li>商品評價(50000)</li>
                        <li>手機社區(qū)</li>
                    </ul>
                </div>
                <div class="detail_tab_con">
                    <div class="item">
                        <ul class="item_info">
                            <li>分辨率:1920*1080(FHD)</li>
                            <li>后置攝像頭:1200萬像素</li>
                            <li>前置攝像頭:500萬像素</li>
                            <li>核 數(shù):其他</li>
                            <li>頻 率:以官網(wǎng)信息為準(zhǔn)</li>
                            <li>品牌: Apple ?關(guān)注</li>
                            <li>商品名稱:APPLEiPhone 6s Plus</li>
                            <li>商品編號:1861098</li>
                            <li>商品毛重:0.51kg</li>
                            <li>商品產(chǎn)地:中國大陸</li>
                            <li>熱點:指紋識別归斤,Apple Pay痊夭,金屬機身,拍照神器</li>
                            <li>系統(tǒng):蘋果(IOS)</li>
                            <li>像素:1000-1600萬</li>
                            <li>機身內(nèi)存:64GB</li>
                        </ul>
                        <p>
                            <a href="#" class="more">查看更多參數(shù)?</a>
                        </p>
                        <img src="upload/detail_img1.jpg" alt="">
                        <img src="upload/detail_img2.jpg" alt="">
                        <img src="upload/detail_img3.jpg" alt="">
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!-- 詳情頁內(nèi)容部分     -->
    <!-- footer start -->
    <div class="footer">
        <div class="w">
            <!-- mod_service -->
            <div class="mod_service">
                <ul>
                    <li>
                        <i class="mod-service-icon mod_service_zheng"></i>
                        <div class="mod_service_tit">
                            <h5>正品保障</h5>
                            <p>正品保障脏里,提供發(fā)票</p>
                        </div>
                    </li>
                    <li>
                        <i class="mod-service-icon mod_service_kuai"></i>
                        <div class="mod_service_tit">
                            <h5>正品保障</h5>
                            <p>正品保障她我,提供發(fā)票</p>
                        </div>
                    </li>
                    <li>
                        <i class="mod-service-icon mod_service_bao"></i>
                        <div class="mod_service_tit">
                            <h5>正品保障</h5>
                            <p>正品保障,提供發(fā)票</p>
                        </div>
                    </li>
                    <li>
                        <i class="mod-service-icon mod_service_bao"></i>
                        <div class="mod_service_tit">
                            <h5>正品保障</h5>
                            <p>正品保障迫横,提供發(fā)票</p>
                        </div>
                    </li>
                    <li>
                        <i class="mod-service-icon mod_service_bao"></i>
                        <div class="mod_service_tit">
                            <h5>正品保障</h5>
                            <p>正品保障番舆,提供發(fā)票</p>
                        </div>
                    </li>
                </ul>
            </div>
            <!-- mod_help -->
            <div class="mod_help">
                <dl class="mod_help_item">
                    <dt>購物指南</dt>
                    <dd> <a href="#">購物流程 </a></dd>
                    <dd> <a href="#">會員介紹 </a></dd>
                    <dd> <a href="#">生活旅行/團(tuán)購 </a></dd>
                    <dd> <a href="#">常見問題 </a></dd>
                    <dd> <a href="#">大家電 </a></dd>
                    <dd> <a href="#">聯(lián)系客服 </a></dd>
                </dl>
                <dl class="mod_help_item">
                    <dt>購物指南</dt>
                    <dd> <a href="#">購物流程 </a></dd>
                    <dd> <a href="#">會員介紹 </a></dd>
                    <dd> <a href="#">生活旅行/團(tuán)購 </a></dd>
                    <dd> <a href="#">常見問題 </a></dd>
                    <dd> <a href="#">大家電 </a></dd>
                    <dd> <a href="#">聯(lián)系客服 </a></dd>
                </dl>
                <dl class="mod_help_item">
                    <dt>購物指南</dt>
                    <dd> <a href="#">購物流程 </a></dd>
                    <dd> <a href="#">會員介紹 </a></dd>
                    <dd> <a href="#">生活旅行/團(tuán)購 </a></dd>
                    <dd> <a href="#">常見問題 </a></dd>
                    <dd> <a href="#">大家電 </a></dd>
                    <dd> <a href="#">聯(lián)系客服 </a></dd>
                </dl>
                <dl class="mod_help_item">
                    <dt>購物指南</dt>
                    <dd> <a href="#">購物流程 </a></dd>
                    <dd> <a href="#">會員介紹 </a></dd>
                    <dd> <a href="#">生活旅行/團(tuán)購 </a></dd>
                    <dd> <a href="#">常見問題 </a></dd>
                    <dd> <a href="#">大家電 </a></dd>
                    <dd> <a href="#">聯(lián)系客服 </a></dd>
                </dl>
                <dl class="mod_help_item">
                    <dt>購物指南</dt>
                    <dd> <a href="#">購物流程 </a></dd>
                    <dd> <a href="#">會員介紹 </a></dd>
                    <dd> <a href="#">生活旅行/團(tuán)購 </a></dd>
                    <dd> <a href="#">常見問題 </a></dd>
                    <dd> <a href="#">大家電 </a></dd>
                    <dd> <a href="#">聯(lián)系客服 </a></dd>
                </dl>
                <dl class="mod_help_item mod_help_app">
                    <dt>幫助中心</dt>
                    <dd>
                        <img src="upload/erweima.png" alt="">
                        <p>品優(yōu)購客戶端</p>
                    </dd>
                </dl>
            </div>
            <!-- mod_copyright  -->
            <div class="mod_copyright">
                <p class="mod_copyright_links">
                    關(guān)于我們 | 聯(lián)系我們 | 聯(lián)系客服 | 商家入駐 | 營銷中心 | 手機品優(yōu)購 | 友情鏈接 | 銷售聯(lián)盟 | 品優(yōu)購社區(qū) | 品優(yōu)購公益 | English Site | Contact U
                </p>
                <p class="mod_copyright_info">
                    地址:北京市昌平區(qū)建材城西路金燕龍辦公樓一層 郵編:100096 電話:400-618-4000 傳真:010-82935100 郵箱: zhanghj+itcast.cn <br> 京ICP備08001421號京公網(wǎng)安備110108007702
                </p>
            </div>
        </div>
    </div>
    <!-- footer end -->
</body>
</html>

css:

base.css:

/*清除元素默認(rèn)的內(nèi)外邊距  */
* {
    margin: 0;
    padding: 0
}
/*讓所有斜體 不傾斜*/
em,
i {
    font-style: normal;
}
/*去掉列表前面的小點*/
li {
    list-style: none;
}
/*圖片沒有邊框   去掉圖片底側(cè)的空白縫隙*/
img {
    border: 0;  /*ie6*/
    vertical-align: middle;
}
/*讓button 按鈕 變成小手*/
button {
    cursor: pointer;
}
/*取消鏈接的下劃線*/
a {
    color: #666;
    text-decoration: none;
}
a:hover {
    color: #e33333;
}
button,
input {
    font-family: 'Microsoft YaHei', 'Heiti SC', tahoma, arial, 'Hiragino Sans GB', \\5B8B\4F53, sans-serif;
    /*取消輪廓線 藍(lán)色的*/
    outline: none;
}
body {
    background-color: #fff;
    font: 12px/1.5 'Microsoft YaHei', 'Heiti SC', tahoma, arial, 'Hiragino Sans GB', \\5B8B\4F53, sans-serif;
    color: #666
}
.hide,
.none {
    display: none;
}
/*清除浮動*/
.clearfix:after {
    visibility: hidden;
    clear: both;
    display: block;
    content: ".";
    height: 0
}
.clearfix {
    *zoom: 1
}

common.css:

/*公共樣式*/
.fl {
    float: left;
}
.fr {
    float: right;
}
@font-face {
    font-family: 'icomoon';
    src:  url('../fonts/icomoon.eot?7kkyc2');
    src:  url('../fonts/icomoon.eot?7kkyc2#iefix') format('embedded-opentype'),
    url('../fonts/icomoon.ttf?7kkyc2') format('truetype'),
    url('../fonts/icomoon.woff?7kkyc2') format('woff'),
    url('../fonts/icomoon.svg?7kkyc2#icomoon') format('svg');
  font-weight: normal;
  font-style: normal;
}
.fr .icomoon {
    font-family: 'icomoon';
    font-size: 16px;
    line-height: 26px;
}
/*版心*/
.w {
    width: 1200px;
    margin: 0 auto;
}
.style-red {
    color: #c81623;
}
.spacer {
    width: 1px;
    height: 12px;
    background-color: #666;
    margin: 9px 12px 0;
}
/*頂部快捷導(dǎo)航*/
.shortcut {
    height: 31px;
    background-color: #f1f1f1;
    line-height: 31px;
}
.shortcut li {
    float: left;
}
/*header區(qū)域*/
.header {
    position: relative;
    height: 105px;
}
.logo {
    position: absolute;
    top: 25px;
    left: 0;
    width: 175px;
    height: 56px;
}
.logo a {
    display: block;
    /*overflow: hidden;*/
    width: 175px;
    height: 56px;
    background: url(../img/logo.png) no-repeat;
    /*text-indent: -999px;*/
    font-size: 0;
}
.search {
    position: absolute;
    top: 25px;
    left: 348px;
}
.text {
    float: left;
    width: 445px;
    height: 32px;
    border: 2px solid #b1191a;
    padding-left: 10px;
    color: #ccc;
}
.btn {
    float: left;
    width: 82px;
    height: 36px;
    background-color: #b1191a;
    border: 0;
    font-size: 16px;
    color: #fff;
}
.hotwrods {
    position: absolute;
    top: 65px;
    left: 348px;
}
.hotwrods a {
    margin: 0 10px;
}
.shopcar {
    position: absolute;
    top:25px;
    right: 64px;
    width: 138px;
    height: 34px;
    border: 1px solid #dfdfdf;
    background-color: #f7f7f7;
    line-height: 34px;
    text-align: center;
}
.car {
    font-family: 'icomoon';
    color: #da5555;
}
.arrow {
    font-family: 'icomoon';
    margin-left: 5px;
}
.count {
    position: absolute;
    top: -5px;
    /*應(yīng)該是左側(cè)對齊 文字才能往右走顯示*/
    left: 100px;
    background-color: #e60012;
    height: 14px;
    padding: 0 3px;
    line-height: 14px;
    color: #fff;
    /*border-radius: 左上角 右上角  右下角  左下角;*/
    border-radius: 7px 7px 7px 0;
}
/*nav start*/
.nav {
    height: 45px;
    border-bottom: 2px solid #b1191a;
}
.dropdown {
    width: 209px;
    height: 45px;
}
.dropdown .dt {
    height: 100%;
    background-color: #b1191a;
    font-size: 16px;
    color: #fff;
    text-align: center;
    line-height: 45px;
}
.dropdown .dd {
    height: 465px;
    background-color: #c81623;
    margin-top: 2px;
} 
.menu_item:hover {
    background-color: #fff;
}
/*鼠標(biāo)經(jīng)過li 里面的 a變顏色*/
.menu_item:hover a {
    color: #c81623;
}
.menu_item {
    height: 31px;
    line-height: 31px;
    margin-left: 1px;
    padding: 0 10px;
    transition: all .5s;
}
.menu_item:hover {
    padding-left: 20px;
}
.menu_item a {
    font-size: 14px;
    color: #fff;
}
.menu_item i {
    float: right;
    font-family: 'icomoon';
    font-size: 18px;
    color: #fff;
}
.navitems {
    margin-left: 10px;
}
.navitems li {
    float: left;
}
.navitems li a {
    display: block;
    height: 45px;
    padding: 0 25px;
    line-height: 45px;
    font-size: 16px;
}
/*footer 部分*/
.footer {
    height: 386px;
    background-color: #f5f5f5;
    padding-top: 30px;
}
.mod_service {
    height: 79px;
    border-bottom: 1px solid #ccc;
}
.mod_service li {
    float: left;
    width: 240px;
    height: 79px;

}
.mod-service-icon {
    /*浮動的盒子 可以直接給大小的 不需要轉(zhuǎn)換*/
    float: left;
    width: 50px;
    height: 50px;
    margin-left: 35px;
    background: url(../img/icons.png) no-repeat;
}
.mod_service_zheng {
    background-position: -253px -3px;   
}
.mod_service_tit {
    float: left;
    margin-left: 5px;
}
.mod_service_tit h5 {
    margin: 5px 0;
}
.mod_service_kuai {
    background-position: -255px -54px;
}
.mod_service_bao {
    background-position: -257px -105px;
}
.mod_help {
    height: 187px;
    border-bottom: 1px solid #ccc;
}
.mod_help_item {
    float: left;
    width: 150px;
    padding: 20px 0 0 50px;
}
.mod_help_item dt {
    height: 25px;
    font-size: 16px;
}
.mod_help_item dd {
    height: 22px;
}
.mod_help_app dt,
.mod_help_app p {
    padding-left: 15px;
}
.mod_help_app img {
    margin: 7px 0;
}
.mod_copyright {
    text-align: center;
}
.mod_copyright_links {
    margin: 20px 0 15px 0;
}
.mod_copyright_info {
    line-height: 18px;
}

detail.css:

/*詳情頁的樣式文件*/
.de_container {
    margin-top: 20px;
}
.crumb_wrap {
    height: 25px;
}
.crumb_wrap a {
    margin-right: 10px;
}
.preview_wrap {
    width: 400px;
    height: 590px;
}
.preview_img {
    position: relative;
    height: 398px;
    border: 1px solid #ccc;
}
.mask {
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    width: 300px;
    height: 300px;
    background: #FEDE4F;
    opacity: .5;
    border: 1px solid #ccc;
    cursor: move;
}
.big {
    display: none;
    position: absolute;
    left: 410px;
    top: 0;
    width: 500px;
    height: 500px;
    background-color: pink;
    z-index: 999;
    border: 1px solid #ccc;
    overflow: hidden;
}
.big img {
    position: absolute;
    top: 0;
    left: 0;
}
.preview_list {
    position: relative;
    height: 60px;
    margin-top: 60px;
}
.list_item {
    width: 320px;
    height: 60px;
    margin: 0 auto;
}
.list_item li {
    float: left;
    width: 56px;
    height: 56px;
    border: 2px solid transparent;
    margin: 0 2px;
}
.list_item li.current {
    border-color: #c81623;
}
.arrow_prev,
.arrow_next {
    position: absolute;
    top: 15px;
    width: 22px;
    height: 32px;
    background-color: purple;
}
.arrow_prev {
    left: 0;
    background: url(../img/arrow-prev.png) no-repeat;
}
.arrow_next {
    right: 0;
    background: url(../img/arrow-next.png) no-repeat;
}
.itemInfo_wrap {
    width: 718px;
}
.sku_name {
    height: 30px;
    font-size: 16px;
    font-weight: 700;
}
.news {
    height: 32px;
    color: #e12228;
}
.summary dl {
    overflow: hidden;
}
.summary dt,
.summary dd {
    float: left;
}
.summary dt {
    width: 60px;
    padding-left: 10px;
    line-height: 36px;
}
.summary_price,
.summary_promotion {
    position: relative;
    padding: 10px 0;
    background-color: #fee9eb;
}
.price {
    font-size: 24px;
    color: #e12228;
}
.summary_price a {
    color: #c81623;
}
.remark {
    position: absolute;
    right: 10px;
    top: 20px;
}
.summary_promotion {
    padding-top: 0;
}
.summary_promotion dd {
    width: 450px;
    line-height: 36px;
}
.summary_promotion em {
    display: inline-block;
    width: 40px;
    height: 22px;
    background-color: #c81623;
    text-align: center;
    line-height: 22px;
    color: #fff;
}
.summary_support dd {
    line-height: 36px;
}
.choose_color a {
    display: inline-block;
    width: 80px;
    height: 41px;
    background-color: #f7f7f7;
    border: 1px solid #ededed;
    text-align: center;
    line-height: 41px;
}
.summary a.current {
    border-color: #c81623;
}
.choose_version {
    margin: 10px 0;
}
.choose_version a,
.choose_type a {
    display: inline-block;
    height: 32px;
    padding: 0 12px;
    background-color: #f7f7f7;
    border: 1px solid #ededed;
    text-align: center;
    line-height: 32px;
}
.choose_btns {
    margin-top: 20px;
}
.choose_amount {
    position: relative;
    float: left;
    width: 50px;
    height: 46px;
    background-color: pink;
}
.choose_amount input {
    width: 33px;
    height: 44px;
    border: 1px solid #ccc;
    text-align: center;
}
.add,
.reduce {
    position: absolute;
    right: 0;
    width: 15px;
    height: 22px;
    border: 1px solid #ccc;
    background-color: #f1f1f1;
    text-align: center;
    line-height: 22px;
}
.add {
    top: 0;
}
.reduce {
    bottom: 0;
    /*禁止鼠標(biāo)樣式*/
    cursor: not-allowed;
    /* pointer  小手  move  移動  */
}
.addcar {
    float: left;
    width: 142px;
    height: 46px;
    background-color: #c81623;
    text-align: center;
    line-height: 46px;
    font-size: 18px;
    color: #fff;
    margin-left: 10px;
    font-weight: 700;
}
.product_detail {
    margin-bottom: 50px;
}
.aside {
    width: 208px;
    border: 1px solid #ccc;
}
.tab_list {
    overflow: hidden;
    height: 34px;
}
/*把背景顏色 底邊框都給 li*/
.tab_list li {
    float: left;
    background-color: #f1f1f1;
    border-bottom: 1px solid #ccc;
    height: 33px;
    text-align: center;
    line-height: 33px;
}
/*鼠標(biāo)單擊 li 變化樣式   背景變白色 去掉下邊框 文字變顏色*/
.tab_list .current {
    background-color: #fff;
    border-bottom: 0;
    color: red;
}
.first_tab {
    width: 104px;
}
.second_tab {
    width: 103px;
    border-left: 1px solid #ccc;
}
.tab_con {
    padding: 0 10px;
}
.tab_con li {
    border-bottom: 1px solid #ccc;
}
.tab_con li h5 {
    /*超出的文字省略號顯示*/
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    font-weight: 400;
}
.aside_price {
    font-weight: 700;
    margin: 10px 0;
}
.as_addcar {
    display: block;
    width: 88px;
    height: 26px;
    border: 1px solid #ccc;
    background-color: #f7f7f7;
    margin: 10px auto;
    text-align: center;
    line-height: 26px;
}
.detail {
    width: 978px;
}
.detail_tab_list {
    height: 39px;
    border: 1px solid #ccc;
    background-color: #f1f1f1;
}
.detail_tab_list li {
    float: left;
    height: 39px;
    line-height: 39px;
    padding: 0 20px;
    text-align: center;
    cursor: pointer;
}
.detail_tab_list .current {
    background-color: #c81623;
    color: #fff;
}
.item_info {
    padding: 20px 0 0 20px;
}
.item_info li {
    line-height: 22px;
}
.more {
    float: right;
    font-weight: 700;
    font-family: 'icomoon';
}

js:

/* detail.js */
window.addEventListener('load', function() {
    var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    // 1. 當(dāng)我們鼠標(biāo)經(jīng)過 preview_img 就顯示和隱藏 mask 遮擋層 和 big 大盒子
    preview_img.addEventListener('mouseover', function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    })
    preview_img.addEventListener('mouseout', function() {
            mask.style.display = 'none';
            big.style.display = 'none';
        })
        // 2. 鼠標(biāo)移動的時候,讓黃色的盒子跟著鼠標(biāo)來走
    preview_img.addEventListener('mousemove', function(e) {
        // (1). 先計算出鼠標(biāo)在盒子內(nèi)的坐標(biāo)
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        // console.log(x, y);
        // (2) 減去盒子高度 300的一半 是 150 就是我們mask 的最終 left 和top值了
        // (3) 我們mask 移動的距離
        var maskX = x - mask.offsetWidth / 2;
        var maskY = y - mask.offsetHeight / 2;
        // (4) 如果x 坐標(biāo)小于了0 就讓他停在0 的位置
        // 遮擋層的最大移動距離
        var maskMax = preview_img.offsetWidth - mask.offsetWidth;
        if (maskX <= 0) {
            maskX = 0;
        } else if (maskX >= maskMax) {
            maskX = maskMax;
        }
        if (maskY <= 0) {
            maskY = 0;
        } else if (maskY >= maskMax) {
            maskY = maskMax;
        }
        mask.style.left = maskX + 'px';
        mask.style.top = maskY + 'px';
        // 3. 大圖片的移動距離 = 遮擋層移動距離 * 大圖片最大移動距離 / 遮擋層的最大移動距離
        // 大圖
        var bigIMg = document.querySelector('.bigImg');
        // 大圖片最大移動距離
        var bigMax = bigIMg.offsetWidth - big.offsetWidth;
        // 大圖片的移動距離 X Y
        var bigX = maskX * bigMax / maskMax;
        var bigY = maskY * bigMax / maskMax;
        bigIMg.style.left = -bigX + 'px';
        bigIMg.style.top = -bigY + 'px';

    })
})

13.2 元素可視區(qū)client系列

client 翻譯過來就是客戶端矾踱,我們使用 client 系列的相關(guān)屬性來獲取元素可視區(qū)的相關(guān)信息恨狈。通過 client
系列的相關(guān)屬性可以動態(tài)的得到該元素的邊框大小、元素大小等


圖片3.png

圖片4.png

13.2.1 clientTop

語法:

element.clientTop

作用:

返回元素上邊框的大小

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 10px solid red;
            padding: 10px;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        // client 寬度 和我們offsetWidth 最大的區(qū)別就是 不包含邊框
        var div = document.querySelector('div');
        console.log(div.clientTop)
    </script>
</body>
</html>

13.2.2 clientLeft

語法:

element.clientLeft

作用:

返回元素左邊框的大小

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 10px solid red;
            padding: 10px;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        // client 寬度 和我們offsetWidth 最大的區(qū)別就是 不包含邊框
        var div = document.querySelector('div');
        console.log(div.clientLeft)
    </script>
</body>
</html>

13.2.3 clientWidth

語法:

element.clientWidth

作用:

返回元素自身包括padding呛讲、內(nèi)容區(qū)的寬度禾怠,不含邊框,返回數(shù)值不帶單位

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 10px solid red;
            padding: 10px;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        // client 寬度 和我們offsetWidth 最大的區(qū)別就是 不包含邊框
        var div = document.querySelector('div');
        console.log(div.clientTop)
    </script>
</body>
</html>

13.2.4 clientHeight

語法:

element.clientHeight

作用:

返回元素自身包括padding贝搁、內(nèi)容區(qū)的高度刃宵,不含邊框,返回數(shù)值不帶單位

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 10px solid red;
            padding: 10px;
        }
    </style>
</head>
<body>
    <div></div>
    <script>
        // client 寬度 和我們offsetWidth 最大的區(qū)別就是 不包含邊框
        var div = document.querySelector('div');
        console.log(div.clientHeight)
    </script>
</body>
</html>

13.3 立即執(zhí)行函數(shù)

13.3.1 立即執(zhí)行函數(shù)

立即執(zhí)行函數(shù) (function(){})() 或者 (function(){}())

主要作用:

創(chuàng)建一個獨立的作用域徘公。 避免了命名沖突問題

代碼演示:

<script>
// 1.立即執(zhí)行函數(shù): 不需要調(diào)用牲证,立馬能夠自己執(zhí)行的函數(shù)
function fn() {
    console.log(1);
}
fn();
// 2. 寫法 也可以傳遞參數(shù)進(jìn)來
// 1.(function() {})()    或者  2. (function(){}());
(function(a, b) {
    console.log(a + b);
    var num = 10;
})(1, 2); // 第二個小括號可以看做是調(diào)用函數(shù)
(function sum(a, b) {
    console.log(a + b);
    var num = 10; // 局部變量
}(2, 3));
// 3. 立即執(zhí)行函數(shù)最大的作用就是 獨立創(chuàng)建了一個作用域, 里面所有的變量都是局部變量 不會有命名沖突的情況
</script>

13.3.2 淘寶 flexible.js 源碼分析

(function flexible(window, document) {
    // 獲取的html 的根元素
    var docEl = document.documentElement
        // dpr 物理像素比
    var dpr = window.devicePixelRatio || 1
    // adjust body font size  設(shè)置我們body 的字體大小
    function setBodyFontSize() {
        // 如果頁面中有body 這個元素 就設(shè)置body的字體大小
        if (document.body) {
            document.body.style.fontSize = (12 * dpr) + 'px'
        } else {
            // 如果頁面中沒有body 這個元素,則等著 我們頁面主要的DOM元素加載完畢再去設(shè)置body
            // 的字體大小
            document.addEventListener('DOMContentLoaded', setBodyFontSize)
        }
    }
    setBodyFontSize();
    // set 1rem = viewWidth / 10    設(shè)置我們html 元素的文字大小
    function setRemUnit() {
        var rem = docEl.clientWidth / 10
        docEl.style.fontSize = rem + 'px'
    }
    setRemUnit()
    // reset rem unit on page resize  當(dāng)我們頁面尺寸大小發(fā)生變化的時候关面,要重新設(shè)置下rem 的大小
    window.addEventListener('resize', setRemUnit)
        // pageshow 是我們重新加載頁面觸發(fā)的事件
    window.addEventListener('pageshow', function(e) {
        // e.persisted 返回的是true 就是說如果這個頁面是從緩存取過來的頁面坦袍,也需要從新計算一下rem 的大小
        if (e.persisted) {
            setRemUnit()
        }
    })
    // detect 0.5px supports  有些移動端的瀏覽器不支持0.5像素的寫法
    if (dpr >= 2) {
        var fakeBody = document.createElement('body')
        var testElement = document.createElement('div')
        testElement.style.border = '.5px solid transparent'
        fakeBody.appendChild(testElement)
        docEl.appendChild(fakeBody)
        if (testElement.offsetHeight === 1) {
            docEl.classList.add('hairlines')
        }
        docEl.removeChild(fakeBody)
    }
}(window, document))

13.3.3 淘寶flexibleJS源碼分析之pageshow事件

下面三種情況都會刷新頁面都會觸發(fā) load 事件

  1. a標(biāo)簽的超鏈接
  2. F5或者刷新按鈕(強制刷新)
  3. 前進(jìn)后退按鈕

但是 火狐中十厢,有個特點,有個“往返緩存”捂齐,這個緩存中不僅保存著頁面數(shù)據(jù)蛮放,還保存了DOM和JavaScript的狀態(tài);實際上是將整個頁面都保存在了內(nèi)存里奠宜。

所以此時后退按鈕不能刷新頁面包颁。

此時可以使用 pageshow事件來觸發(fā)。压真,這個事件在頁面顯示時觸發(fā)娩嚼,無論頁面是否來自緩存。在重新加載頁面中滴肿,pageshow會在load事件觸發(fā)后觸發(fā)岳悟;根據(jù)事件對象中的persisted來判斷是否是緩存中的頁面觸發(fā)的pageshow事件

注意:這個事件給window添加

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        // console.log(window.devicePixelRatio);
        window.addEventListener('pageshow', function() {
            alert(11);
        })
    </script>
    <a >鏈接</a>
</body>
</html>

13.4 元素滾動scroll系列

13.4.1 scroll 概述

scroll 翻譯過來就是滾動的,我們使用 scroll 系列的相關(guān)屬性可以動態(tài)的得到該元素的大小泼差、滾動距離等贵少。


圖片5.png

圖片6.png

頁面被卷去的頭部:

如果瀏覽器的高(或?qū)挘┒炔蛔阋燥@示整個頁面時,會自動出現(xiàn)滾動條堆缘。當(dāng)滾動條向下滾動時滔灶,頁面上面被隱藏掉的高度,我們就稱為頁面被卷去的頭部吼肥。滾動條在滾動時會觸發(fā) onscroll事件录平。

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 10px solid red;
            padding: 10px;
            overflow: auto;
        }
    </style>
</head>
<body>
    <div>
        我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容 我是內(nèi)容
    </div>
    <script>
        // scroll 系列
        var div = document.querySelector('div');
        console.log(div.scrollHeight);
        console.log(div.clientHeight);
        // scroll滾動事件當(dāng)我們滾動條發(fā)生變化會觸發(fā)的事件
        div.addEventListener('scroll', function() {
            console.log(div.scrollTop);
        })
    </script>
</body>
</html>

13.4.2 案例講解-仿淘寶固定右側(cè)側(cè)邊欄

  1. 原先側(cè)邊欄是絕對定位
  2. 當(dāng)頁面滾動到一定位置,側(cè)邊欄改為固定定位
  3. 頁面繼續(xù)滾動潜沦,會讓 返回頂部顯示出來

案例效果圖:

右側(cè)邊欄.gif

思路:

1. 需要用到頁面滾動事件 scroll  因為是頁面滾動萄涯,所以事件源是document
2. 滾動到某個位置,就是判斷頁面被卷去的上部值唆鸡。
3. 頁面被卷去的頭部:可以通過window.pageYOffset 獲得  如果是被卷去的左側(cè)window.pageXOffset
4. 注意涝影,元素被卷去的頭部是element.scrollTop  , 如果是頁面被卷去的頭部 則是 window.pageYOffset
5. 其實這個值 可以通過盒子的 offsetTop可以得到,如果大于等于這個值争占,就可以讓盒子固定定位了

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .slider-bar {
            position: absolute;
            left: 50%;
            top: 300px;
            margin-left: 600px;
            width: 45px;
            height: 130px;
            background-color: pink;
        }
        .w {
            width: 1200px;
            margin: 10px auto;
        }
        .header {
            height: 150px;
            background-color: purple;
        }
        .banner {
            height: 250px;
            background-color: skyblue;
        }
        .main {
            height: 1000px;
            background-color: yellowgreen;
        }
        span {
            display: none;
            position: absolute;
            bottom: 0;
        }
    </style>
</head>
<body>
    <div class="slider-bar">
        <span class="goBack">返回頂部</span>
    </div>
    <div class="header w">頭部區(qū)域</div>
    <div class="banner w">banner區(qū)域</div>
    <div class="main w">主體部分</div>
    <script>
        //1. 獲取元素
        var sliderbar = document.querySelector('.slider-bar');
        var banner = document.querySelector('.banner');
        // banner.offestTop 就是被卷去頭部的大小 一定要寫到滾動的外面
        var bannerTop = banner.offsetTop
            // 當(dāng)我們側(cè)邊欄固定定位之后應(yīng)該變化的數(shù)值
        var sliderbarTop = sliderbar.offsetTop - bannerTop;
        // 獲取main 主體元素
        var main = document.querySelector('.main');
        var goBack = document.querySelector('.goBack');
        var mainTop = main.offsetTop;
        // 2. 頁面滾動事件 scroll
        document.addEventListener('scroll', function() {
            // console.log(11);
            // window.pageYOffset 頁面被卷去的頭部
            // console.log(window.pageYOffset);
            // 3 .當(dāng)我們頁面被卷去的頭部大于等于了 172 此時 側(cè)邊欄就要改為固定定位
            if (window.pageYOffset >= bannerTop) {
                sliderbar.style.position = 'fixed';
                sliderbar.style.top = sliderbarTop + 'px';
            } else {
                sliderbar.style.position = 'absolute';
                sliderbar.style.top = '300px';
            }
            // 4. 當(dāng)我們頁面滾動到main盒子燃逻,就顯示 goback模塊
            if (window.pageYOffset >= mainTop) {
                goBack.style.display = 'block';
            } else {
                goBack.style.display = 'none';
            }
        })
    </script>
</body>
</html>

頁面被卷去的頭部兼容性解決方案

需要注意的是,頁面被卷去的頭部臂痕,有兼容性問題伯襟,因此被卷去的頭部通常有如下幾種寫法:

  1. 聲明了 DTD,使用 document.documentElement.scrollTop
  2. 未聲明 DTD握童,使用 document.body.scrollTop
  3. 新方法 window.pageYOffset和 window.pageXOffset姆怪,IE9 開始支持
function getScroll() {
    return {
      left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft||0,
      top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
    };
 } 
getScroll().left
  • 三大系列總結(jié)
三大系列比較 作用
e.offsetWidthh 返回自身包括padding、邊框、內(nèi)容區(qū)的寬度稽揭, 返回數(shù)值不帶單位
e.clientWidth 返回自身包括padding俺附、內(nèi)容區(qū)域?qū)挾龋缓吙蛳疲粠挝?/td>
e.scrollWidth 返回自身實際寬度事镣,不含邊框,不帶單位

常見用法:

  1. offset經(jīng)常用于獲取元素位置:offsetLeft offsetTop
  2. client經(jīng)常用于獲取元素大小揪胃,clientWidth clientHeight
  3. scroll經(jīng)常用于獲取滾動距離scrollTop scrollLeft
  4. 注意頁面滾動距離通過window.pageYOffset獲取

13.5 mouseenter和mouseover的區(qū)別

13.5.1 mouseenter

  • 當(dāng)鼠標(biāo)移動到元素上時就會觸發(fā)mouseenter 事件璃哟,mouseenter 只會經(jīng)過自身盒子觸發(fā)
  • mouseenter不會冒泡
  • 跟mouseenter搭配鼠標(biāo)離開 mouseleave 同樣不會冒泡

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .father {
            width: 300px;
            height: 300px;
            background-color: pink;
            margin: 100px auto;
        }
        .son {
            width: 200px;
            height: 200px;
            background-color: purple;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <script>
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        father.addEventListener('mouseenter', function() {
            console.log(11);
        })
    </script>
</body>
</html>

13.5.2 mouseover

  • mouseover 鼠標(biāo)經(jīng)過自身盒子會觸發(fā),經(jīng)過子盒子還會觸發(fā)
  • mouseover會冒泡

代碼演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .father {
            width: 300px;
            height: 300px;
            background-color: pink;
            margin: 100px auto;
        }
        .son {
            width: 200px;
            height: 200px;
            background-color: purple;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <script>
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        father.addEventListener('mouseover', function() {
            console.log(11);
        })
    </script>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喊递,一起剝皮案震驚了整個濱河市随闪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌册舞,老刑警劉巖蕴掏,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件障般,死亡現(xiàn)場離奇詭異调鲸,居然都是意外死亡,警方通過查閱死者的電腦和手機挽荡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門藐石,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人定拟,你說我怎么就攤上這事于微。” “怎么了青自?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵株依,是天一觀的道長恋腕。 經(jīng)常有香客問我念秧,道長总寻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮澜倦,結(jié)果婚禮上句各,老公的妹妹穿的比我還像新娘吸占。我一直安慰自己,他們只是感情好凿宾,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布矾屯。 她就那樣靜靜地躺著,像睡著了一般初厚。 火紅的嫁衣襯著肌膚如雪件蚕。 梳的紋絲不亂的頭發(fā)上孙技,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音排作,去河邊找鬼牵啦。 笑死,一個胖子當(dāng)著我的面吹牛妄痪,可吹牛的內(nèi)容都是我干的哈雏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼衫生,長吁一口氣:“原來是場噩夢啊……” “哼裳瘪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起罪针,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤彭羹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泪酱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體派殷,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年墓阀,在試婚紗的時候發(fā)現(xiàn)自己被綠了毡惜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡岂津,死狀恐怖虱黄,靈堂內(nèi)的尸體忽然破棺而出悦即,到底是詐尸還是另有隱情吮成,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布辜梳,位于F島的核電站粱甫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏作瞄。R本人自食惡果不足惜茶宵,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宗挥。 院中可真熱鬧乌庶,春花似錦、人聲如沸契耿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搪桂。三九已至透敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酗电。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工魄藕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撵术。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓背率,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嫩与。 傳聞我的和親對象是個殘疾皇子退渗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345