楼主: 凡哥

[日记] JS代码点滴

[复制链接]
 楼主| 发表于 2024-5-27 12:02 | 显示全部楼层

2024年5月27日 星期一

canvas画布圆形进度条播放器(半拉子项目预览):

评分

1

查看全部评分

点评
回复

使用道具

发表于 2024-5-27 20:37 | 显示全部楼层
凡哥 发表于 2024-5-27 12:02
2024年5月27日 星期一
canvas画布圆形进度条播放器(半拉子项目预览):

虽是半拉,也是大方完美。。
成品已看到,更是惊艳
点评
回复

使用道具

 楼主| 发表于 2024-5-27 20:56 | 显示全部楼层
花简静 发表于 2024-5-27 20:37
虽是半拉,也是大方完美。。
成品已看到,更是惊艳

感谢谷粒
点评
回复

使用道具

 楼主| 发表于 2024-5-29 19:20 | 显示全部楼层

2024年5月29日 星期三

元素克隆演示: 查看效果

<style>     #tiezi { margin: 20px auto; width: 740px; height: 420px; background: tan; box-shadow: 3px 3px 6px #111; overflow: hidden; z-index: 1; position: relative; }     .ma { position: absolute; left: 60%; top: 15%; }     .player { position: relative; cursor: pointer; animation: rot 8s linear infinite var(--state); }     .vid { position: absolute; bottom: 0; width: 100%; height: calc(100% + 50px); object-fit: cover; }     @keyframes rot { to { transform: rotate(1turn); } } </style>   <div id="tiezi">     <audio id="aud" src="https://music.163.com/song/media/outer/url?id=369578" autoplay loop></audio>     <video class="vid" src="https://img.tukuppt.com/video_show/2269348/00/14/14/5e1bbb3034ad7.mp4" autoplay autoplay loop muted></video>     <div id="ma" class="ma">         <img id="player" class="player" src="https://638183.freep.cn/638183/web/svg/3star-01.svg" alt="" />     </div> </div>   <script> (function() {       //ar数组 存储克隆结果数据 [left, top, hue-rotate, width]     let ar = [[10,40,60,100], [200,180,240, 80]];       //遍历 ar 数组 :克隆 id="ma" 元素     ar.forEach((e,k) => {         let clone = ma.cloneNode(true); //克隆母体 id="ma"的元素(true参数表示深度克隆)         var btn = clone.querySelector('#player'); //克隆对象 id="player"         clone.id="ma" + k; //克隆结果 id 不能同于母体 id         btn.id = 'player' + k; //克隆结果内的按钮 id 不能同于母体按钮 id         btn.style.width = e[3] + 'px'; //按钮宽度(图片高度会跟随宽度改变)         btn.onclick = () => player.click(); //克隆结果内的按钮点击事件等于母体按钮点击事件         //克隆结果的CSS样式设置(不设置会与母体重叠在一起)         clone.style.cssText += `             left: ${e[0]}px;             top: ${e[1]}px;             filter: hue-rotate(${e[2]}deg);         `;         tiezi.appendChild(clone); //将克隆结果追加到帖子容器     });       //联动控制函数     let mState = () => {         let players = document.querySelectorAll('.player'),             vids = document.querySelectorAll('.vid');         tiezi.style.setProperty('--state', ['running','paused'][+aud.paused]); //控制关键帧动画         players.forEach(player => player.title = ['暂停','播放'][+aud.paused]);         vids.forEach(vid => aud.paused ? vid.pause() : vid.play());         //...其它联动代码(如果有)     };       aud.onplaying = aud.onpause = () => mState(); //audio监听事件 :调用联动函数       player.onclick = () => aud.paused ? aud.play() : aud.pause(); //按钮单击事件 :控制音频暂停/播放   })(); </script>

评分

1

查看全部评分

点评
回复

使用道具

 楼主| 发表于 2024-6-5 20:16 | 显示全部楼层

2024年6月5日 星期三

布尔变量转数值

布尔变量的值只有两个,非真即假,即 true 或 false,它们其实对应于 1 和 0,1 的数学意义表示有,0 表示没有,但布尔变量不是数值,需要时可以转换成数值,有诸多方法,我喜欢最简单的如下方法:

let a = true;
let b = +a;
console.log(b); //1

评分

1

查看全部评分

点评
回复

使用道具

发表于 2024-6-5 21:02 | 显示全部楼层
凡哥 发表于 2024-6-5 20:16
2024年6月5日 星期三
布尔变量转数值
布尔变量的值只有两个,非真即假,即 true 或 false,它们其实对应于  ...

没看懂也支持一下。。
点评
回复

使用道具

 楼主| 发表于 2024-6-5 21:33 | 显示全部楼层
花简静 发表于 2024-6-5 21:02
没看懂也支持一下。。

布尔变量会经常用到的:比如控制音频播放/暂停按钮的点击,同一个按钮的两次点击,一次是播放,一次是暂停,所依据的就是布尔变量,即音频控件的播放或暂停,audioElement.paused,它返回 true(暂停中)或 false(播放中)。
点评
回复

使用道具

 楼主| 发表于 2024-6-6 13:14 | 显示全部楼层
本帖最后由 凡哥 于 2024-6-6 13:18 编辑

2024年6月6日 星期四

初始JS原生animate动画函数


很多人不认识 JS 原生动画函数,百度的AI也认为没有。其实不然,JS早就拥有 Web Animation API,提供两个接口,其中 animate 函数就是用来操控动画的。本文将通过制作一个可控的元素旋转对象初识 Web Animation API,具体做法是,使用 JS 原生 animate 函数驱动一个 img 元素,令其旋转并且可以对其进行播放暂停进行控制。

我们需要准备一下图片:

这张图片在后面的示例中需要一个 id ,id="h7",它是图片的标识,是我们后续操作这张图片的依据。animate 函数可以这样调用:h7.animate(/* 参数 */);。现在要做的事情是了解 animate 函数的参数——其实就是 animate 函数的语法:

element.animate(keyframes, options);

element 是要执行 animate 动画的元素,一般使用 id 标识,比如本文的图片标签 id h7,或通过 document.querySelector 等方法抓取到的元素标识。下面讨论重点问题,即两个参数:

keyframes 参数,顾名思义指关键帧动画,它是关键帧动画描述的对象集合,比如从 0 到 360deg 的旋转描述,用 JS 对象来表示:

{ transform: 'rotate(0)', /* 第一帧 */ transform: 'rotate(360deg)', /* 第二帧 */ }

CSS关键帧集合描述放在花括号 {} 内,这是JS对象的表示方法。这个内容块描述了动画的两个帧,起始帧旋转 0 度,结尾帧旋转 360 度,向 animate(参数1, 参数2) 函数传递参数1,告诉它给我运行一个动画,从 0 到 360deg 旋转元素。这个内容快就是 animate 函数所需的第一个参数,我们直接将其放置在 keyframes 参数的位置即可,当然,为了方便,我们还可以将动画描述集合储存为一个变量,后面的示例代码会呈现这一点。

options 参数是动画属性集合,包含但不限于动画运行周期、动画运行次数,也是使用 JS 对象存储:

{ duration: 8000, /* 动画持续时长,毫秒单位 */ iteration: 2, /* 动画运行次数,正整数,Infinity 为无限 */ }

同样地,将以上代码块放置到 animate(参数1,参数2) 参数2的位置,告诉 animate 函数,动画的运行属性值是这两个:8 秒钟一个运行周期、运行两次。

把这些代码整合一下,动画就可以运行了:

<img id="h7" alt="" width="200" src="https://638183.freep.cn/638183/web/svg/sunfl-2.svg" />   <script> h7.animate( { transform: 'rotate(0)', /* 第一帧 */ transform: 'rotate(360deg)', /* 第二帧 */ }, { duration: 8000, /* 动画持续时长,毫秒单位 */ iteration: 2, /* 动画运行次数,正整数,Infinity 为无限 */ } ); </script>

图片旋转两圈后自动停下来,不过这个停止动作不是我们控制的,是 iteration: 2 属性的限定。要控制 animate 函数的动画,我们需要拿到动画操作标识,然后通过这个标识控制动画。animate 函数和CSS关键帧动画一样,拥有动画的播放与暂停方法,详情请参阅本文演示示例的代码:

<img id="h7" alt="" width="200" src="https://638183.freep.cn/638183/web/svg/sunfl-2.svg" />   <script> //rot对象 :旋转动画描述(省略首帧) const rot = {     transform: 'rotate(360deg)', };   // rotAttr对象 :动画属性值列表 const rotAttr = {     duration: 8000,     iterations: Infinity, };   // 运行并获得动画操作入口 rotate const rotate = h7.animate(rot, rotAttr);   //图片单击事件 h7.onclick = () => {     rotate.playState === 'running' ? rotate.pause() : rotate.play(); }; </script>

playState 是动画的运行状态,主要是 running 和 paused 两种;同时,animate 动画拥有 play() 和 pause() 两种方法。以上代码,我们就是根据 playerState 状态调用不同的方法来实现对 animate 动画的控制。效果如下:

(点击图片可以控制动画)

小结:animate 是 JS 原生的动画函数,它源自 Web Animation API 接口,它需要两个参数,参数1是动画各帧的描述集合,用以描述动画的全程,参数2是动画属性值的描述集合,用以描述动画的运行周期(时长)、运行次数等,两个参数都是用 JS 对象表示,分别放置在在花括号内;animate 函数的动画与动画属性值的描述语法大致和CSS关键帧动画一样,但有自己的语法规范。animate 函数应由元素调用,元素标识.animate(参数1, 参数2);。而要控制动画,需要获得动画标识,动画标识 = 元素标识.animate();,然后可以使用 动画标识.play(); 播放动画、使用 动画标识.pause(); 暂停动画。动画的运行状态则通过 动画标识.playState 获得,状态一般是 running 或 paused(还有中间状态,这里不提)。

评分

1

查看全部评分

点评
回复

使用道具

发表于 2024-6-6 21:03 | 显示全部楼层
凡哥 发表于 2024-6-6 13:14
本帖最后由 凡哥 于 2024-6-6 13:18 编辑
#artDiv p { font: normal 1.2em/1.5em sans-serif; }
#artDiv  ...

我再来看一遍。
这个跟CSS动画不一样不一样。。
点评
回复

使用道具

发表于 2024-6-12 21:52 | 显示全部楼层
凡哥 发表于 2024-6-5 21:33
布尔变量会经常用到的:比如控制音频播放/暂停按钮的点击,同一个按钮的两次点击,一次是播放,一次是暂 ...

你这么说的话,音频播放和暂停那是常常在用的。
好象久之前的教程里有细说。。
点评
回复

使用道具

您需要登录后才可以回帖 登录 | 中文注册

本版积分规则

手机版|千山论坛 ( 冀ICP备2024055714号 )

GMT+8, 2025-9-15 20:54

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表