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

[CSS3]vw/vh移动适配

vw/vh

目标: 能够使用vw单位设置网页元素的尺寸

  1. 相对单位
  2. 相对视口的尺寸计算结果.
  3. vw全称viewport width;
  • 1vw=1/100视口宽度
  1. vh全称viewport height;
  • 1vh=1/100视口高度

体验vw和vh单位

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>体验vw和vh</title><style>* {margin: 0;padding: 0;}/* 1. vw = 1/100视口宽度 *//* 375 / 100 * 50 = 187.5 *//* 375 / 100 * 30 = 112.5 */.box {width: 50vw;height: 30vw;background-color: pink;}/* 2. vh = 1/100视口高度 *//* 667 / 100 * 50 = 333.5 *//* 667 / 100 * 30 = 200.1 */.box {width: 50vh;height: 30vh;background-color: pink;}</style>
</head>
<body><div class="box"></div>
</body>
</html>

  • vw/vh方案的优势就是不再依赖媒体查询
  • 这里盒子的尺寸和计算值有误差是因我的屏幕分辨率是2k, 逻辑分辨率不同

vw单位换算: 设计稿中的单位一定是px单位, 写代码要写vw单位, 怎么换算呢?

  1. 确定设计稿对应的vw尺寸(1/100视口宽度)
  • 查看设计稿宽度 → 确定参考设备宽度 (视口宽度) → 确定ww尺寸 (1/100)视口宽度
  1. vw单位的尺寸 = px单位数值 / (1/100 视口宽度)
  2. vh单位的尺寸 = px单位数值 / (1/100 视口高度)
  3. 设计稿如下图, 设计稿宽度是375px, 完成尺寸换算

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>vw适配</title><link rel="stylesheet" href="./demo.css">
</head>
<body><div class="box"></div><div class="box2"></div>
</body>
</html>
// out: ./
* {margin: 0;padding: 0;
}// vw单位的尺寸 = px单位数值 / (1/100 视口宽度)
.box {// vwwidth: (68 / 3.75vw);height: (29 / 3.75vw);background-color: pink;
}// vh单位的尺寸 = px单位数值 / (1/100 视口高度)
.box2 {// vhwidth: (68 / 6.67vh);height: (29 / 6.67vh);background-color: green;
}

  1. 使用vw和vh两种单位设置盒子尺寸, 最终盒子的大小是一致的
  2. 所以开发中使用vw和vh都行
  3. 全面屏手机的高度变大, 所以vw和vh单位不能混用, 元素会变形

仿b站首页

准备工作

素材获取: 图片直接右键另存为, 字体图标的下载如下

  1. 检查元素, 找到iconfont类名, 点击iconfont样式表

  1. 复制字体URL到浏览器地址栏, 回车就能下载字体文件

  1. 新建iconfont.css文件, 把样式表的代码复制下来

  1. 在原站中复制图标类名使用就行了

新建index.html文件, 新建index.less文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>B站</title><link rel="stylesheet" href="./fonts/iconfont.css"><link rel="stylesheet" href="./css/index.css">
</head>
<body>
</body>
</html>
@import 'base';

头部区域

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>B站</title><link rel="stylesheet" href="./fonts/iconfont.css"><link rel="stylesheet" href="./css/index.css">
</head>
<body><!-- 1. 头部固定 --><header><div class="top"><div class="left"><a href="#"><i class="iconfont Navbar_logo"></i></a></div><div class="right"><a href="#"><i class="iconfont ic_search_tab"></i></a><a href="#" class="login"><img src="./images/login.png" alt=""></a><a href="#" class="download"><img src="./images/download.png" alt=""></a></div></div><div class="bottom"><div class="tab"><ul><li><a href="#" class="current">首页</a></li><li><a href="#">动画</a></li><li><a href="#">番剧</a></li><li><a href="#">国创</a></li><li><a href="#">音乐</a></li></ul></div><div class="more"><a href="#"><i class="iconfont general_pulldown_s"></i></a></div></div></header><!-- 2. 视频区域 --><!-- 3. 按钮固定 -->
</body>
</html>
@import 'base';@vw: 3.75vw;
@color: #fb7299;// 头部 固定
header {position: fixed;left: 0;top: 0;z-index: 1;width: 100%;// width: 100vw;height: (84 / @vw);background-color: #fff;// top.top {display: flex;justify-content: space-between;align-items: center;height: (44 / @vw);padding-left: (18 / @vw);padding-right: (12 / @vw);.left {.iconfont {font-size: (28 / @vw);color: @color;}}.right {display: flex;.iconfont {font-size: (22 / @vw);color: #ccc;}.login {width: (24 / @vw);height: (24 / @vw);margin-left: (24 / @vw);}.download {width: (72 / @vw);height: (24 / @vw);margin-left: (24 / @vw);}}}// bottom.bottom {display: flex;justify-content: space-between;height: (40 / @vw);border-bottom: 1px solid #eee;.more {a {display: block;width: (40 / @vw);height: (40 / @vw);// background-color: pink;text-align: center;line-height: (40 / @vw);// font-size: (22 / @vw);color: #ccc;.iconfont {font-size: (22 / @vw);}}}.tab {ul {display: flex;li {padding: 0 (16 / @vw);a {display: block;height: (38 / @vw);line-height: (38 / @vw);font-size: (14 / @vw);&.current {color: @color;border-bottom: 2px solid @color;}}}}}}
}

视频区域

视频区域布局分析:

  1. 父级设置左右padding
  2. 每个视频盒子宽度为50%左右padding(拉开内容的距离)
  3. 完成两列盒子三距等宽的视觉效果

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>B站</title><link rel="stylesheet" href="./fonts/iconfont.css"><link rel="stylesheet" href="./css/index.css">
</head>
<body><!-- 1. 头部固定 --><!-- 2. 视频 --><!-- 视频区域布局 --><section class="video_content"><!-- 一份视频, 共计有5个菜单, 应该有5份视频的div --><div class="video_list"><a href="#"><div class="pic"><img src="./images/1.jpg" alt=""><div class="count"><p><i class="iconfont icon_shipin_bofangshu"></i><span>132</span>万</p><p><i class="iconfont icon_shipin_danmushu"></i><span>2.4</span>万</p></div></div><div class="txt ellipsis-2">你活着补刀就是对我最大的侮辱,韩服最强王者组单杀集锦#19</div></a><a href="#"><div class="pic"><img src="./images/1.jpg" alt=""><div class="count"><p><i class="iconfont icon_shipin_bofangshu"></i><span>132</span>万</p><p><i class="iconfont icon_shipin_danmushu"></i><span>2.4</span>万</p></div></div><div class="txt ellipsis-2">你活着补刀就是对我最大的侮辱,韩服最强王者组单杀集锦#19</div></a></div></section><!-- 3. 按钮固定 -->
</body>
</html>
@import 'base';@vw: 3.75vw;
@color: #fb7299;// 视频
.video_content {padding: (84 / @vw) (5 / @vw) 0;.video_list {display: flex;// 弹性盒子换行flex-wrap: wrap;a {width: 50%;padding: (8 / @vw) (5 / @vw);// background-color: pink;font-size: (12 / @vw);.txt {margin-top: (5 / @vw);}.pic {position: relative;.count {position: absolute;left: 0;bottom: 0;display: flex;justify-content: space-between;width: 100%;padding: (8 / @vw);background-image: linear-gradient(to top, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));color: #fff;i {vertical-align: middle;}}}}}
}

http://www.lryc.cn/news/2396118.html

相关文章:

  • Python进阶与常用库:探索高效编程的奥秘
  • nt!MiDispatchFault函数分析之nt!MiCompleteProtoPteFault函数的作用
  • YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制解析2025.5.29
  • 打卡day42
  • 小白的进阶之路系列之八----人工智能从初步到精通pytorch综合运用的讲解第一部分
  • 724.寻找数组的中心下标前缀和
  • 软考-系统架构设计师-第十六章 层次式架构设计理论与实践
  • 甘特图 dhtmlxGantt.js UA实例
  • Docker学习笔记:基础知识
  • 5.2 初识Spark Streaming
  • uv:一个现代化的 Python 依赖管理工具
  • Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等)
  • 理解解释器架构:原理、组成与运行机制全解析
  • 2025华为OD机试真题+全流程解析+备考攻略+经验分享+Java/python/JavaScript/C++/C/GO六种语言最佳实现
  • Python应用for循环临时变量作用域
  • 设计模式——桥接设计模式(结构型)
  • LLaDa——基于 Diffusion 的大语言模型 打平 LLama 3
  • Apache SeaTunnel部署技术详解:模式选择、技巧与最佳实践
  • 2. 数据结构基本概念 (2)
  • 鸿蒙5.0+ 多协议设备发现与分布式软总线技术实践
  • STM32F407寄存器操作(多通道单ADC+DMA)
  • 基于React和TypeScript的金融市场模拟器开发与模式分析
  • 剑指offer13_剪绳子
  • reverse_ssh 建立反向 SSH 连接指南 混淆AV [好东西哟]
  • vue+elementUi+axios实现分页(MyBatis、Servlet)
  • WebBuilder数据库:企业数据管理的能力引擎
  • QtWidgets,QtCore,QtGui
  • lvs-keepalived高可用群集
  • 【Elasticsearch】suggest
  • 高速收发器