css grid随页面大小_CSS Grid 系列(下)-使用Grid布局构建网站首页

news/2024/5/13 4:11:43/文章来源:https://blog.csdn.net/weixin_39524439/article/details/110609026
by Chris House
译者:若愚老师
更好的阅读体验?可在 饥人谷技术博客 查看原文
要看懂这篇文章,推荐先简单过一遍姊妹篇 CSS Grid 系列(上)-Grid布局完整指南

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

设计

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

163e873e5173bbb80ebb2fbe88a59870.png

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

77639596977b853c0f040d23d5770891.png

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

dea56549f653720b85b3650945e24291.png

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横跨四行和五行。 .号代表空单元格。如果你回头看看上面的完整设计,您会看到这个定义如何与我们的网格模式相匹配。

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

503c6c2ff6a7148d8d48bab10a769342.png

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

.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;
}

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

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

6320c1ab530cdade4b6148f8602f46fb.png

除了 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卡入到位,我们的页面完成:

163e873e5173bbb80ebb2fbe88a59870.png

引入响应式

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移动到自己的行。 现在我们的页面元素很适合在较窄的宽度下展示:

78e51552f09cfdd31e19ee71745a454a.png

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) .

补充:基本布局代码

欢迎进群探讨技术,点此 微信扫码进群。

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

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

相关文章

程序页面闪退 进程还在_企业想开发线上业务,那么该做网站、APP、小程序还是公众号?...

很多企业想开发线上业务&#xff0c;那么该做网站、APP、小程序还是公众号&#xff1f;这是很多企业都会遇到的问题。你可能会问&#xff0c;既然都有那么多的选择那么多方向&#xff0c;我们为什么不全做了&#xff1f;当然&#xff0c;如果企业财大气粗&#xff0c;效果肯定不…

seo日常工作表_SEO主要做什么工作?SEO优化入门之网站的日常维护

《种豆南山下——网站的日常维护》--作者&#xff1a;推云阿航日常维护&#xff1a;对于新站&#xff1a;1、未收录的每日提交链接&#xff0c;已经收录的每日投诉快照&#xff0c;直至更新。2、快照一旦更新&#xff0c;就需要先查一下网站site和title的排名&#xff0c;判断权…

从主机访问虚拟机中的网站系列教程(VBox篇)

最近大家开始搭上我们这个学期的关键——Siteweaver&#xff0c;为了这个东西大家无所不用其极&#xff0c;有人换系统&#xff0c;有人开始学习用虚拟机。用虚拟机的同学会发现&#xff0c;我们在使用虚拟机搭建网站的时候&#xff0c;怎么可以方便地从主机和局域网访问到虚拟…

asp的网站能封装成app吗_在线网站封装APP评测:性价比最高的竟然是它?

如果你有一个网站&#xff0c;想给网站加个壳&#xff0c;封装成一个app&#xff0c;点开之后显示的还是网站&#xff0c;可以实现吗&#xff1f;我的回答是肯定的&#xff0c;这就是网站封装APP。现在APP的开发成本很高&#xff0c;很多热倾向于通过封装打包网站来实现“快速开…

linux文件的链接可分为6,linux中有几种文件类型_网站服务器运行维护,linux,文件类型...

linux下编译程序找不到头文件_网站服务器运行维护linux下编译程序找不到头文件的解决方法是&#xff1a;1、首先执行【find / -name xxx.h】命令&#xff0c;查找路径&#xff1b;2、然后执行【gcc test.c -o test -I /usr/local/include/xxx】命令即可。1、普通文件( 数据文件…

linux nginx php网站渗透,Linux系统下nginx+php清理服务器网站日志怎么弄

Linux系统下nginxphp清理服务器网站日志怎么弄发布时间&#xff1a;2020-10-16 15:01:59来源&#xff1a;亿速云阅读&#xff1a;78作者&#xff1a;小新这篇文章主要介绍了Linux系统下nginxphp清理服务器网站日志怎么弄&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以…

onmouseover 事件

, , , , , , , , , , , , , to , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , 支持该事件的 JavaScript 对象&#xff1a;layer, link实例 1在下面的例子中&#xff0c;我们将在用户把鼠标指针移动到图像上时显示一个对话框&#xff1a; onmouseover"…

Nginx配置HTTPS证书网站

前提&#xff1a; 1、主机需要先安装openssl 2、编译安装nginx时&#xff0c;要加上--with-http_ssl_module 这个ssl模块 现在开始配置&#xff1a;&#xff08;我当时配置时&#xff0c;主机已安装了openssl&#xff0c;但编译时没有加载http_ssl_module模块&#xff0c;所以…

nicetool好工具_上进青年研习社丨这6个工具合集网站,抵过上百个软件!

文丨小渔不知道你们有没有这样的经历&#xff1a;为了一些小的需求&#xff0c;在手机上或是电脑上下了一堆软件。虽然用过觉得也挺好用的&#xff0c;但是平时的使用频率真的不高啊。等你把它们都卸载了&#xff0c;过了一段时间突然又需要用它了。所以&#xff0c;今天小渔要…

快站模板 连接mysql_如何轻松建站?站点一键部署搭建(详细教程)

来越多的人选择个人建站&#xff0c;个人站长虽然门槛很低&#xff0c;但是有些朋友觉得Linux服务器各种复杂的命令脚本让自己没法搭建环境。今天就给大家推荐一款使用方便、功能强大的快速建站工具——云帮手&#xff0c;支持 Linux 与 Windows 系统&#xff0c;可一键配置搭建…

查看 db2 正在 运行的sql_介绍两个刷 SQL 题的网站

今天有朋友在群里问到&#xff1a;在哪可以刷 SQL 题&#xff1f;其实&#xff0c;要刷 SQL 题&#xff0c;对着《SQL COOKBOOK》、《SQL 经典实例》这两本书&#xff0c;把所有实例从头到尾全部实现一遍就很厉害了。不过&#xff0c;我想她的本意是想知道有没有关于 SQL 的 On…

html使用bootstrap无效果,[0失败]手把手教你用Bootstrap做个人网站

作为一个纯小白手残星人&#xff0c;总想自己做一个网站&#xff0c;Wix&#xff0c;Strikingly这一类的可视化建站的工具&#xff0c;自由度不高&#xff0c;付费贼贵&#xff0c;自己做的又不好看又费时间&#xff0c;听说bootstrap这种前端框架可以自己做网页&#xff0c;之…

实验六:MYSQL+PHP的网站搭建

实验目的&#xff1a;掌握MYSQLPHP的网站的搭建过程实验准备&#xff1a;一台Server&#xff0c;一台Client实验前的准备&#xff1a;搭建一台web服务器&#xff08;过程省略&#xff09;实验步骤&#xff1a;步骤一1.安装PHP数据包解压php-5.1.4-Win32这个解压包&#xff0c;把…

沙发家具网站源码_2020年(双十二)沙发选购全攻略~~

沙发算是家庭装修最昂贵的家具之一&#xff0c;当然我特别建议选购时亲自试用感受它们&#xff0c;由于这些物品尺寸的特殊性&#xff0c;网购最担心的就是购买后自己如果不喜欢&#xff0c;退货麻烦以及昂贵的运费。现在由于网上购物的便利&#xff0c;以及网上的风格多样化&a…

java项目修改html文件类型,爱了!Guide哥手把手教你搭建一个文档类型的网站!免费且高速!...

这篇文章 Guide 哥就手把手教大家搭建一个像下面这样的文档类型的网站&#xff0c;你可以用来当做项目的说明文档&#xff0c;也还可以当做自己专属的知识小仓库。一.前置条件确保自己电脑下载安装了 NPM 并且使用这个命令&#xff1a; npm i docsify-cli -g安装了 docsify-cli…

LNMP动态网站部署架构 Linux + Nginx 配置Nginx服务

1、解压、编译、生成、安装Nginx服务程序的源码文件Perl语言软件包pcre2、openssl软件包安装/usr/local/openssl/bin目录添加到PATH环境变量中。3、安装zlib软件包4、创建一个用于执行Nginx服务程序的账户。5、在使用命令编译Nginx服务程序时&#xff0c;需要设置特别多的参数&…

网站实时显示人数服务器插件,WordPress网站显示实时在线人数代码分享,显示当前在线浏览人数...

其实Wordpress有类似的插件&#xff0c;比如&#xff1a;WP OnlineCounter、WP-User Online等&#xff0c;不过这些插件都会向数据库中写入数据&#xff0c;并频繁读取数据库&#xff0c;只为了实现这个蛋疼的小功能&#xff0c;不是很划算。随时了解一下当前有多少访客在浏览自…

qt listwidget 关键字颜色_seo关键字优化工具如何收费

如何收费sj67745eo关键字优化工具&#xff0c;企业经常采用SEO优化&#xff0c;以获得更好的排名和更好的流量自己的网站。搜索引擎优化有哪些方法&#xff1f;或者什么更有效&#xff1f;任何一个站点&#xff0c;都是无法脱离内容&#xff0c;它是网站建设的基石&#xff0c;…

安卓封装网站源码_h5封装是什么意思_h5封装的app与原生的有什么区别

什么是h5封装&#xff1f;h5封装APP是指将h5网站或web网站进行打包制作成APP软件&#xff0c;无需编写原生代码即可完成APP开发&#xff0c;同时支持苹果和安卓两个系统。除了网站本身的功能内容之外&#xff0c;鹿客邦还将提供多样的插件&#xff0c;丰富APP的功能。封装后的a…

fiddler如何设置过滤https_传奇网站被劫持怎么办?如何设置网站https防劫持 申请免费https和配置教程...

现在劫持相当严重&#xff0c;很多朋友在开区时网站被各种劫持&#xff0c;所以今天给大家分享一个把网站http变成https的教程&#xff0c;能有效防止网站劫持&#xff0c;注意&#xff1a;现在的各大登陆器还不支持https&#xff0c;所以列表地址你还是得用http&#xff0c;所…