web移动端基础
1.像素密度 PPI
说到屏幕就离不开2个因素,屏幕大小和屏幕分辨率。
PPI是Pixels Per Inch缩写,pixels per inch所表示的是每英寸所拥有的像素(pixel)数目。
PPI越高,手机屏幕显示的效果越好。以前的老手机屏幕显示效果很差,有颗粒感,就是因为PPI太低了。
随着科技发展,手机屏幕的PPI逐年提升,当PPI达到一定数值时,人眼就分辨不出颗粒感了。
例如:
iPhone 6屏幕的PPI为:326
iPhone 6sp屏幕的PPI为:401
2.设备独立像素 DIP
设备独立像素,简称DIP或DP是一种物理测量单位,基于计算机控制的坐标系统和抽象像素(虚拟像素),由底层系统的程序使用,转换为物理像素的应用。
个人理解:随着屏幕技术的发展,分辨率大幅提升。但是屏幕尺寸的提升却是有限制的。例如iPhone4,相比前代iPhone3Gs分辨率320 * 540,iphone4在屏幕尺寸不变的情况下将分辨率提升至640 * 960,也就是说将PPI提升了一倍。按照传统的逻辑来布局,12px的字体iPhone3Gs每行可以放320/12=26.66个字,而iphone4每行可以放640/12=53.33。这时问题就出现了,同样是3.5英寸的屏幕,iPhone3Gs一行塞下26个字,iphone4一行塞下53个字,结果就是iphone4的字非常小,很难看清,按照这种逻辑,如果屏幕分辨率接着提升,每个字符占据的屏幕空间就更小,那样就更看不清了。所以页面布局的时候不能再按物理分辨率来显示了,这就有了设备独立像素的概念。设备独立像素与手机屏幕的尺寸成正比,保证每个css像素占据的屏幕空间大小一致
获取设备独立像素:window.screen.width/height
var p = document.querySelector('p');
var strW = "此设备的屏幕宽度(设备独立像素)为:";
var strH = "此设备的屏幕高度(设备独立像素)为:";
p.innerHTML += (strW + window.screen.width + "<br>");
p.innerHTML += (strH + window.screen.height + "<br>");
3.物理像素与设备独立像素的比例值 DPR
获取方式:window.devicePixelRatio
var str= "此设备物理像素与设备独立像素的比例值为:";
document.write(str + window.devicePixelRatio);
PS:老款的手机和电脑的DPR基本都是1,从iPhone4开始DPR提升到2,而后面的6plus已经提升至3
4.设置视口宽度
pc的页面宽度很大,为了能在手机上完整的显示整个页面,手机浏览器将页面放入一个默认宽度为980px布局视口中
这个视口宽度的意义在于2点:
(1)他规定了当前大小的屏幕要对应980个像素,如果某容器的宽度固定大小是480px,那么他刚好占据一半的屏幕宽度
(2)他规定了最外层元素的宽度,块级元素默认的宽度就是100%,即占满一行,此时视口宽度设定为980px,就意味着body标签的宽度也是980px。继承body宽度的div元素默认也是980px
下面的代码展示了默认视口宽度的效果
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
<style>
div{
height: 100px;
margin-top: 50px;
color: white;
line-height: 100px;
text-align: center;
font-size: 30px;
}
#one{
width: 480px;
background-color: red;
}
#two{
width: 100%;
background-color: blue;
}
</style>
</head>
<body>
<div id="one">480</div>
<div id="two">100%</div>
</body>
<script>
</script>
</html>
可以直观的看到480的宽度的元素占据了屏幕大概一半的宽度,说明填满一整行需要980px,无论横屏竖屏都如此,证明了(1)


对于元素two,图片上可以看出他占据一整行,two元素,body,视口宽度都是一致的,这里再用js代码输出他的大小,横屏竖屏结果是一致的,,证明了(2)
window.onload = function(){
console.log(document.body.offsetWidth) // 980
console.log(document.querySelector('#two').offsetWidth) // 980
}
如果将视口宽度修改为一半,即480,我们再看下效果
<meta name="viewport" content="width=480">


控制台打印效果(横屏竖屏结果是一致的):
window.onload = function(){
console.log(document.body.offsetWidth) // 480
console.log(document.querySelector('#two').offsetWidth) // 480
}
以上再次证明了(2),视口宽度决定了最外层容器的宽度
如果某容器的宽度被写死,超过了视口宽度,会是什么样的情形,我们来看看:
<meta name="viewport" content="width=480">
<div id="one">480</div>
<div id="two">980的固定宽度</div>
此时480的宽度刚好占满一行,而因为无法容纳two元素,已经出现了横向滚动条,需要水平滚动才能查看到two元素右边的内容(横屏竖屏一致)


因为视口容器过小,无法容纳980px的元素,导致了水平滚动条的出现。在实际开发中,很多pc页面都是固定的宽度,且宽度很大,为了在手机浏览时不出现滚动条,浏览器就只能将默认的视口宽度设定成很大,这就是视口宽度默认980的原因
2.而在小小的屏幕中塞满980px的元素,就会显得密密麻麻。例如字体大小14px,每行需要塞满980/14=70个字,用户根本看不清,因为每个字占据的屏幕空间太小了。为了解决这个问题,就需要修改视口宽度,例如修改成一半的大小,或者设备本身的宽度,例如414,那么此时每行只需要塞414/14=30个字,每个字占据的屏幕空间变大了,看起来也就容易了。
而修改视口宽度使用meta标签,一般我们将视口宽度设定等于设备的屏幕宽度,称为完美视口
<meta name="viewport" content="width=device-width">
window.onload = function(){
//这里的设备是 6sp 设备独立像素为 414*736
console.log(document.body.offsetWidth)// 竖屏414 横屏736
}
视口设定之后,用户仍然可以手动对页面进行缩放(双指缩放),但是页面缩小的幅度不能小于设定的视口宽度,即缩小到设定的视口宽度后,就不能再缩小了。按照这个规律,如果你想知道某个页面的视口宽度,只要将其缩小到不能缩为止,这时候的页面宽度就是他的视口宽度。
另外用户缩放不影响最外层容器的大小。
除了上面的为视口宽度设定确定的值外,还可以使用比例来设置视口宽度。
initial-scale:初始缩放比例,=1时相当于设备宽度。=0.5时相当于设备宽度的2倍
minimum-scale:最小缩放比例
maximum-scale:最大缩放比例
user-scalable:允许用户缩放
设定minimum-scale/maximum-scale/user-scalable 都不能阻止用户对页面进行缩放(双击缩放or双指缩放),但是能阻止ios input框获取焦点时页面放大,屏幕切换横竖状态,或者切换元素的class类时,都对页面有限制作用
PS:有时候页面效果与理论不一致竟然是广告插件的锅
5.打印浏览器信息
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>设备信息</title>
</head>
<body>
</body>
</html>
<script>
document.write('该设备独立像素为:'+ window.screen.width + '*' + window.screen.height)
document.write('<br />该设备物理像素与设备独立像素的比例值为:' + window.devicePixelRatio)
document.write('<br />浏览器名称:' + navigator.appName)
document.write('<br />浏览器版本:' + navigator.appVersion)
document.write('<br />用户代理:' + navigator.userAgent)
if(window.chrome){
console.log('这是chrome浏览器')
}else if(window.opera){
console.log('这是opera浏览器')
}
</script>
web移动端基础的更多相关文章
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 从web移动端布局到react native布局
在web移动端通常会有这样的需求,实现上中下三栏布局(上下导航栏位置固定,中间部分内容超出可滚动),如下图所示: 实现方法如下: HTML结构: <div class='container'&g ...
- 如何提高Web服务端并发效率的异步编程技术
作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...
- 了解web及网络基础
了解web及网络基础 以下内容简单的说明了一下TCP/IP协议族中HTTP协议.DNS服务.IP协议的一些概念和关系.笔者只是对知识点进行了总结,仅供参考: ) 转载请注明出处:了解web及网络基础 ...
- Web前端-Ajax基础技术(下)
Web前端-Ajax基础技术(下) 你要明白ajax是什么,怎么使用? ajax,web程序是将信息放入公共的服务器,让所有网络用户可以通过浏览器进行访问. 浏览器发送请求,获取服务器的数据: 地址栏 ...
- Web前端-Ajax基础技术(上)
Web前端-Ajax基础技术(上) ajax是浏览器提供一套的api,用于向服务器发出请求,接受服务端返回的响应,通过javascript调用,实现通过代码控制请求与响应,实现网络编程. ajax发送 ...
- Web前端-JavaScript基础教程上
Web前端-JavaScript基础教程 将放入菜单栏中,便于阅读! JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript ...
- Web开发——HTML基础
文档资料参考: 参考:MDN官网 参考:http://www.runoob.com,W3School 参考:https://developer.mozilla.org/zh-CN/docs/Learn ...
- Web服务端性能提升实践
随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...
- Logan:美团点评的开源移动端基础日志库
前言 Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务.同时Logan也是“金刚狼”大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀利. Logan已经 ...
随机推荐
- CSS – Aspect Ratio
参考: Youtube – Chrome 88 adds aspect-ratio and 2 awesome new devtool features! MDN – aspect-ratio W3S ...
- 通过MobaXterm操作远程服务器电脑的方法
本文介绍在Windows电脑中,下载.配置MobaXterm软件,从而连接.操作远程服务器的方法. 因为是在Windows操作系统的电脑中连接服务器,所以建议使用MobaXterm.PuTTY ...
- Haproxy详解以及基于Haproxy的高可用实战
1.Haproxy与Keepalived VRRP 介绍 软件:haproxy 主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦.实际工作中没有人用. ngi ...
- git工具:sourcetree使用中的部分问题
这段时间经常用到这个工具.就当记个笔记,记录一下我的一些问题. 问题一: 如果想要拉取远端更新: 第一步:先登陆sourcetree,点击"抓取". 第二步:在终端输入:git s ...
- Java日期时间API系列31-----Jdk8中java.time包中的新的日期时间API类,时间戳的获取方式对比、转换和使用。
时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到.Java中本来已经有相关获取时间戳的方法,Java8后增加新的类In ...
- 云原生爱好者周刊:Cilium 放大招,发布服务网格 Beta 版
云原生一周动态要闻: Cilium 推出服务网格测试计划 Knative 已申请成为 CNCF 的孵化项目 Kubernetes v1.23 即将发布 Lens 5.3 发布 开源项目推荐 文章推荐 ...
- 在 Kubernetes 中基于 StatefulSet 部署 MySQL(上)
大家好,我是老 Z! 本文实现了 MySQL 数据库在基于 KubeSphere 部署的 K8s 集群上的安装部署,部署方式采用了图形化这种形式.下一篇文章将会涉及 GitOps 的基础操作,部署过程 ...
- KubeSphere 社区双周报 | 功能亮点抢“鲜”看 | 2022-09-30
KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...
- python多线程应用-批量下载拉勾网课程
import concurrent import os import re import time from collections.abc import Iterable from Crypto.C ...
- 开源之夏 2023|欢迎报名 Apache RocketMQ 社区项目!
开源之夏是由中科院软件所"开源软件供应链点亮计划"发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区的蓬 ...