素材 + 试贴
素材不能放在这里哦,这单独一张,帮你转移到水区了 诺北 发表于 2024-5-8 13:09
素材不能放在这里哦,这单独一张,帮你转移到水区了
好的,谢谢!问好诺北管理员~ 一个醒目的同心结
挺喜庆的画面
谢谢鼓励!问好澜天版主 适合做音画素材。 谢谢鼓励!问好我也在超版,顺祝周末愉快 <style>
#papa {
margin: 130pxauto;
width: 1280px;
height: 730px;
background:url(https://pic.imgdb.cn/item/668a84acd9c307b7e9437ddf.jpg) no-repeat center/100% 100%;
position: relative;
overflow: hidden;
border-radius: 32px;
box-shadow: 3px 3px 6px gray;
z-index: 1;
}
#lrcDiv {
writing-mode: vertical-rl;
--hlcolor: #FF44AA;
position: absolute;
top: 1%;
right: 10%;
display: flex;
flex-direction: column;
gap: 6px;
width: 145px;
height: 650px;
overflow: hidden;
font: normal 18px/24px 'Microsoft YaHei', sans-serif;
text-align: center;
color: #FFBB66;
background: none;
z-index: 5;
}
#lrcDiv>p {
margin: 0;
padding: 0;
transition: .95s;
}
#lrcDiv>p.hlight {
color: var(--hlcolor);
font-size: 28px;
font-weight: bold;
}
#mplayer {
z-index: 5;
--track: silver;
--prog: red;
--percent: 0;
display: flex;
left: 300px;
top: 550px;
gap: 15px;
flex-direction: column;
align-items: center;
width: 650px;
background: none;
color: white;
padding: 15px;
position: absolute;
}
#btns-area {
width: 100%;
display: flex;
justify-content: space-between;
margin-top: 15px;
}
#btn-play {
width: 20px;
height: 20px;
cursor: pointer;
position: relative;
}
#btn-play:hover::after {
opacity: .7;
filter: alpha(opacity:.5);
}
#btn-play::after {
position: absolute;
content: '';
width: 100%;
height: 100%;
background: var(--prog);
clip-path: var(--clip);
}
#progDiv {
z-index: 5;
width: 100%;
height: 10px;
background: linear-gradient(to right, var(--prog) var(--percent), var(--track) var(--percent), var(--track) 0) no-repeat 0 50% / 100% 2px;
cursor: pointer;
}
.play {
--clip: polygon(10% 0, 100% 50%, 10% 100%);
}
.pause {
--clip: polygon(40% 0, 40% 100%, 20% 100%, 20% 0, 80% 0, 80% 100%, 60% 100%, 60% 0);
}
.vid {
position: absolute;
width: 100%;
height: 100%;
opacity: .8;
object-fit: cover;
mask: radial-gradient(transparent 20%, red);
-webkit-mask: radial-gradient(transparent 20%, red);
pointer-events: none;
left: 0px;
top: 0px;
}
</style>
<div id="papa">
<div id="lrcDiv"></div>
<div id="mplayer">
<div id="btns-area">
<div id="time1">00:00</div>
<div id="btn-play" class="pause"></div>
<div id="time2">00:00</div>
</div>
<div id="progDiv"></div>
</div>
<video class="vid " src="https://bpic.588ku.com/video_listen/588ku_video/22/11/03/14/51/00/video636364d43e50d.mp4" loop muted autoplay=""></video>
<audio src="https://cccimg.com/view.php/d05d8a08510c3c47ab212b4fa6668f52.mp3" autoplay loop muted></audio>
</div>
<div class="zw"></div>
<script>
const mplayer = document.querySelector('#mplayer');
const aud = document.querySelector('audio');
const lrcDiv = document.querySelector('#lrcDiv');
const progDiv = document.querySelector('#progDiv');
const btnPlay = document.querySelector('#btn-play');
const vids = document.querySelectorAll('video');
let lrcAr = [], isFScreen = false;
let lineHeight = 30, showLines = 7; // 滚动需要的关键参数
lrcDiv.style.width = lineHeight * showLines + 'px'; // 根据行数计算容器的宽度
const getLrcAr = (text) => {
const ar = text.trim().split(/[\r\n]+/g);
var reg = /\[(\d+)[.:](\d+)[.:](\d+)\](.*)/;
ar.forEach(item => {
let result = item.match(reg);
let tmsg = parseInt(result) * 60 + parseInt(result) + parseInt(result) / 1000;
lrcAr.push(.trim()]);
let p = document.createElement('p');
p.textContent = result.trim();
lrcDiv.appendChild(p);
if (!result) return; // 跳过不匹配的行
});
lrcAr.sort((a, b) => a - b);
};
const updatePlayerDatas = () => {
const percent = (aud.currentTime / aud.duration) * 100;
time1.innerText = formatTime(aud.currentTime);
time2.innerText = formatTime(aud.duration);
mplayer.style.setProperty('--percent', percent + '%');
for (let i = 0; i < lrcAr.length; i ++) {
const lrc = {time: lrcAr[ i ], text: lrcAr[ i ]};
const next = i < lrcAr.length - 1 ? lrcAr : null;aud.currentTime <= aud.duration;
const p = lrcDiv.children[ i ];
if (aud.currentTime >= lrc.time && (!next || aud.currentTime < next)) {
p.classList.add('hlight');
//lrcDiv.scroll({left: 0, top: p.offsetLeft - lrcDiv.offsetHeight / 2 + 12, behavior: 'smooth'});
// 滚动的关键代码,与原来的比较下就知道为什么不动了。
lrcDiv.scroll({left: p.offsetLeft - (Math.ceil(showLines / 2) * lineHeight) + lineHeight, top: 0, behavior: 'smooth'});
} else {
p.classList.remove('hlight');
}
}
};
const formatTime = (seconds) => {
const mins = Math.floor(seconds / 60);
const secs = Math.floor(seconds % 60);
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
};
const mState = () => {
if (aud.paused) {
btnPlay.className = 'play';
btnPlay.title = '点击播放';
playvids(false);
papa.style.setProperty('--state', 'paused');
} else {
btnPlay.className = 'pause';
btnPlay.title = '点击暂停';
playvids(true);
papa.style.setProperty('--state', 'running');
}
};
const playvids = (flag) => {
if(!vids) return;
vids.forEach(vid => flag ? vid.play() : vid.pause());
};
progDiv.addEventListener('click', (e) => {
if (progDiv.offsetWidth === 0 || !aud.duration) return; // 防御性检查
const targetTime = (e.offsetX / progDiv.offsetWidth) * aud.duration;
aud.currentTime = Math.min(targetTime, aud.duration); // 确保不超限
});
progDiv.addEventListener('mousemove', (e) => progDiv.title = formatTime(e.offsetX / progDiv.offsetWidth * aud.duration));
const lrc = `
时光匆匆如流水(Live 合唱版)-付飞社
词:未子夫
曲:李勇军
编曲:姜凯升
后期:鲁晓锋
和声:凌菲
制作人:李勇军工作室
OP:新创焦桐文化
【曲库专用】
来到人世间受苦又受累
尝尽了人生百般滋味
一路坎坷雨打又风吹
回首这半生我太过狼狈
春去秋来 花开花枯萎
转眼我青丝 已经成了灰
想找个地方 好好醉一回
又害怕醉了没人可依偎
时光匆匆 岁月如流水
往事随风 一去不再回
不知不觉容颜已憔悴
我这辈子遭了太多罪
时光匆匆 岁月如流水
人到了中年 没路可以退
看遍了人间是是与非非
我若心碎 谁给我安慰
谁给我安慰
春去秋来 花开花枯萎
转眼我青丝 已经成了灰
想找个地方 好好醉一回
又害怕醉了没人可依偎
时光匆匆 岁月如流水
往事随风 一去不再回
不知不觉容颜已憔悴
我这辈子遭了太多罪
时光匆匆 岁月如流水
人到了中年 没路可以退
看遍了人间是是与非非
我若心碎 谁给我安慰
谁给我安慰
`;
getLrcAr(lrc);
aud.addEventListener('timeupdate', updatePlayerDatas);
aud.addEventListener('playing', mState);
aud.addEventListener('pause', mState);
btnPlay.addEventListener('click', () => aud.paused ? aud.play() : aud.pause());
const xCenter = (el) => {
const rt = el.getBoundingClientRect();
const ww = window.innerWidth;
const ox = (ww - rt.width) / 2.1 - rt.left;
el.style.transform = `translateX(${ox}px)`;
};
xCenter(papa);
</script>
<div class="locked">此帖仅作者可见</div>
<div style="WIDTH: 1280px;height:740px; POSITION: relative;left:-22%; TOP:130px;">
<video id="vid" autoplay="autoplay" controlslist="nodownload" loop="loop" oncontextmenu=”return false” style="position: relative;width:1280px;height:740px;object-fit: cover;overflow: hidden;z-index: 1;" src="https://cccimg.com/view.php/7acc47fb8adc33690d01b0f8b63b24af.mp4"></video>
<div id="layer" style="position:absolute; left:10%;width:100%;TOP: 30px; height:1.5em;z-index: 1;">
<textarea style="visibility:hidden;" id="lrcContent">
回家 - 科尔沁夫
词:于晓峰/尹宏峰
曲:科尔沁夫
那里的风还在吹
风中的故事让人沉醉
那里的雨还在下
雨中的童年忘记回家
那里的树已长大
儿时的我们看着它发芽
那里的花还在吗
闻到那芬芳就想回家
回家回家
回家看看阿爸阿妈
回家回家
回家看看梦中的她
那里的树已长大
儿时的我们看着它发芽
那里的花还在吗
闻到那芬芳就想回家
回家回家
回家看看阿爸阿妈
回家回家
回家看看梦中的她
回家回家
回家看看阿爸阿妈
回家回家
回家看看梦中的她
回家看看梦中的她
</textarea></div></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<script type="text/javascript">
var lrcPlayer=function(){return this.init.apply(this,arguments)};
lrcPlayer.prototype={
constructor:lrcPlayer,
init:function(opts){
this.lrcVec=new Array();
this.lyricTxtObj=document.getElementById(opts.lrcTxtID);
lyricTxt=this.lyricTxtObj.innerHTML;
this.showLrcObj=document.getElementById(opts.lrcShowID);
this.showLrcObj.style.fontSize=opts.gczh?opts.gczh:'1em';
this.showLrcObj.style.fontFamily=opts.gczt?opts.gczt:'隶书';
this.showLrcObj.style.fontWeight=opts.gcct?'bold':'normal';
this.showLrcObj.style.textAlign=opts.dqfs?opts.dqfs:'center';
this.showLrcObj.style.color=opts.gcys1?opts.gcys1:'gray';
this.showLrcObj.style.cursor='pointer';
gcys=opts.gcys?opts.gcys:'red';
sMode=opts.showMode?opts.showMode:0;
this.sLine=opts.gchs?opts.gchs:1;
this.isLoop=opts.playLoop?opts.playLoop:false;
this.handleLrc(lyricTxt);
this.prepareShow(sMode,opts.shys);
this.genPlayer(opts.audioURL);
},
prepareShow:function(sMode,shys){
for(k=0;k<this.sLine;k++){
sItem=document.createElement("span");
sItem.style.display="block";
sItem.style.marginBottom='4px';
if(k==0){
sItem.style.color=gcys;
sItem.style.fontSize='120%';
if(shys){
shadowStr='0 -1px 0px '+shys+',';
shadowStr+='-1px 0 0px '+shys+',';
shadowStr+='1px 0 0px '+shys+',';
shadowStr+='0 1px 0px '+shys;
sItem.style.textShadow=shadowStr;
}
}
if(sMode!=0)sItem.style.textAlign="left";
this.showLrcObj.appendChild(sItem);
}
if(sMode!=0){
this.showLrcObj.style.writingMode='tb-rl';
this.showLrcObj.style.msWritingMode='tb-rl';
this.showLrcObj.style.mozWritingMode='vertical-rl';
this.showLrcObj.style.webkitWritingMode='vertical-rl';
}
},
handleLrc:function(lyricTxt){
var lyriclist=lyricTxt.split(/\r|\n|\r\n/);
for(n=0;n<lyriclist.length;n++){
chkTime=lyriclist.match(/\[\d{1,2}:\d{2}.\d{1,3}\]/g);
if(chkTime){
tIdx=lyriclist.lastIndexOf(']');
if(tIdx>0)lrcTxt=lyriclist.substr(tIdx+1);
for(m=0;m<chkTime.length;m++){
ta=chkTime.substr(1).replace(']','').split(/:|\./);
_t=parseFloat(parseInt(ta,10)*60+parseInt(ta,10)+'.'+ta,10);
if(this.lrcVec.length==0&&_t!=0){
this.lrcVec.push();
}
this.lrcVec.push();
}
}
}
this.lrcVec.sort(function(a,b){return(a-b)});
},
genPlayer:function(mUrl){
this.mObj=document.createElement("audio");
this.mObj.loop=false;
this.mObj.muted=false;
this.mObj.src=mUrl;
this.mObj.controls=true;
this.mObj.style.opacity=0.3;
this.showLrcObj.appendChild(this.mObj);
this.idx=0;
this.mObj.onended=()=>{
this.idx=0;
this.lyricTxtObj.innerHTML='';
if(this.isLoop){
this.mObj.play();
document.getElementById('vid').play(); // 同步播放视频
}else{
this.mObj.controls=true;
}
};
this.mObj.onplaying=()=>{
this.mObj.controls=false;
document.getElementById('vid').play(); // 同步播放视频
};
this.mObj.onerror=()=>{
console.log("audio wrong, remove play start event");
this.showLrcObj.style.display='none';
this.showLrcObj.removeChild(this);
};
this.mObj.ontimeupdate=()=>{
if(this.idx<this.lrcVec.length){
if(this.mObj.currentTime>this.lrcVec){
_idx=this.idx;
_spans=this.showLrcObj.getElementsByTagName('span');
for(k=0;k<this.sLine;k++){
_spans.innerHTML=(_idx+k)>=this.lrcVec.length?"":this.lrcVec;
}
this.idx++;
}
}
};
this.showLrcObj.onclick=()=>{
const video = document.getElementById('vid');
if(this.mObj.paused){
this.mObj.play();
video.play(); // 同步播放视频
}else{
this.mObj.pause();
video.pause(); // 同步暂停视频
}
};
try{
this.mObj.play();
document.getElementById('vid').play(); // 同步播放视频
}catch(err){
console.log(err.message);
}
},
stopMusic:function(){
this.mObj.pause();
this.mObj.controls=false;
this.mObj=null;
document.getElementById('vid').pause(); // 同步暂停视频
}
};
var opts = {
lrcTxtID:'lrcContent', // 放置LRC的textarea标签的ID
lrcShowID:"layer", // 显示歌词的标签ID
audioURL:"https://cccimg.com/view.php/605b41fcab4bf31a5e1c2f3dec6a2f37.mp3", // 音频文件URL
gczh:'32px', // 歌词字体大小
gczt:'华文行楷', // 歌词字体
gcys:'#87CEEB', // 当前歌词显示颜色
gcys1:'Brown', // 后续歌词显示颜色
shys:'#DEF70B', // 歌词描边色
gcct:true, // 歌词是否加粗
dqfs:'center', // 歌词显示对齐方式
showMode:0, // 横排(0)或竖排(1)
playLoop:true, // 是否循环播放
gchs: 2 // 显示歌词行数
};
var km = new lrcPlayer(opts);
const xCenter = (el) => {
const rt = el.getBoundingClientRect();
const ww = window.innerWidth;
const ox = (ww - rt.width) / 2 - rt.left;
el.style.transform = `translateX(${ox}px)`;
};
xCenter(document.getElementById('vid'));
</script>
页:
[1]
2