從零開始學 Web 之 移動Web(二)JD移動端網頁,移動觸屏事件

你們好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新......javascript

  • github:https://github.com/Daotin/Web
  • 微信公衆號:Web前端之巔
  • 博客園:http://www.cnblogs.com/lvonve/
  • CSDN:https://blog.csdn.net/lvonve/

在這裏我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的項目。如今就讓咱們一塊兒進入 Web 前端學習的探索之旅吧!css

1、案例:JD移動端網頁

相關源碼已放置 Githubhtml

如下爲詳細 html 源碼:前端

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="./css/base.css">
    <link rel="stylesheet" href="./css/index.css">
    <script src="./js/index.js"></script>
</head>

<body>
    <div class="jd">
        <!-- 搜索欄開始 -->
        <div class="search">
            <a href="javascript:;" class="search-logo"></a>
            <form action="" class="search-text">
                <input type="text" placeholder="請輸入商品名稱">
            </form>
            <a href="javascript:;" class="search-login">登陸</a>
        </div>
        <!-- 搜索欄結束 -->

        <!-- 輪播圖開始 -->
        <div class="slideshow">
            <ul class="slideshow-img clearfix">
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l1.jpg" alt="">
                    </a>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l2.jpg" alt="">
                    </a>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l3.jpg" alt="">
                    </a>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l4.jpg" alt="">
                    </a>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l5.jpg" alt="">
                    </a>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l6.jpg" alt="">
                    </a>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l7.jpg" alt="">
                    </a>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/l8.jpg" alt="">
                    </a>
                </li>
            </ul>
            <ul class="slideshow-dot">
                <li class="select"></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>
        <!-- 輪播圖結束 -->

        <!-- 導航欄開始 -->
        <div class="nav">
            <ul class="nav-ul clearfix">
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav0.png">
                    </a>
                    <p>商品分類</p>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav1.png">
                    </a>
                    <p>商品分類</p>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav2.png">
                    </a>
                    <p>商品分類</p>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav3.png">
                    </a>
                    <p>商品分類</p>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav4.png">
                    </a>
                    <p>商品分類</p>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav5.png">
                    </a>
                    <p>商品分類</p>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav6.png">
                    </a>
                    <p>商品分類</p>
                </li>
                <li>
                    <a href="javascript:;">
                        <img src="./uploads/nav7.png">
                    </a>
                    <p>商品分類</p>
                </li>
            </ul>
        </div>
        <!-- 導航欄結束 -->

        <!-- 主體內容開始 -->
        <div class="content">
            <div class="content-box clearfix content-box-sk">
                <div class="content-title">
                    <span class="content-title-left-clock"></span>
                    <span class="content-title-left-text fl">掌上秒殺</span>
                    <div class="content-title-left-time fl">
                        <span>0</span>
                        <span>0</span>
                        <span>:</span>
                        <span>0</span>
                        <span>0</span>
                        <span>:</span>
                        <span>0</span>
                        <span>0</span>
                    </div>
                    <span class="content-title-right fr">更多秒殺...</span>
                </div>
                <lu class="content-ul clearfix">
                    <li>
                        <a href="javascript:;">
                            <img src="./uploads/detail01.jpg" alt="" class="br">
                        </a>
                        <p>¥10.00</p>
                        <p class="content-ul-delete">¥20.00</p>
                    </li>
                    <li>
                        <a href="javascript:;">
                            <img src="./uploads/detail01.jpg" alt="" class="br">
                        </a>
                        <p>¥10.00</p>
                        <p class="content-ul-delete">¥20.00</p>
                    </li>
                    <li>
                        <a href="javascript:;">
                            <img src="./uploads/detail01.jpg" alt="">
                        </a>
                        <p>¥10.00</p>
                        <p class="content-ul-delete">¥20.00</p>
                    </li>
                </lu>
            </div>
            <div class="content-box clearfix">
                <div class="content-title">
                    <h3>京東超市</h3>
                </div>
                <lu class="content-ul">
                    <li class="fl">
                        <a href="javascript:;">
                            <img src="./uploads/cp1.jpg" alt="">
                        </a>
                    </li>
                    <li class="fl bl bb">
                        <a href="javascript:;">
                            <img src="./uploads/cp2.jpg" alt="">
                        </a>
                    </li>
                    <li class="fl bl">
                        <a href="javascript:;">
                            <img src="./uploads/cp3.jpg" alt="">
                        </a>
                    </li>
                </lu>
            </div>
            <div class="content-box clearfix">
                <div class="content-title">
                    <h3>京東超市</h3>
                </div>
                <lu class="content-ul">
                    <li class="fr">
                        <a href="javascript:;">
                            <img src="./uploads/cp4.jpg" alt="">
                        </a>
                    </li>
                    <li class="fl bl bb">
                        <a href="javascript:;">
                            <img src="./uploads/cp5.jpg" alt="">
                        </a>
                    </li>
                    <li class="fl bl">
                        <a href="javascript:;">
                            <img src="./uploads/cp6.jpg" alt="">
                        </a>
                    </li>
                </lu>
            </div>
        </div>
        <!-- 主體內容結束 -->
    </div>
</body>

</html>

CSS 源碼:java

CSS 初始化代碼:git

@charset "UTF-8";
/*css 初始化 */
html, body, ul, li, ol, dl, dd, dt, p, span, h1, h2, h3, h4, h5, h6, form, fieldset, legend, img, input, div {
    margin: 0;
    padding: 0;
    /* 盒模型 */
    box-sizing: border-box;
    /* 去掉移動端特有的點擊高亮效果: transparent 透明色*/
    -webkit-tap-highlight-color: transparent;
}

body {
    width: 100%;
    font: 12px/150% "Microsoft YaHei", sans-serif;
    color: #666;
    background: #fff
}

fieldset, img, input, button {          /*fieldset組合表單中的相關元素*/
    border: none;
    padding: 0;
    margin: 0;
    outline-style: none;  /*去除藍色邊框*/
}

ul, ol, li {
    list-style: none;               /*清除列表風格*/
}

a,
a:hover {
    text-decoration: none;
}

a:active {
    color: red;
}

select, input {
    vertical-align: middle;  /*圖片文字垂直居中*/
}

select, input, textarea {
    font-size: 12px;
    margin: 0;
}

textarea {
    resize: none;   /*不能改變多行文本框的大小*/
}

img {
    border: 0;
    vertical-align: middle; /*  去掉圖片低測默認的3像素空白縫隙*/
}

table {
    border-collapse: collapse;          /*合併外邊線*/
}


.clearfix::before, 
.clearfix::after {
    content: "";
    display: block;
    height: 0;
    line-height: 0;
    clear: both;
    visibility: hidden;
}

.clearfix {
    *zoom: 1; /*IE/7/6*/
} 

h1, h2, h3, h4, h5, h6 {
    text-decoration: none;
    font-weight: normal;
    font-size: 100%;
}

s, i, em {
    font-style: normal;
    text-decoration: none;
}

/*公共類*/
.w {
    /*版心 提取 */
    width: 1225px;
    margin: 0 auto;
}

.fl {
    float: left
}

.fr {
    float: right
}

.al {
    text-align: left
}

.ac {
    text-align: center
}

.ar {
    text-align: right
}

.hide {
    display: none
}
.bl {
    border-left: 1px solid #ccc;
}
.br {
    border-right: 1px solid #ccc;
}
.bb {
    border-bottom: 1px solid #ccc;
}

CSS 主要代碼:github

.jd {
    width: 100%;
    /* height: 1000px; */
    /* 最大寬度 */
    max-width: 640px;
    /* 最小寬度 */
    min-width: 320px;
    margin: 0 auto;
    background-color: #eee;
}

/* 搜索欄開始 */

.search {
    width: 100%;
    max-width: 640px;
    height: 40px;
    background-color: rgba(233, 35, 34, 0);
    position: fixed;
    z-index: 10;
}

.search-logo {
    width: 56px;
    height: 20px;
    background-image: url("../images/jd-sprites.png");
    background-size: 200px 200px;
    background-position: left -109px;
    position: absolute;
    left: 10px;
    top: 10px;
}

.search-login {
    color: #fff;
    font-size: 14px;
    line-height: 40px;
    position: absolute;
    right: 10px;
    top: 0;
}

.search-login:visited {
    color: #fff;
}

.search-text {
    width: 100%;
    height: 100%;
    padding-left: 76px;
    padding-right: 50px;
}

.search-text>input {
    width: 100%;
    height: 30px;
    margin-top: 5px;
    border-radius: 15px;
    color: #666;
    padding-left: 30px;
    font-size: 14px;
}

.search-text::before {
    content: "";
    width: 19px;
    height: 20px;
    background-image: url("../images/jd-sprites.png");
    background-size: 200px 200px;
    background-position: -60px -109px;
    position: absolute;
    left: 83px;
    top: 10px;
}

/* 搜索欄結束 */

/* 輪播圖開始 */

.slideshow {
    width: 100%;
    overflow: hidden;
    position: relative;
}

.slideshow-img {
    width: 800%;
}

.slideshow-img>li {
    width: 12.5%;
    float: left;
}

.slideshow-img>li img {
    width: 100%;
}

.slideshow-dot {
    width: 80px;
    height: 10px;
    position: absolute;
    left: 50%;
    bottom: 0;
    transform: translateX(-50%);
}

.slideshow-dot>li {
    width: 6px;
    height: 6px;
    float: left;
    border-radius: 50%;
    border: 1px solid #fff;
    margin: 0 2px;
}

.slideshow-dot>li.select {
    background-color: #fff;
}

/* 輪播圖結束 */

/* 導航欄開始 */

.nav {
    width: 100%;
    box-shadow: 0 2px 2px #ccc;
}

.nav-ul {
    width: 100%;
    background-color: #fff;
}

.nav-ul>li {
    width: 25%;
    float: left;
    text-align: center;
    margin-top: 10px;
}

.nav-ul>li img {
    width: 60px;
    height: 60px;
}

.nav-ul>li p {
    margin: 5px 0;
}

/* 導航欄結束 */

/* 主體內容開始 */

.content {
    width: 100%;
}

.content-box {
    width: 100%;
    margin-top: 10px;
    background-color: #fff;
    box-shadow: 0 2px 2px #ccc;
}

.content-title {
    border-bottom: 1px solid #ccc;
    position: relative;
}

.content-box>.content-title {
    height: 30px;
    line-height: 30px;
}

.content-title>h3 {
    margin-left: 20px;
    position: relative;
    font-weight: 700;
}

.content-title>h3::before {
    content: "";
    width: 3px;
    height: 10px;
    background-color: #e92322;
    position: absolute;
    left: -8px;
    top: 10px;
}

.content-ul {
    width: 100%;
}

.content-ul>li {
    width: 50%;
}

.content-ul>li img {
    width: 100%;
    display: block;
}

.content-title-left-clock {
    display: block;
    width: 16px;
    height: 20px;
    background-image: url("../images/jd-sprites.png");
    background-size: 200px 200px;
    background-position: -85px -111px;
    position: absolute;
    left: 3px;
    top: 4px;
}

.content-title-left-text {
    padding: 0 10px 0 25px;
    color: #e92322;
}

.content-title-left-time>span {
    display: inline-block;
    width: 12px;
    height: 18px;
    line-height: 18px;
    background-color: #363634;
    color: #e5d790;
    text-align: center;
    font-weight: bold;
}

.content-title-left-time>span:nth-of-type(3n) {
    background-color: transparent;
    width: 3px;
}

.content-title-right {
    margin-right: 10px;
}

.content-box-sk {
    padding: 10px;
}

.content-box-sk>.content-title {
    border-bottom: 0;
    margin-bottom: 10px;
}

.content-box-sk .content-ul {
    padding: 10px 0;
    display: flex;
    justify-content: space-around;
}

.content-box-sk .content-ul>li {
    /* width: 33.33%; */
    text-align: center;
}

.content-box-sk .content-ul>li img {
    width: 100%;
    display: inline-block;
    padding: 0 30px;
    margin-bottom: 5px;
}

.content-ul-delete {
    text-decoration: line-through;
    color: #aaa;
}

/* 主體內容結束 */

javaScript 代碼:web

window.onload = function () {
    bannerEffect();
    timeCount();
    slideshowEffect();
};

// 搜索欄上下滾動時改變透明度
function bannerEffect() {
    var bannerObj = document.querySelector(".search");
    var slideshowObj = document.querySelector(".slideshow")

    // 獲取搜索欄的高度
    var bannerHeight = bannerObj.offsetHeight; //40
    // 獲取輪播圖高度
    var slideshowHeight = slideshowObj.offsetHeight; //311

    window.addEventListener("scroll", function () {
        // 頁面向上滾動的距離(兼容代碼)
        var scrolllen = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;

        if (scrolllen < (slideshowHeight - bannerHeight)) {
            var setopacity = scrolllen / (slideshowHeight - bannerHeight);
            bannerObj.style.backgroundColor = "rgba(233, 35, 34, " + setopacity + ")";
        }
    }, false);
}

// 主體內容秒殺欄目的倒計時
function timeCount() {
    var spanObjs = document.querySelector(".content-title-left-time").children;
    var titleCount = 2 * 60 * 60; // 2小時倒計時

    var timeId = setInterval(function () {
        titleCount--;

        var hour = Math.floor(titleCount / 3600);
        var minute = Math.floor((titleCount % 3600) / 60);
        var second = titleCount % 60;

        if (titleCount >= 0) {
            // 下面的true實際想表達的是不執行任何操做,可是必需要寫個語句,因此用true代替。
            spanObjs[0].innerHTML == Math.floor(hour / 10) ? true : spanObjs[0].innerHTML = Math.floor(hour / 10);
            spanObjs[1].innerHTML == hour % 10 ? (true) : spanObjs[1].innerHTML = hour % 10;
            spanObjs[3].innerHTML == Math.floor(minute / 10) ? true : spanObjs[3].innerHTML = Math.floor(minute / 10);
            spanObjs[4].innerHTML == minute % 10 ? true : spanObjs[4].innerHTML = minute % 10;
            spanObjs[6].innerHTML == Math.floor(second / 10) ? true : spanObjs[6].innerHTML = Math.floor(second / 10);
            spanObjs[7].innerHTML == second % 10 ? true : spanObjs[7].innerHTML = second % 10;
        } else {
            titleCount = 0;
            clearInterval(timeId);
            return;
        }
    }, 1000);
}

// 輪播圖
function slideshowEffect() {
    // 1. 自動輪播圖
    // 思路:1.一、使用js在圖片開頭動態添加本來最後一張圖片
    // 1.二、使用js在圖片結尾動態添加本來第一張圖片

    // 獲取輪播圖
    var slideshowObj = document.querySelector(".slideshow");

    // 獲取ul
    var ulObj = document.querySelector(".slideshow-img");

    // 獲取全部li
    var liObjs = ulObj.children;
    // 設置li的索引值
    var index = 1;

    // 要添加的第一個li和最後一個li
    var first = liObjs[0].cloneNode(true);
    var last = liObjs[liObjs.length - 1].cloneNode(true);

    // 在li開頭結尾添加克隆圖片
    ulObj.appendChild(first);
    ulObj.insertBefore(last, ulObj.firstElementChild);

    // 設置ul寬度
    ulObj.style.width = liObjs.length + "00%";
    // 設置每一個li的寬度
    for (var i = 0; i < liObjs.length; i++) {
        liObjs[i].style.width = slideshowObj.offsetWidth + "px";
    }
    // 默認顯示第一張圖
    ulObj.style.transform = "translateX(" + -(slideshowObj.offsetWidth) + "px)"

    // 改變窗口大小的時候自動調節輪播圖的寬度
    window.addEventListener("resize", function () {
        ulObj.style.width = liObjs.length + "00%";
        for (var i = 0; i < liObjs.length; i++) {
            liObjs[i].style.width = slideshowObj.offsetWidth + "px";
        }
        // 改變窗口的大小的時候,不能僅僅回到第一張,要回到第index張
        ulObj.style.transform = "translateX(" + -(slideshowObj.offsetWidth * index) + "px)"

    }, false);

    // 1. 實現自動輪播效果
    var timerId;
    var timerStart = function () {
        timerId = setInterval(function () {
            index++;

            ulObj.style.transition = "transform 0.5s ease-in-out";
            ulObj.style.transform = "translateX(" + -(slideshowObj.offsetWidth * index) + "px)";

            // 設置小白點
            if(index >= liObjs.length - 1) {
                setDot(1);
                return;
            }
            setDot(index);
            
            // 因爲過渡效果,使得過渡的時候,就進行if、判斷,沒法顯示最後一張圖片。
            // 因此進行延時過渡的時候,等全部過渡效果完成後再進行判斷是否到達最後一張。
            setTimeout(function () {
                if (index >= liObjs.length - 1) {
                    index = 1;
                    // 從最後一張調到第一張的時候,取消過渡效果
                    ulObj.style.transition = "none";
                    ulObj.style.transform = "translateX(" + -(slideshowObj.offsetWidth * index) + "px)";
                }
            }, 500);            
        }, 1500);
       
    };

    timerStart();

    // 2. 輪播圖的手動滑動效果
    // 2.一、記錄手指的起始位置
    // 2.二、記錄手指滑動時與起始位置水平軸的偏移距離
    // 2.三、設置當手指鬆開後,判斷偏移距離的大小,決定回彈仍是翻頁。
    var startX, diffX;
    // 設置節流閥,避免手動滑動過快,在過渡過程當中也有滑動,形成的最後圖片會有空白的操做,也就是index越界了,沒有執行相應的 webkitTransitionEnd 事件。
    var isEnd = true;
    ulObj.addEventListener("touchstart", function (e) {
        // 手指點擊輪播圖時,中止自動輪播效果
        clearInterval(timerId);
        startX = e.targetTouches[0].clientX;

    }, false);

    // 最開始的時候不觸發,緣由ul的高度爲0
    ulObj.addEventListener("touchmove", function (e) {
        if (isEnd) {
            // 手指移動的距離
            diffX = e.targetTouches[0].clientX - startX;
            // 關閉過渡效果,不然手指滑動困難
            ulObj.style.transition = "none";
            ulObj.style.transform = "translateX(" + -(slideshowObj.offsetWidth * index - diffX) + "px)";
        }
    }, false);


    ulObj.addEventListener("touchend", function (e) {        
        isEnd = false;

        // 判斷當前滑動的距離是否超過必定的距離,則翻頁
        if (Math.abs(diffX) > 100) {
            if (diffX > 0) {
                index--;
            } else {
                index++;
            }
            // 翻頁
            ulObj.style.transition = "transform 0.5s ease-in-out";
            ulObj.style.transform = "translateX(-" + slideshowObj.offsetWidth * index + "px)";
        } else if (Math.abs(diffX) > 0) { // 回彈
            ulObj.style.transition = "transform 0.5s ease-in-out";
            ulObj.style.transform = "translateX(-" + slideshowObj.offsetWidth * index + "px)";
        }

        // 每次離開手指清除startX, diffX的值
        startX = 0;
        diffX = 0;

        if(index == liObjs.length-1) {
            setDot(1);
            return;
        } else if(index == 0) {
            setDot(liObjs.length-2);
            return;
        }
        setDot(index);

        // 手指離開從新開啓定時器
        timerStart();
    }, false);

    // 咱們發如今第一張往右滑動,或者最後一張往左滑動時,會形成空白
    /*webkitTransitionEnd:能夠監聽當前元素的過渡效果執行完畢,當一個元素的過渡效果執行完畢的時候,會觸發這個事件*/
    ulObj.addEventListener("webkitTransitionEnd", function () {
        // 若是到了第一張(index=0),讓index=count-2
        // 若是到了最後一張(index=count-1),讓index=1;
        if (index == 0) {
            index = liObjs.length - 2;
            // 從第一張到最後一張的時候,取消過渡效果
            ulObj.style.transition = "none";
            ulObj.style.transform = "translateX(" + -(slideshowObj.offsetWidth * index) + "px)";
        } else if (index >= liObjs.length - 1) {
            index = 1;            
            // 從最後一張調到第一張的時候,取消過渡效果
            ulObj.style.transition = "none";
            ulObj.style.transform = "translateX(" + -(slideshowObj.offsetWidth * index) + "px)";
        }

        // 設置過渡效果完成後,才能夠繼續滑動
        setTimeout(function () {
            isEnd = true;
        }, 100);
    }, false);


    // 3. 設置輪播圖小白點
    function setDot(index) {
        var dotliObjs = document.querySelector(".slideshow-dot").children;

        // 建議不使用className,由於class屬性可能有多個,使用dotliObjs[i].className = "";可能將其餘的類樣式一塊兒清除。
        for (var i = 0; i < dotliObjs.length; i++) {
            // 清除全部select樣式
            dotliObjs[i].classList.remove("select");
        }
        // 設置當前索引的樣式爲select
        dotliObjs[index-1].classList.add("select");
    }
}

這裏面的難點和重點就是輪播圖部分:數組

一、思路:微信

要實現輪播圖,必須在首尾添加圖片,若是直接在 html 代碼直接添加圖片的話,因爲圖片的數量是不固定的,那麼每次圖片的數量發生改變的話,不只須要設置 html 的源碼,並且還要設置對應的 css 代碼,因此,爲了從後臺獲取的圖片數量不固定的狀況下,也可以實現輪播效果,咱們可使用 js 來動態的添加圖片。

輪播圖要首尾鏈接,關鍵是先後加圖。

  • 使用 js 動態的在最後的位置,添加原始第一張圖片;在開始的位置,添加原始最後一張圖片。
  • 從新設置圖片盒子的寬度和圖片的寬度,而且在放大縮小視口大小的時候,自動改變寬度。
  • 開啓定時器,自動輪播
  • 添加移動端滑動事件,手動輪播。
  • 添加過渡效果結束事件,解決手動滑動到第一張和最後一張時,出現空白的問題。
  • 設置小白點,在自動輪播和手動輪播兩個地方添加。

二、在手動輪播的時候,必定記得將自動輪播時的過渡效果清除。還要關閉定時器,在手指離開的時候再次設置是定時器。關於手動輪播的相關觸摸事件知識點在下面介紹。

2、移動觸屏事件

一、事件類型

touchstart: 手指觸摸屏幕時觸發

touchmove: 手指在屏幕上移動時觸發

touchend: 手指離開屏幕時觸發

細節:

touch 事件的觸發,必須保證元素有大於0的寬高值,不然沒法觸發。(好比 ul 下 li 有寬高,ul 會被撐開,有了寬高,可是當 li 浮動起來後,ul 的寬還在, 高爲0,此時沒法對 ul 觸發 touch 事件。)

二、TouchEvent 對象

TouchEvent 事件對象是手指觸摸屏幕時觸發的事件對象,在這個對象中,咱們主要關注三個對象數組。

touches:指屏幕上全部的觸摸的手指列表

targetTouched:當前目標上全部的觸摸的手指列表

changedTouches:指當前屏幕上變換的手指對象。在 touchstart 時爲新接觸屏幕的手指,在 touchend 時爲新離開屏幕的手指。

PS:沒有對比出 touches 同 targetTouches 的差別,推薦使用 targetTouches。

三、targetTouches 對象

targetTouches 對象中有幾個座標值值得咱們關注:

screenX/screenY:手指的觸摸點相對屏幕左上角的距離。

clientX/clientY:手指的觸摸點相對視口(移動端屏幕左上角)的距離。

pageX/pageY:手指的觸摸點相對當前頁面的左上角的距離(當前頁面可能有滾動條,因此距離包含滾動的距離)。

而,通常當咱們在移動端設置了 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> 以後,clientX/clientY 的距離和 pageX/pageY 的距離是相同的了。因此通常使用 clientX/clientY。

相關文章
相關標籤/搜索