使用现代CSS的响应式版面
为一个网站选择类型尺寸是项艰巨的任务. 标题和段落的尺寸在网页布局和可读性方面处理起来很棘手. 谢天谢地, 我们有模块化缩放可以引导我们.
模块化缩放是一个数字序列以某种方式关联另一个序列. Tim Brown,更多版面
在版面中应用的模块化比例实现了视觉层次效果与和谐的比例。它们提供了一组数值作为字体尺寸和间距的方针。
版面中的模块化缩放
在web内容中实施模块化比例需要在CSS代码的不同位置手动计算数值并对数值手动编码。为了在所有屏幕尺寸情况下都保持平衡比例,你要花费很多心思
我们可以利用CSS新特性简化一个模块化缩放响应式网站的设计工作。我们首先使用传统属性和calc()基于视口大小来动态计算模块化比例的值。然后我们会基于视口尺寸改变比例,并使用媒体查询和media()函数。
设计坞官网https://www.wode007.com/sites/73738.html
推荐:PostCSS和cssnext
为了在使用CSS新语法时保证浏览器兼容性,我建议使用PostCSS和cssnext插件。
PostCSS是一个使用JavaScript解析CSS的解析器,它驱动的一系列插件可以转换你的CSS代码。
cssnext是一个PostCSS插件,它可以通过转换语法和函数将CSS规格草案转为兼容性的CSS。
一个最小化的postcss.config.js看起来就是这样:
// postcss.config.js
module.exports = {
plugins: [
require('postcss-cssnext'),
],
};
你可在PostCSS 文档中查阅如何使用喜欢的构建工具(webpack,gulp等)来整合PostCSS。
尝试应用一个比例
把定义你的字体和类型比例等传统属性作为开始。使用calc()来计算你选择的比例的不同权重。我们会在下面的例子中使用1.414的比例(在音乐方面这个数字有其特殊含义)。
关于单位的一些准则
为基准字体大小使用百分比 百分比单元遵守浏览器关于文本大小的设定。更多相关信息请查看 CSS Font-Size: em vs. px vs. pt vs. percent。
为标题和间距使用em单位 em是一个活动单位,所以它会基于基础字体大小缩放。查看Type Study: Sizing the Legible Letter获得更多使用em单位的信息。
我们只会为下面例子中的h1,h2,h3,p标签添加很少样式.假如你使用了全部的标题标签,你可能在应用某比例时要完成更多步骤.
:root {
/* Font faces */
--headerFont: 'Helvetica Neue', sans-serif;
--bodyFont: 'Georgia', serif;
--fontColor: hsla(, %, %, 0.8);
--lineHeight: 1.5;
--baseFontSize: 112.5%; /* 18px */
/* Type scale */
--ratio: 1.414; /* Augmented fourth */
/* Each step of the scale is a power
of --ratio
*/
--stepUp1: calc(1em * var(--ratio));
--stepUp2: calc(var(--stepUp1) *
var(--ratio));
--stepUp3: calc(var(--stepUp2) *
var(--ratio));
--stepDown1: calc(1em /
var(--ratio));
}
当你设置基础字体时可以引用这些变量.
html {
font-size: var(--baseFontSize);
color: var(--fontColor);
line-height: var(--lineHeight);
font-family: var(--bodyFont);
} h1,
h2,
h3 {
margin: var(--stepUp1) .5em;
font-family: var(--headerFont);
line-height: 1.2;
} h1 {
font-size: var(--stepUp3);
} h2 {
font-size: var(--stepUp2);
} h3 {
font-size: var(--stepUp1);
} small {
font-size: var(--stepDown1);
}
我们得到如下结果:
请看 Type Scaling using cssnext,作者Steven Loria (@sloria) 发布于CodePen.
结果看起来不错,除非你正在手机上查看...
移动端存在的问题
在大屏情况下缩放表现良好.然而,适合桌面屏幕或笔记本的比例不一定对小屏幕适用.
Jason Pamental解释了原因:
屏幕尺寸减小,可见的元素变得更少,元素的相对比例变得很夸张. Jason Pamental,缩放比例更现代的Web版面
Consequently, we have disproportionately large headings on small screen sizes. 所以,我们在屏幕尺寸更小的情况下设置了更大的标题.
一个为大尺寸屏幕设置的现代比例并不适用于微型设备.
使其具备响应式特性
当视口越小时,能引起视觉注意的元素就越少.因此,我们可以设置更小的基础字号,从而使标题间的对比显得不那么强烈.
在我们的实例中使用了以下的值:
屏幕小于36em:基础字号100%,缩放比例为1.2
屏幕在36em至48em之间:基础字号112.5%,缩放比例为1.2
屏幕大于48em:基础字号112.5%,缩放比例1.414
针对不同的视口使用不同的比例和基础字号.
我们会尝试用两种方式实现效果.首先我们会使用媒体查询.接着我们会使用media()函数让代码更简洁.
使用媒体查询
由于我们有两种缩放比例,我们会编写两套变量:一套对应小尺寸和中等尺寸屏幕,另一套对应大尺寸屏幕.我们同样会定义两套基础字号.
:root {
/* Base sizes */
--baseFontSizeSm: %; /* 16px */
--baseFontSizeMd: 112.5%; /* 18px */
/* Type scale on smaller screens */
--ratioSm: 1.2; /* Minor third */
--stepUp1Sm: calc(1em * var(--ratioSm));
--stepUp2Sm: calc(var(--stepUp1Sm) *
var(--ratioSm));
--stepUp3Sm: calc(var(--stepUp2Sm) *
var(--ratioSm));
--stepDown1Sm: calc(1em /
var(--ratioSm));
/* Type scale on larger screens */
--ratioLg: 1.414; /* Augmented fourth */
--stepUp1Lg: calc(1em * var(--ratioLg));
--stepUp2Lg: calc(var(--stepUp1Lg) *
var(--ratioLg));
--stepUp3Lg: calc(var(--stepUp2Lg) *
var(--ratioLg));
--stepDown1Lg: calc(1em /
var(--ratioLg));
}
接下来,我们要编写媒体查询中用到的两个断点.
媒体查询需使用em单位,因为在不同浏览器下表现一致.媒体查询:px,em还是rem对这几个单位进行了对比.
我们会把断点定义为 custom media(另一个cssnext特性),这样我们就能通过名字来参考.
cssnext允许你使用">=":
@custom-media --break-md (width >= 36em);
@custom-media --break-lg (width >= 48em);
基础字号在"medium"断点应该增加.
html {
font-size: var(--baseFontSizeSm);
color: var(--fontColor);
line-height: var(--lineHeight);
font-family: var(--bodyFont); @media (--break-md) {
font-size: var(--baseFontSizeMd);
}
}
"large"断点处比例应该增加,所以我们参考了媒体查询中的大比例.
h1 {
font-size: var(--stepUp3Sm);
@media (--break-lg) {
font-size: var(--stepUp3Lg);
}
}
h2 {
font-size: var(--stepUp2Sm);
@media (--break-lg) {
font-size: var(--stepUp2Lg);
}
}
h3 {
font-size: var(--stepUp1Sm);
@media (--break-lg) {
font-size: var(--stepUp1Lg);
}
} small {
font-size: var(--stepDown1Sm);
@media (--break-lg) {
font-size: var(--stepDown1Lg);
}
}
请看Steven Loria (@sloria)发布于CodePen的例子Responsive modular scale using cssnext.
字体大小随视口大小准确调整.这很棒!
这种方法比手动计算缩放比例更便利,但我们在缩放转折点仍然需要每次至少一个媒体查询.
在下一节我们可以用media()函数让代码更简洁.
使用media()函数
抛弃为每个模块化比例定义彼此分离的变量集,我们改用media()函数(spec)为缩放属性绑定响应式值.
该特性需要额外安装postcss-media-fn插件,用npm或yarn安装并添加到你的postcss.config.js。
npm install postcss-media-fn
// postcss.config.js
module.exports = {
plugins: [
require('postcss-cssnext'),
require('postcss-media-fn'),
],
};
当定义你的类型缩放变量时使用media()函数.每次缩放比的变化都包含了对每个断点的类型缩放计算.
缩放的一级看起来是这样:
--stepUp1: media(
calc(1em * var(--ratioSm)),
(min-width: 48em) calc(1em * var(--ratioLg))
);
让我们打破这个规则看看.
第一级缩放的默认字号是1em x 1.2(小比例情况下)
超过48em(我们的"large"断点),第一级是1em x 1.414(大比例情况)
以下是使用media()的缩放代码:
:root {
/* Break points */
--minMd: 36em;
--minLg: 48em; /* Ratio on smaller screens */
--ratioSm: 1.2; /* Minor third */ /* Ratio on larger screens */
--ratioLg: 1.414; /* Augmented fourth */ /* Type scale */
--stepUp1: media(
calc(1em * var(--ratioSm)),
(min-width: var(--minLg)) calc(1em * var(--ratioLg))
);
--stepUp2: media(
calc(1em * var(--ratioSm) * var(--ratioSm)),
(min-width: var(--minLg)) calc(1em * var(--ratioLg) * var(--ratioLg))
);
--stepUp3: media(
calc(1em * var(--ratioSm) * var(--ratioSm) * var(--ratioSm)),
(min-width: var(--minLg)) calc(1em * var(--ratioLg) * var(--ratioLg) * var(--ratioLg))
);
--stepDown1: media(
calc(1em / var(--ratioSm)),
(min-width: var(--minLg)) calc(1em / var(--ratioLg))
);
}
有了这个设置,我们不再需要缩放时编写媒体查询.
h1 {
font-size: var(--stepUp3);
} h2 {
font-size: var(--stepUp2);
} h3 {
font-size: var(--stepUp1);
} small {
font-size: var(--stepDown1);
}
这个方法需要进一步完善,但它在许多地方都能使你的代码更紧凑.
总结
当你设计基于web的模块化类型缩放时遵守下面这些建议;
通过模块化缩放,使用传统属性和calc()来动态缩放你的字体大小
为字体大小使用百分比.给文本内容和媒体查询使用em
针对不同视口尺寸使用不同缩放值.视口越小,缩放比例越小
使用媒体查询或者media()函数基于视口来改变比例和基础字号
使用现代CSS的响应式版面的更多相关文章
- Responsive Web CSS – 在线响应式布局创建器
如果您已经使用了 CSS 或前端框架,创建响应式布局应该不难. 然而,如果你刚涉足这类布局,Responsive Web CSS 可以帮助你快速上手. 这是一个基于 Web 的工具,使任何人都可以通过 ...
- CSS:响应式下的折叠菜单(条纹式)
原文:CSS: Responsive Navigation Menu 译文:CSS:响应式导航菜单 译者:dwqs 写在之前,关于如何制作响应式的下拉菜单:响应式下的下拉菜单 之前,我写了一篇关于怎么 ...
- CSS制作响应式正方形及其应用
CSS制作响应式正方形?什么鬼?干嘛用的?干嘛用的没人有每人的需求,本人也正好是由于公司正在做的业务须要,想做个照片展示的功能(当然得符合响应式了).而这个照片展示必须符合下面几点功能:1.用三张图片 ...
- CSS实现响应式布局
用CSS实现响应式布局 响应式布局感觉很高大上,很难,但实际上只用CSS也能实现响应式布局要用的就是CSS中的没接查询,下面就介绍一下怎么运用: 使用@media 的三种方法 1.直接在CSS文件中使 ...
- 用CSS实现响应式布局
响应式网页看起来高大上,但实际上,不用JS只用CSS也能实现响应式网站的布局 要用到的就是CSS中的媒体查询下面来简单介绍一下怎么运用 使用@media 的三种方式 第一: 直接在CSS文件中使用 @ ...
- css实现响应式布局的相关内容
所以我就在做自适应的时候查了一些资料 首先我发现一个问题:有响应式布局和自适应布局两种布局效果 简单来说,响应式布局就是不同的设备无论大小 布局都自动调整大小 页面布局都一样 可以保证无论什么设备 用 ...
- 使用纯 CSS 实现响应式的图片显示效果
有许多方法可以实现页面里图像的响应式显示(Responsive).然而,我碰到的所有方案都使用了JavaScript.这使我疑惑不用 JavaScript 实现图像响应是否可行. 我提出了下面纯CSS ...
- 【css】响应式布局入门【转】
最近研究响应式设计框架的时候,发现网上很多相关的属性介绍,却很少有系统的入门级使用的文章,我自己整理了一篇入门知识,并没有什么高深的理论,也不牵扯到框架. 目前已经越来越多的站点以及wap站点使用响应 ...
- CSS的响应式布局
响应式布局是什么 它是相对于固定像素大小的网页而言的,顾名思义,响应式布局就是网页能够响应各种各样不同分辨率大小的设备,能够将网页很好的呈献给用户. 如何实现响应式布局? 1.CSS3@media查询 ...
随机推荐
- Java实现币值最大化问题
1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,-,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻的条件下,所选硬币的总金额最大. 2 解决方案 2.1 动态规 ...
- java实现拍7游戏
** 拍7游戏** 许多人都曾经玩过"拍七"游戏.规则是:大家依次从1开始顺序数数,数到含有7或7的倍数的要拍手或其它规定的方式表示越过(比如:7,14,17等都不能数出),下一人 ...
- C#基础篇——委托
前言 在本章中,主要是借机这个C#基础篇的系列整理过去的学习笔记.归纳总结并更加理解透彻. 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多 ...
- 温故知新-多线程-深入刨析park、unpark
文章目录 摘要 park.unpark 看一下hotspot实现 参考 你的鼓励也是我创作的动力 Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | ...
- ubuntu18.04安装部署typecho个人博客
LNMP一键安装包安装 wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnm ...
- x memory pool c语言 内存池
#ifndef X_MEMORY_H #define X_MEMORY_H #include <stdlib.h> #include <stdio.h> #include &l ...
- electron-vue报错:Webpack ReferenceError: process is not defined
electron-vue报错:Webpack ReferenceError: process is not defined 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总 ...
- 今天抠图,Python实现一键换底片!想换什么换什么(附源码)
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 生活中我们会拍很多的证件照,有的要求红底,有的是白底,有的是蓝底,今天不通 ...
- @loj - 2977@ 「THUSCH 2017」巧克力
目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...
- 面试:在面试中关于List(ArrayList、LinkedList)集合会怎么问呢?你该如何回答呢?
前言 在一开始基础面的时候,很多面试官可能会问List集合一些基础知识,比如: ArrayList默认大小是多少,是如何扩容的? ArrayList和LinkedList的底层数据结构是什么? Arr ...