马黑黑 发表于 2023-5-10 22:33

css-doodle播放控制器

<css-doodle id="mplayer">
        :doodle {
                @grid: 2 / 300px 70px;
                background: tan;
                --prog: 0%; --ttmsg1: '00:00'; --ttmsg2: '00:00'; --state: paused;
        }
        /* 时间信息 : 左 */ /* 时间信息 : 左 */
        @nth(1) {
                @place: 25% 70%;
                :after { content: var(--ttmsg1); }
        }
        /* 控制器 */
        @nth(2) {
                @size: 40px;
                @shape: clover 4;
                @place: 50% 35%;
                background: crimson;
                cursor: pointer;
                animation: rot 6s infinite linear var(--state);
        }
        /* 时间信息 : 右 */
        @nth(3) {
                @place: 75% 70%;
                :after { content: var(--ttmsg2); }
        }
        /* 进度条 */
        @nth(4) {
                @place: 50% 75%;
                @size: 100% 4px;
                background: gray;
                display: grid;
                place-items: center start;
                :before {
                        content: '';
                        width: var(--prog);
                        height: 100%;
                        background: crimson;
                }
                cursor: pointer;
        }
        @keyframes rot { to { transform: rotate(1turn); } }
</css-doodle>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=488388710" autoplay loop></audio>

<script>
(function() {
        let script = document.createElement('script');
        script.src = 'https://unpkg.com/css-doodle@0.34.9/css-doodle.min.js';
        document.head.appendChild(script);
        let toMin = (val) => {if (!val) return '00:00';val = Math.floor(val);let min = parseInt(val / 60), sec = parseFloat(val % 60);if (min < 10) min = '0' + min;if (sec < 10) sec = '0' + sec;return min + ':' + sec;};
        let mState = () => mplayer.style.setProperty('--state', aud.paused ? 'paused' : 'running');
        aud.addEventListener('play', mState, false);
        aud.addEventListener('pause', mState, false);
        aud.addEventListener('timeupdate', () => {
                mplayer.style.setProperty('--ttmsg1', `'${toMin(aud.currentTime)}'`);
                mplayer.style.setProperty('--ttmsg2', `'${toMin(aud.duration)}'`);
                mplayer.style.setProperty('--prog',`${100 * aud.currentTime / aud.duration}%`)
        });
        mplayer.onclick = (e) => {
                if(e.offsetX > 130 && e.offsetX < 170 && e.offsetY < 46) aud.paused ? aud.play() : aud.pause();
                if(e.offsetY > 46) aud.currentTime = aud.duration * e.offsetX / mplayer.offsetWidth;
        }
})();
</script>

马黑黑 发表于 2023-5-10 22:34

本帖最后由 马黑黑 于 2023-5-10 22:46 编辑

源码<css-doodle id="mplayer">
        :doodle {
                @grid: 2 / 300px 70px;
                background: tan;
                --prog: 0%; --ttmsg1: '00:00'; --ttmsg2: '00:00'; --state: paused;
        }
        /* 时间信息 : 左 */
        @nth(1) {
                @place: 25% 70%;
                :after { content: var(--ttmsg1); }
        }
        /* 控制器 */
        @nth(2) {
                @size: 40px;
                @shape: clover 4;
                @place: 50% 35%;
                background: crimson;
                cursor: pointer;
                animation: rot 6s infinite linear var(--state);
        }
        /* 时间信息 : 右 */
        @nth(3) {
                @place: 75% 70%;
                :after { content: var(--ttmsg2); }
        }
        /* 进度条 */
        @nth(4) {
                @place: 50% 75%;
                @size: 100% 4px;
                background: gray;
                display: grid;
                place-items: center start;
                :before {
                        content: '';
                        width: var(--prog);
                        height: 100%;
                        background: crimson;
                }
                cursor: pointer;
        }
        @keyframes rot { to { transform: rotate(1turn); } }
</css-doodle>
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=488388710" autoplay loop></audio>

<script>
(function() {
        let script = document.createElement('script');
        script.src = 'https://unpkg.com/css-doodle@0.34.9/css-doodle.min.js';
        document.head.appendChild(script);
        let toMin = (val) => {if (!val) return '00:00';val = Math.floor(val);let min = parseInt(val / 60), sec = parseFloat(val % 60);if (min < 10) min = '0' + min;if (sec < 10) sec = '0' + sec;return min + ':' + sec;};
        let mState = () => mplayer.style.setProperty('--state', aud.paused ? 'paused' : 'running');
        aud.addEventListener('play', mState, false);
        aud.addEventListener('pause', mState, false);
        aud.addEventListener('timeupdate', () => {
                mplayer.style.setProperty('--ttmsg1', `'${toMin(aud.currentTime)}'`);
                mplayer.style.setProperty('--ttmsg2', `'${toMin(aud.duration)}'`);
                mplayer.style.setProperty('--prog',`${100 * aud.currentTime / aud.duration}%`)
        });
        mplayer.onclick = (e) => {
                if(e.offsetX > 130 && e.offsetX < 170 && e.offsetY < 46) aud.paused ? aud.play() : aud.pause();
                if(e.offsetY > 46) aud.currentTime = aud.duration * e.offsetX / mplayer.offsetWidth;
        }
})();
</script>

马黑黑 发表于 2023-5-10 22:42

本帖最后由 马黑黑 于 2023-5-10 22:44 编辑

JS动态传递CSS变量值给单元格伪元素,之前曾断言不可行,晚饭后再研究了一阵子,终于解决问题。技巧是,所传递的值必须带小角引号,单引号双引号不论,前后配套就好。

具体实现代码在:

① 05行,声明 --ttmsg1 和 --ttmsg2 两个CSS变量;
② 10行和24行,两个单元格的伪元素分别调用 --ttmsg1 和 --ttmsg2 变量;
③ 55、56行分别对这两个变量赋值,赋值方式加了小角单引号。

起个网名好难 发表于 2023-5-10 23:13

本帖最后由 起个网名好难 于 2023-5-10 23:16 编辑

马黑黑 发表于 2023-5-10 22:42
JS动态传递CSS变量值给单元格伪元素,之前曾断言不可行,晚饭后再研究了一阵子,终于解决问题。技巧是,所 ...
请教,小角单引号是么意思?

mplayer.style.setProperty('--ttmsg1', `'${toMin(aud.currentTime)}'`);    前两行是传入字符串要加引号
mplayer.style.setProperty('--ttmsg2', `'${toMin(aud.duration)}'`);
mplayer.style.setProperty('--prog',`${100 * aud.currentTime / aud.duration}%`)   这行是传入数值不用引号

是不是这意思。

起个网名好难 发表于 2023-5-10 23:14

学习……

马黑黑 发表于 2023-5-10 23:17

起个网名好难 发表于 2023-5-10 23:13
小角单引号是么意思?

mplayer.style.setProperty('--ttmsg1', `'${toMin(aud.currentTime)}'`);   ...
对。单元格的 content 属性,接受JS传递的变量,需要放在引号里,否则不成功

亦是金 发表于 2023-5-10 23:25

先收藏,慢慢学习,体会,模仿,试用!谢谢老师的教程!

醉美水芙蓉 发表于 2023-5-11 06:36

红影 发表于 2023-5-11 10:27

终于可以用css-doodle做出播放器了,黑黑研究得真深{:4_199:}

红影 发表于 2023-5-11 10:34

这个也能拉动播放进度呢,只是有些数值没看明白,比如if(e.offsetX > 130 && e.offsetX < 170 && e.offsetY < 46) ,这里面的数值不知道哪来的{:4_173:}

马黑黑 发表于 2023-5-11 12:16

红影 发表于 2023-5-11 10:34
这个也能拉动播放进度呢,只是有些数值没看明白,比如if(e.offsetX > 130 && e.offsetX < 170 && e.offsetY ...

这些数值要用一个公式来替换,这里暂且这么办而已,是根据各自的位置决定的

马黑黑 发表于 2023-5-11 12:17

亦是金 发表于 2023-5-10 23:25
先收藏,慢慢学习,体会,模仿,试用!谢谢老师的教程!

{:4_191:}

马黑黑 发表于 2023-5-11 12:17

醉美水芙蓉 发表于 2023-5-11 06:36
问候老师早上好!

中午好

马黑黑 发表于 2023-5-11 12:17

红影 发表于 2023-5-11 10:27
终于可以用css-doodle做出播放器了,黑黑研究得真深

还行

南无月 发表于 2023-5-11 12:38

小播放器看上去小巧可爱,代码却不少。看来css-doodle画图可以变得简单之极,牵涉交互就复杂了。

红影 发表于 2023-5-11 14:57

马黑黑 发表于 2023-5-11 12:16
这些数值要用一个公式来替换,这里暂且这么办而已,是根据各自的位置决定的

哦,这个让人有点迷糊。

红影 发表于 2023-5-11 14:57

马黑黑 发表于 2023-5-11 12:17
还行

看着代码挺复杂,还不如之前的呢{:4_173:}

马黑黑 发表于 2023-5-11 19:58

红影 发表于 2023-5-11 14:57
看着代码挺复杂,还不如之前的呢

怎么说呢?你不能因为《巴黎圣母院》字数之多定义其为啰嗦,也不能因为《道德经》才五千字而认为它不全。

马黑黑 发表于 2023-5-11 19:59

红影 发表于 2023-5-11 14:57
哦,这个让人有点迷糊。

涉及到几何问题。

马黑黑 发表于 2023-5-11 20:03

南无月 发表于 2023-5-11 12:38
小播放器看上去小巧可爱,代码却不少。看来css-doodle画图可以变得简单之极,牵涉交互就复杂了。

交互都是复杂的
页: [1] 2 3 4 5 6 7
查看完整版本: css-doodle播放控制器