2020-12-14兼容屏幕分辨率的几种布局方式

兼容屏幕分辨率的几种布局方式

开发很多的项目是针对于不同的屏幕都要兼容的,一般是19201080,最低有时候需要支持到1024768,因此需要在布局上有一些适应屏幕的方式。有多中方式。

  • 1 最基本的是所有都卡死px,这样的话,当屏幕过小时,会出现滚动条,可以拖动显示。

全都使用px的方式,不会受到屏幕的影响,当屏幕过小时可以拖动滚动条显示,但是效果很不好,有时候想在页面上看一个内容,还需要拖动滚动条才可以看完整,因此这种方式不推荐使用。

  • 2 可以考虑百分比,一般为了用户体验感,滚动条是不会添加的,所以可以利用百分比来控制页面各个模块的展示。实现如下效果。

界面从垂直方向来说是一个固比模型,上面的header部分是属于固定高度的下方是取剩下的所有高度,上面取固定高度是为了方便展示某些固定长宽的图片等元素,使用了rem也可以根据浏览器宽度的减小适当减小。

主要分为container div,需要宽度和高度都填满页面,所以设置html,body,.container 这三个元素的宽和高都为100%,然后设置一下margin和padding为0 上方header部分和下方container_body两部分,然后上方定死 2rem,下方的高度利用calc :100% - 2rem 来实现。

header里分为4个item块,每个宽度占25%,高度占100%,在宽度设置25%的时候主要需要在父元素标签里设置font-size为0 ,因为在写html标签时,便签与标签之前有空格,浏览器会编译成一个空格文本,所以除非不留空格,或者将font-size设为0,这样就可以四个元素各占25% ,挤在一行了。如果需要添加border,border的宽度可能会影响原本各占25%宽度的item在一行显示不开,需要加上box-sizing: border-box;

下方container_body部分分为左右两部分,左侧宽度占比75%,右侧占25%,如果设置了display为inline-block之后两个元素还是不在一行,原因则与上方header中一样,需要设置父元素标签的font-size为0。

需要引入jquery将css样式设置可以使用rem,根据屏幕宽度来变化。

在这里插入图片描述
源码如下

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>兼容分辨率布局1</title>

   <script src="../js/jquery-3.3.1.min.js"></script>
   <style>
       html,body,.container{
           width: 100%;
           height: 100%;
           margin: 0;
           padding: 0;
       }
       .header{
           height: 2rem;
           background-color: #8cc5ff;
           font-size: 0px;
       }
       .header .top_item{
           display: inline-block;
           height: 2rem;
           width: 25%;
           font-size: 18px;
           background-color: #c2e7b0;
       }
       .header .top_item:nth-child(2n+1){
           background-color: #e0e0e0;
       }
       .container_body{
           width: 100%;
           background-color: #c0ccda;
           height: calc(100% - 2rem);
           font-size: 0;
       }
       .container_body .body-left{
           display: inline-block;
           width: 75%;
           background-color: yellow;
           height: 100%;
           font-size: 18px;
       }
       .container_body .body-right{
           display: inline-block;
           width: 25%;
           background-color: #9F9F9F;
           height: 100%;
           font-size: 18px;
       }
   </style>
</head>

<script>
   function autoWH() {
       var bili = 100/1920;
       var wH = window.innerHeight;
       var wW = window.innerWidth;
       var rem = wW*bili;
       $('html').css('font-size',rem+"px");
   }
   $(window).on('resize', function() {
       // 设置Iframe窗口大小
       autoWH();
   }).resize();
   autoWH();

</script>
<body>
   <div class="container" >
       <div class="header" >
           <div class="top_item" >item1</div>
           <div class="top_item" >item2</div>
           <div class="top_item" >item3</div>
           <div class="top_item" >item4</div>
       </div>
       <div class="container_body" >
           <div  class="body-left" >
               body-left
           </div>
           <div  class="body-right" >
               body-right
           </div>
       </div>
   </div>
</body>
</html>
  • 3 第三种是使用弹性盒子,flex布局。

弹性盒子有时候可以很好的解决兼容屏幕分辨率的问题,他是将容器当做一个盒子,盒子有主轴和侧轴,首先会在主轴方向去挤压盒子,默认主轴方向是水平方向(flex-direction: row;)我的理解就是row是行的意思,默认是想让所有的元素在一行里排列显示,所以沿着水平方向一行展示,也可以设置为为主轴方向是垂直方向(flex-direction: column;),这个意思就是让元素在一列显示。从上向下排成一列。

如果想让多行展示元素,可以设置flex-wraper:wraper ; 想实现主轴居中对齐,使用justify-content: center; 想设置侧轴方向居中对齐就设置 align-content: center ;

flex的机制就是在主轴方向分配长度时先将固定长度的元素减掉,再将剩下的长度按照flex的比例来进行分配长度.以此来实现固比模型.

下面是布局效果,仅仅是为了展示布局,并未考虑美化.

在这里插入图片描述
以下是flex布局实现的源码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>兼容分辨率布局2弹性盒子</title>
    <script src="../js/jquery-3.3.1.min.js"></script>
    <style>
        html,body,.container{width: 100%;height: 100%;margin: 0;padding: 0;}
        .container{display: flex;flex-direction: column;}
        .container .header{height: 2rem;background-color: #c2e7b0;display: flex;}
        .header .top_item{width: 25%;border: 1px solid darkgray;}
        .header .top_item:nth-child(2n+1){background-color: #e0e0e0;}
        .container .container_body{flex: 1;background-color: #c6e2ff;display: flex;font-size: 20px;}
        .container_body .body-left{display: inline-block;width: 2rem;background-color: #00ff00;}
        .container_body .body-center{display: inline-block;flex: 3;background-color: #93D1FF;}
        .container_body .body-right{display: inline-block;flex: 1;}
        .body-center .body-list{width: 80%;margin: 0 auto;display: flex;justify-content: center;align-content: center;flex-wrap: wrap;}
        .body-list .list-item{width: 200px;border: 1px solid red;}
    </style>
</head>
<script>
    function autoWH() {
        var bili = 100/1920;
        var wH = window.innerHeight;
        var wW = window.innerWidth;
        var rem = wW*bili;
        $('html').css('font-size',rem+"px");
    }
    $(window).on('resize', function() {
        // 设置Iframe窗口大小
        autoWH();
    }).resize();
    autoWH();
</script>
<body>
    <div class="container" >
        <div class="header" >
            <div class="top_item" >item1</div>
            <div class="top_item" >item2</div>
            <div class="top_item" >item3</div>
            <div class="top_item" >item4</div>
        </div>
        <div class="container_body" >
            <div  class="body-left" >
                body-left
            </div>
            <div  class="body-center" >
                body-center
                <div class="body-list" >
                    <div class="list-item">list-item1</div>
                    <div class="list-item">list-item2</div>
                    <div class="list-item">list-item3</div>
                    <div class="list-item">list-item4</div>
                    <div class="list-item">list-item5</div>
                    <div class="list-item">list-item6</div>
                </div>
            </div>
            <div  class="body-right" >
                body-right
            </div>
        </div>
    </div>

</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值