2022-04-13 JavaScript 样式的获取和修改

对马导致昏()

我们知道DOM可以访问网页中的元素,并且可以对其进行增删改查的操作。但是DOM的强大之处远不止于此,除了访问修改节点中的内容,DOM还能访问和修改对应节点的样式。比如一个div之前是200px 红色的,在我们按下鼠标之后它就变成了300px 蓝色的,这样的效果就可以通过DOM来实现。

1.获取样式

语法一:元素.style.样式名
语法二:元素.style["属性"]

这种方式不仅可以获取到元素的样式,还可以设置元素的样式。

box1.style.width = "300px";
box1.style.backgroundColor = "red";

这里要注意,设置的样式都是以字符串的形式添加的,并且长度和宽度等是需要加上px的。第二个值得注意的点,在设置背景颜色的时候,是采用的backgroundColor而不是我们设置CSS时的background-color,因为后者在JavaScript中时不合法的,所有类似的写法都需要改写成前者那样的驼峰书写法。
通过style对象获取和设置样式的方法快捷方便,但是有一个缺点,就是它访问和操作的始终是行内样式,而我们习惯上书写的一般是内联样式或者外联样式,这两种样式style对象是无法访问的。这里就需要另外一种方式来获取到元素当前正在显示的样式。
获取当前正在显示的样式

let obj = getComputedStyle(box, null);
obj.currentStyle[style];

第一行是W3C推荐的获取当前样式的方法,大部分浏览器都支持。第二行则是IE8及以下的浏览器支持的写法,因为它们不支持W3C推荐的写法。为了让代码兼容尽可能多的浏览器,需要采用兼容写法。
兼容写法的核心思路就是,获取前先判断浏览器中到底支持哪一种写法,支持哪一种就返回哪一种对应的样式。

        function getStyle(obj, style) {
            if (window.getComputedStyle) {//正常的浏览器
                return getComputedStyle(obj, null)[style];
            }
            return obj.currentStyle[style];//IE 浏览器
        }

获取当前元素显示的样式是只读模式的,也就是说,这两种方法是不能对样式进行修改的

2.样式相关的其他属性

这里主要介绍JavaScript中的动画三大家族:client offset scroll

  1. client
    client表示的是可视区域的意思,也就是一个元素中能被我们看到的地方。主要包含两个要素.
  • clientWidth 返回元素可视区域的宽度 clientWidth = padding + width
  • clientHeight 返回元素可视区域的高度 clientHeight = padding + height
  1. offset
  • offsetWidth 在clientWidth的基础上增加边框的宽度
  • offsetHeight 在clientHeight的基础上增加边框的宽度
  • offsetParent 获取当前元素的定位父元素,逐层向上纸质找到有定位的父元素,都无定位则返回body
  • offsetLeft 当前元素相较于其定位父元素的水平偏移量
  • offsetTop 当前元素相较于其定位父元素的垂直偏移量
    这里后面三个属性都是相对于定位父元素而言的,而不是距离当前元素最近的父元素。所以这也提醒我们,要使用这三个属性的时候,记得给父元素开启定位。
  1. scroll
    scroll就是滚动的意思,常见的就是网页中的一些子元素的内容溢出了父元素,所以我们添加一个滚顶条来防止溢出的同时保持内容的完整性。
  • scrollHeight 表示整个滚动区域的高度 这个高度应该是子元素的,因为子元素是溢出的。
  • scrollWidth 表示整个滚动区域的宽度
  • scrollTop 表示竖向滚顶条滚动的距离
  • scrollLeft 表示水平滚动条滚动的距离
    关于scroll有一个巧妙的用法,综合client和offset来看。我们发现当scrollHeight - scrollTop的值等于clientHeight的时候,对应的情况正好是滚动条滚动到底了!利用这样的特性,我们可以强制让用户阅读完滚动区域的所有内容,然后在解锁页面的某些功能。

3.举例 注册协议

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册协议模拟</title>
    <style>
        #info {
            width: 600px;
            height: 500px;
            overflow: auto;
            background-color: skyblue;
        }
    </style>
    <script>
        window.onload = function () {
            //为滚动条绑定一个事件 滚动到底就可以注册
            let info = document.getElementById("info");
            let input = document.getElementsByTagName("input");
            info.onscroll = function () {
                // alert("滚动")
                if (parseInt(info.scrollHeight - info.scrollTop) == parseInt(info.clientHeight)) {
                    //由于小数存在的原因 这里不取整数无法触发
                    input[0].disabled = false;
                    input[1].disabled = false;
                }
            }
        }
    </script>
</head>
<body>
<h3>请阅读协议后注册</h3>
<p id="info">
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
    请在完成协议的阅读之后再注册,非完整阅读协议不能进行注册
</p>
<input type="checkbox" name="" id="" disabled="disabled">我已阅读完毕协议
<input type="button" value="注册" disabled="disabled">
</body>
</html>

我们给滚动条绑定了一个事件响应函数,该函数会在滚动条到底的时候解锁页面的某些功能。而判断这个滚动到底的条件就是我们说的利用scroll和client,这里之所加上了取整parseInt,因为我发现直接在浏览器中拉动调试的时候会有一些极小的偏差,为了不影响正常的功能舍去这些小数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容