JS随手笔记2

位置的获取

  • offsetX/offsetY: 事件触发相对于当前元素自身的位置(包括padding为正,border为负)
  • clientX/clientY: 事件触发相对于浏览器可视区域的位置 (不包括滚动出去的范围的)
  • pageX/pageY: 事件触发相对于整个网页的位置 (包括滚动出去的范围的)
  • screenX/screenY: 事件触发相对于屏幕的位置(不常用)
    * {
        margin: 0;
        padding: 0;
      }

      div {
        width: 100px;
        height: 100px;
        margin-left: 50px;
        margin-top: 50px;
        padding: 20px;
        border: 30px solid #cccccc;
        background-color: red;
      }
    <div></div>
    <script>
      let oDiv = document.querySelector("div")
      oDiv.onclick = function (event) {
        event = event || window.event
        console.log("offsetX " + event.offsetX)
        console.log("offsetY " + event.offsetY)
        console.log("-----------------------")
        console.log("clientX " + event.clientX)
        console.log("clientY " + event.clientY)
        console.log("-----------------------")
        console.log("pageX " + event.pageX)
        console.log("pageY " + event.pageY)
        console.log("-----------------------")
      }
    </script>
位置

样式获取

  • getComputedStyle : 获取最终样式
var style = getComputedStyle(oDiv);
     通过getComputedStyle获取宽高不包括 边框和内边距
     只支持获取, 不支持设置
     只支持IE9及以上浏览器
  • currentStyle : 获取样式
var style = oDiv.currentStyle;
     通过currentStyle获取宽高不包括 边框和内边距
     只支持获取, 不支持设置
     只支持IE9及以下浏览器
  • style : 获取样式
oDiv.style.width = "100px";
     通过style获取宽高不包括 边框和内边距
     只能获取内设置的宽高
     支持获取和设置
     高低级浏览器都兼容

宽高获取

  • offsetWidthoffsetHeight 获取元素宽高
    边框 + 内边距 + 元素宽高

  • clientWidthclientHeight 获取元素宽高
    获取的宽高包含 内边距 + 元素宽高

  • scrollWidthscrollHeight 获取元素宽高
    内容没有超出元素范围时
    scrollWidth: = 元素宽度 + 内边距宽度 == clientWidth
    scrollHeight: = 元素高度 + 内边距的高度 == clientHeight
    内容超出元素范围时
    scrollWidth: = 元素宽度 + 内边距宽度 + 超出的宽度
    scrollHeight: = 元素高度 + 内边距的高度 + 超出的高度

位置获取

  • offsetLeft/offsetTop: 距离第一个定位祖先元素偏移位 || body
  • clientLeft/clientTop: 左边框 和 顶部边框
  • scrollTop / scrollLeft: 超出元素内边距 顶部 和 左边 的距离

网页高度获取

  • window.innerWidth/window.innerHeight: 在IE9以及IE9以上的浏览器中才能获取
  • document.documentElement.clientWidth / document.documentElement.clientHeight:
    在IE9以下的浏览器的标准模式中获取
  • document.body.clientWidth / document.body.clientHeight:
    在IE9以下的浏览器的怪异模式中获取

注:html文档中有 <!DOCTYPE html> 为标准模式,否则为怪异模式

document.compatMode === "CSS1Compat" // 标准渲染模式
document.compatMode === "BackCompat" // 怪异渲染模式

兼容写法:获取网页高度 / 宽度

function getScreen() {
        let width, height;
        if(window.innerWidth){
            width = window.innerWidth;
            height = window.innerHeight;
        }else if(document.compatMode === "BackCompat"){
            width = document.body.clientWidth;
            height = document.body.clientHeight;
        }else{
            width = document.documentElement.clientWidth;
            height = document.documentElement.clientHeight;
        }
        return {
            width: width,
            height: height
        }
    }

兼容写法:获取屏幕滚动高度 / 宽度

    function getPageScroll() {
        let x, y;
        if(window.pageXOffset){
            x = window.pageXOffset;
            y = window.pageYOffset;
        }else if(document.compatMode === "BackCompat"){
            x = document.body.scrollLeft;
            y = document.body.scrollTop;
        }else{
            x = document.documentElement.scrollLeft;
            y = document.documentElement.scrollTop;
        }
        return {
            x: x,
            y: y
        }
    }

函数防抖和节流

  • 函数防抖
    /**
     * 函数防抖 - 只会执行一次,只能看到结果
     * @param {*} callback
     * @param {*} delay
     */
    function debounce(callback, delay) {
        let timerId = null;
        return function () {
            let that = this;
            let args = arguments;
            timerId && clearTimeout(timerId);
            timerId = setTimeout(function () {
                callback.apply(that, args);
            }, delay || 1000);
        }
    }
  • 函数节流
    /**
     * 函数节流 - 会执行几次不等,能看到过程
     * @param {*} callback
     * @param {*} delay
     */
    function throttle(callback, delay) {
        let timerId = null;
        let flag = true;
        return function () {
            if(!flag) return;
            flag = false;
            let that = this;
            let args = arguments;
            timerId && clearTimeout(timerId);
            timerId = setTimeout(function () {
                flag = true;
                callback.apply(that, args);
            }, delay || 1000);
        }
    }
END
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341