1. 程式人生 > >從零開始學 Web 之 BOM(四)client系列

從零開始學 Web 之 BOM(四)client系列

一、client 系列

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #dv {
            width: 300px;
            height: 200px;
            border: 20px solid purple;
            margin-top: 50px;
            margin-left: 100px;
        }
        #dv2 {
            width: 100px;
            height: 50px;
            border: 15px solid #e88e1d;
            margin-top: 20px;
            margin-left: 30px;
        }
    </style>
</head>
<body>
<div id="dv">
    <div id="dv2"></div>
</div>
<script src="common.js"></script>
<script>
    console.log(my$("dv").clientWidth); // 300
    console.log(my$("dv").clientHeight); // 200
    console.log(my$("dv").clientLeft); // 20
    console.log(my$("dv").clientTop); // 20

    console.log(my$("dv2").clientWidth); // 100
    console.log(my$("dv2").clientHeight); // 50
    console.log(my$("dv2").clientLeft); // 15
    console.log(my$("dv2").clientTop); // 15
</script>
</body>
</html>

clientWidth:可視區域的寬度(不含邊框)

clientHeight:可視區域的高度(不含邊框)

clientLeft:左邊框的寬度

clientTop: 上邊框的寬度

clientX:可視區域的橫座標

clientY:可視區域的縱座標

1、案例:圖片跟著滑鼠移動最終版

之前圖片跟著滑鼠移動的案例有些bug,就是IE8不支援。

在IE8 下 沒有事件引數,但是有 window.event 可以代替。

window.event: 谷歌, IE8 支援,但是火狐不支援。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        img {
            position: absolute;
        }
    </style>
</head>
<body>
<img src="images/Daotin.png" id="im">
<script src="common.js"></script>
<script>
    document.onmousemove = function (e) {
        // 獲取滑鼠的橫縱座標
        e = window.event || e;
        my$("im").style.left = e.clientX + "px";
        my$("im").style.top = e.clientY + "px";

        console.log(window.event);
    }
</script>
</body>
</html>

這個時候,如果 body 的高度/寬度變化了,可以滾動滑輪了會怎樣呢?

body {
    height: 5000px;
}

這時候,如果滑鼠不動,只滾動滑輪的話,會發現圖片會距離滑鼠原點越來越遠。為什麼呢?

因為當我們滾動滑輪的時候,滑鼠距離頁面頂部的距離改變了,但是 clientY 是可視區域的大小,滾動滑輪的時候, clientY 的大小是沒有變的,但是滑鼠距離頁面頂部的距離改變了,而圖片在 Y 軸的距離計算還是按照 clientY 計算的,所以圖片就會距離滑鼠越來越遠。

那麼,怎麼辦呢?

事件引數 e 有連個屬性:pageX,pageY 是距離頁面頂部邊界的距離,可以直接使用,但是不幸的是,IE8 又不支援。看來,只能是滑鼠移動的距離 + 滑輪捲曲出去的距離來實現了。

思路:

之前我們封裝的相容程式碼都在一個函式裡面,這裡我們封裝到一個物件 evt 裡面。

這個 evt 物件封裝了所有瀏覽器都支援的關於 clientX,clientY 等頁面座標的函式。

圖片跟著滑鼠移動的最終版:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            height: 5000px;
        }

        img {
            position: absolute;
        }
    </style>
</head>
<body>
<img src="images/Daotin.png" id="im">
<script src="common.js"></script>
<script>
    var evt = {
        // 獲取通用事件物件
        getEvent: function (e) {
            return window.event||e;
        },
        // 獲取通用ClientX
        getClientX: function (e) {
            return this.getEvent(e).clientX;
        },
        // 獲取通用ClientY
        getClientY: function (e) {
            return this.getEvent(e).clientY;
        },
        // 獲取通用 scrollLeft
        getScrollLeft: function () {
            return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
        },

        // 獲取通用 scrollTop
        getScrollTop: function () {
            return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
        },

        // 獲取通用 pageX
        getPageX: function (e) {
            return this.getEvent(e).pageX?this.getEvent(e).pageX:this.getClientX(e)+this.getScrollLeft();
        },

        // 獲取通用 pageY
        getPageY: function (e) {
            return this.getEvent(e).pageY?this.getEvent(e).pageY:this.getClientY(e)+this.getScrollTop();
        }
    };

    document.onmousemove = function (e) {
        my$("im").style.left = evt.getPageX(e) + "px";
        my$("im").style.top = evt.getPageY(e) + "px";
    }
</script>
</body>
</html>

2、案例:淘寶寶貝放大鏡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        /*#box {*/
        /*width: 100%;*/
        /*height: 100%;*/
        /*background-color: lightpink;*/
        /*}*/
        .small {
            float: left;
            width: 384px;
            height: 240px;
            margin-top: 50px;
            margin-left: 50px;
        }

        .mask {
            width: 128px;
            height: 80px;
            background-color: yellow;
            opacity: 0.4;
            position: absolute;
            margin-top: 50px;
            margin-left: 50px;
            left: 0;
            top: 0;
            cursor: move;
            display: none;
        }

        .big {
            width: 640px;
            height: 400px;
            float: left;
            margin-left: 50px;
            overflow: hidden;
            display: none;
        }

    </style>
</head>
<body>
<div id="box">
    <div class="small">
        <img src="images/dos.jpg" alt="">
        <div class="mask"></div>
    </div>
    <div class="big">
        <img src="images/window.jpg" alt="">
    </div>
</div>
<script src="common.js"></script>
<script>
    // 獲取所有需要的元素
    var boxObj = my$("box");

    // 獲取 small
    var smallObj = boxObj.children[0];

    // 獲取 mask
    var maskObj = smallObj.children[1];

    // 獲取 big
    var bigObj = boxObj.children[1];

    // 獲取 bigImg
    var bigImgObj = bigObj.children[0];

    // 滑鼠進入,顯示遮擋層和大圖
    smallObj.onmouseover = function () {
        maskObj.style.display = "block";
        bigObj.style.display = "block";
    };

    // 滑鼠退出,隱藏遮擋層和大圖
    smallObj.onmouseout = function () {
        maskObj.style.display = "none";
        bigObj.style.display = "none";
    };

    // 遮擋層跟著滑鼠移動,使滑鼠位於遮擋層中央
    smallObj.onmousemove = function (e) {
        var x = evt.getClientX(e) - parseInt(maskObj.offsetWidth / 2)-50; // 這50是遮擋層初始偏移left的距離
        var y = evt.getClientY(e) - parseInt(maskObj.offsetHeight / 2)-50;// 這50是遮擋層初始偏移top的距離
        // 遮擋層的最小移動範圍
        x = x < 0 ? 0 : x;
        y = y < 0 ? 0 : y;
        // 遮擋層的最大移動範圍
        x = x > smallObj.offsetWidth - maskObj.offsetWidth
            ? smallObj.offsetWidth - maskObj.offsetWidth
            : x;
        y = y > smallObj.offsetHeight - maskObj.offsetHeight
            ? smallObj.offsetHeight - maskObj.offsetHeight
            : y;

        maskObj.style.left = x + "px";
        maskObj.style.top = y + "px";

        // 小圖移動的距離/小圖能移動的最大距離 == 大圖移動的距離/大圖能移動的最大距離
        // 大圖移動的距離 = 小圖移動的距離 * 大圖能移動的最大距離 / 小圖能移動的最大距離;
        var bigImgX = x * (bigImgObj.offsetWidth - bigObj.offsetWidth) / (smallObj.offsetWidth - maskObj.offsetWidth);
        var bigImgY = y * (bigImgObj.offsetHeight - bigObj.offsetHeight) / (smallObj.offsetHeight - maskObj.offsetHeight);

        bigImgObj.style.marginLeft = -bigImgX + "px";
        bigImgObj.style.marginTop = -bigImgY + "px";
    };
</script>
</body>
</html>

第一步:獲取所有需要的元素物件。

第二步:滑鼠進入,離開小圖,顯示和隱藏遮擋層和大圖。

第三步:遮擋層隨著滑鼠的移動而移動。

第四步:遮擋層移動的最大範圍在小圖內。

第五步:小圖移動的距離/小圖能移動的最大距離 == 大圖移動的距離/大圖能移動的最大距離,由此算出大圖移動的距離 = 小圖移動的距離 * 大圖能移動的最大距離 / 小圖能移動的最大距離。

第六步:將得到的大圖移動的距離的負值賦值給大圖即可。

3、案例:DIY 滑動欄

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #box {
            width: 200px;
            height: 300px;
            border: 1px solid red;
            margin-top: 100px;
            margin-left: 300px;
            overflow: hidden;
        }

        .content {
            float: left;
            width: 180px;
            /*height: 900px;*/
        }

        .right {
            float: left;
            width: 20px;
            height: 300px;
            background-color: #e7e7e7;
            position: relative;
        }

        .bar {
            position: absolute;
            left: 0;
            top: 0;
            width: 12px;
            height: 50px;
            margin: 0 4px;
            background-color: #7b7b7b;
            /*cursor: pointer;*/
        }
    </style>
</head>
<body>
<div id="box">
    <div class="content">
        kkkkkk溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!
        溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!
        溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!
        溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!
        溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!
        溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!
        溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!
        溫馨提示:由於廠商可能在未提前通知的情況下更改產品包裝、產地、贈品或隨機附件等。
        飛虎回覆僅在回覆當時對提問者有效,其他網友僅供參考!若由此給您帶來不便敬請諒解,謝謝!Daotin
    </div>
    <div class="right">
        <div class="bar"></div>
    </div>
</div>
<script src="common.js"></script>
<script>
    // 獲取所有的元素
    // 獲取 box
    var boxObj = my$("box");

    // 獲取 content
    var conObj = boxObj.children[0];

    // 獲取 right box
    var rightObj = boxObj.children[1];

    // 獲取 bar
    var barObj = rightObj.children[0];

    // 滑鼠點選bar,拖動
    barObj.onmousedown = function (e) {
        var spaceY = evt.getClientY(e) - barObj.offsetTop; // 滑鼠距離bar頂部的距離

        document.onmousemove = function () {
            var y = evt.getClientY(e) - spaceY;
            y = y < 0 ? 0 : y;
            y = y < rightObj.offsetHeight - barObj.offsetHeight ? y : rightObj.offsetHeight - barObj.offsetHeight;
            barObj.style.top = y + "px";

            // 防止滑動的時候選中了文字
            window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

            // 滑鼠移動的時候,content也應該移動
            // bar移動的距離/ bar可以移動的最大距離 = content移動的距離/ content可以移動的最大距離
            var contentY = y * (conObj.offsetHeight - boxObj.offsetHeight) / (rightObj.offsetHeight - barObj.offsetHeight);
            conObj.style.marginTop = -contentY + "px";
        };
    };

    document.onmouseup = function () {
        document.onmousemove = null;
    }

    // 滑鼠離開
</script>
</body>
</html>

1、獲取所有需要的元素。

2、滑鼠點選,滑動,擡起,三個事件。

3、滑鼠點選的時候獲取滑鼠的位置。

4、滑鼠滑動的時候計算座標 y。由於要保證滑鼠移動的時候,滑鼠相對滑動條頂部的距離一定,所以需要 spaceY。還需要注意滑動條滑動的範圍。

5、滑鼠擡起的時候,清除滑鼠移動的事件。

6、防止滑動的時候選中了文字 window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

7、通過比例,計算 content 內容反方向移動的距離。

二、複習

1、元素隱藏的不同方式

my$("dv").style.display = "none"; // 不佔位
my$("dv").style.visibility = "hidden"; // 佔位
my$("dv").style.opacity = 0;  // 佔位
my$("dv").style.height = 0; // 佔位

Web前端之巔

相關推薦

開始 Web BOMclient系列

一、client 系列 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style

開始 Web BOMoffset,scroll,變速動畫函數

樣式 清理 java mar dde sof mov har width 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔 博客園:

開始 Web BOMoffset,scroll,變速動畫函式

一、直接使用 document 獲取的元素 // 獲取 body document.body; // 獲取 title document.title; // 獲取的是 title 中的值 // 獲取 html document.documentElement; 1、案例:圖片跟著滑鼠移動 <!DOC

開始 Web BOM定時器

一、定時器 BOM 中有兩中方式設定定時器。 1、方式一 特點:定時器可以重複使用。 // 引數有兩個: // 第一個引數:定時器定時結束處理函式 // 第二個引數:定時事件,單位毫秒。 // 返回值:定時器id值 var timeId = window.setInterval(function()

開始 Web BOMBOM的概念,一些BOM物件

大家好,這裡是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... +------------------------------------------------------------ github:https://github.com/Daotin/Web 微信公眾號:Web前端之

開始 Web DOM節點

def clas scrip while p標簽 設置 ner 操作 text 大家好,這裏是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關註。在這裏我會從 Web 前端零基礎開始,一步步學習 Web 相

開始 Web ES6ES6基礎語法二

一、Promise Promise是一個物件,代表了未來某個將要發生的事件(,這個事件通常是一個非同步操作) 有了Promise物件, 可以將非同步操作以同步的流程表達出來, 避免了層層巢狀的回撥函式(俗稱'回撥地獄')。 ES6的Promise是一個建構函式, 用來生成promise例項。 1、prom

開始 Web JavaScript陣列

大家好,這裡是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關注。在這裡我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的專案。現在就讓我們一起進入 Web 前端學習的冒險之旅吧! 一、陣列 1、陣列

開始 Web Ajax介面文件,驗證使用者名稱唯一性案例

>大家好,這裡是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... > > - github:https://github.com/Daotin/Web > - 微信公眾號:[Web前端之巔](https://github.com/Daotin/pi

開始 Web HTML5拖拽介面,Web儲存,自定義播放器

>大家好,這裡是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... > > - github:https://github.com/Daotin/Web > - 微信公眾號:[Web前端之巔](https://github.com/Daotin/pi

開始 Web CSSCSS初始化、定位、overflow、標籤規範

大家好,這裡是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關注。在這裡我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的專案。現在就讓我們一起進入 Web 前端學習的冒險之旅吧! 一、CSS初始化

開始 Web jQuery元素的建立新增與刪除,自定義屬性

一、元素的建立新增和刪除 1、方式一:以物件的方式建立元素 append,appendTo :在被選元素所有子元素的結尾插入內容(增加子元素)。 prepend,prependTo:在被選元素所有子元素的開頭插入元素(增加子元素)。 before:在當前被選元素之後插入內容(相當於增加兄弟元素)。 af

開始 Web CSS3邊框圖片,過渡

一、邊框圖片 邊框圖片:就是給邊框加圖片背景。 我們之前加的邊框都是純顏色的邊框,那麼我們怎麼給邊框加圖片呢? 原理:把一張圖片分成九宮格的形式,然後一一對應到需要新增邊框的元素上。 並且,新增邊框圖片是以背景的方式新增的,所以會有可能文字覆蓋在邊框的情況,後面也會介紹處理方法。 語法: /* bord

開始 Web DOMDOM的概念,對標簽操作

關註 1.5 pan 什麽 tin p標簽 nod text == 大家好,這裏是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關註。在這裏我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,

開始 Web jQuery獲取和操作元素的屬性

eight images idt 隱藏 lis 屬性 ner master lin 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔

開始 Web jQuery為元素綁定多個相同事件,解綁事件

png 好用 添加 方式 執行 存在 區別 也會 地址 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔 博客園:http://ww

開始 Web jQuery事件冒泡,事件參數對象,鏈式編程原理

eval uri turn 定位 return 也會 否則 ont sele 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔 博客

開始 Web AjaxAjax 概述,快速上手

lan 技術分享 php 概述 由於 val asc logs 更新 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔 博客園:ht

開始 Web Ajax同步異步請求,數據格式

遊記 document 空閑 name center 20px 實現 resp 也會 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之

開始 Web AjaxjQuery中的Ajax

var 技術分享 else parse cnblogs 我會 clas alt jquer 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web