学习项目:https://www.bilibili.com/video/BV1A34y1e7wL?p=100

0 设计

OMNIFOOD 是一个使用人工智能来交付膳食计划的专业和值得信赖的公司。目前提供了一些内容和图片:

计划和收集网站内容

  1. 给谁做网页:客户
  2. 网页的用途:
    1. 商业目标:销售月度订阅
    2. 用户目标:吃的好,高效且省钱
  3. 目标用户:繁忙且喜欢技术,对健康饮食感兴趣,以及有一份不错薪水的工作

设计站点地图

只有一页所以无需设计

定义网页个性

原文中提到:我们首先是一个技术公司,并且主要关注消费者的健康饮食。

再结合之前的目标用户,所以我们应该使用 网页个性:创业或乐观,而又因为公司关注健康饮食,还可以加点 网页个性:安静或优雅

规划网站模块

  • 导航
  • 头版
  • 社会评价等
  • 如何实现
  • 几种餐品 (以及一个额外的列表显示所有餐品)
  • 客户反馈+相册块
  • 价格 + 特点介绍
  • 页脚
  • 号召

设计要加入的组件

  • 导航和Logo就不用考虑了,默认样式就行
  • Hero头版有很多选择,可以选择
  • 接着是社会评价等,依然是默认的并排样式
  • 而具体介绍则采用横排卡片的形式呈现,或者采用Z模式的形式展示
  • 餐品呈现使用购物车卡片形式呈现
  • 而客户评价和画廊(可以用上提供的一些人像图片)就采取并排的表格呈现

整体布局的草图如下所示:

1 文件配置

响应式网页设计

2 头部

需要 h1, p,来显示文字部分,还有两个按钮,这些放到一个盒子中。第二是右边的图片,也要放盒子里。至于上面的导航栏以及下面的社会评价就暂时不看。

用到的一些小技术:

代码

<section class="section-hero">
	<div class="hero-container">
		<div class="hero-text-box">
			<h1 class="heading-primary">
				A healthy meal delivered to your door, every single day
			</h1>
			<p class="hero-description">
				The smart 365-days-per-year food subscription that will
				make you eat healthy again. Tailored to your personal
				tastes and nutritional needs.
			</p>
			<a href="#" class="btn btn--full margin-right-sm"
				>Start eating well</a
			>
			<a href="#" class="btn btn--secondary">Learn more &darr;</a>
			<div class="delivered-meals">
				<div class="delivered-imgs">
					<img
						src="content/img/customers/customer-1.jpg"
						alt="客户图片"
					/>
					<img
						src="content/img/customers/customer-2.jpg"
						alt="客户图片"
					/>
					<img
						src="content/img/customers/customer-3.jpg"
						alt="客户图片"
					/>
					<img
						src="content/img/customers/customer-4.jpg"
						alt="客户图片"
					/>
					<img
						src="content/img/customers/customer-5.jpg"
						alt="客户图片"
					/>
					<img
						src="content/img/customers/customer-6.jpg"
						alt="客户图片"
					/>
				</div>
				<p class="delivered-text">
					<span>250,000+<span/> meals delivered last year!
				</p>
			</div>
		</div>
		<div class="hero-img-box">
			<img
				src="content/img/hero.png"
				class="hero-image"
				alt="享受食物的女人图片"
			/>
		</div>
	</div>
</section>

接下来编写CSS

* {
	padding: 0;
	margin: 0;
	box-sizing: border-box;
}
 
html {
	font-size: 62.5%;
}
 
body {
	font-family: "Rubik", sans-serif;
	line-height: 1;
	font-weight: 400;
	color: #555;
}
 
.section-hero {
	background-color: #fdf2e9;
	padding: 9.6rem 0;
}
 
.hero-container {
	max-width: 130rem;
	margin: 0 auto;
	display: grid;
	grid-template-columns: 1fr 1fr;
	align-items: center;
	gap: 9.6rem;
}
 
.heading-primary {
	font-size: 5.2rem;
	font-weight: 700;
	line-height: 1.05;
	color: #333;
	margin-bottom: 3.2rem;
	letter-spacing: -0.5px;
}
 
.hero-description {
	font-size: 2rem;
	line-height: 1.5;
	margin-bottom: 4.8rem;
}
 
.delivered-meals {
	margin-top: 8rem;
	display: flex;
	align-items: center;
	gap: 1.6rem;
}
 
.delivered-imgs {
	display: flex;
}
 
.delivered-imgs img {
	width: 4.8rem;
	height: 4.8rem;
	border-radius: 50%;
	margin-right: -1.4rem;
	border: 3px solid #fdf2e9;
}
.delivered-imgs img:last-child {
	margin-right: 0;
}
 
.delivered-text {
	font-size: 1.8rem;
}
.delivered-text span {
	font-weight: 700;
	color: #cf711f;
}
.hero-image {
	width: 100%;
}
 
.btn:link,
.btn:visited {
	text-decoration: none;
	font-size: 2rem;
	font-weight: 600;
	display: inline-block;
	padding: 1.6rem 3.2rem;
	border-radius: 9px;
 
	transition: background-color 0.3s;
}
 
.btn--full:link,
.btn--full:visited {
	color: #fff;
	background-color: #e67e22;
}
 
.btn--full:hover,
.btn--full:active {
	background-color: #cf711f;
}
 
.btn--secondary:link,
.btn--secondary:visited {
	background-color: #fff;
	color: #333;
}
 
.btn--secondary:hover,
.btn--secondary:active {
	background-color: #fdf2e9;
	box-shadow: inset 0 0 0 3px #fff;
}
 
.margin-right-sm {
	margin-right: 1.6rem !important;
}
 

需要一个图标,一个导航元素,记得也要放置到header容器,此时还可以把之前的herosection放到main标签容器中,算是SEO优化。

CSS 也有快有一百多行,我们需要进行分区以方便维护:

/**************************/
/*       可复用组件        */
/**************************/

代码

HTML则创建一个 header 标签,里面一个img标签,一个nav盒子。导航中使用 ul 无序列表实现。

<header class="header">
	<img
		class="logo"
		alt="Omnifood logo"
		src="content/img/omnifood-logo.png"
	/>
	<nav class="main-nav">
		<ul class="main-nav-list">
			<li><a class="main-nav-link" href="#">选项卡 1</a></li>
			<li><a class="main-nav-link" href="#">选项卡 2</a></li>
			<li><a class="main-nav-link" href="#">选项卡 3</a></li>
			<li><a class="main-nav-link" href="#">选项卡 4</a></li>
			<li>
				<a class="main-nav-link nav-cta" href="#">选项卡 5</a>
			</li>
		</ul>
	</nav>
</header>

CSS 中将无序列表的样式改为空,并设置flex布局,配置一下gap,居中对齐。导航链接则更改一下样式和字体大小,并把最后一个CTA按钮重点显示。

.header {
	display: flex;
	justify-content: space-between;
	align-items: center;
 
	background-color: #fdf2e9;
 
	height: 9.6rem;
	padding: 0 4.8rem;
}
 
.logo {
	height: 2.2rem;
}
 
.main-nav-list {
	display: flex;
	align-items: center;
	list-style: none;
	gap: 3.2rem;
}
 
.main-nav-link:link,
.main-nav-link:visited {
	font-size: 2rem;
	font-weight: 500;
	display: inline-block;
	text-decoration: none;
	color: #333;
}
 
.main-nav-link:hover,
.main-nav-link:active {
	color: #e67e22;
	transition: all 0.3s;
}
 
.main-nav-link.nav-cta:link,
.main-nav-link.nav-cta:visited {
	padding: 1.2rem 2.4rem;
	border-radius: 9px;
	background-color: #e67e22;
	color: #fff;
	transition: all 0.3s;
}
 
.main-nav-link.nav-cta:hover,
.main-nav-link.nav-cta:active {
	background-color: #cf711f;
}

How it Work 介绍部分

这部分的结构有重用,所以先把网格CSS写一下:

.container {
	/* 1140px */
	max-width: 120rem;
	padding: 0 3.2rem;
	margin: 0 auto;
}
 
.grid {
	display: grid;
	column-gap: 6.4rem;
	row-gap: 9.6rem;
}
 
.grid--center-v {
	align-items: center;
}
 
.grid--2-cols {
	grid-template-columns: repeat(2, 1fr);
}
 
.grid--3-cols {
	grid-template-columns: repeat(2, 1fr);
}
 
.grid--4-cols {
	grid-template-columns: repeat(2, 1fr);
}

之后先用html把内容整上去,层级为:

section
// 整个section的标题
--container
----span
----heading-secondary
// 按 Z-pattern 循环三次
--container grid grid--col-2 grid-center-v
----step-text-box
------step-number
------heading-tertiary
------step-decription
----step-img-box
------step-img

再配置标题字体,颜色依然是跟主标题一样的灰色,因为是创业风格,section的简述用span标签,颜色为主色的暗色,且大小小于section标题。 Z-pattern的文字部分先将序号放大并颜色放淡,引人注目的同时优先级低于小标题,标题依然是更改字号字重,字母间距还有底边距。下面的描述则更改一下字号字重以及行距。 图片部分则先在盒子上用flex将图片居中,设置图片大小为父元素的45%,再加些点缀,用伪元素创建两个圆形,并绝对定位到图片的中心且位于图片背后。 相关技术:

社会评价部分

在HTML中实现后,先设置主标题的字号,粗体,颜色,字母间距还有利用 text-align:center 来居中对齐,再加上底边距。以及整个模块的上下边距分别为 4.8rem3.2rem

对于logo部分,就直接用 flex 布局来实现。

我们想让LOGOs部分不与下面部分对齐,而是稍微小一号,除了在盒子中加padding,还可以直接修改justify-content为 space-around,这样会在左右两侧添加空白:

对于这些图标,它们的颜色过于不统一,除了使用图像处理软件解决,我们还可以使用CSS技巧。

相关技术:

餐饮卡片+菜单部分

在HTML中先实现基本元素,第一个是当前块的小标题,然后是整块的标题 Omnifood AI chooses from 5,000+ recipes。接着是三个盒子,前两个是meal, 最后一个盒子为diets。

在 meal 中,首先是一个图片,然后显示当前餐所属标签类别,还有餐名。接下来是一个列表描述,最后还要加上图标。

对于前两个标题,直接套用之前特征介绍块的标题部分就行:

<div class="container">
	<span class="subheading"> How it works </span>
	<h2 class="heading-secondary">
		Your daily dose of health in 3 simple steps
	</h2>
</div>

接着的三个盒子要并列,所以用上之前的 grid 布局,再加上三列类 grid—3-cols。之后设置图片宽度为盒子的 100% 即可避免大小溢出。

设置 meal-title 的样式,仿照小标题的形式:

.meal-title {
	font-size: 2.4rem;
	font-weight: 600;
	color: #333;
	margin-bottom: 3.2rem;
}

列表的部分则依然取消选项符号后使用flex来添加间距。令字号为1.8rem即可。

.meal-attributes {
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 2rem;
}
 
.meal-attribute {
	font-size: 1.8rem;
}
 
.meal-img {
	width: 100%;
}

至于图标,我们之前是用HTML中内嵌SVG代码来实现网页因素:图标,例如轮播(Carousel), 分页(Pagination)。这里使用另一种导入方案,直接用js脚本链接放入整个图标库,并用ion-icon标签来添加到html中。

<script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script>
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script>

将这两行代码放入 head 标签内即可,需要哪个图标就去网站上找然后复制html代码。

接下来就设置图标大小还有颜色,以及与描述文本之间的距离,还有文本中的数字高亮。以及标签的设置,让其变圆且更改颜色。

这里的内容和图片显得有些拥挤,创建一个盒子meal-content 来将文本分离出来并加入padding即可。

完成后copy一份放出来两个盒子:

第三块放所有餐品的列表,这里就不再用一个卡片包裹,而是直接用list来代替: 我们也不能光罗列,还得有个链接能让用户去看看剩下的菜品。所以直接在该节末尾再放一个链接:

<div class="container all-recipes">
	<a href="#" class="link"> See all recipes &rarr;</a>
</div>