每日一题(四一)[].forEach.call($$(*)function(a){a.style.outline=1px solid #+(~~(Math.random()*(1 24))).toS

解释下这段代码的意思,以及用到的技术点

[].forEach.call($$('*'),function(a){
    a.style.outline = "1px solid #"+(~~(Math.random()*(1<<24))).toString(16);
})

答案:

直观操作:获取页面所有的元素,然后给这些元素加上 1px 的外边框,并且使用了随机颜色。

几个关键点:

1.选择页面中的所有元素:$$() 函数是现代浏览器提供的一个命令行 API ,它相当于 document.querySelectorAll(),可以将当前页面中的 CSS 选择器作为参数传递给此方法,然后它会返回匹配的所有元素。

2.遍历元素:[].forEach.call($$('*'),function(a){...});  通过使用函数的 call 和 apply 方法进行方法借用,可以实现类似 NodeList 这样的类数组对象上调用数组方法。

3.为元素添加颜色:a.style.outline="1px solid #"+color ,代码中使用 outline 的 CSS 属性给元素添加一个边框,由于渲染的 outline 是不在 CSS 盒模型中的,所以为元素添加 outline 并不会影响元素的大小和页面的布局。

4.生成随机颜色:(~~(Math.random()*(1<<24))).toString(16)

    1>.Math.random()*(1<<24) 可以得到 0~2^24 -1 之间的随机数,使用了位操作。<< 是左位移操作符

    2>.因为得到了一个浮点数,但是我们只需要整数部分,使用取反操作符 ~ 连续两次取反获得整数部分,使用两个波浪号等价于使用 parseInt:const a = 12.23;  ~~a === parseInt(a); //true

    3>.然后再用 toString(16) 方式,转换成一个十六进制的字符串。toString() 方法将数值转换为字符串时,接收一个参数用以指明数值的进制。如果省略了该参数,则默认采用十进制,但可以指定为其他进制。例如十六进制。

猜你喜欢

转载自blog.csdn.net/MFWSCQ/article/details/106406282