JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。
HTML和CSS系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看!
点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励!
系列文章目录
JavaScript- 1.1 行内、内部、外部三种引用方式
JavaScript- 1.2 ECMA基本语法和控制流
JavaScript- 1.3 DOM对页面内容进行操作
JavaScript- 1.4 BOM对浏览器进行操作
JavaScript- 1.5 数据类型+变量+运算符
JavaScript- 1.6 基本控制流
JavaScript- 2.1 系统函数和自定义函数
JavaScript- 2.2 内置对象MATH
JavaScript- 2.3 内置对象String
JavaScript- 2.4 内置对象Date
JavaScript- 2.5 内置对象ARRAY
JavaScript- 2.6 数组应用
JavaScript- 2.7 二维数组
JavaScript- 3.1 定时器函数 window.settimeout & window.settinterval
JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面
JavaScript- 4.1 DOM-document对象
目录
系列文章目录
前言
一、JavaScript实现不同显示器尺寸的响应式主题和页面
1. 使用CSS媒体查询(推荐基础方案)
2. 纯JavaScript实现
方法一:使用window.matchMedia()
方法二:使用ResizeObserver(现代浏览器)
3. 动态加载不同资源
4. 结合CSS变量和JavaScript
5. 使用CSS框架的响应式工具
6.最佳实践建议
二、代码实践
1、获取屏幕大小
2、屏幕的高度和宽度不同时,显示不同的页面
3、屏幕的高度和宽度不同时,打印不同的内容
总结
前言
小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!
一、JavaScript实现不同显示器尺寸的响应式主题和页面
在JavaScript中,可以通过检测视口(viewport)大小来实现针对不同显示器尺寸应用不同的主题和页面布局。以下是几种实现方法:
1. 使用CSS媒体查询(推荐基础方案)
虽然这不是纯JavaScript方案,但通常是首选方法:
css
/* 默认主题 - 移动设备 */
:root {--primary-color: #4285f4;--background: #ffffff;--text-color: #333333;
}/* 中等屏幕 - 平板 */
@media (min-width: 768px) {:root {--primary-color: #34a853;--background: #f8f9fa;}
}/* 大屏幕 - 桌面 */
@media (min-width: 1024px) {:root {--primary-color: #ea4335;--background: #ffffff;}
}
2. 纯JavaScript实现
方法一:使用window.matchMedia()
javascript
function applyThemeBasedOnScreenSize() {const screenWidth = window.innerWidth;const body = document.body;// 移除所有现有主题类body.classList.remove('theme-mobile', 'theme-tablet', 'theme-desktop');if (screenWidth < 768) {body.classList.add('theme-mobile');// 可以在这里加载移动端特定的JS逻辑} else if (screenWidth >= 768 && screenWidth < 1024) {body.classList.add('theme-tablet');// 加载平板特定的JS逻辑} else {body.classList.add('theme-desktop');// 加载桌面特定的JS逻辑}
}// 初始应用
applyThemeBasedOnScreenSize();// 监听窗口大小变化
window.addEventListener('resize', applyThemeBasedOnScreenSize);
方法二:使用ResizeObserver(现代浏览器)
javascript
const observer = new ResizeObserver(entries => {for (let entry of entries) {const width = entry.contentRect.width;applyThemeBasedOnScreenSize(width);}
});observer.observe(document.body);function applyThemeBasedOnScreenSize(width) {// 实现与上面类似的逻辑
}
3. 动态加载不同资源
对于需要加载不同CSS或JS文件的情况:
javascript
function loadThemeResources() {const screenWidth = window.innerWidth;// 移除现有主题链接document.querySelectorAll('link[data-theme]').forEach(link => link.remove());let themeFile;if (screenWidth < 768) {themeFile = 'mobile-theme.css';} else if (screenWidth >= 768 && screenWidth < 1024) {themeFile = 'tablet-theme.css';} else {themeFile = 'desktop-theme.css';}// 动态加载CSSconst link = document.createElement('link');link.rel = 'stylesheet';link.href = themeFile;link.setAttribute('data-theme', 'true');document.head.appendChild(link);
}// 初始加载
loadThemeResources();// 监听窗口变化
window.addEventListener('resize', debounce(loadThemeResources, 200));// 防抖函数,避免频繁重绘
function debounce(func, wait) {let timeout;return function() {clearTimeout(timeout);timeout = setTimeout(func, wait);};
}
4. 结合CSS变量和JavaScript
更灵活的方案是使用CSS变量配合JavaScript:
javascript
// 定义不同屏幕尺寸的主题配置
const themes = {mobile: {primary: '#4285f4',background: '#ffffff',text: '#333333',layout: 'vertical'},tablet: {primary: '#34a853',background: '#f8f9fa',text: '#222222',layout: 'grid'},desktop: {primary: '#ea4335',background: '#ffffff',text: '#111111',layout: 'horizontal'}
};function applyTheme() {const screenWidth = window.innerWidth;let theme;if (screenWidth < 768) {theme = themes.mobile;} else if (screenWidth >= 768 && screenWidth < 1024) {theme = themes.tablet;} else {theme = themes.desktop;}// 应用CSS变量const root = document.documentElement;Object.keys(theme).forEach(key => {root.style.setProperty(`--${key}`, theme[key]);});// 根据布局调整页面结构applyLayout(theme.layout);
}function applyLayout(layout) {// 实现布局调整逻辑console.log(`Applying ${layout} layout`);
}// 初始应用和监听
applyTheme();
window.addEventListener('resize', debounce(applyTheme, 200));
5. 使用CSS框架的响应式工具
如果你使用Bootstrap等框架,可以利用其内置的响应式工具:
javascript
// 使用Bootstrap的断点检测
function isMobile() {return window.matchMedia('(max-width: 767px)').matches;
}function isTablet() {return window.matchMedia('(min-width: 768px) and (max-width: 1023px)').matches;
}function isDesktop() {return window.matchMedia('(min-width: 1024px)').matches;
}// 根据设备类型执行不同逻辑
if (isMobile()) {// 移动端逻辑
} else if (isTablet()) {// 平板逻辑
} else if (isDesktop()) {// 桌面逻辑
}
6.最佳实践建议
- 移动优先:先设计移动端体验,再逐步增强大屏幕体验
- 使用CSS媒体查询为主:尽可能用CSS解决布局问题,JS用于复杂逻辑
- 防抖处理:resize事件频繁触发,务必使用防抖
- 考虑服务器端渲染:对于关键内容,可在服务器端根据设备类型返回不同HTML
- 测试实际设备:不要仅依赖浏览器缩放,在实际设备上测试
通过以上方法,你可以创建适应不同显示器尺寸的响应式主题和页面布局。
二、代码实践
1、获取屏幕大小
HTML
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>BOM--navigator\screen</title></head><body><script type="text/javascript">console.log(navigator.appName);console.log(navigator.appCodeName);console.log(screen.width);console.log(screen.height);console.log(screen.availHeight);</script></body>
</html>
代码运行如下:
2、屏幕的高度和宽度不同时,显示不同的页面
代码如下:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>不同大小的显示器不同主题</title></head><body><script type="text/javascript">var h,w;h=screen.availHeight;w=screen.availWidth;// test1 当屏幕的高度和宽度不同时,显示不同的页面if(h>800 && w>1200){console.log(location.href);location.href="js3-4.html";}else{location.href="js3-5.html";}//test2 当屏幕的高度和宽度不同时,打印不同的内容// if(h > 800 && w > 1200) {// console.log("高度大于800且宽度大于1200");// // } else {// console.log("高度小于等于800或宽度小于等于1200");// // }</script></body>
</html>
代码运行如下:
可以看到高度小于800,且宽度也小于1200,显示 js3-5.html
这里如果把两个条件调换,可以看到变成了js3-4.html页面
3、屏幕的高度和宽度不同时,打印不同的内容
代码如下:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>不同大小的显示器不同主题</title></head><body><script type="text/javascript">var h,w;h=screen.availHeight;w=screen.availWidth;// test1 当屏幕的高度和宽度不同时,显示不同的页面// if(h>800 && w>1200){// console.log(location.href);// location.href="js3-5.html";// // location.href="js3-4.html";// }// else{// // location.href="js3-5.html";// location.href="js3-4.html";// }// test2 当屏幕的高度和宽度不同时,打印不同的内容if(h > 800 && w > 1200) {console.log("高度大于800且宽度大于1200");} else {console.log("高度小于等于800或宽度小于等于1200");}</script></body>
</html>
代码运行如下:
总结
以上就是今天要讲的内容,本文简单记录了JavaScript实现不同显示器尺寸的响应式主题和页面 ,仅作为一份简单的笔记使用,大家根据注释理解
相关文章:

JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML和CSS系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看ÿ…...

15.进程间通信(一)
一、进程间通信介绍 进程间通信目的: 数据传输:一个进程需要将它的数据发送给另⼀个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们…...

AI 数据采集实战指南:基于 Bright Data 快速获取招标讯息
AI 数据采集实战指南:基于Bright Data快速获取招标讯息 在招标行业中,快速、准确地获取招标公告、项目详情、投标截止日期和其他关键招标信息,是投标企业提高竞标成功率的核心竞争力。然而,招标信息往往分散在不同的平台和网页&a…...

cursor使用mcp
问题说明 mcp就相当于给AI安装了工具包,它可以调用获取接口文档,网页,数据库等,基本上所有的mcp都是node程序,少数需要python环境 使用说明 使用mcp-mysql举例,下面是配置json "mysql": {&qu…...

小白成长之路-计算机网络(四)
文章目录 前言一、网络连接查看1.netstat2.ss3.bond绑定3.1准备好这三个文件3.2添加bond配置文件3.3关闭网络图形化服务3.4重启 4.Linux下的抓包工具Wireshark 5、web压力测试工具6、路由追踪命令 二、[练习题](https://blog.csdn.net/m0_70730767/article/details/148262716?…...

【Agent】MLGym: A New Framework and Benchmark for Advancing AI Research Agents
arxiv: https://arxiv.org/pdf/2502.14499 简介 Meta 推出的 MLGym 框架及配套基准 MLGym-Bench,为评估和开发LLM Agent在 AI 研究任务中的表现提供了全新工具。作为首个基于 Gym 的机器学习任务环境,MLGym 支持强化学习等算法对代理的训练,…...
5.27 打卡
知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 作业:了解下cifar数据集,尝试获取其中一张图片 import torch import torchvision from torchvision im…...

Web安全测试-文件上传绕过-DVWA
Web安全测试-文件上传绕过-DVWA 很多网站都有上传资源(图片或者文件)的功能,资源上传后一般会存储在服务器的一个文件夹里面,如果攻击者绕过了上传时候的文件类型验证,传了木马或者其他可执行的代码上去,那服务器就危险了。 我用…...
织梦dedecms arclist最新发布日期显示红色
织梦DedeCMS在当天发表的文章显示红色、添加new图标的问题,织梦模板网在以前的文章中已经发表过类似的文章,今天我们再来回顾和温习一下,主要增加了真正的当天显示红色,而不是24小时内的文章显示红色。 真正的“当天”显示红色&a…...

现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践
通过 数学计算 CSS mask 复合遮罩 实现的真正几何内凹效果: 背景是一张图片,用来证明中间的凹陷是透明的。 完整代码: app.js import FormPage from "./pages/formPage"; import "./App.css"; const App () > {re…...

【运维自动化-标准运维】如何实现在不同步骤间传递参数
当流程有多个步骤时,经常需要把前面某个个步骤处理的结果传递给下一个或后面的步骤使用(输出作为输入),这就是跨步骤传参的场景,标准运维通过特有的标记符号"<SOPS_VAR>key:value</SOPS_VAR> "来…...
STM32 UART通信实战指南:从原理到项目落地
STM32串口通信实战指南:从零开始手把手教你 前言:为什么串口这么重要? 在嵌入式开发中,串口就像设备的"嘴巴"和"耳朵"。无论是给单片机下达指令、读取传感器数据,还是让两个模块"对话"…...
基于stm32的 永磁同步电机二电平驱动控制系统设计
基于STM32的永磁同步电机(PMSM)二电平驱动控制系统设计方案: 系统架构 永磁同步电机二电平驱动控制系统主要由以下部分组成: STM32微控制器:作为控制核心,生成PWM信号并处理反馈数据。功率驱动电路:使用IGBT或MOSFET构成三相桥式逆变器,实现二电平驱动。电流采样电路:…...

[AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)
主流大模型特色对比表 模型核心优势适用场景局限性DeepSeek- 数学/代码能力卓越(GSM8K准确率82.3%)1- 开源生态完善(支持医疗/金融领域)7- 成本极低(API价格仅为ChatGPT的2%-3%)5科研辅助、代码开发、数据…...

手机IP地址更换的影响与操作指南
在移动互联网时代,IP地址如同手机的“网络身份证”,其变更可能对上网体验、隐私安全及服务访问产生连锁反应。无论是为了绕过地域限制、保护隐私,还是解决网络冲突,了解IP更换的影响与正确操作方法都至关重要。本文将系统分析影响…...
iOS 响应者链详解
响应者链是 iOS 中处理用户事件(如触摸、摇动、按键)的核心机制,由一系列 UIResponder 对象构成,决定了事件传递的路径和优先级。以下是其核心机制与使用场景的详细解析: 一、响应者链的组成 1. 响应者对象࿰…...
Flink Table API 编程入门实践
Flink Table API 编程入门实践 前言 Apache Flink 是目前大数据实时计算领域的明星产品,Flink Table API 则为开发者提供了声明式、类似 SQL 的数据处理能力,兼具 SQL 的易用性与编程 API 的灵活性。本文将带你快速了解 Flink Table API 的基本用法&am…...

MongoDB 安全机制详解:全方位保障数据安全
在当今数据驱动的时代,数据库安全至关重要。MongoDB 作为一款流行的 NoSQL 数据库,广泛应用于 Web 应用、大数据分析和物联网等领域。然而,随着 MongoDB 的普及,其安全性也面临诸多挑战,如未授权访问、数据泄露和注入攻…...
Teensy LC 一款由 PJRC 公司开发的高性能 32 位微控制器开发板
Teensy LC 是一款由 PJRC 公司开发的高性能 32 位微控制器开发板,具有以下特点: 硬件配置 核心处理器 :采用 MKL26Z64VFT4 ARM Cortex-M0 处理器,运行频率为 48MHz,相较于传统的 8 位 AVR 处理器,速度更快…...
MicroPython 开发ESP32应用教程 之 线程介绍及实例分析
MicroPython ESP32 线程(Thread)基础 MicroPython 在 ESP32 上支持线程(Thread)功能,通过 _thread 模块实现。线程允许程序并发执行多个任务,适合处理需要同时运行的场景,例如传感器数据采集和…...
鸿蒙5开发宝藏案例分享---一多断点开发实践
🌟【鸿蒙开发实战进阶】六大核心案例深度拆解,带你玩转多端适配! 📐 案例4:动态网格布局(电商商品列表) 应用场景:手机/平板商品展示差异 痛点分析:手机单列→平板多列&…...

嵌入式学习之系统编程(六)线程
目录 一、线程 (一)线程概念 (二)特征 (三)优缺点 二、线程与进程的区别(面问) 三、多线程程序设计步骤 四、线程的创建(相关函数) 1、pthread_create…...
分布式常见概念
分布式常见概念 反向代理正向代理 vs 反向代理(对比理解名称)正向代理示意(“我去帮你拿数据”)反向代理示意(“你找我,我替你联系内部服务器”)为什么叫“反向”? API网关一、为什么…...
数据库的事务(Transaction)
在数据库中,事务(Transaction) 是保证数据操作一致性和完整性的核心机制。它通过一组原子性的操作单元,确保所有操作要么全部成功(提交),要么全部失败(回滚)。以下是数据…...

大语言模型 提示词的少样本案例的 演示选择与排序新突破
提示词中 演示示例的选择与排序 这篇论文《Rapid Selection and Ordering of In-Context Demonstrations via Prompt Embedding Clustering》聚焦于提升大语言模型(LLMs)在自适应上下文学习(ICL)场景中演示示例的选择与排序效率 一、论文要解决的问题 在上下文学习(ICL)…...

【算法篇】二分查找算法:基础篇
题目链接: 34.在排序数组中查找元素的第一个和最后一个位置 题目描述: 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返…...
Qtc++开发遇到的问题-按钮点击不管用?
我在设计自己的控件的时候,遇到了按钮点击不管用的问题,而且是有的自定义控件不管用,有的管用,有的一开始管用,多点几次就不管用了, 它是这样的,一个lineEdit和位于两侧的按钮,分别…...

重磅发布 | 复旦533页《大规模语言模型:从理论到实践(第2版)》(免费下载)
在人工智能浪潮席卷全球的今天,大语言模型正以前所未有的速度推动着科技进步和产业变革。从 ChatGPT 到各类行业应用,LLM 不仅重塑了人机交互的方式,更成为推动学术研究与产业创新的关键技术。 面对这一飞速演进的技术体系,如何系…...

智能体赋能效率,企业知识库沉淀价值:UMI企业智脑的双轮驱动!
智能体企业知识库:UMI企业智脑的核心功能与价值 在人工智能技术飞速发展的今天,企业智能化转型已经成为不可逆转的趋势。作为企业级AI智能体开发平台的佼佼者,优秘智能推出的UMI企业智脑,以其强大的智能体开发能力和全面的企业知…...
STM32CubeMX,arm-none-eabi-gcc简单试用
在windows下,为stm32系列单片机编程,keil有了免费的试用版,有很多开发板示例,给学习单片机编程带来很大的方便。 STM32CubeMX提供了stm32单片机的功能设置,在输出方式上给出了几种方式,有mdk(k…...