️基础链接导航️

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

看样例 → 摸鱼小网站地址

学代码 → 源码库地址

一、前言

大家好呀,我是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-col
v-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 { @Autowired
private 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());
//设置虎扑三方ID
sbmyHotSearchDO.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();
} @PostConstruct
public void init() {
// 启动运行爬虫一次
try {
hotSearch(null);
} catch (IOException e) {
log.error("启动爬虫脚本失败",e);
}
}
}

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

  1. 超 Nice 的表格响应式布局小技巧

    今天,遇到了一个很有意思的问题,一名群友问我,仅仅使用 CSS,能否实现这样一种响应式的布局效果: 简单解析一下效果: 在屏幕视口较为宽时,表现为一个整体 Table 的样式 而当屏幕视口宽度较小时, ...

  2. FFT 深夜摸鱼小笔记

    本次笔记学习自算法导论 FFT核心:系数表示→(单位复数根)点值表示→(插值)系数表示 关于单位复数根 n次单位复数根\(ω\)为满足\(ω^n=1\)的复数 n次单位复数根恰好有n个,表示为\(ω_ ...

  3. 跟我一起做一个vue的小项目(十)

    接下来我们对城市列表页面进行优化,除了对数据优化,也会进行节流处理 //src\pages\city\components\Alphabet.vue <template> <ul c ...

  4. 给我的cnblogs主页做一个响应式布局模板

    在cnblogs,一直都是使用官方自带的那些模板,而且感觉也一直很良好!不过最近用手机搜索一些相关的技术资料,很多都来自cnblogs,有些博主的页面在和机端显得很好,有些则展示得不那么友好了……忽然 ...

  5. 使用rem来做响应式布局(js动态加载)

    <script> ;(function (doc,win) { var htmlEle=doc.documentElement; var reload="orientationc ...

  6. 用 WinUI 3 开发了一个摸鱼应用

    1. 开发了一个摸鱼 App 我做了一个简单的 App:摸鱼. 如上图所示,这个 App 就只有一个按钮,点击后假装开始 Windows Update,然后用户就可以光明正大地摸鱼了. 不要小看摸鱼, ...

  7. GitHub 热点速览 Vol.27:程序员的自我救赎——GitHub 摸鱼

    作者:HelloGitHub-小鱼干 摘要:都知道 VSCode 有各种摸鱼小插件,边听云音乐.边在 IDE 斗地主,再来一个 NBA 直播,怎一个美滋滋了得.作为 VSCode 的同门,GitHub ...

  8. 最近用django做了个在线数据分析小网站

    用最近做的理赔申请人测试数据集做了个在线分析小网站. 数据结构,算法等设置都保存在json文件里.将来对这个小破站扩充算法,只修改一下json文件就行. 当然,结果分析还是要加代码的.页面代码不贴了, ...

  9. 微信小程序新单位rpx与自适应布局

    rpx是微信小程序新推出的一个单位,按官方的定义,rpx可以根据屏幕宽度进行自适应,在rpx出现之前,web页面的自适应布局已经有了多种解决方案,为什么微信还捣鼓出新的rpx单位?在解释这个单位前,我 ...

  10. 小程序学习-理解小程序中响应式单位rpx

    微信小程序的官方文档用rpx来做响应式布局单位!那什么是rpx,应该如何设置呢?今天我们就来好好了解一下. [像素]:它不是自然界的物理长度,指基本原色素及其灰度的基本编码. [物理像素]:它是显示器 ...

随机推荐

  1. 安装 AWS CLI

    安装 macOS 使用 Homebrew: brew install awscli 手动安装: curl "https://awscli.amazonaws.com/AWSCLIV2.pkg ...

  2. 【Docker学习教程系列】8-如何将本地的Docker镜像发布到私服?

    通过前面的学习,我们已经知道,怎么将本地自己制作的镜像发布到阿里云远程镜像仓库中去.但是在实际工作开发中,一般,我们都是将公司的镜像发布到公司自己搭建的私服镜像仓库中,那么一个私服的镜像仓库怎么搭建? ...

  3. Angular 18+ 高级教程 – Component 组件 の Angular Component vs Shadow DOM (CSS Isolation & slot)

    前言 要掌握 Angular,最好先掌握原生. 全局 CSS 的问题,还有如何用原生 CSS 来管理全局 CSS,看这篇. 利用 Shadow Dom 来隔离 CSS 看这篇. CSS Global ...

  4. 反DDD模式之“复用”

    本文书接上回<反DDD模式之关系型数据库>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: 视频 ...

  5. k8s StorageClass 存储类

    目录 一.概述 1.StorageClass 对象定义 2.StorageClass YAML 示例 二.StorageClass 字段 1.provisioner(存储制备器) 1.1.内置制备器 ...

  6. 2021年第十一届数据技术嘉年华(DTC)资料分享

    数据技术嘉年华(DTC)是由由中国DBA联盟(ACDU)和墨天轮社区联合主办的数据技术领域的盛会,至今已成功举办11届,吸引和聚集了众多数据领域学术精英.领袖人物.技术专家.从业者和技术爱好者,于此进 ...

  7. 简述 JavaScript脚本的执行原理?

    js 是一种动态 . 弱类型 . 基于原型的语言 ,通过浏览器可以直接执行: 当浏览器遇到 <script></script>标记时 , 会执行标记之间的js 代码:然后js ...

  8. Vue-Router 是干什么的,原理是什么?

    传统的项目中,页面的切换和跳转使用的是超链接实现,但是目前的SPA 是基于组件和路由实现的,页面的切换和跳转是由路由机制完成,区别是更新了视图但不重新请求页面: 原理是把url 和组件之间建立映射关系 ...

  9. Kubernetes 持久化存储之 NFS 终极实战指南

    作者:运维有术星主 在 Kubernetes 生态系统中,持久化存储扮演着至关重要的角色,它是支撑应用稳定运行的基石.对于那些选择自建 Kubernetes 集群的运维架构师而言,选择合适的后端持久化 ...

  10. KubeSphere 社区征稿说明

    KubeSphere 社区一直致力于云原生技术的布道工作.通过组织线下 Meetup,线上的定期技术直播,KubeSphere 社区输出了颇多精彩的技术分享内容.此外,社区还产出了多篇优质的技术文章, ...