Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.CSS Layout debug #3

Open
ccforward opened this issue Dec 11, 2014 · 1 comment
Open

2.CSS Layout debug #3

ccforward opened this issue Dec 11, 2014 · 1 comment
Assignees

Comments

@ccforward
Copy link
Owner

ccforward commented Dec 11, 2014

一行代码调试 CSS

github代码地址

一、代码

108字节

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

131字节

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

更短的版本:82字节版本

使用hsl颜色
for(i=0;A=$$("*")[i++];)A.style.outline="solid hsl("+(A+A).length*9+",99%,50%)1px"

二、源码解读

代码先转成三行

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

1、选取页面所有DOM元素

函数$$();在现代浏览器的API中几乎都有支持,等价于 document.querySelectorAll();

2、迭代DOM元素

$$('_')将所有DOM元素转成NodeList对象,但这并不是一个JS数组,所以不能用$$('_').forEach()方法来迭代,所以使用call或者apply方法来使用foreach

[].forEach.call 等价于 Array.prototype.forEach.call 不过前者字节更少

3、给元素添加ouline

首先,为什么使用outline 而不是 border?
因为border是在元素的CSS盒模型之内,outline在CSS盒模型之外,所以添加outline之后不会影响布局。

然后最有趣的部分:随机生成颜色函数
(~~(Math.random()*(1<<24))).toString(16)

我们使用十六进制的的颜色 0~ffffff
并且 parseInt('ffffff',16) == 16777215 == 2^24-1

位运算 1>>24 == 16777216

Math.random()*(1<<24) 返回 (0,16777216)之间的 _浮点数, 等于十六进制的 0~ffffff

使用~取反,~~连续取反可以去掉浮点数的小数部分,所以~~等价于parseInt()

    ~12.3 == -13
    ~~12.3 == 12
    ~-12.98 == 11
    ~~12.98 == 12

使用toString(16)转换成16进制数(颜色)

其他

这篇原文下面的评论也很有意思,歪果仁写了更多版本的代码。

@zhuiyings
Copy link

~~第四个例子错了
~~12.98 == 12

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants