记一次 - 响应式布局解决方案

184 阅读3分钟
  • 由于现代浏览器屏幕的多样化,无论是移动端还是pc,出现了很多规格的屏幕尺寸,为了更好的适配,我们的页面布局会采用【响应式布局】。

  • 在实际项目开发过程中,我们通常采用多种布局方式来实现响应式的需要。【媒体查询】作为基础,字体可以用【rem】,宽高可以用【vw/vh】【flex/grid】【%】【栅格系统】等

  • 响应式布局的注意点

    • 设置视口

响应式布局方案

百分比布局

  • 利用百分比布局可以设置元素跟随浏览器的宽度/高度变化而变化。Bootstrap 的 栅格布局就是利用媒体查询在不同尺寸的浏览器中,设置不同的百分比。element-ui 的响应式布局也是参照 Bootstap 设计的。

  • 需要计算,父/祖先元素的 width height padding margin border 均会影响子元素的计算,增加开发成本和时间

媒体查询

  • 是 css3 的特性,会根据不同媒体类型定义不同的样式。当重置浏览器窗口大小时,页面会根据不同条件重新渲染。所以,性能开销也很大。

  • 确定不同媒体的分割点,是一件至关重要的事情。(下图仅供参考)

image.png

/* iphone6 7 8 plus */
@media screen and (min-width: 414px) {
    body {}
}

/* ipad */
@media screen and (min-width: 768px) {
    body {}
}

/* pc */
@media screen and (min-width: 1440px) {
    body {}
}

rem布局

  • css3 的新特性,根据 html 的字体大小为基础进行计算的。html 的字体大小为 18px,那么 1rem=18px。
  • 开发中,只要改变 html 的 font-size 的大小,即可进行各媒体类型的适配。
  • 通常结合媒体查询进行不同屏幕宽度的 html 字体大小的设置
// 基准大小
const baseSize = 16
// 设置 rem 函数
function setRem () {
  // 当前页面宽度相对于 1920 宽的缩放比例,可根据自己需要修改。 pc端项目的设计稿通常是 1920*1080
  const scale = document.documentElement.clientWidth / 1920
  // 设置页面根节点字体大小, 字体大小最小为12 chrome最小字体大小为12
  let fontSize = (baseSize * Math.min(scale, 2))>12 ? (baseSize * Math.min(scale, 2)): 12
  document.documentElement.style.fontSize = fontSize + 'px'
}
//初始化
setRem()
//改变窗口大小时重新设置 rem,这里最好加上节流
window.onresize = function () {
  setRem()
}

视口布局

  • css3新特性 vw/vh 视口单位
  • vw 视窗宽度,1vw=视窗宽度的1%;vh 视窗高度,1vh=视窗高度的1%
  • 因为是根据视口的宽高进行设置的,换算比较简单。
如果设计稿宽度是 1920

设置 div 的宽度则是 

div {
    width: (100 / 1920) * 100vw;
}
  • 物理像素线:普通屏幕下1px(1个像素点),高清屏幕下0.5px(4个像素点),此时利用 transform:scale 实现
div {
    height: 1px;
    @media only screen and (-webkit-min-device-pixel-ratio: 2) {
        -webkit-transform: scaleY(0.5); 
        -webkit-transform-origin: 50% 0%;
    }
}
  • 对于需要保持宽高比的图,用 padding-top 实现
div {
    padding-top: percentage(100/700);
    position: relative;
    height: 0;
    overflow: hidden;
    img {
        width: 100%;
        height: auto;
        position: absolute; 
        left: 0; 
        top: 0;
    }
}

弹性布局/网格布局

  • css3 新特性
  • display: flex; display: grid; 父元素开启弹性布局/网格布局
  • 当浏览器变化时,页面布局依然保持想要的布局方式。
  • 父元素开启弹性/网格布局,子元素按照需要合理进行排列,对其,分配剩余空间。
  • 适配浏览器版本较高。