移动web页面支持滚动的方案

移动web页面支持滚动的方案

一般在写移动端项目的时候,我们一般的布局方案是,需要内容的顶部或者底部是固定的不能移动,但是中间内容可以滑动,那一般你会用什么方法呢?

image.png

我们可以分为两个部分,来分析解决问题。

  1. 固定内容部分
  2. 其余滚动内容部分

固定区域部分

1、绝对定位设置

  1. 首先需要给body设置个高度,让body的高度就等于当前设备的高度Html,body{height:100%},但是又要禁止页面出现滚动,防止内容超出影响body的高,可以给body设置overflow:hidde

  2. 固定区域采用绝对对位(为啥不用固定定位?因为对于 ios4 和 android2.2 以下不支持 position:fixed)

2、弹性盒设置

1、首先需要给body设置个高度,让body的高度就等于当前设备的高度Html,body{height:100%},但是又要禁止页面出现滚动,防止内容超出影响body的高,可以给body设置overflow:hidden

2、给最外层的内容设置弹性盒,主轴为y轴

3、给中间可滑动内容占满剩余空间

其余滚动区域部分

其余滚动区域部分可以用用overflow处理

方案: overflow-y:auto和-webkit-overflow-scrolling: touch
 overflow-y:auto
复制代码

可以使用overflow-y:auto;来设置(overflow-y属性指定或是裁剪内容并且渲染一个滚动条,或是当块级元素在其顶部或底部溢出时显示溢出的内容。)其实简单点说,overflow-y属性就是在垂直方向,有内容溢出的时候,让溢出的内容以滚动条滑动的形式显示。

-webkit-overflow-scrolling: touch

在ios设备中,利用overflow来模拟滚动会出现卡顿的情况,可以通过设置-webkit-overflow-scrolling: touch来解决,原因是设置后ios会为其创建一个UIScrollView,利用硬件来加速渲染。

(Overflow-y:auto 写法在 winphone8 和 android4+ 上有用。ios5+ 版本支持overflow-scrolling 这个属性可以激活平滑滚动,)

所以弹性滚动的兼容写法

   .css{
       overflow:auto;/* winphone8和android4+ */
       -webkit-overflow-scrolling: touch; /* ios5+ */
       }
复制代码

布局一:完整版绝对定位设置

定义页面整体高度为100%,然后使用 position:absolute 布局可解决
中间滚动部分用:overflow-y:auto;和 -webkit-overflow-scrolling: touch解决

image.png

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    *{padding:0;margin:0;}
    html,body{height:100%;}
    .wrap{width:100%;}
    .header,.footer{height:40px;line-height:40px;background-color:#D8D8D8;text-align:center;}
    .header{position: absolute;top:0;left:0;width:100%;}
    .footer{position: absolute;bottom:0;left:0;width:100%;}
    .main{position:absolute;z-index:1;top:40px;left:0;bottom:40px;width:100%;}
    .main{
    Overflow-y:auto;/* winphone8和android4+ */
    -webkit-overflow-scrolling: touch; /* ios5+ */
    }
    .wrap > p{padding: 0 10px;height: 40px;line-height: 40px;border-bottom: 1px solid #ccc;border-top: 1px solid #fff;font-size: 14px;}
</style>
<body>
    <div class="wrap">
        <div class="header">header区域</div>
        <div class="main">
            <div>
                
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
                <p> iscroll滚动区域,高度自动适应</p>
            </div>
        </div>
        <div class="footer">footer区域</div>
    </div>
</body>
</html>

复制代码

布局二:完整版弹性盒设置

为了更好地兼容性,我们需要新版弹性盒和旧版弹性盒局混合使用(新版弹性盒flex2012年的语法,也将是以后标准的语法,大部分浏览器已经实现了无前缀版本。旧版box-flex是2009年的语法,已经过时,是需要加上对应前缀的。

定义页面整体高度为100%,给最外层容器设置弹性盒,需要用到的属性

flex:定义布局为盒模型属性
box-orient:vertical:盒模型垂直布局
box-flex:1 子元素占据剩余的空间
flex-align-center:子元素垂直居中
flex-pack-center:子元素水平居中
flex-pack-justify:子元素两端对齐
兼容性:ios 4+、android 2.3+、winphone8+

中间滚动部分用overflow-y:auto;和 -webkit-overflow-scrolling: touch解决

代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>flex上下固定中间滚动布局</title>
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
<style type="text/css">
*{padding: 0;margin: 0;}
html,body{height: 100%}
.wrap{width: 100%;height: 100%;}
.header,.footer{height:40px;line-height:40px;background-color:#D8D8D8;}
.main{overflow:auto;-webkit-overflow-scrolling: touch;}
.flex{
    /* 都是设置弹性布局 */
    display:-webkit-box; /*兼容谷歌 Chrome 4+, Safari 3.1, iOS Safari 3.2+ */
    display:-webkit-flex;/*兼容谷歌 Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */
    display:-ms-flexbox; /* IE 10 */
    display:flex;/* 兼容Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ */
    }
.flex-v{
    /* 设置盒模型垂直布局,设置前缀的兼容性同上 */
    -webkit-box-orient:vertical;
    -webkit-flex-direction:column;
    -ms-flex-direction:column;flex-direction:column;
    }
.flex-1{
    /* 设置子元素占据剩余的空间,设置前缀的兼容性同上 */
    -webkit-box-flex:1;
    -webkit-flex:1;
    -ms-flex:1;flex:1;
    }
.flex-align-center{
    /* 设置子元素垂直居中,设置前缀的兼容性同上 */
    -webkit-box-align:center;
    -webkit-align-items:center;
    -ms-flex-align:center;align-items:center;
    }
.flex-pack-center{
    /* 设置子元素水平居中,设置前缀的兼容性同上 */
    -webkit-box-pack:center;
    -webkit-justify-content:center;
    -ms-flex-pack:center;
    justify-content:center;
    }
.flex-pack-justify{
    /* 子元素两端对齐,设置前缀的兼容性同上  */
    -webkit-box-pack:justify;
    -webkit-justify-content:
    space-between;-ms-flex-pack:justify;
    justify-content:space-between;
    }
</style>
</head>
<body>
<div class="wrap flex flex-v">
<div class="header">我想要它固定顶部部</div>
    <div class="main flex-1">
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
      <p>高度自动适应</p>
    </div>
    <div class="footer">我想要它固定底部</div>
</div>

</body>
</html>

复制代码

滚动条优化部分

如果直接设置overflow-y:scroll在ios下始终会出现很丑的滚动条,我们可以对该元素设置以下属性:

margin-right: -20px;
padding-right: 20px;
复制代码

对滚动条进行一个小小的hack,它就再也不会出现了,用户交互时会有和原生滚动一样的感觉,体验更佳。
设置webkit浏览器的私有属性::-webkit-scrollbar能更灵活的控制滚动条,在此感谢。如果只需要隐藏,如下代码即可:

::-webkit-scrollbar{
display: none
}

复制代码

虽然移动端的浏览器webkit内核居多,不过还是要在真机测试后再得出结论,如果有些浏览器不支持这个属性的话,依然可以使用上面的小hack。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享