美文网首页
[项目]JS增删选择器实现CSS状态切换

[项目]JS增删选择器实现CSS状态切换

作者: Camilia_yang | 来源:发表于2019-07-21 22:36 被阅读0次

今天,在写仿网易云音乐播放器的播放页面时,有一些体会,写篇博客记录下来。
我是使用MVC模式写播放页面的JS,需要实现的效果是,
1.一开始光盘中间只出现“播放”按钮,不出现“暂停”按钮,这个很简单,一开始就在css里写死“暂停”按钮display:none;
2.当点击“播放”按钮时,播放音乐,同时 光盘开始转动,出现“暂停”按钮。
3.当点击“暂停”按钮时,停止播放音乐,同时 光盘停止开始转动,出现“播放”按钮。
一开始我的View里面的render()函数只负责将歌曲封面图片渲染进img标签,同时改变背景图片的url,同时View里还有circle()(光盘转动),stopcircle()(光盘停止转动),showPlaybutton()(展现播放按钮),showPausebutton(展现暂停按钮)四个函数,即将每个效果写成一个函数分别调用。

circle(){
 $('.cover').css('animation-play-state','running')
 //最好不要直接修改CSS,通过添加/删除 class来做到
  },
stopcircle(){
 $('.cover').css('animation-play-state','paused')
},
showPlaybutton(){
this.$el.find('.disc').removeClass('playing') 
},
showPausebutton(){
this.$el.find('.disc').addClass('playing') 
}
// css: 
 .disc.playing .icon-pause{display:block}
 .disc.playing .icon-play{display:none} 

写完之后发现view太细碎了,需进行优化。
仔细一想,光盘转动+“暂停”按钮 是播放时的一个组合效果,光盘不转动+“播放”按钮 是一个组合(暂停时),那么播放时我用一个变量status记下此时的状态playing ,在render时判断一下,然后按各自的效果渲染就可以了。因此我在model的data里添加了一个status变量。

 data:{
  song:{
    id:'',
    name:'',
    singer:'',
    url:'',
    cover:''
    },
   status:'paused'
},

这样的话,就把上面的四个函数变成了render函数里的:

 if(status === 'playing'){
     $('.cover').css('animation-play-state','running')
     this.$el.find('.disc').addClass('playing')
  }else if((status === 'paused')){
     $('.cover').css('animation-play-state','paused')
     this.$el.find('.disc').removeClass('playing')
  } 

另外,基于CSS和JS分开管理的原则,尽量不要让JS直接去修改CSS(虽然有.css()这样的API)而是通过添加类(.addClass(),removeClass())来实现切换。因此,通过给.cover和.disc共同的父元素添加/删除 class,将这两个效果都挂载在其父元素.playing的状态下,这样上面两种情况的两行代码就简化成一行了,

 if(status === 'playing'){
     this.$el.find('.disc').addClass('playing')
  }else if((status === 'paused')){
     this.$el.find('.disc').removeClass('playing')
  } 

至此,对render函数的改造最终完成。
犹如上面的每一步,一开始我的代码可能很low,基本上就是想到什么写什么,但没关系,先实现功能再优化代码也未尝不可嘛!

相关文章

网友评论

      本文标题:[项目]JS增删选择器实现CSS状态切换

      本文链接:https://www.haomeiwen.com/subject/rravlctx.html