JavaScript- 3.2 JavaScript实现不同显示器尺寸的响应式主题和页面

news2025/7/20 7:17:17

本系列可作为前端学习系列的笔记,代码的运行环境是在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';
  }
  
  // 动态加载CSS
  const 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.最佳实践建议

  1. 移动优先:先设计移动端体验,再逐步增强大屏幕体验
  2. 使用CSS媒体查询为主:尽可能用CSS解决布局问题,JS用于复杂逻辑
  3. 防抖处理:resize事件频繁触发,务必使用防抖
  4. 考虑服务器端渲染:对于关键内容,可在服务器端根据设备类型返回不同HTML
  5. 测试实际设备:不要仅依赖浏览器缩放,在实际设备上测试

通过以上方法,你可以创建适应不同显示器尺寸的响应式主题和页面布局。

 二、代码实践

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实现不同显示器尺寸的响应式主题和页面 ,仅作为一份简单的笔记使用,大家根据注释理解

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

15.进程间通信(一)

一、进程间通信介绍 进程间通信目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另⼀个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xf…

AI 数据采集实战指南:基于 Bright Data 快速获取招标讯息

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

cursor使用mcp

问题说明 mcp就相当于给AI安装了工具包&#xff0c;它可以调用获取接口文档&#xff0c;网页&#xff0c;数据库等&#xff0c;基本上所有的mcp都是node程序&#xff0c;少数需要python环境 使用说明 使用mcp-mysql举例&#xff0c;下面是配置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&#xff0c;为评估和开发LLM Agent在 AI 研究任务中的表现提供了全新工具。作为首个基于 Gym 的机器学习任务环境&#xff0c;MLGym 支持强化学习等算法对代理的训练&#xff0c…

Web安全测试-文件上传绕过-DVWA

Web安全测试-文件上传绕过-DVWA 很多网站都有上传资源(图片或者文件)的功能&#xff0c;资源上传后一般会存储在服务器的一个文件夹里面&#xff0c;如果攻击者绕过了上传时候的文件类型验证&#xff0c;传了木马或者其他可执行的代码上去&#xff0c;那服务器就危险了。 我用…

现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践

通过 数学计算 CSS mask 复合遮罩 实现的真正几何内凹效果&#xff1a; 背景是一张图片&#xff0c;用来证明中间的凹陷是透明的。 完整代码&#xff1a; app.js import FormPage from "./pages/formPage"; import "./App.css"; const App () > {re…

【运维自动化-标准运维】如何实现在不同步骤间传递参数

当流程有多个步骤时&#xff0c;经常需要把前面某个个步骤处理的结果传递给下一个或后面的步骤使用&#xff08;输出作为输入&#xff09;&#xff0c;这就是跨步骤传参的场景&#xff0c;标准运维通过特有的标记符号"<SOPS_VAR>key:value</SOPS_VAR> "来…

[AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)

主流大模型特色对比表 模型核心优势适用场景局限性DeepSeek- 数学/代码能力卓越&#xff08;GSM8K准确率82.3%&#xff09;1- 开源生态完善&#xff08;支持医疗/金融领域&#xff09;7- 成本极低&#xff08;API价格仅为ChatGPT的2%-3%&#xff09;5科研辅助、代码开发、数据…

手机IP地址更换的影响与操作指南

在移动互联网时代&#xff0c;IP地址如同手机的“网络身份证”&#xff0c;其变更可能对上网体验、隐私安全及服务访问产生连锁反应。无论是为了绕过地域限制、保护隐私&#xff0c;还是解决网络冲突&#xff0c;了解IP更换的影响与正确操作方法都至关重要。本文将系统分析影响…

MongoDB 安全机制详解:全方位保障数据安全

在当今数据驱动的时代&#xff0c;数据库安全至关重要。MongoDB 作为一款流行的 NoSQL 数据库&#xff0c;广泛应用于 Web 应用、大数据分析和物联网等领域。然而&#xff0c;随着 MongoDB 的普及&#xff0c;其安全性也面临诸多挑战&#xff0c;如未授权访问、数据泄露和注入攻…

嵌入式学习之系统编程(六)线程

目录 一、线程 &#xff08;一&#xff09;线程概念 &#xff08;二&#xff09;特征 &#xff08;三&#xff09;优缺点 二、线程与进程的区别&#xff08;面问&#xff09; 三、多线程程序设计步骤 四、线程的创建&#xff08;相关函数&#xff09; 1、pthread_create…

大语言模型 提示词的少样本案例的 演示选择与排序新突破

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

【算法篇】二分查找算法:基础篇

题目链接&#xff1a; 34.在排序数组中查找元素的第一个和最后一个位置 题目描述&#xff1a; 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返…

重磅发布 | 复旦533页《大规模语言模型:从理论到实践(第2版)》(免费下载)

在人工智能浪潮席卷全球的今天&#xff0c;大语言模型正以前所未有的速度推动着科技进步和产业变革。从 ChatGPT 到各类行业应用&#xff0c;LLM 不仅重塑了人机交互的方式&#xff0c;更成为推动学术研究与产业创新的关键技术。 面对这一飞速演进的技术体系&#xff0c;如何系…

智能体赋能效率,企业知识库沉淀价值:UMI企业智脑的双轮驱动!

智能体企业知识库&#xff1a;UMI企业智脑的核心功能与价值 在人工智能技术飞速发展的今天&#xff0c;企业智能化转型已经成为不可逆转的趋势。作为企业级AI智能体开发平台的佼佼者&#xff0c;优秘智能推出的UMI企业智脑&#xff0c;以其强大的智能体开发能力和全面的企业知…

vue项目 build时@vue-office/docx报错

我在打包vue项目时&#xff0c; 开始用的npm run build和cnpm run build&#xff0c;总是提示 vue-office/docx 错误&#xff0c;尝试过用cnpm重新安装node_modules几次都没用。类似下面的提示一直有。 Error: [commonjs--resolver] Failed to resolve entry for package "…

#RabbitMQ# 消息队列入门

目录 一 MQ技术选型 1 运行rabbitmq 2 基本介绍 3 快速入门 1 交换机负责路由消息给队列 2 数据隔离 二 Java客户端 1 快速入门 2 WorkQueue 3 FanOut交换机 4 Direct交换机 5 Topic交换机 *6 声明队列交换机 1 在配置类当中声明 2 使用注解的方式指定 7 消息转…

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题 一、核心原理:分解提示与多空间投影 1. 提示分解:用低秩矩阵压缩长提示 传统问题: 长提示(如100个token)精度高但训练慢,短提示(如20个token)速度快但…

云原生安全核心:云安全责任共担模型(Shared Responsibility Model)详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 1. 基础概念 什么是云安全责任共担模型&#xff1f; 云安全责任共担模型&#xff08;Shared Responsibility Model, SRM&#xff09;是云服务提供商&…