需求背景
平台首页有选货市场,商品大图展示时,要求根据浏览器宽度均匀排布。
即浏览器宽度不同,一行展示的商品数量不同,通过改变外边距,让商品均匀填充满容器盒子。
原实现方案
通过css
的flex
布局和justify-content: space-between
让商品元素均匀排布。效果如下:
可见,当商品铺差不多够满了一行时展示效果是ok的,不足一行时,就会有问题。
新思路
- 不再用flex布局,使用
float
浮动,让商品元素一行展示; - 根据父容器的宽度,计算出一行可以展示的数量
n
; - 计算每个商品的
margin-right
的值newMarginRight
, 通过js
动态设置; - 父元素
margin-right:- newMarginRight
确保每行填充满;
核心代码
react代码
const GOODS_CARD_WIDTH = 250; // 每个卡片的固定宽度
const MIN_MARGIN_RIGHT = 14; // 最小的margin-right值
const GOODS_NUM_INLINE = 4; // 一行最少展示的商品数量
class GoodsCardList extends React.Component {
// 计算方法
private calcCardMarginRight = () => {
// 容器总宽度
const goodsBoxWidth = document.querySelector