V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  cyrbuzz  ›  全部回复第 12 页 / 共 31 页
回复总数  617
1 ... 8  9  10  11  12  13  14  15  16  17 ... 31  
2021-08-09 17:53:53 +08:00
回复了 CSGO 创建的主题 问与答 JS 前端倒计时时间不准确如何解决?
@Biwood

还是有点疑问,setTimeout 设置 0 会有最小 4ms 的延迟是清清楚楚在文档里写的,非活跃的标签在各个浏览器下对定时器也有节流在文档里也可以清楚看到,raf 非活跃不会执行。

我的疑问是仅从楼主代码来看,1000ms 这个为什么会有延迟,楼主的代码本身没有会阻塞很长时间的代码,楼主说 60 秒会慢 1 秒,也就是每次大概都会有 16.66ms 的延迟,为什么会有如此大的延迟?楼主定时器的内的代码:

```
let num = Number(elem.innerText);
let next = num - 1;
if (next < 0) next = init;
elem.innerText = num.toString().padStart(2, '0');
```

他怎么看都花不了 16ms 。
@apeople

确实,有一些需求用 svg 写舒适的不要不要的,就是用的时候得查,嘿嘿。
2021-08-09 13:34:22 +08:00
回复了 CSGO 创建的主题 问与答 JS 前端倒计时时间不准确如何解决?
怎么感觉从理论上不会有误差呢,vant 的倒计时也是用的 raf 和 setTimeout 做的。就楼主这点代码还能阻塞到有误差?来个大佬解释一下。

从解决的角度来看,vant 内的秒级并不是 1s 执行一次,而是 1 秒执行 60 次(raf 或者 setTimeout 的模拟,或者用 requestIdleCallback 来找空闲时间的回调),通过比对是否秒数一致来实现的。
@squallsdjl

战略性 thanks~。
@LeeReamond

这个很抱歉,我没有系统性的探索过 Canvas,都是跟着 MDN 的 Demo 撸的。

感觉你可以撩一下一楼的大佬,一楼大佬给的链接里是用的 Canvas 做的 3D 动画,博客里也都是 3D 动画。
@nznd

我自己是翻译了一下 http://tutorials.jenkov.com/svg/index.html 这个大佬的 SVG 教程,跟着走了一圈。

然后翻翻 MDN,找了一些现有的例子:

张鑫旭大佬的文章:

https://www.zhangxinxu.com/wordpress/2017/12/understand-svg-fedisplacementmap-filter/

https://www.zhangxinxu.com/wordpress/2021/07/svg-filter-shadow-css-blur/

好像有本书叫 SVG 精髓,还没买来看= =。
@pigzzz

感谢大佬支持~。
@LeeReamond

谢谢~。

SVG 可以和 JS 发生交互,最后一个红包雨的例子中就注册了一个单个红包的点击事件,以及仓库中的给任意元素添加水波纹效果的 SVG 其实是用 JS 做了一个 SVG 滤镜的帧动画。

SVG 的内容对用户也是透明的,我个人的理解中是没法做到像 Canvas 那样的无法仅从 DOM 中复制,但是用 SVG 是会增加识别难度的,像掘金 logo 的例子,第一个菱形我用的`polygon`实现:

```
<polygon points="165,0 180,15 165,30 150,15" fill="#1E80FF"></polygon>
```

可以很轻易的得到我写了 4 个点,然后组成的菱形,写成 CSS 可能就是写个 div 定义宽高背景色然后 rotate,获取的更容易,但同时 SVG 也可以写的很复杂:

```
<path xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" d="M15.0737 5.80396H15.0757L18.706 2.91722L15.0757 0.00406298L15.0717 0L11.4475 2.91112L15.0717 5.80193L15.0737 5.80396ZM15.0757 14.9111L15.0778 14.9091L24.4429 7.52057L21.9036 5.48096L15.0778 10.8664L15.0757 10.8685L15.0737 10.8705L8.2479 5.48502L5.71057 7.52463L15.0737 14.9132L15.0757 14.9111ZM15.0716 19.9614L15.0757 19.9593L27.614 10.066L30.1534 12.1056L24.449 16.6053L15.0757 24L0.243779 12.3047L0 12.1117L2.53936 10.0721L15.0716 19.9614Z" class="logo"/>
```

不跑一跑我是看不懂这一堆`path`到底会组成什么东西,所以应该会增加识别难度,在我的理解中,功防时增加攻击成本都是一项正收益的事情。

都是仅理论= =,还是一个 SVG 小菜鸟,哈哈。
@balabalaguguji

哎嘿(≖ᴗ≖)✧。
@xrr2016

谢谢~😘。
@justrand

感谢!
@Danswerme

嘘,可能会摸出奇怪的东西。
@zouzou0208

感谢支持~,有帮助就太好了,开心~。(ノ´▽`)ノ♪
@mathzhaoliang

刚才看的时候就有点疑问,为什么要在 SVG 里写 canvas,直接在 html 里写不是更好,后面想到 SVG 的一大优势就是矢量图方便增删使用。看了大佬的数学仙境,只能说,大佬牛批,已加入 Star 里收藏吃灰。
@liyang5945

谢谢支持~。ヾ(゚∀゚ゞ)
@mathzhaoliang

每次觉得自己行了,就会有大佬给我上一课,这个特效也太酷了。
2021-07-28 11:45:58 +08:00
回复了 beryl 创建的主题 程序员 刷题有点刷不下去了,请假刷题经验心得
我个人的刷题经验是开始零启动,然后按套路刷。

比如今天刷链表,我会先找 easy 难度的链表(或者 easy 难度的其他题),找到一个翻转链表,翻转链表我马上能想到是用新的内存空间,迭代一遍把值保存,然后生成一个翻转的新的链表。这样能跑通吗,肯定是 AC,AC 之后今天就算启动了,接下来可以继续优化成不用额外空间的,也可以再做其他题,然后重复这个过程....
2021-07-25 17:55:32 +08:00
回复了 DinoStray 创建的主题 问与答 鼓励中年人继续学习的话有哪些
求田问舍 ,怕应羞见,刘郎才气。
2021-07-22 13:09:10 +08:00
回复了 Alander 创建的主题 前端开发 浏览器渲染问题疑惑
@Alander

emm,感觉我有说明= =,我简化一下:

innerHTML 并非触发渲染的条件,执行完整个循环才是,包裹你写的阻塞在内的所有代码都属于渲染前执行的任务。
2021-07-22 12:05:43 +08:00
回复了 Alander 创建的主题 前端开发 浏览器渲染问题疑惑
参考下这个: https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-processing-model

说下自己的理解,里面提到第 11 步是更新渲染,11 之后还有两步,一个是执行浏览器空闲回调(requestsIdleCallback)一个是 worker 的回调。

11 步之前是执行 JS,JS 主线程就一个线程,UI 渲染会等待 JS 执行,所以你这个阻塞也阻塞了渲染,

```
const div = document.querySelector('#root')
div.innerHTML = '1'
const now = performance.now()
console.log(div.innerHTML);
```
执行到这里如果没有后续代码,浏览器会尝试执行微任务栈,然后执行 UI 渲染,此时就会渲染 1 。

但要注意 innerHTML 实时改变了 DOM,但不是触发渲染的条件,改变 DOM != 渲染,走完这个循环才是执行渲染的条件。

```
while (performance.now() - now < 100) {
console.log(now)
}
console.log(div.innerHTML);
div.innerHTML = '2'
console.log(div.innerHTML);
```

加上下面这些,只是多阻塞了主线程一会,此时走完前面的 1-10,去执行 UI 渲染,而是不断执行 console.log(now),之后执行到了:

```
div.innerHTML = '2'
console.log(div.innerHTML);
```
执行渲染时的 innerHTML 已经是 2,所以渲染出来 2 了。

一般可以用 setTimeout+Promise,这样不会阻塞 UI 渲染,只会阻塞后续代码执行:

```
function sleep(times) {
return new Promise((resolve) => {
setTimeout(() => {
resolve()
}, times)
})
}
```

```
async function draw() {
const div = document.querySelector('#root')
div.innerHTML = '1'
//const now = performance.now()
//console.log(div.innerHTML);
//while (performance.now() - now < 100) {
// console.log(now)
//}
await sleep(100)
console.log(div.innerHTML);
div.innerHTML = '2'
console.log(div.innerHTML);
}

draw()
```

相关扩展可以了解一下 Vue 的$nextTick,曾经某一个版本把它从微任务改到了宏任务,此时用$nextTick 改变 DOM 的 Style 会出现抖动(因为 宏-> 微 -> UI 渲染 -> 宏 2),本来任务应该在 UI 渲染前结果成了 UI 渲染后。
1 ... 8  9  10  11  12  13  14  15  16  17 ... 31  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2984 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 21ms · UTC 14:14 · PVG 22:14 · LAX 07:14 · JFK 10:14
Developed with CodeLauncher
♥ Do have faith in what you're doing.