CSS Grid 系列(下)-使用Grid布局构建网站首页

news/2024/4/27 19:18:59/文章来源:https://blog.csdn.net/weixin_34024034/article/details/88906972

by Chris House
译者:若愚老师
想要更好的阅读体验可在饥人谷技术博客 查看原文
要看懂这篇文章,推荐先简单过一遍姊妹篇 CSS Grid 系列(上)-Grid布局完整指南

当我开始一个项目,并开始计划如何布局主页时,我的大脑复现出浮动和定位。有些人可能会使用 Bootstrap 或其他框架。 那是因为这是2016年,我们一直在用这些方法来做布局。 但假设我们乘坐时光机来到2018年,所有主流浏览器都支持CSS Grid 布局模块。此时我们的页面布局模式已经完全改变,CSS的功能最终强大到能轻松实现我们的设计目标,这是一个web开发人员最美好的时代。现在,让我们使用超赞的工具——Grid布局来创建一个主页。

设计

下面是我们将要实现的页面

在我们开始编码之前,我们需要进入网格的思维模式。 第一步是观察我们的设计稿,并将其划分为主要的网格组件。 以下是我为此设计做的划分:

你会发现整个页面分为7个顶级网格区域。 我之所以说“顶级”是因为我们可以在其内部继续嵌套网格,这正是我们将要对hero部分所做的事:

HTML

这是HTML的基本结构。 稍后我会显示整个完成的文件,但现在我已经省去了大部分的细节。 这里要注意的重要部分是作为 body 的直接后代的7个元素:top-barmain-headerheroblog-postsnewsside-bar 以及 main-footerbody将成为我们的网格容器(grid container),它的孩子将成为网格项(grid items)。

正如刚刚提到的,我们也将设置 hero 作为网格容器。 它有两个孩子,将作为网格项:messageaward

<body><header class="top-bar"><!-- social links and contact info --></header><header class="main-header"><!-- logo and main navigation --></header><section class="hero"><div class="message"><!-- circular element --></div><div class="award">    <!-- award image and quote -->      </div></section><section class="blog-posts"><!-- blog posts and excerpts --></section><section class="news"><!-- news headlines and excerpts --></section><aside class="side-bar"><!-- critter of the month info --></aside><footer class="main-footer"><!-- footer menu and copyright --></footer></body>

CSS

Okey,我们按照这种方式讲解,教程中我们不会展示所有使用到的CSS,在文章的最后我会展示最终完整的文件。现在我们只关注吸引我们的网格部分以及任何与它直接相关的样式即可。

我们首先在body上定义主网格容器:

body{display: grid;grid-template-columns: 12% auto 400px 12%;grid-template-rows: auto auto 950px auto auto auto;
}

我们刚刚创建了一个4列6行的网格,第一列和最后一列将作为主内容两侧的填充。 我把第三列设置为400px,因为这是我们将要放置side-bar元素的地方,我们希望这是一个固定的宽度。 hero 元素(第三行)的固定高度为950px。

现在我们使用grid-template-areas来定义某个网格区域会跑到哪里。 这是非常有趣的部分:

body{display: grid;grid-template-columns: 12% auto 400px 12%;grid-template-rows: auto auto 950px auto auto auto;grid-template-areas: "top-bar     top-bar     top-bar     top-bar""main-header main-header main-header main-header""hero        hero        hero        hero"".           blog-posts  side-bar    ."".           news        side-bar    .""main-footer main-footer main-footer main-footer";  
}

grid-template-areas让我们能把元素放在任何想要放置的地方,并且对于元素的布局该属性给我们提供一个不错的可视化。 值得注意的是,这里使用的值(top-barmain-headerhero等)不是指那些元素的类名,而是指我们用grid-area属性给它们起的名字,下一步我们将对它们命名。

当网格区域名称重复时,该元素将跨越这些列/行。 例如,top-bar 横跨四列,side-bar横跨四行和五行。 .号代表空单元格。如果你回头看看上面的完整设计,您会看到这个定义如何与我们的网格模式相匹配。

假设我们已经应用了我们所有的样式,但还没有为网格项分配网格区域名称,到目前为止我们的页面看起来还不太好:

在将网格区域名称分配给网格项之前,网格将根据它们的源顺序自动将我们的元素放置在网格中。 显然这不是我们想要的。 为了使我们的布局按预期工作,我们需要定义我们的网格区域。所以我们继续往下走:

.top-bar{grid-area: top-bar;
} 
.main-header{grid-area: main-header;
} 
.hero{grid-area: hero;
}
.blog-posts{grid-area: blog-posts;
}
.news{grid-area: news;
}
.side-bar{grid-area: side-bar;
}
.main-footer{grid-area: main-footer;
}

需要注意的是这些名称可以随意设置。 为了方便,我选择了让它们与类名相匹配。

现在,我们已经为网格项分配了网格区域名称,它们将在被放置在网格中合适的位置。 这一步带来的变化很大:

除了 hero 部分中的网格项外,所有内容都完全按照需要正确放置,我们差不多要完成了。

但是在我们修复 hero 部分之前,我想解释一下一些难以理解的地方:主要内容两边的填充区域的设置。 作为提醒,我们再次把刚刚的设置搬过来,用如下方式调整列:

body{grid-template-columns: 12% auto 400px 12%;
}

设置为12%的两列用于填充主要内容两边的空白,但是它们仅用于第四行和第五行。 回想一下,我们告诉我们的top-barmain-headerheromain-footer元素跨越所有列,包括这两个“填充”列。 我们为什么这样做? 因为我们希望这些元素的背景色横跨越整个视窗宽度,且任何一侧都没有空白。 我们只想在 blog-post/newssidebar元素周围留出空白(第四行和第五行)。

为了让元素水平覆盖整个宽度,同时让元素里面的内容保存一定的padding,我们需要显示地在这些元素上设置padding:

.top-bar{padding: 4px 12%; 
}
.main-header{padding: 12px 12%;
}
.hero{  padding: 55px 12% 0 12%;
}
.main-footer{padding: 25px 12%;
}

我们给元素设置左右 padding 为12%,这和grid-template-areas定义中的第一列和最后一列的宽度是一样的。 现在,需要填充整个宽度的元素最终呈现的结果是,背景横跨水平宽度,但其内容在两侧都预留出12%的空白。 很赞!

好了,让我们来修复 hero 部分。 这也将是一个网格容器,因此我们把它定义为一个网格,就像刚刚做过的那样:

.hero{display: grid;grid-template-columns: auto 1fr auto;grid-template-rows: auto auto auto;grid-template-areas: ".       .  award""message .  .    "".       .  .    "; }

这是一个3×3的网格,除了中间的列,其它都设置为 auto。 我们给中间一列大小设为1fr,因为我们希望在第一列和最后一列用东西填充后,剩下的空间完全需要完全填满。

hero中只有两个元素:messageaward。 我们要message占据第二行的第一列,我们要award占据第一行的第三列。所以我们的完整网格定义应该如下所示:

.hero{display: grid;grid-template-columns: auto 1fr auto;grid-template-rows: auto auto auto;grid-template-areas: ".       .  award""message .  .    "".       .  .    ";  }

下面我们所要做的就是命名我们的元素:

.message{grid-area: message;
}
.award{grid-area: award;
}

就这样,messageaward卡入到位,我们的页面完成:

引入响应式

CSS Grid 使用媒体查询让重新排列整个布局变得非常简单。你所做的就是重新放置你的网格项。现在回到我们的设计,简单起见,我们只对两个宽度临界值做响应式处理,1600px 和 1050px。我们需要对一些元素(padding、margin等)进行一些小的样式调整,但是我不会把所有的样式调整都全部展示在这里。后面我会放出完整的代码,现在我们只需要关注关注网格相关的东西即可。

1600px 这个临界点的处理比较简单,当浏览器宽度到底1600px时我们将减少网站外部填充的地方。 之所以选择1600px,是到了这个宽度后12%填充看起来不太合适。为了解决这个问题,我们需要做的是在body上改变grid-template-columns的值,将第一列和最后一列减少到2%。 我们还需要调整其他元素的填充以匹配:

@media (max-width: 1600px) {body{grid-template-columns: 2% auto 400px 2%;}.top-bar{padding: 4px 2%;}.main-header{padding: 12px 2%;}.hero{padding: 55px 2% 0 2%;}.main-footer{padding: 25px 2%;}
}

对于下一个临界值,我们对网格项重新排列,使它们排列在一个列中。 再次回头看看我们原来的代码是如何对body进行设置的:

body{display: grid;grid-template-columns: 12% auto 400px 12%;grid-template-rows: auto auto 950px auto auto auto;grid-template-areas: "top-bar     top-bar     top-bar     top-bar""main-header main-header main-header main-header""hero        hero        hero        hero"".           blog-posts  side-bar    ."".           news        side-bar    .""main-footer main-footer main-footer main-footer";  
}

下面是重新设置的媒体查询:

@media (max-width: 1050px) {body{grid-template-columns: 3% auto 3%;grid-template-rows: auto auto auto auto auto auto auto;grid-template-areas: "top-bar     top-bar     top-bar""main-header main-header main-header""hero        hero        hero"".           blog-posts  ."".           news        ."".           side-bar    .""main-footer main-footer main-footer";}
}

我们在这里做了一些重要的改变:将列数从四个减少到三个,将第一列和最后一列的值改为3%(3%在较窄的宽度上优于2%),添加了 附加行,将所有行的长度改为auto,并将side-bar移动到自己的行。 现在我们的页面元素很适合在较窄的宽度下展示:

The Live Code

下面是我们的主页,以及完整的HTML和CSS文件。 你需要一个支持grid的浏览器来查看预览。 我建议启用Experimental Web Platform Features标志的Chrome 49+(地址栏输入 chrome:// flags ,并向下滚动到“Experimental Web Platform Features”)。

下面的嵌入式页面默认会以移动视图展示,可以点击“Edit on Codepen”在页面全宽下展示不同的效果:

在 CodePen 查看效果 Building a Home Page with Grid by Chris House (@chrishouse) .

补充:基本布局代码

加微信号: astak10或者长按识别下方二维码进入前端技术交流群 ,暗号:写代码啦

每日一题,每周资源推荐,精彩博客推荐,工作、笔试、面试经验交流解答,免费直播课,群友轻分享... ,数不尽的福利免费送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_801043.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站被黑了

先说下背景。一个客户的服务器&#xff0c;去年找我帮忙维护&#xff0c;其实主要解决的问题是网站被挂马。当时&#xff0c;接过来花费了我很多精力&#xff0c;各种找&#xff0c;各种查。但&#xff0c;毕竟我不是专业搞安全的&#xff0c;所以只能是摸着石头过河&#xff0…

网站访问出现 ------ Can not write to cache files, please check directory ./cache/ .

最近在搞微商城时&#xff0c;突然出现了Can not write to cache files, please check directory ./cache/ .这样一个提示&#xff0c; 但最近好像没搞什么大动作&#xff0c;怎么回事&#xff0c;经过一番折腾&#xff0c;最终解决了问题&#xff0c;今天分享给大家。 这是权限…

外国h小游戏网站flash_爷青结!占用了我整个童年的Flash,还是要关闭了

该来的还是会来&#xff0c;2020 年底一个陪伴了我们整个童年的引擎最终还是迎来了停止运营的那天。从 2021 年的 1 月 1 日起&#xff0c;Flash 已经正式停运&#xff0c;要细说起 Flash 的好坏&#xff0c;我想每个人都有自己的看法。但是对于这款伴随了很多差友们成长的引擎…

html网站如何添加身份验证,怎么给网站增加一个全站身份验证功能? - WordPress教程...

通过对网站增加一些密码&#xff0c;我们可以阻止一些不喜欢的人访问自己的网站作为一个有追求的站长&#xff0c;总是希望自己的网站能被各大搜索引擎尽快抓取&#xff0c;以提升自己的曝光&#xff0c;但有些时候&#xff0c;例如网站正在建设中或是做一个特立独行的站长&…

部署社交网站(SVN+PHP+NGINX+MYSQL+MFS)

案例需求&#xff1a;社交网站采用PHP语言开发&#xff0c;为了管理开发代码&#xff0c;搭建SVN服务器进行版本控制&#xff0c;社交网站的第一个版本部署在LNMP平台上&#xff0c;前端为nginx服务器&#xff0c;通过fastcgi协议访问后端的PHP服务器。这里实现动静分离&#x…

修改html会影响seo,网站修改css影响seo吗?

改动不大的话&#xff0c;不会影响&#xff1b;慢慢改&#xff0c;别一下子改动太大了&#xff0c;大幅度的修改。CSS样式在SEO中最重要的作用&#xff0c;就是平衡链接在内容页面与HTML的展示位置&#xff0c;它严重影响蜘蛛抓取的频率&#xff0c;以及传递的权重。css对seo影…

个人网站常用代码整理

我最近又更换wordpress风格了&#xff0c;感觉这种风格还不错。 但是吧&#xff0c;之前加进去的许多小东西就需要重新添加一次&#xff0c;由于很多东西是当时一遍看教程一边操作的&#xff0c;去原来的文件里扒拉也浪费了不少时间&#xff0c;所以决定在这里整理一下一些常用…

我的建站经历(教程)(二)

转载自我的博客&#xff1a;https://blog.ljyngup.com接 建站教程1三、安装WordPress 官网下载 这里不建议用面板自带的安装wordpress(我安装了好几次都装不起来)下载后上传到相应的域名下(可以是子域名目录&#xff0c;或者直接放到网站根目录下)然后访问域名&#xff0c;一步…

搜索关键词分析——以个人博客网站为例

背景 我做了一个个人博客网站&#xff0c;希望能够记录自己的学习&#xff0c;工作和成长笔记。同时为更多有相同需求的人提供帮助和支持。那么用户应该怎么来找到我这个博客网站呢&#xff1f;通过什么关键词能够快速找到这个博客网站呢&#xff1f; 接下来本文就来探讨一下关…

快速学习Docker-部署静态网站

设置容器的端口映射 run [-P] [-p] -P , --publish-alltrue|false 默认为false :将为容器所有暴露的端口进行映射. 示例:docker run -P -i -t centos /bin/bash-p, --publish[ ] :给指定的端口进行映射. 方式一:containerPort 示例:docker run -p 80 -i -t centos /bin/bas…

云服务器怎么找网站的根目录,如何访问云服务器的根目录

如何访问云服务器的根目录 内容精选换一换通过内网连接云手机实例时&#xff0c;需要在租户VPC中创建一台弹性云服务器&#xff0c;作为连接云手机的跳板机器。若创建云手机服务器时未使用自定义网络&#xff0c;还需在云手机租户的VPC和服务器所在VPC之间建立对等连接&#xf…

c语言实现二叉树函数源码百度网盘,捕鱼赢钱的 -官方网站

php最近在研究 Excel 中的 VBA ,也就是Excel 的宏,需要将第一个页面的值,等列排入第二个Sheet页中 就像第一个页面中 排列成 这个样子 首先需要缕缕自己的思路 我们需要获取到第一个Sheet 也的值 Set Destination Worksheets("Sheet1") 获取到以后,要如何去找到每一…

xml 前言中不允许有内容_如何禁止搜索引擎收录指定网页内容 | 网站 robots.txt 文件配置方法...

点击蓝字关注我获取 高效/实用/好玩 的工具软件和教程前言搜索引擎通过网络蜘蛛(机器人)抓取网页的内容&#xff0c;并展示在相关的搜索结果中。但是有些网页内容我们可能并不想被搜索引擎收录和索引&#xff0c;如管理员后台等。我们就可以通过 robots.txt 文件来声明允许/禁止…

85个国外优秀的响应式网站设计作品范例【系列二】

响应式网页设计是时下网页设计领域最热门的话题之一&#xff0c;该概念由著名网页设计师 Ethan Marcotte 在2010年5月份提出&#xff08;详见&#xff1a;Responsive Web Design&#xff09;&#xff0c;其目标是要让设计的网站能够响应用户的行为&#xff0c;根据不同终端设备…

网站推广apahce 与 php整合

2019独角兽企业重金招聘Python工程师标准>>> 网站推广整合apache和php 1.修改apache的配置文件httpd.conf 1)在httpd.conf文件中找到有很多LoadModule的地方&#xff0c;在最后加上如下语句&#xff1a; LoadModule php5_module E:/soft_work/PHP/php5apache2_2.dll…

分享国外电商网站的七大时尚设计元素

最近一直想写个案例关于电商网站设计&#xff0c;从国内的电商网站中寻求素材&#xff0c;始终没有想要的&#xff0c;不得已收集了国外电商网站的一些设计元素&#xff0c;南京SEO陈奇个人认为&#xff0c;那是追随时尚的设计元素&#xff0c;当然这篇文章也是既《国外常见电商…

seo全攻略_网站外链怎样才能被快速收录呢?网站外链优化最全攻略

网站是企业在互联网平台盈利的一个有力工具&#xff0c;可以说如果没有网站&#xff0c;就等于放弃了一种有效的营销方式&#xff0c;真的是非常遗憾。因为这种营销方式相比广告投放&#xff0c;性价比更高&#xff0c;企业获客的主动性也更强。所以&#xff0c;越来越多的企业…

Server2008如何卸载MySQL_「完美卸载」完美卸载SQL Server 2008 R2 的方法,适合所有问题 - seo实验室...

完美卸载最近遇到了一件烦心事&#xff0c;在安装sql Server 2008 R2总是在Analysis Services选项那里出现错误&#xff0c;安装了一整天也没好&#xff0c;真的是按了又卸载&#xff0c;之后在按&#xff0c;为此我很苦恼&#xff0c;经过百度查询&#xff0c;终于找到本文&am…

鼠标移至div内部其他层时,触发mouseout

话说有一个DIV元素&#xff0c;其内部有一个IMG元素和SPAN元素&#xff0c;不用理会这两个内部元素怎么布局&#xff0c;这不是我要讨论的重点。 为了实现一些特殊的效果&#xff0c;我需要利用TD的onmouseover和onmouseout事件&#xff0c;测试时就会发现如下的状况&#xff1…

前端基础-CSS网站图标和字体图标

网站图标和字体图标 1.网站图标 作用&#xff1a;一个好的ico图标可以加深用户对于网站的记忆。降低用户记忆成本&#xff0c;就好像现在说道熊爪大家都能够想到度娘&#xff0c;更多的属于用户体验。有利于识别当前窗口是在哪个网站。 制作流程&#xff1a; ​ &#xff0…