我们前面了解了HTML、CSS、JS相关基础知识,我们可以利用了解到的前端知识做一个简单项目的前端页面,用来展示我们项目所要实现功能的具体操作页面,博客系统前端页面包含但不限于列表页、正文页、登录页及编辑页,下面我们来进行一一实现。
1 博客列表页面
博客列表页我们放入导航栏、个人信息介绍以及文章列表:
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">
<title>博客列表</title>
<!-- 引入公共样式css文件 -->
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/blog_list.css">
</head>
<body>
<!-- 导航栏 -->
<div class="nav">
<!-- logo -->
<img src="img/logo2.jpg" alt="">
<!-- 标题 -->
<span class="title">我的博客系统</span>
<!-- spacer 不现实任何内容, 只是占位, 把后面 a 标签撑到右侧去 -->
<div class="spacer"></div>
<!-- 超链接跳转页面 -->
<a href="blog_list.html">主页</a>
<a href="blog_edit.html">写博客</a>
<a href="#">注销</a>
</div>
<!-- 页面的主区域 -->
<div class="container">
<!-- 左侧的用户信息 -->
<div class="container-left">
<!-- 用户的信息 -->
<div class="card">
<!-- 用户的头像 -->
<img src="img/cat.jpg" alt="">
<!-- 用户的名字 -->
<h3>miao</h3>
<a href="#">github 地址</a>
<div class="counter">
<span>文章</span>
<span>分类</span>
</div>
<div class="counter">
<span>2</span>
<span>1</span>
</div>
</div>
</div>
<!-- 右侧内容区域 -->
<div class="container-right">
<!-- 每个 .blog 用来表示一篇博客 -->
<div class="blog">
<div class="title">博客01</div>
<div class="date">2022-12-08 12:00:00</div>
<div class="desc">
第一篇博客. Lorem ipsum dolor sit amet consectetur adipisicing elit. Id veritatis repudiandae, at quas temporibus iure minima aliquid facilis! Odit unde veniam, veritatis qui illum tenetur in dolores sint asperiores aliquam?
</div>
<!-- 转义字符>>,>> <表示< -->
<a href="blog_detail.html">查看全文 >> </a>
</div>
<!-- 每个 .blog 用来表示一篇博客 -->
<div class="blog">
<div class="title">博客02</div>
<div class="date">2022-12-10 12:00:00</div>
<div class="desc">
第二篇博客. Lorem ipsum dolor sit amet consectetur adipisicing elit. Id veritatis repudiandae, at quas temporibus iure minima aliquid facilis! Odit unde veniam, veritatis qui illum tenetur in dolores sint asperiores aliquam?
</div>
<a href="blog_detail.html">查看全文 >> </a>
</div>
<!-- 每个 .blog 用来表示一篇博客 -->
<div class="blog">
<div class="title">博客03</div>
<div class="date">2022-12-11 12:00:00</div>
<div class="desc">
第三篇博客. Lorem ipsum dolor sit amet consectetur adipisicing elit. Id veritatis repudiandae, at quas temporibus iure minima aliquid facilis! Odit unde veniam, veritatis qui illum tenetur in dolores sint asperiores aliquam?
</div>
<a href="blog_detail.html">查看全文 >> </a>
</div>
<!-- 每个 .blog 用来表示一篇博客 -->
<div class="blog">
<div class="title">博客04</div>
<div class="date">2022-12-15 12:00:00</div>
<div class="desc">
第四篇博客. Lorem ipsum dolor sit amet consectetur adipisicing elit. Id veritatis repudiandae, at quas temporibus iure minima aliquid facilis! Odit unde veniam, veritatis qui illum tenetur in dolores sint asperiores aliquam?
</div>
<a href="blog_detail.html">查看全文 >> </a>
</div>
</div>
</div>
</body>
</html>
通用的CSS代码:
/* 这个文件放多个页面都需要使用的公共样式 */
/* 清除浏览器的默认样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
/* 设置让 html 的高度和浏览器窗口一样高 */
height: 100%;
}
/* 要想给整个页面设置背景,需要给body标签设置背景 */
body {
/* 设置让 body 的高度和 html 标签一样高 */
height: 100%;
/* 背景图片、位置、 */
background-image: url(../img/fl111.jpg);
background-position: center center;
background-repeat: no-repeat;
background-size: cover;
}
/* 导航栏布局 */
.nav {
/* 导航栏高度普遍都是 50px */
height: 50px;
/* 半透明效果的导航栏 */
background-color: rgba(50, 50, 50, 0.4);
/* 文字颜色设置成白色 */
color: white;
/* 给nav标签添加弹性布局,nav的子元素就会按照弹性布局排列 */
display: flex;
/* 靠左布局,子元素使用这个来控制元素在水平方向如何排列 */
justify-content: flex-start;
/* 居中布局,子元素使用这个来控制元素在垂直方向如何排列 */
align-items: center;
}
.nav .title {
}
/* logo图片设置 */
.nav img {
width: 40px;
height: 40px;
/* 左右侧外边距 */
margin-left: 30px;
margin-right: 10px;
/* 圆形图标,尺寸为长宽的一半就是一个标准⚪ */
border-radius: 20px;
}
/* 中间占位区域的样式 */
.nav .spacer {
/* 宽度设置成百分比的形式, 以父元素为基准, 设置当前的尺寸 */
width: 70%;
height: 40px;
}
/* 设置a标签的样式 */
.nav a {
color: white;
/* 去掉下划线 */
text-decoration: none;
padding: 0 10px;
}
/* 页面主区域布局 */
.container {
width: 1000px;
/* 水平居中 */
margin: 0 auto;
/* 设置高度,整体高度减去导航栏高度,css3引入calc库计算页面高度,-两侧必须要有空格 */
height: calc(100% - 50px);
/* 为了让里面的 left 和 right 能够水平方向排列, 就需要使用弹性布局了 */
display: flex;
/* 让布局中间留有空白 */
justify-content: space-between;
}
.container .container-left {
height: 100%;
width: 200px;
}
.container .container-right {
height: 100%;
/* 不设置成800 留有一定的间隙 */
width: 796px;
background-color: rgba(255, 255, 255, 0.8);
padding: 20px;
border-radius: 20px;
/* 如果内容超出范围了, 自动添加滚动条 */
overflow: auto;
}
/* 对个人介绍页面布局调整 */
.card {
background-color: rgba(255, 255, 255, 0.8);
/* 设置内边距, 就是为了让文字和图片不要顶着边界 */
padding: 30px;
border-radius: 20px;
}
/* 个人图像布局调整 */
.card img {
width: 140px;
height: 140px;
border-radius: 70px;
}
/* 昵称调整 */
.card h3 {
text-align: center;
padding: 10px;
}
/* 针对github地址的a标签调整 */
.card a {
/* a 默认是行内元素. 默认尺寸就是和内容是一样的,因此要先转换为行内元素 */
display: block;
text-align: center;
color: #999;
text-decoration: none;
/* 上下边距 */
padding: 10px 0;
}
/* 文章分类布局 */
.card .counter {
/* 弹性布局 */
display: flex;
/* 空格环绕 */
justify-content: space-around;
/* 边距 */
padding: 5px;
}
列表页CSS代码:
/* 这个文件专门放 博客列表页 的专用样式 */
/* 博客的容器进行设置 */
/* .blog {
} */
/* 博客标题 */
.blog .title {
font-size: 20px;
font-weight: 700;
/* 水平居中 */
text-align: center;
/* 标题边距 */
padding: 10px 0;
}
/* 博客日期 */
.blog .date {
text-align: center;
color: rgb(44, 114, 143);
padding: 10px 0;
}
/* 文章内容 */
.blog .desc {
/* 文本缩进2字符 */
text-indent: 2em;
}
/* 博客超链接a标签 */
.blog a {
/* 转成块级元素, 容易设置尺寸 */
display: block;
width: 120px;
height: 40px;
/* 元素水平居中 */
margin: 10px auto;
/* 文字水平居中 */
text-align: center;
/* 文字垂直居中 */
line-height: 40px;
color: black;
/* 去掉下划线 */
text-decoration: none;
/* 加上边框 */
border: 2px solid black;
/* 加上一个背景的渐变效果 */
transition: all 0.7s;
}
/* 鼠标悬停的时候, 有个动态效果,在查看全文上面悬停,背景会变为黑色 */
.blog a:hover {
background-color: black;
color: white;
}
2 博客详情页
当我们点击博客列表页中的 查看全文 通过a标签自带的跳转功能跳转到博客详情页,这里的布局类似列表页的布局,引用通用的CSS,改变主区域右边的内容,展示某一篇博客的具体内容:
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">
<title>博客详情</title>
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/blog_detail.css">
</head>
<body>
<div class="nav">
<img src="img/logo2.jpg" alt="">
<span class="title">我的博客系统</span>
<!-- spacer 不现实任何内容, 只是占位, 把后面 a 标签撑到右侧去 -->
<div class="spacer"></div>
<a href="blog_list.html">主页</a>
<a href="blog_edit.html">写博客</a>
<a href="#">注销</a>
</div>
<!-- 这个 div 表示页面的主区域(版心) -->
<div class="container">
<!-- 左侧的用户信息 -->
<div class="container-left">
<!-- 用这个元素表示用户的信息 -->
<div class="card">
<!-- 用户的头像 -->
<img src="img/cat.jpg" alt="">
<!-- 用户的名字 -->
<h3>miao</h3>
<a href="#">github 地址</a>
<div class="counter">
<span>文章</span>
<span>分类</span>
</div>
<div class="counter">
<span>2</span>
<span>1</span>
</div>
</div>
</div>
<!-- 右侧内容区域 -->
<div class="container-right">
<div class="blog-detail">
<h3>博客01</h3>
<div class="date">2022-12-08 12:00:00</div>
<p>
第一篇博客.
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At provident quis fuga totam, voluptatem expedita quam vitae consectetur modi deserunt ipsam numquam quae cumque esse placeat. Earum molestiae reiciendis ullam!
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At provident quis fuga totam, voluptatem expedita quam vitae consectetur modi deserunt ipsam numquam quae cumque esse placeat. Earum molestiae reiciendis ullam!
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At provident quis fuga totam, voluptatem expedita quam vitae consectetur modi deserunt ipsam numquam quae cumque esse placeat. Earum molestiae reiciendis ullam!
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At provident quis fuga totam, voluptatem expedita quam vitae consectetur modi deserunt ipsam numquam quae cumque esse placeat. Earum molestiae reiciendis ullam!
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At provident quis fuga totam, voluptatem expedita quam vitae consectetur modi deserunt ipsam numquam quae cumque esse placeat. Earum molestiae reiciendis ullam!
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At provident quis fuga totam, voluptatem expedita quam vitae consectetur modi deserunt ipsam numquam quae cumque esse placeat. Earum molestiae reiciendis ullam!
Lorem ipsum dolor sit amet consectetur, adipisicing elit. At provident quis fuga totam, voluptatem expedita quam vitae consectetur modi deserunt ipsam numquam quae cumque esse placeat. Earum molestiae reiciendis ullam!
</p>
</div>
</div>
</div>
</body>
</html>
详情页CSS代码:
/* 给博客详情页提供具体的样式 */
/* 标题 */
.blog-detail h3 {
font-size: 20px;
text-align: center;
padding: 20px 0;
}
/* 日期 */
.blog-detail .date {
color: rgb(0, 128, 0);
text-align: center;
padding: 10px 0;
}
/* 文本内容 */
.blog-detail p {
text-indent: 2em;
}
当前页面的数据都是随机生成的数据,后面结合后端,就会显示markdown编辑器渲染出来的html
3 博客登录页
登陆页面和前面两个页面差距较大,导航栏和背景一样,中间是一个类似于对话框的卡片:
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">
<title>登录</title>
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/login.css">
</head>
<body>
<div class="nav">
<img src="img/logo2.jpg" alt="">
<span class="title">我的博客系统</span>
<!-- spacer 不现实任何内容, 只是占位, 把后面 a 标签撑到右侧去 -->
<div class="spacer"></div>
<a href="blog_list.html">主页</a>
<a href="blog_edit.html">写博客</a>
</div>
<!-- 页面主区域, 把对话框放到这个元素里面, 垂直水平居中 -->
<div class="login-container">
<!-- 登录对话框 -->
<div class="dialog">
<h3>登录</h3>
<div class="row">
<span>用户名</span>
<!-- 这两个框很关键, 后面还要用, 就起个 id 作为标识 -->
<input type="text" id="username">
</div>
<div class="row">
<span>密码</span>
<input type="password" id="password">
</div>
<div class="row">
<button id="login-btn">登录</button>
</div>
</div>
</div>
</body>
</html>
登录页CSS代码:
/* 这个文件用来实现登录页的样式 */
.login-container {
height: calc(100% - 50px);
/* 这三个样式是为了让 .dialog 垂直水平居中 */
display: flex;
justify-content: center;
align-items: center;
}
/* 登录框 */
.dialog {
width: 400px;
height: 300px;
background-color: rgba(255, 255, 255, 0.8);
border-radius: 20px;
}
/* 标题 */
.dialog h3 {
font-size: 20px;
text-align: center;
padding: 40px 0;
}
/* 两行文本框 */
.dialog .row {
height: 50px;
/* 弹性布局 */
display: flex;
/* 水平居中 */
justify-content: center;
/* 垂直居中 */
align-items: center;
}
/* 用户名和密码 */
.dialog .row span {
width: 80px;
}
/* 输入框 id选择器*/
#username, #password {
height: 40px;
width: 180px;
/* 输入内容大小 */
font-size: 18px;
/* 和输入框边距 */
padding-left: 5px;
}
/* 登录按钮 */
#login-btn {
width: 260px;
height: 40px;
border-radius: 5px;
background-color: rgb(44, 114, 143);
color: white;
border: none;
}
#login-btn:active {
background-color: grey;
}
前面我们在写 查看全文的时候直接使用a标签的herf属性完成页面跳转,在这里的登录按钮是需要把用户名和密码发送到服务器的,不能直接使用a标签进行跳转,还需要搭配其他方式。同时在这个页面不需要注销按钮,注销指的是退出登录状态。
4 博客编辑页
这个页面是由导航栏、背景、输入标题的输入框、发布按钮及markdown编辑器构成的:
下载引入编辑器
上面的markdown编辑器是调用第三方库,editor.md是一个开源的markdown编辑器,直接在浏览器搜索editor.md,进入主页直接从GitHub上下载,解压缩后粘贴到项目下,命名改为editor.md 这里无论是目录结构还是命名都不能出现出现错误。
引入到代码中(务必要保证引入文件的路径是正确的):
<!-- 引入 editor.md 的依赖 -->
<link rel="stylesheet" href="editor.md/css/editormd.min.css" />
<!-- 引入jquery 由于editor.md依赖了jquery,因此需要手动引入 -->
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="editor.md/lib/marked.min.js"></script>
<script src="editor.md/lib/prettify.min.js"></script>
<script src="editor.md/editormd.js"></script>
初始化编辑器
先创建一个div,必须给个id
<!-- 正文的编辑区 -->
<div id="editor">
</div>
接下来就是初始化编辑器
<script>
// 初始化编辑器, 代码截取自 官方文档 .
var editor = editormd("editor", {
// 这里的尺寸必须在这里设置. 设置样式会被 editormd 自动覆盖掉.
width: "100%",
// 设定编辑器高度
height: "calc(100% - 50px)",
// 编辑器中的初始内容
markdown: "## hello world",
// 指定 editor.md 依赖的插件路径
path: "editor.md/lib/"
});
</script>
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">
<title>博客编辑</title>
<link rel="stylesheet" href="css/common.css">
<link rel="stylesheet" href="css/blog_edit.css">
<!-- 引入 editor.md 的依赖 -->
<link rel="stylesheet" href="editor.md/css/editormd.min.css" />
<!-- 这是另外一个第三方库 -->
<!-- <script src="js/jquery.min.js"></script> -->
<!-- 引入jquery 由于editor.md依赖了jquery,因此需要手动引入 -->
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="editor.md/lib/marked.min.js"></script>
<script src="editor.md/lib/prettify.min.js"></script>
<script src="editor.md/editormd.js"></script>
</head>
<body>
<div class="nav">
<img src="img/logo2.jpg" alt="">
<span class="title">我的博客系统</span>
<!-- spacer 不现实任何内容, 只是占位, 把后面 a 标签撑到右侧去 -->
<div class="spacer"></div>
<a href="blog_list.html">主页</a>
<a href="blog_edit.html">写博客</a>
<a href="#">注销</a>
</div>
<!-- 整个编辑页的主区域 -->
<div class="blog-edit-container">
<!-- 标题的编辑区 -->
<div class="title">
<!-- 输入的标题内容 placeholder是提示信息,不影响输入 -->
<input type="text" id="blog-title" placeholder="在这里输入博客标题">
<button id="submit">发布文章</button>
</div>
<!-- 正文的编辑区 -->
<div id="editor">
</div>
</div>
<script>
// 初始化编辑器, 代码截取自 官方文档 .
var editor = editormd("editor", {
// 这里的尺寸必须在这里设置. 设置样式会被 editormd 自动覆盖掉.
width: "100%",
// 设定编辑器高度
height: "calc(100% - 50px)",
// 编辑器中的初始内容
markdown: "## hello world",
// 指定 editor.md 依赖的插件路径
path: "editor.md/lib/"
});
</script>
</body>
</html>
编辑页CSS代码:
/* 针对博客编辑页写的样式 */
/* 主区域 */
.blog-edit-container {
width: 1000px;
height: calc(100% - 50px);
margin: 0 auto;
}
/* 设置标题编辑区的样式 */
.blog-edit-container .title {
height: 50px;
/* 只要是水平方向排列多个元素, 就用弹性布局 */
display: flex;
justify-content: space-between;
align-items: center;
}
/* 输入框 */
#blog-title {
height: 40px;
width: 897px;
font-size: 20px;
padding-left: 5px;
/* 去掉轮廓线, 选中输入框时候的黑圈 */
outline: none;
/* 去掉边框 */
border: none;
/* 圆角矩形 */
border-radius: 5px;
/* 加上背景半透明效果 */
background-color: rgba(255, 255, 255, 0.8);
}
/* 发布文章按钮 */
#submit {
height: 40px;
width: 100px;
border: none;
border-radius: 5px;
color: white;
background-color: orange;
}
#submit:active {
background-color: grey;
}
/* 编辑器设置成变透明 */
#editor {
border-radius: 10px;
/* 由于里面有很多子元素,这个方法不能实现半透明效果 */
/* background-color: rgba(255, 255, 255, 0.8); */
/* 这个属性的半透明是可以让子元素也一起生效的, 值是个百分数. 80% 就相当于 rgba 中的 0.8 */
opacity: 80%;
}
上述就是我们博客系统的前端页面设计,对于前端页面,如果不走前端方向,我们不需要做到精通,理解代码意思就够用了。
前端知识到此结束,接下来我们继续了解后端知识。下面我们一起了解HTTP相关内容。