亚伦影音工作室 发表于 2023-5-27 05:19

老鹰《城市的翅膀》控制移动和动态

<style>
#papa {
        margin: 100px -300px;
        width: 1164px;
        height: 640px;
        background: url('https://www.yiyuen.com/e/file/view/585873') no-repeat center/cover;
        box-shadow: 0 0 0px #000;
        position: relative;
        z-index: 1;overflow:hidden;
        --state: paused;
}
css-doodle{ position: absolute; }
#plane {position: absolute;left: 0%;top: 20%;width: 160px;height: 140px; animation: move 8s linear infinite;z-index: 5;}
@keyframes move{ 0% { transform: scale(1);left: 0%;} 100% { transform: scale(1);left: 100%;}}

#canv {filter:hue-rotate(0deg)contrast(140%)brightness(80%);
        position: absolute;
        display: block;
        height: 100%;
        position: relative;
        cursor: pointer;
        z-index: 4;opacity: 1;
}
#vid { display: none; }

#lrc {
        --state: paused;
        --motion: cover2;
        --tt: 2s;
        --bg: linear-gradient(180deg, #880000, #ff0000, #80ef03);
        position: absolute;z-index: 6;
        left: 50%;
        transform: translate(-50%);
        top: 85%;
        font:normal 3em 华文行楷;
        color: #055306;
        white-space: pre;
        -webkit-background-clip: text;
        filter:drop-shadow(#FFFFFF 1px 0 0)drop-shadow(#FFFFFF 0 1px 0)drop-shadow(#FFFFFF -1px 0 0) drop-shadow(#FFFFFF 0 -1px0);
}
#lrc::before {
        position: absolute;
        content: attr(data-lrc);
        width: 20%;
        height: 100%;
        color: transparent;
        overflow: hidden;
        white-space: pre;
        background: var(--bg);
       
        -webkit-background-clip: text;
        animation: var(--motion) var(--tt) linear forwards;
        animation-play-state: var(--state);
}

@keyframes cover1 { from { width: 0; } to { width: 100%; } }
@keyframes cover2 { from { width: 0; } to { width: 100%; } }

.wenzi {width:400px;height: 40px; position: absolute; left:-45px; top: 18%;text-align:center; z-index: 10;color:#ffffff; font: bold 20px/20px 'FangSong',serif;opacity: 1; }
#papa:hover #fullscreen { display:block ;}

#fullscreen { position: absolute; top:2%; left:5%;color:#FFffff; font: normal 2.2em华文行楷; opacity: 1; cursor: pointer; z-index: 6}

</style>

<div id="papa">
      <div id="lrc" data-lrc="花潮lrc在线">花潮lrc在线</div>
<div id="plane"><img id="testImg" src="https://www.yiyuen.com/e/file/view/588179" width="100%" height="100%"></div>

        <divid="bnt"><divstyle="width: 400px;height: 320px;overflow:hidden;margin: 3% 70%;position: absolute;">
<css-doodleid="mplayer">
          :doodle {
                @grid: 2 / 300px 60px;
            position: absolute;z-index: 40;
                color: var(--color);
            transform: scale(1);
                --prog: 0%; --size: 40px; --ttmsg1: '00:00'; --ttmsg2: '00:00'; --color:#ffffff; --state: paused;
      }
      /* 时间信息 : 左 */
      @nth(1) {
                @place: 25% 80%;
                :after { content: var(--ttmsg1); }
      }
      /* 控制器 */
      @nth(2) { @size: var(--size);                                                                                 
clip-path: @shape(fill: evenodd;points: 40;scale:.45;x: cos(2t) + cos(7t);y: sin(2t) + sin(7t); );            
@place: 50% 35%;
background: var(--color);                           
animation: rot 6s infinite linear var(--state);                  
      }
      /* 时间信息 : 右 */
      @nth(3) {
                @place: 75% 80%;
                :after { content: var(--ttmsg2); }
      }
      /* 进度条 */
      @nth(4) {
                @place: 50% 80%;
                @size: 100% 2px;
                background: #aaaaaa;
               display: grid;
                place-items: center start;
                :before {
                        content: '';
                        width: var(--prog);
                        height: 100%;
                        background: var(--color);
                }
      }
      @keyframes rot { to { transform: rotate(1turn); } }


</css-doodle>
<div class="wenzi">亚伦影音工作室</div>
</div>
</div>


<canvas id="canv"></canvas>
        <span id="fullscreen">全屏观赏</span>

        <video id="vid" src="https://img-baofun.zhhainiao.com/pcwallpaper_ugc/preview/4ceb834c17da93398d437bdf5f4616ac_preview.mp4" autoplay loop muted></video>
        <audio id="aud" src="https://www.qqmc.com/mp3/music277349946.mp3" autoplay loop></audio>

</div>

<script>
let ctx = canv.getContext('2d');
let ww = canv.width = papa.offsetWidth, hh = canv.height = papa.offsetHeight;
let loop = () => {
        ctx.drawImage(vid, 0, 0, ww, hh);
        if(!vid.paused) {
                requestAnimationFrame(loop);
                return;
        }
}
let mState = () => aud.paused ? ( mplayer.style.setProperty('--state', 'paused'), vid.pause()) : ( mplayer.style.setProperty('--state', 'running'), vid.play());
vid.addEventListener('play', loop, false);
aud.addEventListener('play', () => mState());
aud.addEventListener('pause', () => mState());

plane.style.animationPlayState = aud.paused ? 'paused' : 'running';
aud.addEventListener('playing', () => plane.style.animationPlayState = 'running');
aud.addEventListener('pause', () => plane.style.animationPlayState = 'paused');

</script>

<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>

<script >
(function() {
/*原始lrc歌词*/
let lrcStr = `
作词: 梁芒/阳蕾
作曲: 郭亮
编曲: 郭亮
城市的翅膀(第31届世界大学生夏季运动会推广曲 群星
总策划: 刘思齐
出品:亚伦影音
太阳鸟飞过的地方
鸟语花香城市中徜徉
遇见自己未来的模样
坚定信念我们启航
带着你的梦到这里来
未来更美因为都有爱
跨千山万水相聚吧
今天这里就是全世界
欢迎来成都
成就你梦想
信仰需要拼搏才怒放
欢迎来成都
你就是最强
分享胜利和渴望
追逐的心向往翱翔
我们是这城市的翅膀
闪耀着光芒的赛场
海阔天空任你绽放
带着你的梦到这里来
未来更美因为都有爱
跨千山万水相聚吧
今天这里就是全世界
欢迎来成都
成就你梦想
信仰需要拼搏才怒放
欢迎来成都
你就是最强
分享胜利和渴望
欢迎来成都
(BVG: Welcome to ChengDu)
漫天舞星光
(BVG: Makes Dreams Come True)
动人故事写在你脸庞
欢迎来成都
梦和梦相逢
爱让世界都一样
成都有你更漂亮
城市的翅膀(第31届世界大学生夏季运动会推广曲 群星
演唱Performers:(排名不分先后)

音频制作群Audio Production Group
作曲Composer: 郭亮
编曲Arrangment: 郭亮
监制Supervised production: 阳蕾
弦乐Strings:国际首席爱乐乐团
弦乐编写Strings Arrangment:郭亮
弦乐监制String supervise: 李朋
鼓Drum: 郑朝晖
贝斯E Bass: 任罕
键盘&钢琴Keyboard&Piano: 郭亮
音频编辑Audio Edit: 郭亮
伴唱Backing Vocal: 樊竹青胡维纳王馨悦张石荻许一鸣张江阳蕾郭亮
伴唱编写BVG Arrangment: 郭亮
混音师Mixing Engineer: 瞿然
混音室Mixing Studio: 蛐蛐造音场
母带处理工程师Mastering Engineer: 瞿然

`;

/*变量 :mKey - 当前歌词索引;mFlag :调用关键帧动画索引;averAdd :平均值补偿*/
let mKey = 0, mFlag = true, averAdd = 0.3;

/*函数 :获取每句歌词用时,歌词用时若超过平均值则取平均值,最后一句歌词则取平均值*/
let lrcTime = (ar) => {
        let tmpAr = [];
        for(j = 0; j <ar.length - 1; j ++) {
                if(j !== ar.length - 1) tmpAr = parseFloat((ar - ar).toFixed(1));
        }
        let aver = parseInt(tmpAr.reduce((a,b) => a + b) / (tmpAr.length - 1)) + averAdd;
        tmpAr.push(aver);
        tmpAr.forEach((item,key) => {
                ar = item > aver ? aver : item;
        });
        return ar;
};

/*函数 :从原始lrc歌词获取信息并存入 n*3 数组*/
let getLrcAr = (text) => {
        let lrcAr = [];
        let calcRule = ;
        for(x of text.split('\n')) {
                let ar = [];
                let re = /\d+[\.:]\d+([\.:]\d+)?/g;
                let geci = x.replace(re,'');
                if(geci) {
                        geci = geci.replace(/[\[\]\'\"\t,]s?/g,'');
                        let time = x.match(re);
                        if(time != null) {
                                for(y of time) {
                                        let tmp = y.match(/\d+/g);
                                        let sec = 0;
                                        for(z in tmp) sec += tmp * calcRule;
                                        ar = ;
                                        lrcAr.push(ar);
                                }
                        }
                }
        }
        lrcAr.sort((a,b)=> a - b);
        return(lrcTime(lrcAr));
};

/*函数 :模拟显示同步歌词*/
let showLrc = (time) => {
        let name = mFlag ? 'cover1' : 'cover2';
        lrc.innerHTML = lrcAr;
        lrc.dataset.lrc = lrcAr;
        lrc.style.setProperty('--motion', name);
        lrc.style.setProperty('--tt', time + 's');
        lrc.style.setProperty('--state', 'running');
        mKey += 1;
        mFlag = !mFlag;
};

/*函数 :处理当前歌词索引 mKey*/
let calcKey = () => {
        for (j = 0; j < lrcAr.length; j++) {
                if (aud.currentTime <= lrcAr) {
                        mKey = j - 1;
                        break;
                }
        }
        if (mKey < 0) mKey = 0;
        if (mKey > lrcAr.length - 1) mKey = lrcAr.length - 1;
        let time = lrcAr - (aud.currentTime - lrcAr);
        showLrc(time);
};

/*格式化时间信息*/
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 = () => aud.paused ? (lrc.style.setProperty('--state','paused'),mplayer.style.animationPlayState = 'paused') : (lrc.style.setProperty('--state','running'),mplayer.style.animationPlayState = 'running');

/*监听播放进度*/
aud.addEventListener('timeupdate', () => {
        for (j = 0; j < lrcAr.length; j++) {
                if (aud.currentTime >= lrcAr) {
                        cKey = j;
                        if (mKey === j) showLrc(lrcAr);
                        else continue;
                }
        }
});
aud.addEventListener('pause', () => mState());/*监听暂停事件*/
aud.addEventListener('play', () => mState());/*监听播放事件*/
aud.addEventListener('seeked', () => calcKey());/*监听查询事件*/
let lrcAr = getLrcAr(lrcStr); /*获得歌词数组*/
})();

let fs = true;
        fullscreen.onclick = () => {
                fs ? (fullscreen.innerText = '退出全屏',papa.requestFullscreen()) : (fullscreen.innerText = '全屏观赏', document.exitFullscreen());
                fs = !fs;
        };


</script>


<script>
if ('getContext' in document.createElement('canvas')) {
    HTMLImageElement.prototype.play = function() {
      if (this.storeCanvas) {
            // 移除存储的canvas
            this.storeCanvas.parentElement.removeChild(this.storeCanvas);
            this.storeCanvas = null;
            // 透明度还原
            image.style.opacity = '';
      }
      if (this.storeUrl) {
            this.src = this.storeUrl;   
      }
    };
    HTMLImageElement.prototype.stop = function() {
      var canvas = document.createElement('canvas');
      // 尺寸
      var width = this.width, height = this.height;
      if (width && height) {
            // 存储之前的地址
            if (!this.storeUrl) {
                this.storeUrl = this.src;
            }
            // canvas大小
            canvas.width = width;
            canvas.height = height;
            // 绘制图片帧(第一帧)
            canvas.getContext('2d').drawImage(this, 0, 0, width, height);
            // 重置当前图片
            try {
                this.src = canvas.toDataURL("image/gif");
            } catch(e) {
                // 跨域
                this.removeAttribute('src');
                // 载入canvas元素
                canvas.style.position = 'absolute';
                // 前面插入图片
                this.parentElement.insertBefore(canvas, this);
                // 隐藏原图
                this.style.opacity = '0';
                // 存储canvas
                this.storeCanvas = canvas;
            }
      }
    };
}

var image = document.getElementById("testImg"),
    button = document.getElementById("bnt");
   
if (image && button) {
    button.onclick = function() {
      if (this.value == '') {
         image.play();
            this.value = '.';
      } else {
            image.stop();
            this.value = '';
      }
    };
}
</script>


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

焱鑫磊 发表于 2023-5-27 08:23

欣赏老师佳作!{:4_176:}

红影 发表于 2023-5-27 09:01

漂亮的制作。这个停止的动态好像不是动态的任意状态,而是跳转为固定的静图呢,不过路径是停在任意状态的{:4_187:}

红影 发表于 2023-5-27 09:01

欣赏亚伦老师好帖{:4_199:}

梦缘 发表于 2023-5-27 11:07

欣赏老师的精彩,问好!{:4_187:}

梦缘 发表于 2023-5-27 11:08

漂亮的播放器,欣赏点赞!{:4_178:}

小辣椒 发表于 2023-5-27 14:30

欣赏亚伦精彩的制作{:4_199:}
页: [1]
查看完整版本: 老鹰《城市的翅膀》控制移动和动态