瀑布流
使用grid实现
- 通过
grid-auto-rows属性设置grid元素的基准行高 - 设置
grid元素的align-items属性值为start,目的是取消其自动拉伸行为 - 设置
grid的每一行自动填充,grid-template-columns: repeat(auto-fill, calc(50% - 5px)) - 接着动态获取每个
grid元素的clientHeight,让其除以基准行高并向上取整后加上一个间隔距离值:const girdHeight = Math.ceil(height / 5) + 2 - 最后将计算好的
grid元素实际高度赋值给grid-row-end属性即可
js
itemList[i].style.gridRowEnd = `span ${girdHeight}`我的这个例子是用原生 JS 写的,对于
Vue和React,可以根据这个思路,将grid元素封装成子组件,在子组件挂载阶段获取元素的clientHeight并计算出实际的grid元素高度即可
滚动歌词
因为歌词文件的文本格式通常都是一段歌词正文和时间轴组合而成的,所以大致的实现思路可以分为以下步骤
- 通过接口获取到歌词文本内容
- 解析歌词得到一个数组对象,每个对象至少要包含有时间轴信息和歌词正文信息
- 预先设定好的每句歌词的行高和歌词列表容器的高度
- 根据解析好的歌词数组对象动态创建一个列表
- 监听播放器的
timeupdate事件得到当前歌词的数组下标,然后计算出偏移量