响应式开发心得

栏目: CSS · 发布时间: 3年前

来源: www.renfed.com

内容简介:响应式开发心得

本文转载自:http://www.renfed.com/2017/05/30/responsive-layout/?utm_source=tuicool&utm_medium=referral,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

什么是响应式?页面在不同的屏幕有不同的布局,换句话说,使用相同的 html 在不同的分辨率有不同的排版。如下图所示:

响应式开发心得

响应式布局是为了解决适配的问题,传统的开发方式是PC端开发一套,手机端再开发一套,而使用响应式布局只要开发一套就好了。因为它是用的同样html,所以它的JS逻辑交互也只需写一套就好了,缺点是CSS比较重。

另外,传统的手机端适配常见有三种解决方案,第一种是bootstrap的columns布局;第二种是使用全局的rem,先根据屏幕换算1rem等于多少个px,然后设置html标签的font-size为多少个rem,屏幕越大,则font-size越大,然后页面所有的元素的宽高和字体大小都用rem等比例缩放;第三种是阿里的flex box,这种方案和第二种类似,不同点是页面内容的字体大小是用的px,而不是比例缩放的rem。相对来说第三种相对第二种来说应该更合理点,因为正文的字体常用的为14px或者16px,如果一个页面在这个手机字号是15.5px,在另外一个手机又变成了14.9px,这样可能会有点奇怪。第一种需要额外引入一个框架。

而使用响应式布局就不需要进行rem的换算了,下面通过上图的那个例子一步一步地分析怎么做响应式。

1. 设置不同分辨率页面两边留白

首先一个页面有最大的宽度,当屏幕超过这个宽度时这个页面最大就这么大了,不会再变大了,也就是说它固定一个最大宽度,然后居中显示,如最大为1080px。然后当大于1024px时,页面主体内容最小宽为960px,两边自动留白;在500px到1024px之间两边保持留白40px;而当小于500px时就认为是手机,两边留白20px。所以计算一下,container的代码如下:

响应式开发心得

总体的思想是留白要合适,既不能留太多,导致中间内容太窄,也不能让中间的内容显得太大。这个其实和bootstrap的container思想一致,只是你可能要根据你自己的业务特点、用户人群等做不同留白策略。

2. 屏幕变小时,一头变窄,另一头不变

当屏幕拉小时,中间内容的宽度就不能保持1080px,它得跟着变小,而在变小的过程中,往往要保持一边不变,另一边随屏幕变窄,如下图所示:

响应式开发心得

右边的计算结果宽度保持不变,缩小左边的表单栏。因为右边一旦就窄不好看了,如果右边变窄,那么字体也要相应缩小,字号一缩小,右边上下留白就变得太大了,这样就不美观了,所以只能采取右边保持不动的策略去缩小左边的内容。这种场景比较常见,如右边如果是一个头像的话,它也不能跟着缩小,它一缩小高度也要跟着缩小,导致上下太空,所以这种情况也不能动。

3. 保持中间留白固定,缩小内容宽度

左栏的宽度变小应该怎么变呢?有一个原则,就是要保持中间的间距固定,而两边的内容宽度相应缩小,如下图所示:

响应式开发心得

所以就要借助CSS3的calc,如下所示:

input{
    width: calc((100% - 20px) / 2)
}

calc的兼容性IE10及以上支持,android 4及以下不支持,所以考虑到不支持的设备,可以简单做个兼容,如下代码所示:

input{
    width: 48%;
    width: calc((100% - 20px) / 2);
}

如果不支持calc就用48%,这样差别其实不是很大,就是不是很精确。你可以多写几个媒体查询变得更精确。

4. 左右布局变成上下布局

当屏幕拉得很小的时候,左栏已经缩得很小了,再小就不协调了,所以这个时候要把左右布局改成上下布局,把右边的往下面放。因为右栏在大屏的时候是float: right,所以在中屏的时候覆盖掉这个浮动的属性,变成float: none就可以了,然后原本右栏的内容有四行,都比较短,可以考虑把它下面的三行排成一行,即让它们浮动。如下面代码所示:

.cal-result{
    float: right;
    width: 330px;
}
 
@media(max-width: 800px){
    .cal-result{
        float: none;
        width: 100%;
    }
    .cal-result .result{
        float: left;
        width: 33%;
    }
}

让每一个result占1/3,然后浮动,效果如下:

响应式开发心得

5. 宽度太小时,自动换行

特别是当内容是列表ul形式的时候,排不下的li应当自动换到下一行。当然也可以手动控制,如下:

@media (max-width: 800px){
    .result{
        width: 33%;
    }
}
 
@media (max-width: 400px){
    .result{
        width: 50%;
    }
}

在屏幕宽度小于400的时候,每个结果就占50%,这样就排成两行了。这也是一种常用的办法,但是在我们这个例子,如果数字比较小,在iPhone6 375px的屏幕上还是排得下的,如果能保持在一行相对比较美观。而且固定50%,如果当数字比较大时也有可能会有重叠的危险,这个也有办法,就是别写死宽度,而是写死min-width为50%,这样当内容比较长时,float的元素同一行排不下就会自动换行。但是最好还是要个办法让它能根据内容长度自动换行,当然可以用JS计算,但是有点麻烦。

这个时候flex就派上用场了,很简单,只要设置两个属性:

.result-container{
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
}

space-between让子元素挨着容器的两边等间距排列,而wrap属性让子元素自动换行,当容器宽度不够的时候,就有了以下的效果:

响应式开发心得

还有从大屏变成成小屏的时候有些字号和间距要相应调小,这种变小是阶梯变化的,而不是像rem一样连续变化,而且这种阶梯一般只要有两个就够了,一个大屏的,一个小屏的。如果你需要做很多阶梯的话,那你的排版很可能有问题。

6. 使用响应式图片

如相同的头图,在电脑上需要使用大图,但是手机上面使用小图就好了,不然会造成加载慢浪费流量等问题,一个办法是使用backgound-image结合媒体查询,如下所示:

.banner{
    background-image: url(/static/large.jpg);
}
 
@media (max-width: 500px){
    background-image: url(/static/small.jpg);
}

第二种常用办法是使用img的srcset或者picture标签做响应式图片,这个我在《 Effective前端7:加快页面打开速度 》已经提到,这里不再重复。

这种响应式图片除了大小屏之外,还可以兼顾视网屏即dpr为2以上的和普通屏dpr为1的屏,在高dpr的屏幕使用2倍图,而普通屏幕使用1倍图。

7. 其它问题处理

有些地方大小屏的排版差异比较大,例如有些内容大屏的时候是挨在一起,而小屏离得比较远,这个时候你可能得重复html,写两份的标签,不同屏幕隐藏掉相应的html。

还有个问题,有时候你可能要借助transform: scale做大小缩放,但这一定是下策,我们的原则还是要保持字号和间距不变,当屏幕的跨度不是很大的时候。使用transform的后果是屏幕拉小的时候,内容跟着变小了,但是由于transform不会造成重排,它占据的高度还是那么大,下面的内容不会跟上来。这样就得手动计算内容的高度。另外如果使用rem,就和响应式的思想冲突了。如果页面的一部分使用了rem,另一部分使用了px,这样就协调了,如果你全部写rem那就不用响应式开发了。

本文总结了响应式开发的一些思想,它的好处不用大屏写一套,小屏写一套,方便维护,缩短开发时间,缺点是兼容性不是特别好,并且效果没有专门出一个小屏的UI和交互来得好。但是总体来说,使用响应式还是很方便的,只要设计得好,小屏上也是挺好看的。现在响应式已经越来越流行,它可以兼容三端的屏幕,这个优点就是无法超越的,只需写一套html和一套JS逻辑。

浏览量: 5


以上所述就是小编给大家介绍的《响应式开发心得》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

关注码农网公众号

关注我们,获取更多IT资讯^_^


查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Rust编程之道

Rust编程之道

张汉东 / 电子工业出版社 / 2019-1 / 128

Rust 是一门利用现代化的类型系统,有机地融合了内存管理、所有权语义和混合编程范式的编程语言。它不仅能科学地保证程序的正确性,还能保证内存安全和线程安全。同时,还有能与C/C++语言媲美的性能,以及能和动态语言媲美的开发效率。 《Rust编程之道》并非对语法内容进行简单罗列讲解,而是从四个维度深入全面且通透地介绍了Rust 语言。从设计哲学出发,探索Rust 语言的内在一致性;从源码分析入......一起来看看 《Rust编程之道》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具