1. 准备工作
1.1 google字体下载
到google font官网下载要用的字体,可以用cdn的方式导入,也可以下载下来放在项目目录的fonts目录下导入
-
cdn导入
<!-- google fonts Montserrat --> <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;700&display=swap" rel="stylesheet" />
-
本地保存
先在css中用
@font-face
声明字体@font-face { font-family: "Montserrat"; src: url("../fonts/Montserrat-VariableFont_wght.ttf") format("truetype"); }
然后再在要用该字体的地方用
font-family
属性即可* { font-family: "Montserrat", sans-serif; padding: 0; margin: 0; }
1.2 scss编译成css
使用一个简单易用的scss编译器scout-app
,下载地址:https://scout-app.io/
2. 导航栏
2.1 导航栏html框架
<body>
<header>
<nav class="container">
<a href="#">
<img src="img/logo.png" />
</a>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Team</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</header>
</body>
2.2 预定义基本标签的样式
@font-face {
font-family: "Montserrat";
src: url("../fonts/Montserrat-VariableFont_wght.ttf") format("truetype");
}
* {
font-family: "Montserrat", sans-serif;
padding: 0;
margin: 0;
box-sizing: border-box;
scroll-behavior: smooth; // 平滑过渡
}
ul {
list-style: none; // 去掉无序列表前面的点点
}
a {
text-decoration: none; // 将 a 标签的下划线去除
}
h2 {
font-weight: 500;
font-size: 36px;
color: #283d50;
margin-bottom: 60px;
}
h3 {
color: #444;
font-size: 24px;
margin-bottom: 20px;
}
h4 {
font-size: 20px;
margin-bottom: 8px;
color: #283d50;
}
2.3 导航栏固定以及添加阴影
// nav
header {
height: 79px;
position: fixed; // 固定导航栏 -- 无论滚动条怎么滑动,导航栏都不会消失
width: 100%; // 任何宽度比例下导航栏都要保持铺满显示屏 方便响应式设计
z-index: 3;
background-color: #fff;
// 参数: X轴偏移量、Y轴偏移量、模糊半径、扩散半径和颜色
box-shadow: 0 0 30px rgba(127, 137, 161, 0.3); // rgba 的第四个参数是不透明度 越大越不透明 0 则为透明
}
2.4 菜单响应式
// nav
header {
height: 79px;
position: fixed; // 固定导航栏 -- 无论滚动条怎么滑动,导航栏都不会消失
width: 100%; // 任何宽度比例下导航栏都要保持铺满显示屏 方便响应式设计
z-index: 3;
background-color: #fff;
// 参数: X轴偏移量、Y轴偏移量、模糊半径、扩散半径和颜色
box-shadow: 0 0 30px rgba(127, 137, 161, 0.3); // rgba 的第四个参数是不透明度 越大越不透明 0 则为透明
nav {
display: flex;
align-items: center;
padding: 25px 10px; // 上下 25px 左右 10px
img {
height: 25px; // 只设定图片的高度或者宽度能够等比例缩放
}
ul {
/**
* 导航栏响应式的灵魂所在!!!
* 菜单设置为不显示 然后用媒体查询来根据 viewport 的宽度
* 来更新 ul 的显示状态
*/
display: none;
@media (min-width: 800px) {
// viewport 宽度大于等于 800px 时改为 flex 布局
display: flex;
// 菜单要靠在右边 所以用 flex-end
justify-content: flex-end;
/**
* flex: flex-grow flex-shrink flex-basis
* flex-grow: 给单独元素设置 值越大 则其所占比例越大
* 这里设置为 1 就是为了让菜单铺满整个导航栏
* 如果不设置为 1 则会和 logo 一起自适应元素大小占据导航栏
*/
flex: 1;
}
}
}
}
使用scss的好处就是能够嵌套css选择器,并且能够写类似C语言的双斜线注释和多行注释
这里flex如果设置为0,效果如下
而设置为1,则效果如下,具体原因注释中已经说明
2.5 使用辅助工具类让导航栏的内容有外边距并居中
<nav>
标签上设置了一个辅助类class="container"
,container
的作用就是让元素能够有一定的外边距并且水平居中显示
// utility classes
// 让导航栏能够有一定的外边距并且水平居中显示
.container {
max-width: 1140px;
margin: 0 auto;
}
2.6 修改菜单内的a标签样式
a {
color: var(--menu-font-color);
font-size: 14px;
font-weight: 500;
padding: 0 15px;
margin-left: 15px;
}
--menu-font-color
是一个定义在header标签选择器内的变量
header {
--menu-font-color: #004289;
}
2.7 完成效果
当前阶段的全部代码
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<!-- google fonts Montserrat -->
<!-- <link
href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;700&display=swap"
rel="stylesheet"
/> -->
<!-- font-awesome -->
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.0/css/all.min.css"
integrity="sha512-10/jx2EXwxxWqCLX/hHth/vu2KY3jCF70dCQB8TSgNjbCVAC/8vai53GfMDrO2Emgwccf2pJqxct9ehpzG+MTw=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
/>
<link rel="stylesheet" href="css/style.css" />
<title>Document</title>
</head>
<body>
<header>
<nav class="container">
<a href="#">
<img src="img/logo.png" />
</a>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Team</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</header>
</body>
</html>
style.scss
@font-face {
font-family: "Montserrat";
src: url("../fonts/Montserrat-VariableFont_wght.ttf") format("truetype");
}
* {
font-family: "Montserrat", sans-serif;
padding: 0;
margin: 0;
box-sizing: border-box;
scroll-behavior: smooth; // 平滑过渡
}
ul {
list-style: none; // 去掉无序列表前面的点点
}
a {
text-decoration: none; // 将 a 标签的下划线去除
}
h2 {
font-weight: 500;
font-size: 36px;
color: #283d50;
margin-bottom: 60px;
}
h3 {
color: #444;
font-size: 24px;
margin-bottom: 20px;
}
h4 {
font-size: 20px;
margin-bottom: 8px;
color: #283d50;
}
// nav
header {
--menu-font-color: #004289;
height: 79px;
position: fixed; // 固定导航栏 -- 无论滚动条怎么滑动,导航栏都不会消失
width: 100%; // 任何宽度比例下导航栏都要保持铺满显示屏 方便响应式设计
z-index: 3;
background-color: #fff;
// 参数: X轴偏移量、Y轴偏移量、模糊半径、扩散半径和颜色
box-shadow: 0 0 30px rgba(127, 137, 161, 0.3); // rgba 的第四个参数是不透明度 越大越不透明 0 则为透明
nav {
display: flex;
align-items: center;
padding: 25px 10px; // 上下 25px 左右 10px
img {
height: 25px; // 只设定图片的高度或者宽度能够等比例缩放
}
ul {
/**
* 导航栏响应式的灵魂所在!!!
* 菜单设置为不显示 然后用媒体查询来根据 viewport 的宽度
* 来更新 ul 的显示状态
*/
display: none;
@media (min-width: 800px) {
// viewport 宽度大于等于 800px 时改为 flex 布局
display: flex;
// 菜单要靠在右边 所以用 flex-end
justify-content: flex-end;
/**
* flex: flex-grow flex-shrink flex-basis
* flex-grow: 给单独元素设置 值越大 则其所占比例越大
* 这里设置为 1 就是为了让菜单铺满整个导航栏
* 如果不设置为 1 则会和 logo 一起自适应元素大小占据导航栏
*/
flex: 1;
}
a {
color: var(--menu-font-color);
font-size: 14px;
font-weight: 500;
padding: 0 15px;
margin-left: 15px;
}
}
}
}
// utility classes
// 让导航栏能够有一定的外边距并且水平居中显示
.container {
max-width: 1140px;
margin: 0 auto;
}
3. Hero介绍页
3.1 Hero html框架
<!-- Hero -->
<section class="hero">
<div class="container flex-row">
<div class="left">
<h2>
We provide<br /><span><u>solutions</u></span
><br />
for your business!
</h2>
<div class="buttons">
<a href="#" class="btn">Get Started</a>
<a href="#" class="btn btn-light">Our Services</a>
</div>
</div>
<img src="img/intro-img.svg" alt="" />
</div>
</section>
class=left
样式是为了让文字和按钮在左边,而图片在右边,由于section
只是个普通的块级元素,所以其内部的元素都是垂直排列,为了使其左右排列,要使用flex布局,考虑到flex布局经常会用,所以创建一个工具类样式flex-row
,并且btn
和btn-light
也是工具类样式,只要用到按钮就可以套用这个样式
3.2 工具类样式
flex-row
// flex 布局样式
.flex-row {
display: flex;
}
btn
// 按钮样式
.btn {
cursor: pointer;
display: inline-block;
color: var(--btn-font-color);
background-color: var(--btn-bg-color);
border-radius: 45px;
padding: 14px 40px;
font-weight: 700;
border: 2px solid var(--btn-border-color);
transition: 500ms ease all;
&:hover {
background-color: var(--btn-hover-bg-color);
border-color: var(--btn-hover-border-color);
}
}
btn-light
// 颜色和 btn 相反 其他都一样
.btn-light {
background-color: var(--btn-hover-bg-color);
border-color: var(--btn-hover-border-color);
&:hover {
background-color: var(--btn-bg-color);
border-color: var(--btn-border-color);
}
}
3.3 引入hero背景图片
.hero {
padding: 150px 0;
// center bottom 是 background-position 能让图片水平居中垂直贴进容器底部
background: url("/img/intro-bg.png") center bottom no-repeat;
background-size: cover; // 让图片铺满容器
}
3.4 hero在移动端以column显示
PC端时可以让.left
和img
水平显示,而移动端由于宽度有限,所以要让其内容变为垂直显示,即把flex布局的方向改为column,以移动端优先,先设计移动端的样式,然后加上媒体查询调整PC端的样式
由于这里涉及到的flex布局方式的改变仅限于.hero
中的元素,所以应当在.hero
选择器的内部嵌套处理
以下所有样式都是以移动端优先,pc端的单独在媒体查询中编写
// hero
.hero {
...
.flex-row {
// 移动端的 flex-direction 应以 column 显示
flex-direction: column;
align-items: center;
padding: 0 32px;
gap: 32px; // 用来设置网格行与列之间的间隙
@media (min-width: 1000px) {
// pc 端以 row 显示
flex-direction: row;
}
}
}
3.5 hero移动端的字体
// hero
.hero {
...
h2 {
color: #fff;
font-size: 40px;
margin-bottom: 32px;
text-align: center;
@media (min-width: 1000px) {
text-align: initial;
font-size: 48px;
}
}
}
3.6 移动端图片和信息垂直显示
// hero
.hero {
...
.left {
flex: 1;
order: 2; // 移动端中文字和按钮放在图片的下面显示
justify-content: center;
align-items: center;
@media (min-width: 1000px) {
order: 1; // pc端中文字和按钮在图片左边显示
}
}
img {
display: flex;
flex: 1;
order: 1;
width: 80%;
@media (min-width: 1000px) {
order: 2;
}
}
}
3.7 移动端hero按钮水平居中
// hero
.hero {
...
.buttons {
display: flex;
flex-direction: column;
align-items: center;
@media (min-width: 1000px) {
flex-direction: row;
}
.btn {
text-align: center;
width: 200px;
margin-bottom: 16px;
@media (min-width: 1000px) {
margin-right: 16px;
}
}
}
}
3.8 完成效果
当前阶段的全部代码
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<!-- google fonts Montserrat -->
<!-- <link
href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;700&display=swap"
rel="stylesheet"
/> -->
<!-- font-awesome -->
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.0/css/all.min.css"
integrity="sha512-10/jx2EXwxxWqCLX/hHth/vu2KY3jCF70dCQB8TSgNjbCVAC/8vai53GfMDrO2Emgwccf2pJqxct9ehpzG+MTw=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
/>
<link rel="stylesheet" href="css/style.css" />
<title>Document</title>
</head>
<body>
<!-- Nav -->
<header>
<nav class="container">
<a href="#">
<img src="img/logo.png" />
</a>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Team</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</header>
<!-- Hero -->
<section class="hero">
<div class="container flex-row">
<div class="left">
<h2>
We provide<br /><span><u>solutions</u></span
><br />
for your business!
</h2>
<div class="buttons">
<a href="#" class="btn">Get Started</a>
<a href="#" class="btn btn-light">Our Services</a>
</div>
</div>
<img src="img/intro-img.svg" alt="" />
</div>
</section>
</body>
</html>
style.scss
@font-face {
font-family: "Montserrat";
src: url("../fonts/Montserrat-VariableFont_wght.ttf") format("truetype");
}
* {
font-family: "Montserrat", sans-serif;
padding: 0;
margin: 0;
box-sizing: border-box;
scroll-behavior: smooth; // 平滑过渡
}
ul {
list-style: none; // 去掉无序列表前面的点点
}
a {
text-decoration: none; // 将 a 标签的下划线去除
}
h2 {
font-weight: 500;
font-size: 36px;
color: #283d50;
margin-bottom: 60px;
}
h3 {
color: #444;
font-size: 24px;
margin-bottom: 20px;
}
h4 {
font-size: 20px;
margin-bottom: 8px;
color: #283d50;
}
:root {
/* menu var */
--menu-font-color: #004289; // 菜单栏字体的颜色
/* btn var */
--btn-font-color: #fff; // 按钮中的字体颜色
--btn-bg-color: #0071f9; // 按钮背景颜色
--btn-hover-bg-color: transparent; // 按钮 hover 时的背景颜色
--btn-border-color: transparent; // 按钮边框颜色
--btn-hover-border-color: #fff; // 按钮 hover 时边框颜色
}
// nav
header {
height: 79px;
position: fixed; // 固定导航栏 -- 无论滚动条怎么滑动,导航栏都不会消失
width: 100%; // 任何宽度比例下导航栏都要保持铺满显示屏 方便响应式设计
z-index: 3;
background-color: #fff;
// 参数: X轴偏移量、Y轴偏移量、模糊半径、扩散半径和颜色
box-shadow: 0 0 30px rgba(127, 137, 161, 0.3); // rgba 的第四个参数是不透明度 越大越不透明 0 则为透明
nav {
display: flex;
align-items: center;
padding: 25px 10px; // 上下 25px 左右 10px
img {
height: 25px; // 只设定图片的高度或者宽度能够等比例缩放
}
ul {
/**
* 导航栏响应式的灵魂所在!!!
* 菜单设置为不显示 然后用媒体查询来根据 viewport 的宽度
* 来更新 ul 的显示状态
*/
display: none;
@media (min-width: 800px) {
// viewport 宽度大于等于 800px 时改为 flex 布局
display: flex;
// 菜单要靠在右边 所以用 flex-end
justify-content: flex-end;
/**
* flex: flex-grow flex-shrink flex-basis
* flex-grow: 给单独元素设置 值越大 则其所占比例越大
* 这里设置为 1 就是为了让菜单铺满整个导航栏
* 如果不设置为 1 则会和 logo 一起自适应元素大小占据导航栏
*/
flex: 1;
}
a {
color: var(--menu-font-color);
font-size: 14px;
font-weight: 500;
padding: 0 15px;
margin-left: 15px;
}
}
}
}
// hero
.hero {
display: flex;
justify-content: center;
padding: 150px 0;
// center bottom 是 background-position 能让图片水平居中垂直贴进容器底部
background: url("/img/intro-bg.png") center bottom no-repeat;
background-size: cover; // 让图片铺满容器
.flex-row {
// 移动端的 flex-direction 应以 column 显示
flex-direction: column;
align-items: center;
padding: 0 32px;
gap: 32px; // 用来设置网格行与列之间的间隙
@media (min-width: 1000px) {
// pc 端以 row 显示
flex-direction: row;
}
}
h2 {
color: #fff;
font-size: 40px;
margin-bottom: 32px;
text-align: center;
@media (min-width: 1000px) {
text-align: initial;
font-size: 48px;
}
}
.left {
flex: 1;
order: 2; // 移动端中文字和按钮放在图片的下面显示
justify-content: center;
align-items: center;
@media (min-width: 1000px) {
order: 1; // pc端中文字和按钮在图片左边显示
}
}
img {
display: flex;
flex: 1;
order: 1;
width: 80%;
@media (min-width: 1000px) {
order: 2;
}
}
.buttons {
display: flex;
flex-direction: column;
align-items: center;
@media (min-width: 1000px) {
flex-direction: row;
}
.btn {
text-align: center;
width: 200px;
margin-bottom: 16px;
@media (min-width: 1000px) {
margin-right: 16px;
}
}
}
}
// utility classes
// 让容器能够有一定的外边距并且水平居中显示
.container {
max-width: 1140px;
margin: 0 auto;
}
// flex 布局样式
.flex-row {
display: flex;
}
// 按钮样式
.btn {
cursor: pointer;
display: inline-block;
color: var(--btn-font-color);
background-color: var(--btn-bg-color);
border-radius: 45px;
padding: 14px 40px;
font-weight: 700;
border: 2px solid var(--btn-border-color);
transition: 500ms ease all;
&:hover {
background-color: var(--btn-hover-bg-color);
border-color: var(--btn-hover-border-color);
}
}
// 颜色和 btn 相反 其他都一样
.btn-light {
background-color: var(--btn-hover-bg-color);
border-color: var(--btn-hover-border-color);
&:hover {
background-color: var(--btn-bg-color);
border-color: var(--btn-border-color);
}
}
4. About us
4.1 About us html框架
<!-- About us -->
<section class="about about-1">
<div class="container">
<h2>About us</h2>
<div class="flex-row">
<div class="left">
<p>
Lorem ipsum dolor sit, amet consectetur adipisicing elit.
Necessitatibus libero facere repellendus ipsum distinctio velit
voluptatibus. Amet quam eligendi impedit cum, nam id inventore
quibusdam neque eos, quae voluptatibus qui.
</p>
<!-- Title #1 -->
<div class="flex-row">
<i class="fas fa-bullhorn"></i>
<div class="info">
<h4>Title #1</h4>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum
error molestias, magni laborum recusandae voluptatem.
</p>
</div>
</div>
<!-- Title #2 -->
<div class="flex-row">
<i class="fas fa-bullhorn"></i>
<div class="info">
<h4>Title #1</h4>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum
error molestias, magni laborum recusandae voluptatem.
</p>
</div>
</div>
<!-- Title #3 -->
<div class="flex-row">
<i class="fas fa-bullhorn"></i>
<div class="info">
<h4>Title #1</h4>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum
error molestias, magni laborum recusandae voluptatem.
</p>
</div>
</div>
</div>
<div class="right">
<img src="img/about-img.svg" alt="" />
</div>
<!-- <img src="" alt=""> -->
</div>
</div>
</section>
<section class="about about-2">
<div class="container flex-row">
<div class="left">
<img src="img/about-extra-1.svg" alt="" />
</div>
<div class="right">
<h3>About us secondary content title</h3>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Illo maxime
repudiandae praesentium? Incidunt delectus molestiae ipsum? Deleniti
in rem sequi.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam
harum inventore impedit voluptatum fugit eos. Qui unde soluta quis
voluptatem?
</p>
</div>
</div>
</section>
<section class="about about-3">
<div class="container flex-row">
<div class="left">
<h3>About us secondary content title</h3>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Totam
voluptas porro voluptatum saepe molestiae ullam ut nobis assumenda
sapiente repudiandae.
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eligendi
tempore dolorum labore accusantium ducimus nesciunt quos architecto
id dolorem eum?
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Ut eos
illum odit ratione cum similique magnam atque culpa consequuntur
iusto!
</p>
</div>
<div class="right">
<img src="img/about-extra-2.svg" alt="" />
</div>
</div>
</section>
4.2 基本布局样式
// about us
.about {
img {
width: 60%;
@media (min-width: 900px) {
width: 100%;
}
}
h2 {
text-align: center;
}
p {
line-height: 1.7;
}
.flex-row {
gap: 50px;
flex-direction: column;
@media (min-width: 900px) {
flex-direction: row;
}
}
.left,
.right {
flex: 1; // 让左右空间铺满且各占一半
}
}
4.3 宽度减小到500px以下时纵向显示
// about us
.about {
...
// 对 about-1 中的文本格式进行调整
.left {
.flex-row {
flex-direction: column; // 宽度不够时纵向水平居中显示
align-items: center;
gap: 0; // 将 left 区域内的图标和文本之间的间距移除
@media (min-width: 500px) {
flex-direction: row; // 宽度足够时横向显示
}
}
}
}
4.4 调节info中的文本格式
// about us
.about {
...
// 对 about-1 中的文本格式进行调整
.left {
...
.info {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 20px;
@media (min-width: 500px) {
margin-top: 0;
align-items: initial;
}
p {
color: #444;
font-size: 14px;
}
}
}
}
4.5 图标样式
// about us
.about {
...
// 对 about-1 中的文本格式进行调整
.left {
...
i {
// 图标垂直水平居中
display: flex;
align-items: center;
justify-content: center;
width: 70px;
height: 70px;
border: 2px solid var(--menu-font-color);
border-radius: 50%;
transition: 500ms ease all;
color: var(--menu-font-color);
font-size: 24px;
@media (min-width: 500px) {
margin-right: 16px;
}
&:hover {
background-color: var(--icon-color);
border-color: transparent;
color: #fff;
}
}
}
}
4.6 about-1样式
要让.about-1
中的文本在纵向排列时水平居中显示
.about-1 {
.left {
text-align: center;
@media (min-width: 500px) {
text-align: initial;
}
}
}
4.7 about-1和about-3样式
让.about-1
和.about-3
中的图片在纵向排列时水平居中显示
.about-1,
.about-3 {
.right {
display: flex;
justify-content: center;
@media (min-width: 900px) {
align-items: start;
}
}
}
4.8 about-2样式
让.about-2
在水平排列时,图片排在文本前面,而垂直排列时,图片排在文本后面
// 纵向排列时 让图片排在文本下面 -- 改变 order
.about-2 {
.left {
order: 2;
display: flex;
justify-content: center;
@media (min-width: 900px) {
order: 1;
align-items: start;
}
}
.right {
order: 1;
@media (min-width: 900px) {
order: 2;
}
}
}
.about-2,
.about-3 {
p {
margin-bottom: 20px;
}
}
4.9 multiple section styles
给具有相同class
的类设置的样式放在该区域中,如这里有三个about
样式,就将它们的共同样式都写在该区域里
共同样式为内边距
// multiple section styles
.about {
padding: 50px 20px;
@media (min-width: 900px) {
padding: 100px 20px;
}
}
4.10 完成效果
当前阶段的全部代码
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<!-- google fonts Montserrat -->
<!-- <link
href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;700&display=swap"
rel="stylesheet"
/> -->
<!-- font-awesome -->
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.0/css/all.min.css"
integrity="sha512-10/jx2EXwxxWqCLX/hHth/vu2KY3jCF70dCQB8TSgNjbCVAC/8vai53GfMDrO2Emgwccf2pJqxct9ehpzG+MTw=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
/>
<link rel="stylesheet" href="css/style.css" />
<title>Document</title>
</head>
<body>
<!-- Nav -->
<header>
<nav class="container">
<a href="#">
<img src="img/logo.png" />
</a>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Team</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</header>
<!-- Hero -->
<section class="hero">
<div class="container flex-row">
<div class="left">
<h2>
We provide<br /><span><u>solutions</u></span
><br />
for your business!
</h2>
<div class="buttons">
<a href="#" class="btn">Get Started</a>
<a href="#" class="btn btn-light">Our Services</a>
</div>
</div>
<img src="img/intro-img.svg" alt="" />
</div>
</section>
<!-- About us -->
<section class="about about-1">
<div class="container">
<h2>About us</h2>
<div class="flex-row">
<div class="left">
<p>
Lorem ipsum dolor sit, amet consectetur adipisicing elit.
Necessitatibus libero facere repellendus ipsum distinctio velit
voluptatibus. Amet quam eligendi impedit cum, nam id inventore
quibusdam neque eos, quae voluptatibus qui.
</p>
<!-- Title #1 -->
<div class="flex-row">
<i class="fas fa-bullhorn"></i>
<div class="info">
<h4>Title #1</h4>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum
error molestias, magni laborum recusandae voluptatem.
</p>
</div>
</div>
<!-- Title #2 -->
<div class="flex-row">
<i class="fas fa-balance-scale"></i>
<div class="info">
<h4>Title #1</h4>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum
error molestias, magni laborum recusandae voluptatem.
</p>
</div>
</div>
<!-- Title #3 -->
<div class="flex-row">
<i class="fas fa-globe"></i>
<div class="info">
<h4>Title #1</h4>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum
error molestias, magni laborum recusandae voluptatem.
</p>
</div>
</div>
</div>
<div class="right">
<img src="img/about-img.svg" alt="" />
</div>
</div>
</div>
</section>
<section class="about about-2">
<div class="container flex-row">
<div class="left">
<img src="img/about-extra-1.svg" alt="" />
</div>
<div class="right">
<h3>About us secondary content title</h3>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Illo maxime
repudiandae praesentium? Incidunt delectus molestiae ipsum? Deleniti
in rem sequi.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam
harum inventore impedit voluptatum fugit eos. Qui unde soluta quis
voluptatem?
</p>
</div>
</div>
</section>
<section class="about about-3">
<div class="container flex-row">
<div class="left">
<h3>About us secondary content title</h3>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Totam
voluptas porro voluptatum saepe molestiae ullam ut nobis assumenda
sapiente repudiandae.
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Eligendi
tempore dolorum labore accusantium ducimus nesciunt quos architecto
id dolorem eum?
</p>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Ut eos
illum odit ratione cum similique magnam atque culpa consequuntur
iusto!
</p>
</div>
<div class="right">
<img src="img/about-extra-2.svg" alt="" />
</div>
</div>
</section>
</body>
</html>
style.scss
@font-face {
font-family: "Montserrat";
src: url("../fonts/Montserrat-VariableFont_wght.ttf") format("truetype");
}
* {
font-family: "Montserrat", sans-serif;
padding: 0;
margin: 0;
box-sizing: border-box;
scroll-behavior: smooth; // 平滑过渡
}
ul {
list-style: none; // 去掉无序列表前面的点点
}
a {
text-decoration: none; // 将 a 标签的下划线去除
}
h2 {
font-weight: 500;
font-size: 36px;
color: #283d50;
margin-bottom: 60px;
}
h3 {
color: #444;
font-size: 24px;
margin-bottom: 20px;
}
h4 {
font-size: 20px;
margin-bottom: 8px;
color: #283d50;
}
:root {
/* menu var */
--menu-font-color: #004289; // 菜单栏字体的颜色
/* btn var */
--btn-font-color: #fff; // 按钮中的字体颜色
--btn-bg-color: #0071f9; // 按钮背景颜色
--btn-hover-bg-color: transparent; // 按钮 hover 时的背景颜色
--btn-border-color: transparent; // 按钮边框颜色
--btn-hover-border-color: #fff; // 按钮 hover 时边框颜色
/* about us var */
--icon-color: #007bff;
}
// multiple section styles
.about {
padding: 50px 20px;
@media (min-width: 900px) {
padding: 100px 20px;
}
}
// nav
header {
height: 79px;
position: fixed; // 固定导航栏 -- 无论滚动条怎么滑动,导航栏都不会消失
width: 100%; // 任何宽度比例下导航栏都要保持铺满显示屏 方便响应式设计
z-index: 3;
background-color: #fff;
// 参数: X轴偏移量、Y轴偏移量、模糊半径、扩散半径和颜色
box-shadow: 0 0 30px rgba(127, 137, 161, 0.3); // rgba 的第四个参数是不透明度 越大越不透明 0 则为透明
nav {
display: flex;
align-items: center;
padding: 25px 10px; // 上下 25px 左右 10px
img {
height: 25px; // 只设定图片的高度或者宽度能够等比例缩放
}
ul {
/**
* 导航栏响应式的灵魂所在!!!
* 菜单设置为不显示 然后用媒体查询来根据 viewport 的宽度
* 来更新 ul 的显示状态
*/
display: none;
@media (min-width: 800px) {
// viewport 宽度大于等于 800px 时改为 flex 布局
display: flex;
// 菜单要靠在右边 所以用 flex-end
justify-content: flex-end;
/**
* flex: flex-grow flex-shrink flex-basis
* flex-grow: 给单独元素设置 值越大 则其所占比例越大
* 这里设置为 1 就是为了让菜单铺满整个导航栏
* 如果不设置为 1 则会和 logo 一起自适应元素大小占据导航栏
*/
flex: 1;
}
a {
color: var(--menu-font-color);
font-size: 14px;
font-weight: 500;
padding: 0 15px;
margin-left: 15px;
}
}
}
}
// hero
.hero {
display: flex;
justify-content: center;
padding: 150px 0;
// center bottom 是 background-position 能让图片水平居中垂直贴进容器底部
background: url("/img/intro-bg.png") center bottom no-repeat;
background-size: cover; // 让图片铺满容器
.flex-row {
// 移动端的 flex-direction 应以 column 显示
flex-direction: column;
align-items: center;
padding: 0 32px;
gap: 32px; // 用来设置网格行与列之间的间隙
@media (min-width: 1000px) {
// pc 端以 row 显示
flex-direction: row;
}
}
h2 {
color: #fff;
font-size: 40px;
margin-bottom: 32px;
text-align: center;
@media (min-width: 1000px) {
text-align: initial;
font-size: 48px;
}
}
.left {
flex: 1;
order: 2; // 移动端中文字和按钮放在图片的下面显示
justify-content: center;
align-items: center;
@media (min-width: 1000px) {
order: 1; // pc端中文字和按钮在图片左边显示
}
}
img {
display: flex;
flex: 1;
order: 1;
width: 50%;
@media (min-width: 1000px) {
order: 2;
}
}
.buttons {
display: flex;
flex-direction: column;
align-items: center;
@media (min-width: 1000px) {
flex-direction: row;
}
.btn {
text-align: center;
width: 200px;
margin-bottom: 16px;
@media (min-width: 1000px) {
margin-right: 16px;
}
}
}
}
// about us
.about {
img {
width: 60%;
@media (min-width: 900px) {
width: 100%;
}
}
h2 {
text-align: center;
}
p {
line-height: 1.7;
}
.flex-row {
gap: 50px;
flex-direction: column;
@media (min-width: 900px) {
flex-direction: row;
}
}
.left,
.right {
flex: 1; // 让左右空间铺满且各占一半
}
// 对 about-1 中的文本格式进行调整
.left {
.flex-row {
flex-direction: column; // 宽度不够时纵向水平居中显示
align-items: center;
gap: 0; // 将 left 区域内的图标和文本之间的间距移除
margin-top: 32px;
@media (min-width: 500px) {
flex-direction: row; // 宽度足够时横向显示
}
}
.info {
flex: 1; // 将 .info 的 flex 占比设为 1 才能让图标正常显示
display: flex;
flex-direction: column;
align-items: center;
margin-top: 20px;
@media (min-width: 500px) {
margin-top: 0;
align-items: initial;
}
p {
color: #444;
font-size: 14px;
}
}
i {
// 图标垂直水平居中
display: flex;
align-items: center;
justify-content: center;
width: 70px;
height: 70px;
border: 2px solid var(--icon-color);
border-radius: 50%;
transition: 500ms ease all;
color: var(--icon-color);
font-size: 24px;
@media (min-width: 500px) {
margin-right: 16px;
}
&:hover {
background-color: var(--icon-color);
border-color: transparent;
color: #fff;
}
}
}
}
.about-1 {
.left {
text-align: center;
@media (min-width: 500px) {
text-align: initial;
}
}
}
.about-1,
.about-3 {
.right {
display: flex;
justify-content: center;
@media (min-width: 900px) {
align-items: start;
}
}
}
// 纵向排列时 让图片排在文本下面 -- 改变 order
.about-2 {
.left {
order: 2;
display: flex;
justify-content: center;
@media (min-width: 900px) {
order: 1;
align-items: start;
}
}
.right {
order: 1;
@media (min-width: 900px) {
order: 2;
}
}
}
.about-2,
.about-3 {
p {
margin-bottom: 20px;
}
}
// utility classes
// 让容器能够有一定的外边距并且水平居中显示
.container {
max-width: 1140px;
margin: 0 auto;
}
// flex 布局样式
.flex-row {
display: flex;
}
// 按钮样式
.btn {
cursor: pointer;
display: inline-block;
color: var(--btn-font-color);
background-color: var(--btn-bg-color);
border-radius: 45px;
padding: 14px 40px;
font-weight: 700;
border: 2px solid var(--btn-border-color);
transition: 500ms ease all;
&:hover {
background-color: var(--btn-hover-bg-color);
border-color: var(--btn-hover-border-color);
}
}
// 颜色和 btn 相反 其他都一样
.btn-light {
background-color: var(--btn-hover-bg-color);
border-color: var(--btn-hover-border-color);
&:hover {
background-color: var(--btn-bg-color);
border-color: var(--btn-border-color);
}
}