元素的相关操作

一、通过js知识来操作css样式

DOM操作:通过js可以操作网页中的元素和样式

        行内样式:直接在标签中style样式        js中设置的样式就称为js样式

js样式的优先级低于行内样式,但大于外部css和内联样式

        若在用js脚本来获取元素的样式只能获取到js样式和行内样式,而外部引入的css样式和内联样式获取不到

案例1:随机颜色生成

  <style>
        .box {
            color: red;
            /* opacity: 1;
            background-color: ; */
            width: 200px;
            height: 200px;
        }
    </style>
</head>

<body>
    <div class="box">111</div>
    <script>
        let box = document.querySelector(".box")
        //dom操作: js可以操作网页中的任意信息
        let r = Math.round(Math.random() * 255)
        let g = Math.round(Math.random() * 255)
        let b = Math.round(Math.random() * 255)
        box.style.color = `rgb(${r},${g},${b})` //这里使用的是反引号
        box.style.backgroundColor = `rgb(${g},${r},${b})`
        console.log(box.style)
        console.log(window.getComputedStyle(box))//获取box元素的计算样式(已经计算好的样式属性)
    </script>

        getComputedStyle(n):获取指定元素n的计算样式,已经计算好了的,包括元素的尺寸,边框、边距、背景等,返回的是一个只读对象

<script>
const box = document.getElementById('box');//获取元素
const computedStyle = getComputedStyle(box);
const width = computedStyle.width;
const height = computedStyle.height;// 获取计算好的宽度和高度
const paddingTop = computedStyle.paddingTop;
const paddingBottom = computedStyle.paddingBottom;// 获取计算好的内边距

console.log(width, height, paddingTop, paddingBottom);
<//script>

        n.style:用于获取和设置、修改元素的样式,getcomputedStyle()是不可修改的

案例2:设置一个边框,每隔1秒边框的高度增加4px,若高度值大于800px了,则停止

        分析:(1)获取元素

                   (2) 这里需要用到计时器setInterva()用于设置延时的秒数    

                   (3)在计时器中获取现在的高度(h),在现在的高度上再添加值(4px)并赋值给元素(newh)

                    (4)判断高度是否达到800px,若大于800,则清除计时器

  var box = document.getElementsByClassName("box")[0]
        var timer = setInterval(() => {
            let newh = parseFloat(getComputedStyle(box).height) + 4
            box.style.height = newh + "px"
            if (newh >= 400) {
                clearInterval(timer)
            }
        }, 1000)

         案例3:点击图片,然后背景图片换成该图片

<style>
    img {
        width: 100px;
        height: 100px;
    }
</style>
<div class="box">
    <img class="one" src="./imag/OIP-C 4.jfif" alt="">
    <img class="two" src="./imag/OIP-C.jfif" alt="">
    <img class="thr" src="./imag/OIP-C9.jfif" alt="">
</div>
<script>
    var c = document.querySelectorAll("img")
    var d = ["url(./imag/OIP-C 4.jfif)", "url(./imag/OIP-C.jfif)", "url(./imag/OIP-C9.jfif)"]//创建一个数组,将图片装进去
    for (let i = 0; i < c.length; i++) {
        c[i].onclick = function () {//给每个元素都绑定点击事件
            console.log(i)
            document.body.style.backgroundImage = d[i]//若点击事件触发,点击哪个图片,就将哪个图片设为背景图片
        }
    }
</script>

        效果图最后一次点击的是第三个图片,背景就变成了该图片

二、表单(input)操作

与前面用标签写的表单标签相比,js中编写的各种功能具有可编程性

        1.获取表单和表单元素:获取方式和前面获取元素的方法一样(getElementByIdquerySelectorgetElementsByTagName、

        (1)获取表单:获取整个表单元素本身,包括表单的属性、事件和子元素等

        (2)获取表单元素:获取表单中的具体表单字段或控件元素如:文本框、复选框、下拉列表等

        2.表单和表单元素的属性和方法

<script>
        var input = document.querySelectorAll("input")//获取所有
        //表单方法
        input.submit()//提交表单
        input.reset()//重置表单
        //表单元素属性
        input.type //可读可写,表单元素类型
        input.form//包含该元素的form表单对象,不存在返回null
        input.name //可读可写,元素的名称
        input.value//可读可写,输入框的值
</script>

三、页面的渲染流程

1.页面呈现过程

不同的浏览器略微会有些不同。但基本上都是类似的

①.浏览器把html代码解析成1个Dom树,html中的每个tag都是Dom树中的1个节点,根节点就是我们常用的document对象。dom树就是html结构,里面包含了所有的html tag,包括用JS添加的元素。

②浏览器把所有样式(主要包括css和浏览器自带的样式设置)解析成样式结构体,在解析的过程中会去掉浏览器不能识别的样式

③dom tree和样式结构体结合后构建呈现树(render tree),render tree有点类似于dom tree,但有区别,render tree能识别样式,render tree中每个node都有自己的style,而且render tree不包含隐藏的节点(比如display:none的节点,还有head节点)因为这些节点不会用于呈现,而且不会影响呈现的,所以就不会包含到render tree中。但是visibility:hidden隐藏的元素还是会包含到render tree中的,因为visibility:hidden 会影响布局,会占有位置

④一旦render tree构建完毕后,浏览器就根据render tree来绘制页面。

2.回流与重绘

        ① 当render tree中因为元素的数量,尺寸,布局,隐藏等改变而需要重新构建。这就称为回流或者回档(其实我觉得叫重新布局更简单明了些)。每个页面至少需要一次回流,就是在页面第一次加载的时候。

        ②当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局,比如background-color。则就叫称为重绘

        ③(面试,选择题,问答题就答上面)从上面可以看出,回流将引起重绘,而重绘不一定会引起回流。

3.常见的回流和重绘操作任何对render tree中元素的操作都会引起回流或者重绘

        ①添加、删除元素(回流+重绘)

        ② 隐藏元素,display:none(回流+重绘),visibility:hidden(只重绘,不回流)

        ③ 移动元素,比如改变top,left(jquery的animate方法就是,改变top,left不一定会影响回流),或者移动元素到另外1个父元素中。(重绘+回流)

        ④ 对style的操作(对不同的属性操作,影响不一样)

        ⑤ 还有一种是用户的操作,比如改变浏览器大小,改变浏览器的字体大小等(回流+重绘)

④重绘与回流操作的注意点:重绘与回流操作的次数越多,计算机的性能消耗越大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值