@ -118,7 +118,12 @@
< / div >
< / div >
< div class = "right-side" >
< div class = "right-side" >
< transition name = "slide-fade" >
< transition name = "slide-fade" >
< div class = "lyrics-container" ref = "lyricsContainer" v-show ="!noLyric" >
< div
class = "lyrics-container"
ref = "lyricsContainer"
v - show = "!noLyric"
@ scroll = "blurEffect($event)"
>
< div class = "line" id = "line-1" > < / div >
< div class = "line" id = "line-1" > < / div >
< div
< div
class = "line"
class = "line"
@ -270,6 +275,23 @@ export default {
this . $parent . $refs . player . setProgress ( value ) ;
this . $parent . $refs . player . setProgress ( value ) ;
this . $parent . $refs . player . player . seek ( value ) ;
this . $parent . $refs . player . player . seek ( value ) ;
} ,
} ,
blurEffect ( ev ) {
ev . target . children . forEach ( ( el ) => {
const distanceToCenterPercentage =
Math . abs (
el . getBoundingClientRect ( ) . y +
el . clientHeight / 2 -
window . innerHeight / 2
) /
( window . innerHeight / 2 ) ;
const functionedEffectValue =
1 - Math . sqrt ( 1 - Math . pow ( distanceToCenterPercentage , 2 ) ) ;
el . style . setProperty (
"--func-val" ,
isNaN ( functionedEffectValue ) ? "" : functionedEffectValue . toFixed ( 2 )
) ;
} ) ;
} ,
setLyricsInterval ( ) {
setLyricsInterval ( ) {
this . lyricsInterval = setInterval ( ( ) => {
this . lyricsInterval = setInterval ( ( ) => {
const progress = this . player . seek ( ) ? ? 0 ;
const progress = this . player . seek ( ) ? ? 0 ;
@ -282,11 +304,36 @@ export default {
} ) ;
} ) ;
if ( oldHighlightLyricIndex !== this . highlightLyricIndex ) {
if ( oldHighlightLyricIndex !== this . highlightLyricIndex ) {
const el = document . getElementById ( ` line ${ this . highlightLyricIndex } ` ) ;
const el = document . getElementById ( ` line ${ this . highlightLyricIndex } ` ) ;
if ( el )
if ( el ) {
el . scrollIntoView ( {
const duration = 500 ;
behavior : "smooth" ,
var start ;
block : "center" ,
var animationProgress ;
} ) ;
const oldY = el . parentNode . scrollTop ;
const newY =
el . offsetTop - window . innerHeight / 2 + el . clientHeight / 2 ;
const distance = oldY - newY ;
var animation = ( timeStamp ) => {
if ( ! start ) {
start = timeStamp ;
}
animationProgress = ( timeStamp - start ) / duration ;
if ( animationProgress < 1 ) {
el . parentNode . scrollTo (
0 ,
oldY -
Math . sqrt (
2 * animationProgress - Math . pow ( animationProgress , 2 )
) *
distance
) ;
window . requestAnimationFrame ( animation ) ;
} else {
window . cancelAnimationFrame ( animation ) ;
}
} ;
window . requestAnimationFrame ( animation ) ;
}
}
}
} , 50 ) ;
} , 50 ) ;
} ,
} ,
@ -316,6 +363,8 @@ export default {
< / script >
< / script >
< style lang = "scss" scoped >
< style lang = "scss" scoped >
$layoutBreakpoint : 1000 px ;
. lyrics - page {
. lyrics - page {
position : fixed ;
position : fixed ;
top : 0 ;
top : 0 ;
@ -424,9 +473,28 @@ export default {
height : 22 px ;
height : 22 px ;
width : 22 px ;
width : 22 px ;
}
}
@ media ( max - width : $layoutBreakpoint ) {
button : nth - child ( 2 ) . svg - icon {
height : 48 px ;
width : 48 px ;
}
. svg - icon {
height : 36 px ;
width : 36 px ;
}
}
}
}
}
}
}
}
@ media ( max - width : $layoutBreakpoint ) {
. controls {
max - width : 100 vw ;
width : calc ( 100 vw - 2 * var ( -- main - content - padding - x ) ) ;
padding : var ( -- main - content - padding ) ;
margin - top : 48 px ;
}
}
}
}
. cover {
. cover {
@ -435,18 +503,31 @@ export default {
. cover - container {
. cover - container {
position : relative ;
position : relative ;
}
}
@ media ( max - width : $layoutBreakpoint ) {
. cover - container {
display : flex ;
justify - content : center ;
align - items : center ;
}
}
img {
img {
border - radius : 0.75 em ;
border - radius : 0.75 em ;
width : 54 vh ;
width : 86 vw ;
height : 54 vh ;
height : 86 vw ;
max - width : 54 vh ;
max - height : 54 vh ;
user - select : none ;
user - select : none ;
object - fit : cover ;
object - fit : cover ;
}
}
. shadow {
. shadow {
position : absolute ;
position : absolute ;
top : 12 px ;
top : 12 px ;
height : 54 vh ;
width : 86 vw ;
width : 54 vh ;
height : 86 vw ;
max - width : 54 vh ;
max - height : 54 vh ;
filter : blur ( 16 px ) opacity ( 0.6 ) ;
filter : blur ( 16 px ) opacity ( 0.6 ) ;
transform : scale ( 0.92 , 0.96 ) ;
transform : scale ( 0.92 , 0.96 ) ;
z - index : - 1 ;
z - index : - 1 ;
@ -469,13 +550,24 @@ export default {
overflow - y : auto ;
overflow - y : auto ;
transition : 0.5 s ;
transition : 0.5 s ;
. line {
. line {
-- func - val : 1 ;
/ / m a r g i n - t o p : 3 8 p x ;
/ / m a r g i n - t o p : 3 8 p x ;
padding : 18 px ;
padding : 18 px ;
transition : 0.2 s ;
transition : background 0.2 s , transform 0.5 s cubic - bezier ( 0.2 , 0 , 0 , 1 ) ;
border - radius : 12 px ;
border - radius : 12 px ;
filter : blur ( 12 px ) ;
filter : blur ( calc ( var ( -- func - val ) * 12 px ) ) ;
opacity : calc ( 1 - var ( -- func - val ) ) ;
transform : scale ( 0.9 ) translate ( - 5 % , 0 ) ;
& : hover {
& : hover {
background : var ( -- color - secondary - bg ) ;
background : var ( -- color - secondary - bg ) ;
}
}
& # line - 1 {
pointer - events : none ;
}
& . highlight {
transform : scale ( 1 ) translate ( 0 , 0 ) ;
}
span {
span {
opacity : 0.28 ;
opacity : 0.28 ;
cursor : default ;
cursor : default ;
@ -497,6 +589,12 @@ export default {
}
}
}
}
@ media ( max - width : $layoutBreakpoint ) {
. right - side {
display : none ;
}
}
. close - button {
. close - button {
position : fixed ;
position : fixed ;
top : 24 px ;
top : 24 px ;