UI挑战 - 提升CSS掩蔽技术-PT2
#css #网络开发人员 #web #ui

在这篇文章中,我将显示Avatar component just built on previous post的用例。

网格

我们的目标是构建一个网格组件,该组件将带有一些其他文本信息的头像,然后在后台添加一些很酷的视频播放。为了实现这一目标,将执行以下步骤:

  • 创建一个将使用Avatar组件的头像卡组件,然后使用2个文本字段,持有名称和角色信息。
  • 将几个头像卡组件放在网格中。
  • 添加一个视频,该视频将在页面背景中在页面背景中很好地播放。

虽然在纸上似乎很正常,但html/css的编码是有些并发症,因为我无法在任何头像父母上使用任何背景来产生所需的效果。

在编码Web组件时,我尝试最大化HTML/CSS代码,但有时JS是实现某些功能障碍的最干净,最简单的方法。我正在寻找创建一个集中物品的网格组件(就像CSS网格合理性:中心属性一样),但是在尝试仅尝试使用CSS之后,请记住我们需要使网格响应且灵活(网格组件)不知道孩子的元素大小)我意识到JS将是最好的选择。再次,我喜欢将代码保持尽可能可读和清洁,其中包括CSS代码(这是使用形状剪切所有外部内容的rathen,可以创建新形状 - 例如一个装有六角形的正方形 - 能够管理它的纵横比需要相关性,因为面具容器可以水平地生长尽可能多,而不会影响形状的纵横比,因此我们不需要任何额外的空侧元素来获得相同的元素增长效果),因此如果CSS变得过于复杂,我倾向于重新考虑实施设计,但是当然,这只是个人编码样式的选择。

因此,为了以中心方式进行分类,我创建了以下组件(用react ts制成)。以下是代码:

const SideGrowingGrid: React.FC<SideGrowingGridProps> = ({ coverColor = 'white', children }): ReactElement => {
    const [gridRef, { width }] = useElementSize();
    const [itemRef, { width: iWidth }] = useElementSize();
    const childs = ( (children as JSX.Element[]).map ? children : [(children as JSX.Element)] ) as JSX.Element[]; 
    const itemsPerRow : number = iWidth === 0 ? childs.length : iWidth > width ? 1 : Math.floor(width / iWidth);

    return (
        <div className='sgg-container'
            ref={gridRef}>
            {
                ([...Array(Math.ceil(childs.length / itemsPerRow))]).map((e, i) =>  (
                    <div className='sgg-row' key={i}>
                        <div style={{backgroundColor: coverColor, flexGrow: 1}}></div>
                    {      
                        childs.slice(i * itemsPerRow, i * itemsPerRow + itemsPerRow).map((child, j) => (
                            <div key={j} ref={(i === 0 && j === 0) ? itemRef : null}>
                                {child}
                            </div>
                        ))
                    }
                        <div style={{backgroundColor: coverColor, flexGrow: 1}}></div>
                    </div>
                ))
            }
        </div>
    );
}

组件非常简单:

  • 使用自定义挂钩获得网格大小和网格项目的大小(注意:假设所有项目的大小都相同)。
  • 计算每个网格行的项目数,以后创建相应包装此类孩子的行元素。
  • 在开始的开始和每行的末端添加空元素,并使用其作为组件属性传递的任何颜色覆盖网格远端。

就是这样,我们已经准备好了网格组件!尽管如此,如果您对像CSS网格这样的物品进行排序良好 - 周围的空间确实可以很容易地使用CSS实现它。您可以检查下面的笔实现并进行播放。

想象力是无限的

现在我们拥有网格组件,我们只需要添加一个酷的背景即可获得大部分。在公司的网站中,我们使用了一些微妙的(动画梯度和涂鸦背景),但是对于此用例,我添加了一个视频,访问者可以轻松地告诉所有头像都在共享相同的背景。

您可以查看完整的实现here

,在下面的链接中,您可以检查实时结果:

Avatar Grid

avatar-grid.vercel.App

< UI Challenge - Elevate CSS masking techniques - Pt1

谢谢

就是这样,希望您发现这篇文章有用,如果您有一些很酷的用例想法,请毫不犹豫地分享它们!如果您想连接,可以在LinkedIn

中找到我