CSS Grid 布局实战|打造一款响应式的商品展示网站

CSS Grid 布局是一种新型的前端布局方式,它可以轻松实现复杂的网页布局效果,而且比传统的 flexbox 和 float 布局更为高效、易于维护。本篇文章将介绍如何使用 CSS Grid 布局来打造一款响应式的商品展示网站,让你深入了解 CSS Grid 布局的强大之处,并掌握如何运用它来实现复杂的网页布局效果。

准备工作

在开始之前,需要先确保你已经掌握了以下技能:

  • HTML5 语法基础
  • CSS3 基础
  • Chrome 开发者工具的基本使用方法

设计思路

我们需要设计一款商品展示网站,它需要具备以下功能:

  • 响应式布局,适应各种屏幕大小
  • 商品列表随机排列,不会出现空白间隙
  • 商品列表分为不同的分类
  • 商品列表可以进行筛选,筛选条件包括分类和价格
  • 商品列表中的每个商品都有自己的图片和详细说明页面

为了实现以上功能,我们需要对网页布局进行以下设计:

  • 使用 header 标签放置网站标题和全局导航栏
  • 使用 main 标签作为主要内容区域,从上到下分别是商品筛选区域、商品分类区域、商品列表区域
  • 商品筛选区域包含两个下拉框,分别用于筛选商品分类和价格
  • 商品分类区域是一个占据整行的网格容器,容器中的每个网格都是一个商品分类,且该分类占满整个网格
  • 商品列表区域是一个动态生成的网格容器,每个商品是一个网格,根据筛选条件随机排列

HTML 结构

按照以上设计思路,我们可以编写以下 HTML 结构:

--------- -----
----- -------------

------
    ----- ----------------
    ----- --------------- ---------------------------- -------------------
    ---------------------
    ----- ---------------- -----------------
-------

------
    --------
        ---------------
        -----
            -- ---------------
            -- -----------------
            -- ----------------
            -- -----------------
        ------
    ---------
    ------
        ---- --------------------
            --------------------
            --------
                ------- -------------------------
                ------- -----------------------------
                ------- -----------------------------
                ------- ----------------------------
                ------- ------------------------------
            ---------
            --------------------
            --------
                ------- -------------------------
                ------- -----------------------------
                ------- --------------------------------
                ------- ---------------------------------
            ---------
        ------
        ---- ----------------------
            ---- -------------
                ---- ------------------
                    -----------
                ------
                ---- ------------------
                    -----------
                ------
                ---- -----------------
                    -----------
                ------
                ---- ------------------
                    ------------
                ------
            ------
        ------
        ---- ---------------------
            ---- -------- ---
        ------
    -------
-------

-------

其中,由于商品列表是动态生成的,我们在 .product-area 内容区域先留个空,待后面的 JavaScript 代码填充。

CSS 样式表

接下来,我们需要使用 CSS 样式表为网页进行布局和样式设计。由于 CSS Grid 布局是关键所在,因此我们着重介绍以下相关的样式代码。

网格容器样式

为了让网格容器具备 CSS Grid 布局的能力,需要为其指定 display: grid 属性:

----- -
    -------- -----
    ---------------------- ----------------- ------------- ------
    ---- -----
-

其中,grid-template-columns 属性是设置网格列的数量和大小。这里我们采用了 repeat(auto-fill, minmax(250px, 1fr)) 的方式定义列,它可以自适应屏幕大小、生成若干个宽度为 250px 的网格列,并将多出来的空间平均分配给每个列。gap 属性可以设置网格之间的间隙大小。

网格项样式

网格项即网格容器中的一个网格,也就是商品展示页面的每一个商品。我们要为每个网格指定一个特定的样式,让其能够适应不同的商品图片和说明。指定样式如下:

----- - - -
    -------- -----
    ----------------- ------
-

这里我们使用了一个通用选择器 .grid > *,表示选择所有直接子元素(即网格项),为它们设置如下的样式:

  • padding:网格内边距,确保商品图片和说明不会紧贴到网格的边界上,从而不至于过度压缩或被裁剪
  • background-color:网格的背景颜色,确保商品之间有明显的边界,更好地进行视觉区分

除此之外,每个分类的网格项需要加上特定的类名,以便后续进行分类筛选。例如,以下是家具分类的网格项样式:

---------- -
    ----------------- ------------------------------
    ---------------- ------
    -------------------- -------
    ---------- -----
    ------ ------
-

这里我们添加了 .furniture 类名,并为其指定了以下样式:

  • 背景图片:等比例缩放,覆盖整个网格;
  • 字体大小:设置商品名称的字体大小;
  • 字体颜色:将商品名称颜色设为白色;

同样,其他分类的网格项样式也可以按照此方式进行定义。

网格响应式布局

在进行响应式布局时,我们需要注意以下几点:

  • 在屏幕较小的情况下,将网格列数固定为一个,避免过度挤压导致商品图片和说明被裁剪;
  • 在屏幕尺寸变化时自适应调整网格列数和大小;
  • 筛选条件选择框需要能够自适应屏幕大小并处于同一行;
  • 全局导航栏需要能够收缩成一个菜单,在手机端不占用太多屏幕空间。

为了实现网格响应式布局,可以进行如下设置:

------ ------ --- ----------- ------ -
    ----- -
        ---------------------- ----
    -
    ------------ -
        --------------- -------
        ------------ -----------
        -------------- -----
    -
    ------------ - - -
        ------ -----
    -
    --- -
        -------- -----
        --------- ---------
        ---- -----
        ----- --
        ------ --
        ------- --------- - ------
        ----------------- ------
        -------- --
    -
    ---------- -
        -------- ------
    -
-

这里,我们在媒体查询中针对屏幕宽度小于 767px 的情况进行样式调整,具体设置如下:

  • 将商品列表列数调整为 1;
  • 筛选条件选择框变为纵向排列;
  • 筛选条件选择框宽度调整为 100%;
  • 导航栏变为展开/隐藏菜单,同时设置菜单的位置和大小等相关属性。

JavaScript 代码

除了 HTML 和 CSS 之外,我们还需要使用 JavaScript 代码为网站添加一些交互效果。例如,根据用户选择的分类和价格条件动态生成商品列表、在点击导航栏菜单时展开/隐藏菜单,等等。以下是一些基本的 JavaScript 代码示例:

-- -----------------
----- -------- - -
    -
        ----- -------
        ------ ----
        --------- ------------
        ------ -----------------
        ------------ -------- --- ----------- ---- -------- --- ------ ---- --- -------
    --
    -
        ----- ---- ----
        ------ ----
        --------- ------------
        ------ -----------------
        ------------ --- ---- -- --- ----- --- -- ---- ---- --- ----- --------
    --
    -- ---
--

-- -----------------
-------- ----------------------------- ------ -
    -- ---------
    ----- ----------- - ----------------------------------------
    --------------------- - ---

    -- ----------
    ----- ---------------- - ------------------------- -- -
        -- --------- --- ----- -- ---------------- --- --------- -
            -- ------ --- ------ -
                ------ -----
            - ---- -- ------ --- ------- -- ------------- -- ---- -
                ------ -----
            - ---- -- ------ --- -------- -- ------------- - --- -- ------------- -- ---- -
                ------ -----
            - ---- -- ------ --- ----------- -- ------------- - ---- -
                ------ -----
            -
        -
        ------ ------
    ---

    -- ------------
    ----- ---- - --------------------------------
    ---------------------------------- -- -
        ----- -------- - ------------------------------
        ------------------ - -
            ---- -------------------------------- ----------------------
            ------------------------
            -----------------------------
            ---- -------------------------------------
            -- -----------------
        --
        -----------------------------------------
        ---------------------------
    ---
-

-- -------------
----- -------------- - --------------------------------------- ---------
--------------------------------- -- -
    ----------------------------------- -- -- -
        ----- -------- - -------------------------------------------------
        ----- ----- - ----------------------------------------------
        ----------------------------- -------
    ---
---

-- -----------------
----- ---------- - ----------------------------------------
------------------------------------ -- -- -
    ----- --- - ------------------------------
    -------------------------------
---

以上 JavaScript 代码中,我们模拟了商品数据,并编写了一个 generateProductList 函数,它可以根据筛选条件生成商品列表并展示在网格容器中。点击选择框时,会调用该函数刷新商品列表。同时,我们还编写了一个 navMenuBtn 的事件监听,它可以在用户点击导航栏菜单按钮时展开/隐藏菜单。

实现效果

最终,我们可以得到一个响应式的、具备分类筛选和价格筛选功能的商品展示网站,其示意图如下所示:

当屏幕大小发生变化时,网页布局和配色都会自适应调整,如下图所示:

总结

本篇文章介绍了如何使用 CSS Grid 布局来搭建一个响应式的商品展示网站,从设计思路到 HTML 结构、CSS 样式表和 JavaScript 代码,详细地介绍了如何实现网格的布局、响应式调整和样式设计,还通过生成商品列表和筛选条件等交互效果来加强网站的展示功能。希望本文对读者理解 CSS Grid 布局的特点和使用方法有所帮助,也能够启发读者在实际开发中运用其优秀的布局能力。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6479830f968c7c53b0582b30


猜你喜欢

  • ECMAScript 2021 中的 async 函数详解

    ECMAScript 2021 中的 async 函数详解 随着现代 web 应用程序的复杂性增加,异步编程变得越来越重要。在过去的几年中,JavaScript 中的异步编程,特别是使用 Promis...

    1 年前
  • 解决 Deno 中调用第三方 API 时出现的“timeout”问题

    前言 Deno 是一个新的 JavaScript/TypeScript 运行时环境,由于其安全性强、代码可读性高等优点,在前端开发中越来越受到关注。然而,当我们在使用 Deno 调用第三方 API 时...

    1 年前
  • Sequelize 实现 MySQL 聚合函数的方法

    聚合函数在 SQL 中是十分重要的,能够用于统计数据和进行数据分析。在 Node.js 的项目中,通过 Sequelize 可以方便地操作 MySQL 数据库。本文将介绍如何利用 Sequelize ...

    1 年前
  • 精通 ES7 async 和 await

    什么是 async 和 await async 和 await 是 ECMAScript 2017 (ES7) 中的一个新特性,它们为 JavaScript 中的异步编程提供了一种更优雅的解决方案。

    1 年前
  • 基于 Serverless 的 ETL 转换实现

    什么是 ETL? ETL(Extract-Transform-Load)是一种数据处理方法,常用于数据仓库和数据分析。其流程如下: Extract:从不同的数据源中提取数据。

    1 年前
  • AngularJS 基于 ui-router 单页面应用(SPA)开发

    在前端开发中,单页面应用(SPA)已经成为一个非常重要的概念。它允许我们在一个页面中构建整个应用程序,利用 JavaScript 和 AJAX 构建动态页面、交互功能,使得用户体验更加流畅和快速,同时...

    1 年前
  • Koa 中间件 koa-log4js 的使用技巧

    引言 在日常的开发中,日志是必不可少的,不仅能够帮助开发者根据日志来排查问题,更能为系统运维提供重要的支持。然而,在 Node.js 平台中,日志处理需要使用到一些工具库,例如常见的 log4j,为了...

    1 年前
  • RxJS multicast 操作符的应用与解析

    RxJS 是一款流行的 JavaScript Reactive 编程库,它将异步和基于事件的编程模型结合起来,提供了一种响应式编程的思维方式。在 RxJS 中,multicast 操作符是一个非常有用...

    1 年前
  • 自定义 React JSX 无障碍性顺序实现

    React 是前端开发中常用的 JavaScript 库,其强大的组件化功能以及灵活的 JSX 语法让我们能够快速构建高质量的前端应用。在开发过程中,我们需要考虑到无障碍性方面的问题,以保证我们的应用...

    1 年前
  • Chai.js 如何支持中文?插件 "chai-for-zh" 详解!

    Chai.js 是一个流行的 JavaScript 测试框架,它提供了可读性强、易于使用的断言语法,使得前端单元测试变得更加简单。然而,对于许多中文开发者来说,Chai.js 中的英文语言可能会成为一...

    1 年前
  • Angular 中使用 HttpClient 替代 Http 模块

    在 Angular 中,使用 Http 模块是发送 HTTP 请求的常见做法。但是,在 Angular 4.3 后推出的 HttpClient 模块,不仅可以替代 Http 模块,更提供了更强大、更方...

    1 年前
  • PM2 日志文件的生成和配置

    介绍 PM2 是一个流行的 Node.js 进程管理器,可以帮助我们轻松地管理应用程序的生命周期和操作系统的资源。日志记录是任何应用程序都需要的一项功能,因为它提供了对应用程序运行过程的实时反馈和故障...

    1 年前
  • Tailwind 常用样式合集:如何快速实现常见的设计需求

    Tailwind 是一个高度定制化的 CSS 框架,它使用简单的类名来实现快速编写样式的目的。Tailwind 的设计理念是避免使用原子性的类名,而是提供类名组合的方式来让开发者更加高效地完成页面开发...

    1 年前
  • ES9 和 ES10 常用的新特性

    ECMAScript 是 JavaScript 的标准化版本。ES9 和 ES10 是 ECMAScript 的最新版本,引入了一些新特性和改进。本篇文章将探讨 ES9 和 ES10 常用的新特性,并...

    1 年前
  • 解决 React 项目中组件重复渲染的问题

    在 React 开发中,经常会遇到组件重复渲染的问题,这不仅会导致页面性能下降,还可能会产生一些其他的问题。本文将探讨在 React 项目中,如何优化组件渲染,以提高页面性能和用户体验。

    1 年前
  • 如何使用 Jest Mock Axios 请求

    前言 在前端开发中,我们常常需要请求后端接口来获取数据。为了测试我们的代码是否可靠,我们需要使用 Jest 进行单元测试。而为了避免在测试中请求后端接口导致数据不可控,我们需要使用 Jest Mock...

    1 年前
  • ES9 中如何使用空值合并运算符

    在前端开发中,处理变量为空或未定义的问题是一个重要的话题。在 ES9 中,引入了一个新的空值合并运算符,可以更方便地处理这些问题。本文将介绍空值合并运算符的使用方法,并提供示例代码进行详细说明。

    1 年前
  • Node.js 中使用 EventEmitter 优化程序结构

    在 Node.js 中,EventEmitter 是一个十分重要的模块。它允许我们在事件触发时进行自定义动作的编程方法。使用 EventEmitter,我们可以有效地优化程序结构并增加可维护性。

    1 年前
  • 初学 Sass 应该注意什么?如何避免 bug?

    如果你是一名前端开发,那么你一定已经听过 Sass,它是一种 CSS 预处理器,能够提供更加快捷灵活的样式编写方式。在 Sass 中,我们可以使用变量、嵌套、函数、继承等高级特性,使得编写样式更加简单...

    1 年前
  • Socket.io 使用教程:实现即时文件传输功能

    简介 Socket.io 是一个针对浏览器和服务器实时通信的 JavaScript 库,它的特点是双向通信的实时性和简单易用的 API。 在这篇文章中,我们将探讨如何使用 Socket.io,实现即时...

    1 年前

相关推荐

    暂无文章