瀑布流
使用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
事件得到当前歌词的数组下标,然后计算出偏移量