javascript之移动端布局方案与注意事项

移动端布局方案

(1)布局方案1

使用的技术是:媒体查询(修改html的字体大小)+ rem(相对于html的字体大小的倍数)
使用媒体查询,来监视设备的视口宽度发生的变化,为此做出响应,匹配对应的样式,而文本大小的变化也是为了响应设备的宽度来做出变化,于是需要使用rem单位。
关于rem单位?
rem:就是相对于根节点(html)的文本大小的倍数,假如你html的文本大小设置为50px,那么你设置一个容器div,宽为2rem,高位2rem
实际而言就是等同于 宽 = 2 * 50 = 100px 宽高同理,所以最后在浏览器上显示的div的宽高为200px。
至于媒体查询的话,就是使用@media 来监视所需要监视的设备,而常见的设备有以下:all(所有设备),screen(用于电脑屏幕,平板电脑,智能手机等。)print(用于打印机和打印预览),只不过大部分都是使用all来即可。

需求:根据媒体查询,判断视口的大小,来改变div的显示多少。
0 - 480px的时候显示div呈现一列排放
481px - 749px 时候显示两列的div
750px - 1023px 时候显示三列div
1024px - 1200px 时候显示四列div

<section>
    <div>
      <img src="./image/pic2.png" alt="">
      <h3>笑意</h3>
    </div>
    <div>
      <img src="./image/pic2.png" alt="">
      <h3>笑意</h3>
    </div>
    <div>
      <img src="./image/pic2.png" alt="">
      <h3>笑意</h3>
    </div>
    <div>
      <img src="./image/pic2.png" alt="">
      <h3>笑意</h3>
    </div>
</section>

  <style>
    * {
      margin: 0;
      padding: 0;

    }

    img {
      display: block;
      width: 100%;
    }

    section {
      min-width: 1200px;
      height: 500px;
      background: #ccc;
      margin: 0 auto;
      display: flex;
      justify-content: space-around;
      flex-wrap: wrap;
    }

    div {
      /* 使用媒体查询,时时改变div的宽度即可,便能实现响应式 */
      width: 23%;
      margin-bottom: 10px;
    }

    @media screen and (min-width: 1024px) and (max-width: 1200px) {
      section div {
        width: 23%;
      }
    }

    @media screen and (min-width: 750px) and (max-width: 1023px) {
      section div {
        width: 32%;
      }
    }

    @media screen and (min-width: 480px) and (max-width: 749px) {
      section div {
        width: 48%;
      }
    }

    @media screen and (max-width: 479px) {
      section div {
        width: 98%;
      }
    }
  </style>


注意点:只不过由于媒体查询代码量较多,而且安卓手机屏幕各不一样,因此这种方案处理起来相对不方便。于是引出第二种方案。

(2)布局方案2

技术:vw + rem 实现文本和视口的响应式
vw是是一个单位,再阐述vw前面,这就需要得讲讲视口宽度的概念,就一个显示屏幕沾满全部的时候,也就是一个视口为100%,而vw就是视口的单位
1 vw = 1 % 的视口宽度 => 100vw = 100 %视口宽度
而移动端由于屏幕尺寸的缘故,考虑到图片失真问题,还有文本问题,都是采用二倍图或者三倍图的做法。
这也牵引出一个 像素比的单位 dpr = 物理像素 / 逻辑像素
物理像素就是设计图中的像素,常用的有640px,750px,1080px
而他们的dpr一般匹配都是这样: 2 2 3(一一对应匹配)
逻辑像素就是我们一般书写的像素单位 = 物理像素 / dpr
以设计图为750px为例:
假如设计图的大小为750px,那么dpr为2,也就是逻辑像素为350px
1 vw = 1% 视口宽度(750px中的视口宽度为350px)
推理出100vw = 350px
也就是100px = 26.67vw;
然后由于html中的字体大小设置为28.73vw(也就是100px),当你在ps量取到的像素,先处于dpr,再除于100px就是rem的值
为什么html中不能为字体大小的单位?
因为html的字体大小直接固定死了。而vw是根据视口宽度的变化,值也跟着变化。
注意点:高度的设置为rem即可,因为vw随着视口宽度的大小变化而变化。

640px设计图 -- 320px(视口宽度) 
320px = 100vw
100px = 31.25vw;

1080设计图 --- 360px(视口宽度)
360px= 100vw
100px = 27.77vw

假如正常计算出来在html设置的字体大小为26.67vw
那么逻辑像素 = 量取 / 2 / 100px = ?rem

或者
假如正常计算出来在html设置的字体大小为26.67vw 在这边直接除于2  26.67vw / 2 = 13.335vw
那么逻辑像素 = 量取 / 100px = ?rem

这边就以饿了么为例,实现移动端的三段式布局

在这里插入图片描述
技术:弹性盒 + vw + rem
来实现头部,主体,底部的布局
01:首先设置html的文字大小,由于设计图为750px,那么100px = 26.67vw;,但是在ps中量取还有除于dpr,因此可以先在html中除于2,然后你量取的ps像素直接除于100就是?rem的单位了!
02:首先设置弹性盒,需要一个父元素,也就是#elm,但是需要高度占满整个屏幕,也就是需要设置html,body的高度了,还有文本大小需要重置一下,也就是在body中设置文本为16px
03:头部与底部量取到高度,转化为rem单位,然后中间主体采用flex来占据剩余空间,需要注意的是,中间主体需要添加overflow:auto;产生滚动条,否则超出的会影响底部布局,还有就是中间主体需要再存放一个容器来包裹内容,不能直接书写版块。
04:对于头部而言,就是头部的定位和input都需要设置跳转,跳转到另外的页面进行搜索或定位功能
注意点1:就是头部搜索框的设置,还有就是放大镜,这个字体图标,需要添加在form那边(内部一个span),然后定位好位置,position: absolute;top: 50%(距离顶部50%);transform: translateY(-50%)(需要向上走自身的一半);
或者采用一个div包裹一个span,span来存放那个放大镜,采用定位,而文本居中
注意点2:就是span需要设置字体大小为.26rem(因为量取到是26px,也就是0.26rem)

  <div id="elm">
    <!-- header -->
    <div class="header">
      <div class="title">
        <span class="iconfont icon-location"></span>
        <h1>惠通产业园B9栋</h1>
        <span class="iconfont icon-xiabiao"></span>
      </div>
      <form action="">
        <span class="iconfont icon-fangdajing"></span>
        <input type="text" placeholder="搜索饿了么商家、商品名称">
      </form>
    </div>
    //主体区
     <div class="main">
     //主体区内的包裹容器,里面书写各个版块
      <div class="main-con">
      </div>
     </div>
	
	   <!-- footer -->
    <div class="footer">
      <ul class="nav">
        <li>
          <a href="###">
            <em class="iconfont icon-changyonglogo40"></em>
            <i>首页</i>
          </a>
        </li>
        <li>
          <a href="###">
            <em class="iconfont icon-faxian"></em>
            <i>发现</i>
          </a>
        </li>
        <li>
          <a href="###">
            <em class="iconfont icon-order-copy"></em>
            <i>订单</i>
          </a>
        </li>
        <li>
          <a href="###">
            <em class="iconfont icon-wode"></em>
            <i>我的</i>
          </a>
        </li>
      </ul>
    </div>

body,
html {
  height: 100%;
}

html {
  font-size: 13.335vw;
}

body {
  font-size: 16px;
}

#elm {
  display: flex;
  flex-direction: column;
  height: 100%;
  width: 100vw;
}

/* header */
.header {
  display: flex;
  flex-direction: column;
  padding-top: 1px;
  height: 1.9rem;
  background: linear-gradient(to right, #00aaff, #0085fe);
}

.header .title {
  display: flex;
  margin: 0.38rem 0 0 0.28rem;
  line-height: 0.32rem;
  font-size: 0.32rem;
  color: #fff;
  /* background: orange; */
}


.header .title h1 {
  margin: 0 0.14rem;
}

.header form {
  position: relative;
  margin: .32rem 0.28rem 0 0.28rem;
  height: 0.72rem;
  width: 6.94rem;
  background: pink;
  font-size: 0.26rem;
  line-height: 0.26rem;
  color: #a2a2a2;
}

.header form span {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  left: 1.6rem;
  z-index: 1;
  font-size: 0.26rem;
}

.header form input {
  box-sizing: border-box;
  padding-left: .15rem;
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  text-align: center;
}

/* main */
.main {
  flex: 1;
  padding: 0 0.2rem;
  box-sizing: border-box;
  /* background: green; */
  overflow: auto;
}

.main-con {
  position: relative;
  height: 100%;
  width: 100%;
  /* background: pink; */
}

/* footer */
.footer {
  height: 1.05rem;
  width: 100vw;
  border-top: 0.09rem solid #000;
}

.footer .nav {
  display: flex;
  justify-content: space-evenly;
  align-items: center;
  width: 100%;
  height: 100%;
}

.footer .nav li {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
}

.footer .nav li a {
  display: flex;
  flex-direction: column;
  align-items: center;
  color: #7e7e7e;
}

.footer .nav li a em {
  display: block;
  width: 0.38rem;
  font-size: 0.38rem;
  line-height: 0.38rem;
}

.footer .nav li a i {
  margin-top: 0.1rem;
  display: block;
  font-size: 0.18rem;
  line-height: 0.18rem;
}

(3)布局方案3

技术: rem.js + rem单位布局
01:第一步引入rem.js文件
02:需要根据设计图的大小来修改宽度(750px等)
03:cssrem插件(配置根节点的字体大小 — )
文件-首选项 -设置- cssrem(搜索) -Cssrem: Root Font Size(就是设计图除于10的值)
比如设计图为750px,那么750px/10 = 75px 640px的时候就是64px
04:重启
05:设计图中量取到的值,直接书写后,会自动帮你转化为rem值

rem.js文件的注意点:
01:需要根据设计图的大小来修改宽度(750px等)

注意点:常规而言,rem.js文件中大部分划分为10等份,比如750px的设计图,划分为10等份后,就是一等份占75px => 1rem = 75px
然后借助cssrem插件,你实际量取到的数值,直接输入,然后你手动选择哪个自动帮你转化为rem单位的数值即可!

(4)布局方案4

技术: Saaa + vw 布局
Sass是css的预编译语言

。。。正在梳理中,请等待!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值