Skip to content

元素位置

  • offsetParent

获取某个元素第一个定位的祖先元素,如果没有,则得到body

body的offsetParent为null

  • offsetLeft、offsetTop

相对于该元素的offsetParent的坐标

如果offsetParent是body,则将其当作是整个网页

js
/* 获取元素距离整个页面的距离 */
function getPagePosition(dom) {
  let left = dom.offsetLeft;
  let top = dom.offsetTop;
  const parent = dom.offsetParent;

  //循环一直找到body body的offsetParent是null
  while (parent) {
    left += parent.offsetLeft;
    top += parent.offsetTop;
    parent = parent.offsetParent;
  }

  return { x: left, y: top };
}
  • getBoundingClientRect方法

该方法得到一个对象,该对象记录了该元素相对于视口的距离 left:视口左边缘到元素左边框的距离 right:视口左边缘到元素右边框的距离 top和bottom同理

js
// 元素的滚动吸附效果
var div = document.querySelector(".container");
var scrollTop = 0; //滚动的距离

window.onscroll = function () {
  var rect = div.getBoundingClientRect();
  if (rect.top < 0) {
    div.style.position = "fixed";
    div.style.top = 0;
    div.style.left = rect.left + "px";
    div.style.width = rect.width + "px";
    div.style.height = rect.height + "px";
    div.style.boxSizing = "border-box";
    //记录滚动条的位置
    scrollTop = window.scrollY + rect.top;
  }
  if (window.scrollY < scrollTop) {
    div.setAttribute("style", "");
  }
};

事件模拟

  • click()
  • sumbit()
  • dispatchEvent()
js
dom.click(); //元素模拟
formDom.submit(); //表单数据提交

// 模拟鼠标进入事件
btn1.onmouseenter = function () {
  this.style.background = "red";
  this.style.color = "#fff";
};
//当点击btn3的时候,能模拟btn1进入的事件
btn3.onclick = function () {
  var event = new MouseEvent("mouseenter", {
    bubbles: false,
  });
  btn1.dispatchEvent(event);
};

其他补充

  • window.scrollX、window.pageXOffset、window.scrollY、window.pageYOffset

window.scrollX、window.pageXOffset: 相当于根元素的scrollLeft

window.scrollY、window.pageYOffset: 相当于根元素的scrollTop

  • scrollTo、scrollBy

scrollTo: 设置滚动条位置

  • resizeTo、resizeBy

MIT License