当前位置: 首页 > news >正文

CSS系列(12)-- 响应式设计详解

前端技术探索系列:CSS 响应式设计详解 📱

致读者:掌握响应式设计的艺术 👋

前端开发者们,

今天我们将深入探讨 CSS 响应式设计,学习如何创建适应各种设备的网页布局。

响应式基础 🚀

视口设置

<!-- 视口元标签 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

媒体查询基础

/* 基础媒体查询 */
/* 移动优先 */
.element {/* 移动端基础样式 */width: 100%;padding: 15px;
}/* 平板 */
@media (min-width: 768px) {.element {width: 50%;padding: 20px;}
}/* 桌面 */
@media (min-width: 1024px) {.element {width: 33.333%;padding: 30px;}
}/* 复杂媒体查询 */
@media (min-width: 768px) and (max-width: 1023px) and (orientation: landscape) {.element {/* 特定设备和方向的样式 */}
}

响应式单位

/* 响应式单位使用 */
.responsive-text {/* 相对于视口宽度 */font-size: 5vw;/* 相对于视口高度 */height: 50vh;/* 相对于视口最小尺寸 */padding: 2vmin;/* 相对于视口最大尺寸 */margin: 2vmax;/* rem 单位 */font-size: 1.2rem;
}/* 响应式根字体大小 */
html {font-size: 16px;
}@media (min-width: 768px) {html {font-size: calc(16px + 0.5vw);}
}

响应式布局策略 🎯

弹性布局

/* Flexbox 响应式布局 */
.flex-container {display: flex;flex-wrap: wrap;gap: 20px;
}.flex-item {flex: 1 1 300px; /* 增长 收缩 基准值 */
}/* 响应式导航 */
.nav {display: flex;flex-direction: column;
}@media (min-width: 768px) {.nav {flex-direction: row;justify-content: space-between;}
}

网格布局

/* Grid 响应式布局 */
.grid-container {display: grid;grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));gap: 20px;
}/* 响应式区域布局 */
.layout {display: grid;grid-template-areas:"header""nav""main""sidebar""footer";
}@media (min-width: 768px) {.layout {grid-template-areas:"header header""nav nav""main sidebar""footer footer";grid-template-columns: 1fr 300px;}
}

响应式图片

/* 响应式图片 */
.responsive-image {max-width: 100%;height: auto;
}/* 艺术指导 */
.art-directed-img {content: url('mobile.jpg');
}@media (min-width: 768px) {.art-directed-img {content: url('tablet.jpg');}
}@media (min-width: 1024px) {.art-directed-img {content: url('desktop.jpg');}
}

实践项目:响应式框架 🛠️

class ResponsiveFramework {constructor(options = {}) {this.options = {breakpoints: {sm: 576,md: 768,lg: 992,xl: 1200,xxl: 1400},container: {sm: 540,md: 720,lg: 960,xl: 1140,xxl: 1320},columns: 12,gutters: 30,...options};this.init();}init() {this.createStyles();this.setupResizeHandler();this.setupOrientationHandler();}createStyles() {const style = document.createElement('style');style.textContent = this.generateStyles();document.head.appendChild(style);}generateStyles() {return `${this.generateGridSystem()}${this.generateUtilities()}${this.generateResponsiveHelpers()}`;}generateGridSystem() {let styles = `.container {width: 100%;margin-right: auto;margin-left: auto;padding-right: ${this.options.gutters / 2}px;padding-left: ${this.options.gutters / 2}px;}`;// 容器响应式宽度Object.entries(this.options.container).forEach(([breakpoint, width]) => {styles += `@media (min-width: ${this.options.breakpoints[breakpoint]}px) {.container {max-width: ${width}px;}}`;});// 网格系统styles += `.row {display: flex;flex-wrap: wrap;margin-right: -${this.options.gutters / 2}px;margin-left: -${this.options.gutters / 2}px;}[class^="col-"] {position: relative;width: 100%;padding-right: ${this.options.gutters / 2}px;padding-left: ${this.options.gutters / 2}px;}`;// 列宽度类for (let i = 1; i <= this.options.columns; i++) {styles += `.col-${i} {flex: 0 0 ${(i / this.options.columns) * 100}%;max-width: ${(i / this.options.columns) * 100}%;}`;}return styles;}generateUtilities() {return `.d-none { display: none !important; }.d-block { display: block !important; }.d-flex { display: flex !important; }.d-grid { display: grid !important; }.text-center { text-align: center !important; }.text-left { text-align: left !important; }.text-right { text-align: right !important; }.flex-column { flex-direction: column !important; }.flex-row { flex-direction: row !important; }.flex-wrap { flex-wrap: wrap !important; }.flex-nowrap { flex-wrap: nowrap !important; }`;}generateResponsiveHelpers() {let styles = '';Object.entries(this.options.breakpoints).forEach(([name, width]) => {styles += `@media (min-width: ${width}px) {.d-${name}-none { display: none !important; }.d-${name}-block { display: block !important; }.d-${name}-flex { display: flex !important; }.d-${name}-grid { display: grid !important; }.text-${name}-center { text-align: center !important; }.text-${name}-left { text-align: left !important; }.text-${name}-right { text-align: right !important; }}`;});return styles;}setupResizeHandler() {let timeout;window.addEventListener('resize', () => {clearTimeout(timeout);timeout = setTimeout(() => {this.handleResize();}, 250);});}handleResize() {const width = window.innerWidth;document.documentElement.style.setProperty('--viewport-width', `${width}px`);}setupOrientationHandler() {window.addEventListener('orientationchange', () => {this.handleOrientationChange();});}handleOrientationChange() {// 处理方向变化document.documentElement.classList.toggle('landscape', window.orientation === 90 || window.orientation === -90);}
}

最佳实践建议 💡

  1. 设计策略

    • 采用移动优先
    • 设置合理断点
    • 使用相对单位
    • 保持简单性
  2. 性能优化

    • 优化媒体资源
    • 控制 HTTP 请求
    • 使用条件加载
    • 优化渲染性能
  3. 可访问性

    • 保持内容可读
    • 适当的触摸目标
    • 键盘导航支持
    • 屏幕阅读器兼容

写在最后 🌟

响应式设计是现代网页开发的基础技能,掌握这些技术可以帮助我们创建更好的用户体验。

进一步学习资源 📚

  • 响应式设计模式
  • 移动优先策略
  • 性能优化指南
  • 响应式框架研究

如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

相关文章:

CSS系列(12)-- 响应式设计详解

前端技术探索系列&#xff1a;CSS 响应式设计详解 &#x1f4f1; 致读者&#xff1a;掌握响应式设计的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS 响应式设计&#xff0c;学习如何创建适应各种设备的网页布局。 响应式基础 &#x1f680; 视口设…...

filecoin boost GraphQL API 查询

查询示例 查询失败交易 curl -X POST \ -H "Content-Type: application/json" \ -d {"query":"query { deals(limit: 10, query: \"failed to get size of imported\") { deals { ID CreatedAt Message } } }"} \ http://localhost:…...

SAS - Subtractive Port

在SAS&#xff08;串行连接SCSI&#xff0c;Serial Attached SCSI&#xff09;协议中&#xff0c;subtractive port 是一种特殊类型的端口&#xff0c;主要用于设备间的路由功能。它的作用是在路径选择过程中充当默认路径&#xff0c;以处理未明确指定路径的请求。以下是它的定…...

TCP客户端模拟链接websocket服务端

因一些特殊原因研究了下TCP模拟链接websocket。原理上可以连接但具体怎么连接怎么操作就不知道了&#xff0c;需要研究下&#xff0c;以下是个人研究的方案。 用线上和本地地址来做例子&#xff1a; 线上wss地址&#xff1a;wss://server.cs.com/cs/vido/1 本地地址ws://127…...

TypeScript 的崛起:全面解析与深度洞察

一、背景与起源 &#xff08;一&#xff09;JavaScript 的局限性 类型系统缺失 难以在编码阶段发现类型相关错误&#xff0c;导致运行时错误频发。例如&#xff0c;将字符串误当作数字进行数学运算&#xff0c;可能在运行时才暴露问题。函数参数类型不明确&#xff0c;容易传入…...

c#笔记2024

Ctrl r e自动添加get和set CompositeCurve3d 复合曲线 List<Entity> entS listline.Cast<Entity>().ToList();//list类型强转 前面拼上\u0003&#xff0c;就可以实现&#xff0c;不管有没有命令都能打断当前命令的效果 取消其他命令&#xff1a;Z.doc.SendStri…...

Hadoop一课一得

Hadoop作为大数据时代的奠基技术之一&#xff0c;自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop&#xff0c;从其起源、核心架构、关键组件&#xff0c;到典型应用场景&#xff0c;并结合代码示例和图示&#xff0c;帮助您更好地掌握Hadoop的实战…...

AI生成图表化:深入探索Mermaid

引言 在使用生成式AI时&#xff0c;只要你提出让AI帮你生成mermaid图&#xff0c;AI的生成就会出现丰富的图形&#xff01; 在现代文档编写中&#xff0c;图表的使用不仅能增强文档的可读性&#xff0c;还能更直观地表达复杂的概念和流程。Mermaid 作为一款开源的图表绘制工具…...

25.DDD数量关系

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗&#xff1f;领域对象之…...

Linux应用开发————线程池

线程池 定义&#xff1a;简单来说&#xff0c;就是存放多个线程的池子。当创建线程池时&#xff0c;就给池中存放一些线程&#xff0c;如果有任务要执行&#xff0c;就从池中取出一个线程执行任务&#xff0c;依次类推&#xff1b;当所有线程都在执行任务时&#xff0c;其他任务…...

Spring Boot 集成阿里云OSS 完成文件上传下载

前言&#xff1a; 文件上传下载在项目开发中是一个非常常见的业务场景&#xff0c;在云服务上还没有兴起的时候&#xff0c;一般来说都会把文件单独存放到文件服务器上&#xff0c;随着云服务的兴起&#xff0c;各类云服务厂商都提供了 OSS 服务&#xff0c;本篇我们分享 Spri…...

使用ERA5数据绘制风向玫瑰图的简易流程

使用ERA5数据绘制风向玫瑰图的简易流程 今天需要做一个2017年-2023年的平均风向的统计,做一个风向玫瑰图&#xff0c;想到的还是高分辨率的ERA5land的数据&#xff08;0.1分辨率&#xff0c;逐小时分辨率&#xff0c;1950年至今&#xff09;。 风向&#xff0c;我分为了16个&…...

测试脚本并发多进程:pytest-xdist用法

参考&#xff1a;https://www.cnblogs.com/poloyy/p/12694861.html pytest-xdist详解&#xff1a; https://www.cnblogs.com/poloyy/p/14708825.html 总 https://www.cnblogs.com/poloyy/category/1690628.html...

数据可视化的Python实现

一、GDELT介绍 GDELT ( www.gdeltproject.org ) 每时每刻监控着每个国家的几乎每个角落的 100 多种语言的新闻媒体 -- 印刷的、广播的和web 形式的&#xff0c;识别人员、位置、组织、数量、主题、数据源、情绪、报价、图片和每秒都在推动全球社会的事件&#xff0c;GDELT 为全…...

【Linux系列】Linux 系统配置文件详解:`/etc/profile`、`~/.bashrc` 和 `~/.bash_profile`

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

uni-app实现小程序、H5图片轮播预览、双指缩放、双击放大、单击还原、滑动切换功能

前言 这次的标题有点长&#xff0c;主要是想要表述的功能点有点多&#xff1b; 简单做一下需求描述 产品要求在商品详情页的头部轮播图部分&#xff0c;可以单击预览大图&#xff0c;同时在预览界面可以双指放大缩小图片并且可以移动查看图片&#xff0c;双击放大&#xff0…...

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程&#xff0c;展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹&#xff0c;而另一版本是角色会完全停下来。这种方式感觉不太自然&#xff0c;因为在游戏中&#xff0c;…...

electron常用方法

一&#xff0c;,electron设置去除顶部导航栏和menu 1&#xff0c;electron项目 在创建BrowserWindow实例的main.js页面添加frame&#xff1a;false属性 2&#xff0c;electron-vue项目 在src/main/index.js文件下找到创建窗口的方法&#xff08;createWindow&#xff09;&…...

【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…...

meta llama 大模型一个基础语言模型的集合

LLaMA 是一个基础语言模型的集合&#xff0c;参数范围从 7B 到 65B。我们在数万亿个 Token 上训练我们的模型&#xff0c;并表明可以专门使用公开可用的数据集来训练最先进的模型&#xff0c;而无需诉诸专有的和无法访问的数据集。特别是&#xff0c;LLaMA-13B 在大多数基准测试…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...