:books: :octocat: Github static blog post, experience the fun of using Issues.Welcome star( 静态博客文章,体验一下使用 Issues 的乐趣,欢迎 star )个人博客地址:blog.hvkcoder.me/love
The function of the viewport is to constrain the element,which is the uppermost containing block of your site.
译:视口的功能是约束 html 元素,它是网站上的包含区块。
The viewport, in turn, is exactly equal to the browser window: it’s been defined as such. The viewport is not an HTML construct, so you cannot influence it by CSS. It just has the width and height of the browser window — on desktop.
译:视口与浏览器窗口完全相同,但它并不是 HTML 结构,因此你不能通过 CSS 来影响它。在桌面端,视口只是具有浏览器窗口的高度与宽度。
Imagine the layout viewport as being a large image which does not change size or shape. Now image you have a smaller frame through which you look at the large image. The small frame is surrounded by opaque material which obscures your view of all but a portion of the large image. The portion of the large image that you can see through the frame is the visual viewport. You can back away from the large image while holding your frame (zoom out) to see the entire image at once, or you can move closer (zoom in) to see only a portion. You can also change the orientation of the frame, but the size and shape of the large image (layout viewport) never changes.
The visual viewport is the part of the page that’s currently shown on-screen.The user may scroll to change the part of the page he sees, or zoom to change the size of the visual viewport.
However, the CSS layout, especially percentual widths, are calculated relative to the layout viewport, which is considerably wider than the visual viewport.
译:然而,CSS 布局,特别是百分比的宽度,是相对于布局视口计算的,它要比视觉视口宽的多。
How wide is the layout viewport? That differs per browser. Safari iPhone uses 980px, Opera 850px, Android WebKit 800px, and IE 974px.
响应式开发的本质是针对多种屏幕做适配,首先需要掌握几个基本概念:
iPhone 6 Plus
的分辨率是 1920 * 1080 像素。使用 rem 实现响应式布局
rem
(font size of the root element)是CSS
的计量单位,表示相对于根(即html
)元素的字体大小。其主要用于移动Web
开发,以适配不同尺寸的屏幕。rem
的兼容可以通过 caniuse 查询由于
rem
单位是相对于网页根元素的字号大小而定,所以实现rem
布局开发时,首先要做的就是对根元素的字号赋值。我们将网页根元素的字号设置为
12px
,此时rem
相对于网页根元素字号为1rem = 12px
。故此转换rem
的公式则为下面通过
rem
实现一个简单的布局 【预览】最后加上最关键的重置元素字号脚本
rem
确实有效的解决了响应式布局,但却并非完美:js
脚本对其根元素的字号动态计算与赋值。rem
则显得无能为力,因为它基准值只能是一个,高度或宽度。使用 vw、vh、vmin、vmax 实现响应式布局
vw
、vh
、vmin
、vmax
与rem
相同都是CSS3
中新引入的一种计量单位。不同于rem
它们所表达的含义如下:vw
、vh
、vmin
、vmax
的兼容可以通过 caniuse 查询在使用
vw
、vh
、vmin
、vmax
之前我们需要认识一下视口。以 PPK大神 在其文章 A tale of two viewports (一)、A tale of two viewports (二) 以及 Meta viewport 三篇文章 中提出关于视口的解释:
以上是我在原文中截取的两段关于桌面端的视口概念,从中总结得知:在桌面端,视口就是浏览器的可视化区域,其只是具有浏览器窗口的高度和宽度,使用
document.documentElement.clientWidth/Height
获取视口宽高。以上是我在原文中对移动端视口概念的截取,从中总结可得知:
移动端的视口分为三部分:
视觉视口(visual viewport)
:就是设备的屏幕区域,但是它所对应的并不是指屏幕区域里的物理像素,而是CSS
像素。当用户缩小或放大时,测量会发生变化,因为更多或更少的CSS
像素会融入屏幕。使用window.innerWidth/Height
获取视觉视口的宽高。布局视口(layout viewport)
:与视觉视口不一样,它是为了解决PC 端网站在移动端显示不佳的一个解决方案,它宽高不会改变,使用document.documentElement.clientWidth/Height
来获取布局视口的宽高。理想视口(ideal viewport)
:它是基于布局视口的,用于调整布局视口端口的大小。既然提到了
理想视口(ideal viewport)
,那么就不得不普及一下<meta name="viewport">
。viewport 属性
viewport
是指屏幕上能用来显示网页的区域,默认情况下大多数设备的viewport
的宽度都是980
像素,可以通过在heade
元素中增加meta
标签来设置viewport
属性:viewport
下包含以下属性:width
:设置viewport
的宽度,为正整数,或者字符串 “device-width”。initial-scale
:设置viewport
的初始缩放值,为数字,可以带小数。minimum-scale
:设置viewport
的最小缩放值,为数字,可以带小数。maximum-scale
:设置viewport
的最大缩放值,为数字,可以带小数。height
:设置viewport
的高度。user-scalable
:是否允许用户缩放,值为 "yes" 或 "no"。通过设置
viewport
属性,可以调整用户界面的逻辑大小,页面CSS
中的大小均以viewport
为基准。vw、vh、vmin、vmax 的使用
基础的东西说完了,接着回到
vw
、vh
、vmin
、vmax
的使用,它们相对于 PC 端浏览器的视口就是浏览器的可视化区域 ,而在移动端则为布局视口,还是以第一个案例为例,使用vw
实现布局【预览】:。vw
、vh
、vmin
、vmax
的出现给我的感觉显得有些鸡肋,有点像%
,但与百分比最大的不同则是%
是相对于父元素的大小设定的比率,vw
、vh
是视口大小决定的。在使用它的过程中,个人认为它并不适合去做布局,而是去做一些元素大小的限制。当然,也是因为个人能力有限,并没有悟透,希望能够得到大神的指点。Flex 弹性盒布局
在
Felx
出现之前,布局基于盒模型,依赖display
、position
和float
样式属性。但是使用时需要清除浮动,并且对于一些特定布局的实现非常不方便,下面就让我们来看一下,Felx
布局的基本概念,如图所示:采用
Flex
布局的容器称为Flex 容器flex container)
,所有子元素自动成为容器成员,称为Flex 项目(flex item)
。容器默认存在两根轴:水平的
主轴(main axis)
:开始的位置叫做主轴起始(main start)
,结束位置叫做主轴结束(main end)
。垂直的
交叉轴(cross axis)
: 开始位置叫做交叉轴起始 (cross start)
,结束位置叫做交叉轴结束(cross end)
。项目默认沿主轴排列,单个项目占据主轴的空间叫做
项目主轴大小(main size)
,占据交叉轴空间叫做项目交叉轴大小(cross size)
。Flex 容器属性
1. display
说明:通过设置 display 属性的值为 flex 或 inline-flex 将其定义为弹性容器。
语法:
display: flex | inline-flex
2. flex-direction
说明:决定主轴的方向(项目的排列方向)。该属性的反转值不会改变元素的绘制,只改变流动方向。
语法:
flex-direction: row | row-reverse | column | column-reverse
3. flex-wrap
说明:控制 flex 容器是单行或多行。
语法:
flex-wrap: nowrap | wrap | wrap-reverse
4. flex-flow
说明:复合属性,设置 flex 项目排列方式。
语法:
flex-flow: <flex-direction> || <flex-wrap>
5. justify-content
说明:设置 flex 项目主轴上的对齐方式。
语法:
justify-content: flex-start | flex-end | center | space-between | space-around
6. align-items
说明:设置 flex 项目交叉轴上的对齐方式。
语法:
align-items: stretch | flex-start | flex-end | center | baseline
line-height
值,则与flex-start
相同。7. algin-content
说明:用于修改
flex-wrap
属性的行为。类似与justify-content
,但它不是设置弹性子元素的对齐,而是设置各个行的对齐。语法:
align-content: stretch | flex-start | flex-end | center | space-between | space-around
Flex 项目属性
1. flex-grow
说明:定义项目的扩展比例,根据 Flex 容器的子元素所设置扩展因子作为比率来分配剩余空间。对于 flex 项目宽度未超出 flex 容器宽度时,生效。
语法:
flex-grow: <number> (default 0)
div1 实际宽度 = 180px + ( 500px - (180px + 280px)) / ( 1 + 1 )
div2 实际宽度 = 280px + ( 500px - (180px + 280px)) / ( 1 + 1 )
2. flex-shrink
说明:定义项目的缩小比例,根据 Flex 容器的子元素所设置收缩因子作为比率来分配收缩空间。****
语法:
flex-shrink: <number> (default 1)
div1 实际宽度 = 300px - (300px * 1) / (300px * 1 + 280px * 1) * (300px + 280px - 500px)
div2 实际宽度 = 280px - (280px * 1) / (300px * 1 + 280px * 1) * (300px + 280px - 500px)
3. flex-basis
说明:定义在分配剩余空间之前,项目占据的主轴空间。可以理解为与
width
一样。语法:
flex-basis: <length> | auto (default)
flex-basis 应用准则:
content -> width -> file-basis (limited by max|min-width)
flex 项目
未设置flex-basis 属性
,则flex-basis
的大小就是项目的width 属性
大小。flex 项目
未设置width
属性,则flex-basis
的大小就是项目内容的大小。4. flex
说明:flex 是
flex-grow
、flex-shrink
和flex-basis
的复合属性。语法:
flex: <flex-grow> || <flex-shrink> || <flex-basis>
5. order
说明:定义
flex 项目
的排列顺序,值越小,排列越靠前。语法:
order: <number> (default 0)
6. align-self
说明:设置单个项目的对齐方式,可覆盖
flex 容器
设置的align-items
属性。语法:
align-self: auto | flex-start | flex-end | center | baseline | stretch