js----盒模型屬性

JS盒子模型屬性

  • JS盒子模型 經過JS中的屬性和方法獲取元素的屬性信息
  • client
    • clientWidth / clientHeight
      • clientWidth 內容寬度 + 左右padding
      • clientHeight 內容高度 + 上下padding
    • clientLeft / clientTop
      • clientLeft 左邊框
      • clientTop 上邊框
    • offsetWidth / offsetHeight
      • offsetWidth = clientWidth(內容寬+左右padding) + 左右邊框
      • offsetHeight = clientHeight(內容高+上下padding) + 上下邊框
  • scoll系列 - scrollLeft(橫向滾動條捲去的距離) - scrollTop(縱向滾動條捲去的距離) - 滾動條 捲去的距離,默認是0,具體是多少要看滾動條滾動了多少
  • 獲取瀏覽器的窗口滾動的距離 let sc = document.documentElement.scrollTop || document.body.scrollTop;
    • scrollHeight/scrollWidth
      • 沒有溢出時:scrollHeight/scrollWidth 等於 clientHeight/clientWidth
      • 內容溢出時:scrollHeight = clientHeight + 溢出內容高度;
      • 內容溢出時:scrollWidth= clientWidth + 溢出內容高度;
  • 獲取瀏覽器窗口的盒模型屬性
let winW = document.documentElement.clientWidth || document.body.clientWidth;
let winH = document.documentElement.clientHeight || document.body.clientHeight;

function win(attr, val) {
 if (typeof val !== "undefined") {
   document.documentElement[attr] = document.body[attr] = val;
 }
 return document.documentElement[attr] || document.body[attr];
}
console.log(win('scrollTop'));
console.log(win('screenTop', 1000));
複製代碼
  • 偏移值 offsetLeft和offsetTop
  • 父級參照物 距離當前元素最近的有定位屬性的父級元素,若是沒有的話默認 body

封裝win方法

function win(attr, val) {
  if (typeof val !== "undefined") {
    // 傳2個值的時候是設置,傳一個值是獲取
    document.documentElement[attr] = document.body[attr] = val;
  }
  return document.documentElement[attr] || document.body[attr];
}
console.log(win('scrollTop'));
console.log(win('screenTop', 1000));
複製代碼

計算生效的樣式

  • ele.style(可讀可寫) 只能獲取或設置行內樣式
box.stytle.xxx
box.style.xxx = xxx
複製代碼
  • 獲取瀏覽器最終計算生效後的樣式 window.getComputedStyle(元素對象,僞類) 不須要僞類 寫null
  • 返回一個對象 對象中包含該元素全部的樣式
  • IE6-8不支持該語法
  • IE中獲取計算過的生效樣式 元素對象.currentStyle屬性 屬性值是一個對象 存儲了該元素生效的全部樣式

封裝getCss方法 並處理兼容問題

// 優化:去除單位、同一 透明度樣式:
function getCss(ele, attr) {
  var value;
  if ('getComputedStyle' in window) {
    value = window.getComputedStyle(ele, null)[attr];
  } else {
    // 判讀獲取的屬性是不是透明度,若是是須要給IE的透明度屬性進行特殊處理
    if (attr === 'opacity') {
      value = ele.currentStyle['filter'];
      var reg2 = /^alpha\(opacity=(.+)\)$/;
      value = reg2.exec(value)[1] / 100;
    } else {
      value = ele.currentStyle[attr];
    }
  }

  // 去除單位: 只有是數字帶單位的狀況下才須要去除單位
  var reg = /^-?\d+(\.\d+)?(px|pt|rem|em)$/i;
  if (reg.test(value)) {
    value = parseFloat(value);
  }
 }
console.log(getCss(box, 'width'));
console.log(getCss(box, 'opacity'));
複製代碼

圖片懶加載 在某個合適的時機去加載這張圖片 通常是圖片進入瀏覽器可視區域或者即將進入可視區域

  • 原理
    • 實現延時加載,不直接給 img 標籤設置 src 屬性,而是選擇自定義其餘屬性保存其圖片資源路徑;等到什麼時候的時機,再獲取這個自定義屬性值,再賦值給圖片的 src 屬性,此時,瀏覽器會根據這個 src 去加載圖片。
  • 單張圖片懶加載 -當圖片即將進入瀏覽器可視窗口
    • 監聽頁面的滾動事件 當頁面滾動時 計算圖片何時進入可視窗口
    • 進入瀏覽器可視窗口條件 :(圖片上外邊距離頁面頂端的距離 - 瀏覽器的可視窗口的高度 - 頁面縱向滾動條捲去的距離) <= 0
    • 現實項目中 先動態建立一個img標籤 用動態建立的 img 去嘗試加載,加載成功就再給頁面中的圖片 src 屬性賦值。
  • 多張圖片懶加載
    • 監聽可視頁面全部圖片
    • 監聽頁面中的onscroll事件 在事件函數中 計算每張圖片是否即將出如今瀏覽器的可視窗口
    • 當前圖片即將進入,就進行該圖片的加載
    • 加載以前須要判斷該圖片是否有src屬性 如有 就說明圖片已經加載過 就不須要從新加載
相關文章
相關標籤/搜索