《花100块做个摸鱼小网站! 》第十篇—响应式布局适配PC端和移动端

news/2024/11/29 10:44:55/文章来源:https://www.cnblogs.com/wlovet/p/18568017

⭐️基础链接导航⭐️

服务器 → ☁️ 阿里云活动地址

看样例 → 🐟 摸鱼小网站地址

学代码 → 💻 源码库地址

一、前言

大家好呀,我是summo,小网站一直有个问题,就是PC端的样式和移动端的样式是两套,并且不能根据显示屏的大小进行动态化布局,如果PC端屏幕非常小就是这样:

如果移动端屏幕非常大就是这样:

总之,这样的效果不是我想要的,我想要是下面这样的:

这个功能我本来以为会很麻烦,实际上还好,已经发布上线了,代码也提交到Gitee了,下面介绍一下我是怎么实现这个响应式布局功能的。

二、响应式布局

响应式布局是同一页面在不同的屏幕上有不同的布局,即只需要一套代码使页面适应不同的屏幕。这个听起来很牛逼,但是小网站想要实现这个功能却很容易,因为小网站的前端是基于ElementUI实现的,而ElementUI本身就支持响应式布局。

也就是说我们只要利用ElementUI的这个特性就可以实现响应式布局。

这是小网站的main区域修改后的代码

<el-main><el-row :gutter="10"><el-col :sm="24" :md="20" :lg="20" :xl="20"><el-row :gutter="10"><el-colv-for="(board, index) in hotBoards":key="index":xs="24":sm="10":md="8":lg="6":xl="6"><hot-search-board:title="board.title":icon="board.icon":fetch-url="board.fetchUrl":type="board.type"/> </el-col></el-row></el-col><el-col :xs="0" :sm="4" :md="4" :lg="4" :xl="4"><visitor-log /><holiday-calendar /><word-cloud /><poetry /><camera-player /></el-col></el-row>
</el-main>

从代码上可以看到,在内容区域和侧边栏区域设置了响应式布局属性,正常情况下两块区域的比例分配是20:4,但由于侧边栏在页面宽度很小时会出现样式混乱的问题,所以可以通过设置:xs="0"直接隐藏。
第二部分就是内容区域里面的热搜组件,由于每行展示的热搜组件个数需要根据页面宽度来动态调整,所以这里也是使用了响应式布局属性,核心逻辑就是随着页面宽度的减少,单个热搜组件的占比增加,最终增加到24,占满整个屏幕。

三、PC端和移动端样式替换

本来我以为这个功能会很复杂,但实际上这个反而是最简单的,我先上代码:

<template><div v-if="!isSmallScreen"><pc-app /></div><div v-else><mp-app /></div>
</template>
<script>
import PcApp from "@/PCApp.vue";
import MpApp from "@/MpApp.vue";
export default {components: { PcApp, MpApp },data() {return {// 用于标识是否为小屏幕isSmallScreen: false,};},created() {// 根据初始屏幕宽度设置isSmallScreen的值this.checkScreenSize();},methods: {checkScreenSize() {const screenWidth = window.innerWidth;this.isSmallScreen = screenWidth < 768;},},mounted() {// 监听窗口大小变化事件window.addEventListener("resize", this.checkScreenSize);},beforeDestroy() {// 移除窗口大小变化事件监听器window.removeEventListener("resize", this.checkScreenSize);},
};
</script>
<style scope></style>

核心逻辑就是,我将PC端和移动端分为了两个组件,然后利用isSmallScreen属性来判断当前屏幕是否需要进行PC端和移动端切换,非常简单。

四、小结一下

小网站的功能一直都不是很全,很多都只有最初始的版本,优化的点很多,但我前面确实对前端技术不是怎么熟悉就没有做。不过最近好好重新学了一下,感觉自己前端功力大涨,后续我会尝试增加一些新功能,让小网站的功能更加丰富。

番外:虎扑恋爱区热搜爬虫

1. 爬虫方案评估

虎扑恋爱区一直都是大家最爱看的热搜板块,今天我讲一下这个热搜数据是怎么获取到的。这个板块的核心接口是https://bbs.hupu.com/love-hot,返回的是HTML页面,所以又得用上我们的老朋友 Jsoup了,核心代码在第二段。

2. 网页解析代码

HupuHotSearchJob.java

package com.summo.sbmy.job.hupu;import com.summo.sbmy.common.model.dto.HotSearchDetailDTO;
import com.summo.sbmy.dao.entity.SbmyHotSearchDO;
import com.summo.sbmy.service.SbmyHotSearchService;
import com.summo.sbmy.service.convert.HotSearchConvert;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;import static com.summo.sbmy.cache.hotSearch.HotSearchCacheManager.CACHE_MAP;
import static com.summo.sbmy.common.enums.HotSearchEnum.HUPU;/*** @author summo* @version HupuHotSearchJob.java, 1.0.0* @description 虎扑热搜Java爬虫代码* @date 2024年08月09*/
@Component
@Slf4j
public class HupuHotSearchJob {@Autowiredprivate SbmyHotSearchService sbmyHotSearchService;@XxlJob("hupuHotSearchJob")public ReturnT<String> hotSearch(String param) throws IOException {log.info("虎扑热搜爬虫任务开始");try {String url = "https://bbs.hupu.com/love-hot";List<SbmyHotSearchDO> sbmyHotSearchDOList = new ArrayList<>();Document doc = Jsoup.connect(url).get();//元素列表Elements elements = doc.select(".p-title");for (int i = 0; i < elements.size(); i++) {SbmyHotSearchDO sbmyHotSearchDO = SbmyHotSearchDO.builder().hotSearchResource(HUPU.getCode()).build();//设置文章标题sbmyHotSearchDO.setHotSearchTitle(elements.get(i).text().trim());//设置虎扑三方IDsbmyHotSearchDO.setHotSearchId(getHashId(HUPU.getCode() + sbmyHotSearchDO.getHotSearchTitle()));//设置文章连接sbmyHotSearchDO.setHotSearchUrl("https://bbs.hupu.com/" + doc.select(".p-title").get(i).attr("href"));//设置热搜热度sbmyHotSearchDO.setHotSearchHeat(doc.select(".post-datum").get(i).text().split("/")[1].trim());//设置热搜作者sbmyHotSearchDO.setHotSearchAuthor(doc.select(".post-auth").get(i).text());//按顺序排名sbmyHotSearchDOList.add(sbmyHotSearchDO);}AtomicInteger count = new AtomicInteger(1);sbmyHotSearchDOList = sbmyHotSearchDOList.stream().sorted(Comparator.comparingInt((SbmyHotSearchDO hotSearch) -> Integer.parseInt(hotSearch.getHotSearchHeat())).reversed()).map(sbmyHotSearchDO -> {sbmyHotSearchDO.setHotSearchOrder(count.getAndIncrement());return sbmyHotSearchDO;}).collect(Collectors.toList());if (CollectionUtils.isEmpty(sbmyHotSearchDOList)) {return ReturnT.SUCCESS;}//数据加到缓存中CACHE_MAP.put(HUPU.getCode(), HotSearchDetailDTO.builder()//热搜数据.hotSearchDTOList(sbmyHotSearchDOList.stream().map(HotSearchConvert::toDTOWhenQuery).collect(Collectors.toList()))//更新时间.updateTime(Calendar.getInstance().getTime()).build());//数据持久化sbmyHotSearchService.saveCache2DB(sbmyHotSearchDOList);log.info("虎扑热搜爬虫任务结束");} catch (IOException e) {log.error("获取虎扑数据异常", e);}return ReturnT.SUCCESS;}/*** 根据文章标题获取一个唯一ID** @param title 文章标题* @return 唯一ID*/private String getHashId(String title) {long seed = title.hashCode();Random rnd = new Random(seed);return new UUID(rnd.nextLong(), rnd.nextLong()).toString();}@PostConstructpublic void init() {// 启动运行爬虫一次try {hotSearch(null);} catch (IOException e) {log.error("启动爬虫脚本失败",e);}}
}

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

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

相关文章

HCIA-09 VLAN原理与配置

主要介绍了虚拟局域网 (VLAN)的相关技术知识,包括:VLAN的作用,VLAN的标识及划分,VLAN的数据交互,VLAN的实际规划和应用,以及VLAN的相关基本配置。 通过VLAN技术,可以将物理的局域网划分成多个广播域,实现同一VLAN内的网络设备可以直接进行二层通信,不同VLAN内的设备不…

vxe-modal 实现窗口拖拽调整宽高

vxe-modal 实现窗口拖拽调整宽高 官网:https://vxeui.com<template><div><vxe-button content="点击弹出" @click="showPopup = true"></vxe-button><vxe-modal v-model="showPopup" title="标题1" :widt…

Tarjan学习笔记

强连通分量,缩点算法:Tarjan 代码及模板 强连通图:有向图,任意两点有路径 强连通分量:有向图,强连通子图数量 前置知识:dfs树(dfs序构成的树) 成分: 1.树边:dfs树上的边 (以下三种边是dfs树上没有但原图上有的边) 2.前向边:dfs树的祖先到儿子的边。 3.返祖边(后…

Mysql 数据库并发事物导致ABA问题排查解决

问题描述 一个更新计费参数接口,按钮连点导致数据未更新问题。 背景 接口内容逻辑,在一个事物内,先保存更新计费参数,再根据计费参数,重新计算费用,并刷新计费单,结算单,支付单等单据金额信息。按理来讲,这个接口是具备幂等性的,因为即便多次更新,也只是重新计算一遍…

工程化开发谷歌插件到底有爽

工程化开发谷歌插件到底有爽谷歌插件开发本质上就是写一些 html + js + css谷歌开发心得吧 manifest.json 文件{"manifest_version": 3,"name": "发布助手","version": "3.0","description": "前端资源监测&…

12-渗透测试

1、水平越权&垂直越权漏洞实验水平越权lucy用户登入成功后,将url的username参数由lucy改为kobe,即可查看到kobe的信息,实现水平越权垂直越权使用低权限用户pikachu访问添加用户页面,行使管理员admin用户的添加用户权限用户添加成功,实现垂直越权2、密码修改逻辑漏洞实…

vxe-modal 实现弹窗多窗口

官网:https://vxeui.com<template><div><p><vxe-button content="点击弹出" @click="openEvent"></vxe-button></p></div> </template><script> import { VxeUI } from vxe-pc-ui export default …

redis 流量增加过多问题排查解决

背景 Java项目,使用Redis集群。 现象 Redis集群,单台流量增加过多。 在redis服务器上:iftop -npP排查过程 发现流量上涨是同一台机器IP尾号3。到这台机器上查看。 top 命令查看进程idtop -H -p 1748 查看具体线程信息,可以看到,有三个线程执行100多小时,而且占用较多cpu…

RX23E-B系列微控制器是工业传感器设备的理想选择!R5F523E5B介绍,EFR32BG13P732F512GM48-D蓝牙/TH58NVG2S3HTAI0存储IC

RX23E-B系列微控制器是工业传感器设备的理想选择!R5F523E5B介绍,EFR32BG13P732F512GM48-D蓝牙/TH58NVG2S3HTAI0存储ICRX23E-B 系列微控制器具有内置模拟前端 (AFE),是工业传感器设备的理想选择。 与上一代的 RX23E-A 相比,RX23E-B 的24 位 Delta Sigma 模/数转换器在高速性…

100ASK_IMX6ULL-PRO 数码相框扩展项目:支持打开阅读 TXT 文件

背景说明 本篇内容基于百问网嵌入式Linux项目数码相框与文件浏览器和嵌入式Linux电子书阅读器 需求:在文件浏览器界面中支持双击打开TXT类型文件,进入新界面进行文本阅读和翻页控制。 实现思路说明 浏览器界面中响应双击操作,识别TXT类型文件成功后进入阅读器界面。可参考项…

mysql数据库聚合与拆分

1. 背景在用户使用的时候会有统计数据的情况,在多表联查的时候分类时会有,同一个类型出现多次,然后任务需区是出现一次类型名 2. 聚合查询 GROUP_CONCAT(聚合字段) group_by(聚合字段)SELECT report.serialNumber as 病人编号, GROUP_CONCAT(label.lableName) AS &q…

GIS与数字孪生融合:打造智能3D空域管理平台

在数字化转型的浪潮中,地理信息系统(GIS)技术正以其独特的空间分析能力,为城市规划和管理带来革命性的变化。今天,我们将探讨一个前沿话题:基于GIS技术的数字孪生3D空域规划与飞行信息管理平台。 什么是数字孪生?数字孪生,简而言之,就是物理世界中的实体在数字世界中的…