【译】用CSS实现基线韵律
本文是我在众成翻译上认领并翻译的:用CSS实现基线韵律
用CSS实现基线韵律
垂直韵律是一个经常被前端工程师们误解的排版概念
设计师们通过将内容排列在垂直网格中使作品看上去整洁和谐。如果前端工程师们能够准确地实现相同的垂直韵律,就能更加轻松快速地开发出协调一致的美观页面。而这一过程无需设计师的参与。
本文将帮助你建立在CSS中实现合适的垂直韵律的基础。首先我得澄清一下哪些问题不打算在此讨论。
这个概念已经存在很多年了。它引入一个应用于所有元素的通用line height值(或其倍数),包括内外边距,偶尔也将border的宽度纳入计算范围。
此时,根据CSS标准,页面内容会被排列在两条水平网格线的正中间。但两个不同格式的元素相邻排列时会显得很不和谐。
有一种方法能让不同字体格式的内容产生具有协调性的排版结果。那就是设定文本的基线。使用这种方法,能让所有的内容——不论其大小如何——都以同一条网格线为基准对齐。
CSS没有为此提供任何便捷的工具,因此我们必须手动做一些微调。这里有两点需要想清楚:
内容需要被移动多少;
如何高效率地移动所需的距离;
确定偏移量
Razvan Onofrei写了一篇很棒的文章来解释这一部分。
简而言之,一个大写字母位于基线以上的高度叫做cap height(也就是浏览器会自动在网格线之间居中的高度)。我们要做的就是将它移动line height与cap height之差的距离。
cap height是当前使用字体的一个属性。我们可以通过尝试和微调不同的值来确定它,直到文字内容与网格线对齐。
本站的stylesheets就是基于这种思想,摘录一段如下所示:
$line-height: 24px; $font-stacks: ( s: $font-stack-text, m: $font-stack-text, l: $font-stack-display, xl: $font-stack-display ); $font-sizes: (s: 13px, m: 15px, l: 19px, xl: 27px); $cap-heights: (s: 0.8, m: 0.8, l: 0.68, xl: 0.68); // Accepts `s`, `m`, `l`, or `xl` @function rhythm-shift($size-name) { $font-size: map-get($font-sizes, $size-name); $cap-height: map-get($cap-heights, $size-name); $offset: ($line-height - $cap-height * $font-size) / 2; @return round($offset); }
应用偏移量
知道文字应该偏移多少之后,我们就需要决定如何可靠地应用它了。回顾一下,我们有几种方案可以实现。
方案1. 利用相对定位
使用top
属性来移动内容而不影响上下文。
$offset: rhythm-shift(m); .rhythm-m { position: relative; top: $offset; }
查看 示例。
这也许是最简单的一个选项,但用这种方法你至少会遇到两个问题:
position:
relative
会影响元素的堆叠顺序。如果两个元素重叠,设置了相对定位的元素会显示在顶层。有时候这会引起预期之外的z-index
手动微调;position
可能被其他需求使用,例如绝对定位的内容;
在代码库相对小而简单的时候这种方案当然够用。但当我们的APP架构变得更加复杂,需要更强的可扩展性时,我们还是抛弃了这种方案。
方案 2. 使用正的 top padding 和负的 bottom margin
此方案是之前提到的那篇文章中推荐的:
$offset: rhythm-shift(m); .rhythm-m { padding-top: $offset; margin-bottom: -1 * $offset; }
查看 示例.
top padding将内容按需要向下偏移,负的bottom margin则用来补偿这种偏移。要注意只使用一个方向的margin,比如bottom margin。否则margin折叠将破坏整个布局系统。
此方案最大的缺点就是会迅速增加代码复杂性。以我们的APP为例,公共样式类pt-1
添加了24px的top padding,pt-2
则是48px(两倍行高),诸如此类。如果把这些类一起使用,要么得增加额外的HTML容器,要么就会为了生成所有可能的案例而过度使用Sass特性。无论哪种情况都会使代码变得笨重,将来也无法轻松地迭代升级。
方案 3. 使用正的 top margin 和负的 bottom margin
这是我们最终采取的方案:
$offset: rhythm-shift(m); .rhythm-m { margin-top: $offset; margin-bottom: -1 * $offset; }
查看 示例.
跟前一个方案一样,顶部偏移——这次是margin——由负的bottom margin补偿。
margin折叠怎么办?
好在我们有一个十分整洁的窍门可以解决这个问题。但首先,我们来回顾一下在有正负margin的情况下折叠的规则:
对于两个正的margin,大值获胜。例如
margin-bottom:
30px
和margin-top:
20px
,最后元素之间的空白是30px;对于两个负的margin,同样,小值(意味着负的更多)获胜;
对于一正一负两个margin,它们会相加。例如
margin-bottom:
30px
和margin-top:
-20px
,结果是10px的空白;
根据最后一条规则,如果我们总是让正负margin交替出现,它们的值就会相互抵消,文本内容则会保持与网格线对齐。
为了保证这种效果,我们决定在APP中除韵律系统以外的地方一律不使用margin。尽管这么做损失并不大,但意外出现的margin并不总是可预测的。
解决 margin 泄露
CSS中的margin还有一个恶心的特性:如果一个元素没有设置border或padding,而它的第一个子元素又有margin,那么这个margin就会泄露到父元素外面。当父元素设置了background的时候这会造成问题。这个background会覆盖子元素所在区域,而不是父元素内部。
有两种方法可以解决此问题。
要么使用
overflow:
hidden
将margin强制限定在父元素内部;要么添加
padding-top:
0.1px
, 这是一个微小值hack。这个值太小了,以至于浏览器无法实际渲染,但它足够使子元素保持在父元素的容器边界之内;
查看 最终示例.
到这里一切就大功告成了。我们已经成功地在自己的APP上使用这个系统好几月了。
尽管CSS没有提供一个能够立即使用的此类系统,但在我们正确地搭建了基础框架之后基线韵律是完全可以实现的。
转载于:https://www.cnblogs.com/tuzisxy/p/5699419.html
【译】用CSS实现基线韵律相关推荐
- 【译】CSS 十六进制颜色揭秘
本文讲的是[译]CSS 十六进制颜色揭秘, 原文地址:CSS Hex Colors Demystified 原文作者:Dave Gash 译文出自:掘金翻译计划 本文永久链接:github.com/x ...
- 你不知道的css——4. 基线、中线、x-height、单位ex(含文本与图标对齐技巧)
字母x的下边缘(线)就是CSS中的基线. ascender height: 上行线高度. cap height:大写字母高度. median: 中线. baseline:基线 descender he ...
- 【译】CSS动画 vs JS动画
原文地址 目前有两个主流的方法在web上创建动画:使用CSS或JS.到底选择哪种方法来实现动画,完全取决于你的项目以及你想要达到的效果. tips: 对于简单的只出现一次的过渡效果,可以采用CSS动画 ...
- html禁止文本选择,[译]用CSS来禁止文本选择
有些时候我们需要禁止网页的部分文本不能被选择.你可以使用user-select这个CSS特性来实现这个需求. 举例 下面是一个使用了disable-selection类的样式规则,当它作用于一个HTM ...
- [译] 关于CSS中的float和position (父容器div内的子元素div为float时,父元素无法撑开(或高度自适应)的解决方式)
测试案例:http://blog.csdn.net/goodshot/article/details/44408245 当构建页面排版时,有不同的方法可以使用.使用哪一种方法取决于具体页面的排版要求, ...
- 【译】css动画里的steps()用法详解
原文地址:http://designmodo.com/steps-c... 原文作者:Joni Trythall 我想你在css 动画里使用steps()会和我一样有很多困惑.一开始我不清楚怎样使用它 ...
- 【译】CSS 自定义属性的策略指南
原文地址: www.smashingmagazine.com/2018/05/css- 译文地址: github.com/yued-fe/y-t- 译者: 波波 校对者: ziven27. 小爷 关于 ...
- [DIV/CSS] 【译】60个有用CSS代码片段
2019独角兽企业重金招聘Python工程师标准>>> 1.垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,可以很优雅的 ...
- 转:关于垂直网格与CSS基线对其的探讨
网页设计布局中一直比较流行网格对齐,但只是针对水平的对齐,很少或者没有涉及垂直对齐,这篇文章很详细的讲解了垂直网格,乃至基线对其的相关,而css3中的多列布局的也使其显得更为重要,因此还是很有必要去了 ...
- 初识css预处理器:Sass、LESS
这篇文章是初步介绍css预处理的,详细学习请移步官网~ sass中文文档:https://www.sass.hk/docs less中文文档:http://lesscss.cn/ 什么是css预处理器 ...
最新文章
- iter迭代器的应用
- jsch mysql_java JDBC 连接MySql
- 2022年电商发展分析报告
- AndroidStudio快捷键——打开最近编辑文件列表视图——(一)
- UI设计超干货素材!小图标里的大学问!
- 经典最优滤波器(概述)
- 数码相机专业术语解答
- 模块讲解----XML模块
- Zookeeper案例之分布式全局唯一ID生成
- androidstudio图片居中_android studio textView 垂直居中
- CSS特效--图像悬停效果
- scrapy框架常用从头到尾巴
- 面试经历(某大型机器人少儿编程培训机构)
- SSR服务端渲染(nuxt重构项目)
- iPhone 越狱版本打包
- 信息系统项目管理-项目进度管理-(六)
- activeMQ消息发送过程与原理浅析
- 计算机与linux操作系统的发展
- 现场总线过程控制系统实验装置
- 通信算法之二十六:5G讲的这么简单明了
热门文章
- Java 8 新特性(一)lambda表达式
- SqlServer将特定字符串拆分并进行插入操作
- JS获取url参数,主域名等方法
- linux版Nacos安装、集群配置
- python数字时钟日期_Python数值日期时间笔记
- java foreach跳出本次循环_java控制流程最全示例
- python aes加密对于长字符数据丢失_Python 3中AES加密和解密的字符串字节数
- redis数据结构-hash
- java泛型范围_Java泛型类型中的通配符参数在其范围内的正式条件是什么?
- raft算法_MIT 6.824 分布式系统 | Lab 2A:Raft选举