【JavaScript】脚本化CSS & 滚动设置

获取 CSS 样式

获取元素的所有样式属性(只读)
  1. [window.]getComputedStyle(ele[, pseudoElt]).att / ['att']
    ele - 用于获取计算样式的元素
    pseudoElt - 指定要匹配的伪元素;必须对普通元素省略 / null
let style = getComputedStyle(box, null);
console.log(typeof style); // object
console.log(typeof style.height); // string -- 以字符串形式返回属性值

. 获取的属性名要符合标识符规范。所以有连字符的属性名要写成小驼峰

getComputedStyle(oDiv).backgroundColor;
oDiv.currentStyle.backgroundColor;

[] 内写的是字符串,所以可以保留连字符

getComputedStyle(oDiv)['background-color'];
oDiv.currentStyle['background-color'];
demo 1
<div id="box"></div>
#box {
    width: 100px;
}

#box::after {
    content: '';
    display: block;
    width: 60px;
}

获取元素节点的属性:

let w = parseInt(getComputedStyle(box).width);
console.log(w); // 100

获取伪元素的属性:

let w = parseInt(getComputedStyle(box, 'after').width);
console.log(w); // 60
demo 2

这样,我们就可以获取元素节点的 CSS 样式,并修改行内样式:

<div id="box"></div>
<script>
    let oBox = document.getElementById('box');
    let wid = parseInt(getComputedStyle(oBox).width); // 获取 CSS 样式

    oBox.onclick = function () {
        wid += 20;
        console.log(wid);
        oBox.style.width = wid + 'px'; // 修改行内样式
    }
</script>

offset

盒子的大小
  1. ele.offsetWidthwidth + 左右padding + 左右border
  2. ele.offsetHeightheight + 上下padding + 上下border
  • 没有兼容问题
盒子的位置
  1. ele.offsetLeft:该元素左边框外,到自己的 offsetParent 对象的左边框内的距离
  2. ele.offsetTop:该元素上边框外,到自己的 offsetParent 对象的下边框内的距离
  • 兼容性较差
元素的 offsetParent 对象
  • 离自己最近的、定位的祖先元素。最后的父级为 body
op.offsetParent // 查找离自己最近的定位父级
demo:封装 getElementPosition() 函数,获取元素相对于文档的坐标
function getElePos(dom) {
    let x = dom.offsetLeft + dom.clientLeft; // 水平距离 + 左边框
    let y = dom.offsetTop + dom.clientTop; // 竖直距离 + 上边框
    let parent = dom.offsetParent; // 父级

    while (parent) { // 有父级的话
        x += parent.offsetLeft + parent.clientLeft; // 父级的水平距离 + 左边框
        y += parent.offsetTop + parent.clientTop; // 父级的竖直距离 + 上边框
        parent = parent.offsetParent; // 再取父级
    }
    return { x: x, y: y };
}

client

盒子的大小
  1. ele.clientWidthwidth + 左右padding
  2. ele.clientHeightheight + 上下padding
  • 如果盒子没有高度,可以用文字撑起 height
盒子的边框
  1. dom.clientTop:上边框线的宽度
  2. dom.clientLeft:左边框线的宽度
  • parseInt(getComputedStyle(box).borderTopWidth) 等效,所以使用得比较少

对于元素

获取宽高

当元素实际内容 > 设置的宽高时

  1. dom.scrollWidth → 元素实际内容的 width
  2. dom.scrollHeight → 元素实际内容的 height

获取 / 设置滚动距离

滚动距离:在显示页面上方的距离

  1. dom.scrollTop [获取] / [设置] 一个元素的内容垂直滚动的像素数
  2. dom.scrollLeft [获取] / [设置] 一个元素的内容水平滚动的像素数
  • 到元素底部的距离:dom.scrollHeight - parseInt(getComputedStyle(dom).height) - dom.scrollTop

在这里插入图片描述

对于页面

页面的滚动兼容问题

获取宽高

  1. window.innerWidth 窗口的宽度(包含滚动条)
  2. window.innerHeight 窗口的高度(包含滚动条)

获取滚动距离

  1. window.scrollX / window.pageXOffset 页面滚动的水平距离
  2. window.scrollY / window.pageYOffset 页面滚动的竖直距离

设置滚动

可以用于设置 [元素] / [页面] 的滚动

element.scrollTo() 滚动到指定位置
  1. element.scrollTo(x-coord, y-coord)
window.scrollTo(0, 100);
  1. element.scrollTo(options)
window.scrollTo({
    top: 100,
    left: 100,
    behavior: 'smooth'
});
element.scrollBy() 滚动指定距离
  1. element.scrollBy(x-coord, y-coord)
window.scrollBy(0, 100);
  1. element.scrollBy(options)
window.scrollBy({
    top: 100,
    left: 0,
    behavior: 'smooth'
});
element.scrollIntoView():滚动 element 的父容器,使 element 对用户可见
  1. element.scrollIntoView()
element.scrollIntoView(); // 使 [element 的顶端] 与 [其父容器的顶端] 对齐
window.scrollIntoView(false); // [元素的底端] 与 [其所在滚动区域的可视区域的底端] 对齐
  1. element.scrollIntoView(alignToTop)
    behavior:定义动画过渡效果 - auto(默认、smooth
    block:定义垂直方向的对齐 - start(默认)、centerendnearest
    inline:定义水平方向的对齐 - startcenterendnearest(默认)
window.scrollIntoView({ 
    block: "end",
    behavior: "smooth"
});
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JS.Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值