本文是我在众成翻译上认领并翻译的:用CSS实现基线韵律

用CSS实现基线韵律

垂直韵律是一个经常被前端工程师们误解的排版概念

设计师们通过将内容排列在垂直网格中使作品看上去整洁和谐。如果前端工程师们能够准确地实现相同的垂直韵律,就能更加轻松快速地开发出协调一致的美观页面。而这一过程无需设计师的参与。

本文将帮助你建立在CSS中实现合适的垂直韵律的基础。首先我得澄清一下哪些问题不打算在此讨论。

这个概念已经存在很多年了。它引入一个应用于所有元素的通用line height值(或其倍数),包括内外边距,偶尔也将border的宽度纳入计算范围。

此时,根据CSS标准,页面内容会被排列在两条水平网格线的正中间。但两个不同格式的元素相邻排列时会显得很不和谐。

有一种方法能让不同字体格式的内容产生具有协调性的排版结果。那就是设定文本的基线。使用这种方法,能让所有的内容——不论其大小如何——都以同一条网格线为基准对齐。

CSS没有为此提供任何便捷的工具,因此我们必须手动做一些微调。这里有两点需要想清楚:

  1. 内容需要被移动多少;

  2. 如何高效率地移动所需的距离;

确定偏移量

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; }

查看 示例。

这也许是最简单的一个选项,但用这种方法你至少会遇到两个问题:

  1. position: relative会影响元素的堆叠顺序。如果两个元素重叠,设置了相对定位的元素会显示在顶层。有时候这会引起预期之外的z-index手动微调;

  2. 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: 30pxmargin-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实现基线韵律相关推荐

  1. 【译】CSS 十六进制颜色揭秘

    本文讲的是[译]CSS 十六进制颜色揭秘, 原文地址:CSS Hex Colors Demystified 原文作者:Dave Gash 译文出自:掘金翻译计划 本文永久链接:github.com/x ...

  2. 你不知道的css——4. 基线、中线、x-height、单位ex(含文本与图标对齐技巧)

    字母x的下边缘(线)就是CSS中的基线. ascender height: 上行线高度. cap height:大写字母高度. median: 中线. baseline:基线 descender he ...

  3. 【译】CSS动画 vs JS动画

    原文地址 目前有两个主流的方法在web上创建动画:使用CSS或JS.到底选择哪种方法来实现动画,完全取决于你的项目以及你想要达到的效果. tips: 对于简单的只出现一次的过渡效果,可以采用CSS动画 ...

  4. html禁止文本选择,[译]用CSS来禁止文本选择

    有些时候我们需要禁止网页的部分文本不能被选择.你可以使用user-select这个CSS特性来实现这个需求. 举例 下面是一个使用了disable-selection类的样式规则,当它作用于一个HTM ...

  5. [译] 关于CSS中的float和position (父容器div内的子元素div为float时,父元素无法撑开(或高度自适应)的解决方式)

    测试案例:http://blog.csdn.net/goodshot/article/details/44408245 当构建页面排版时,有不同的方法可以使用.使用哪一种方法取决于具体页面的排版要求, ...

  6. 【译】css动画里的steps()用法详解

    原文地址:http://designmodo.com/steps-c... 原文作者:Joni Trythall 我想你在css 动画里使用steps()会和我一样有很多困惑.一开始我不清楚怎样使用它 ...

  7. 【译】CSS 自定义属性的策略指南

    原文地址: www.smashingmagazine.com/2018/05/css- 译文地址: github.com/yued-fe/y-t- 译者: 波波 校对者: ziven27. 小爷 关于 ...

  8. [DIV/CSS] 【译】60个有用CSS代码片段

    2019独角兽企业重金招聘Python工程师标准>>> 1.垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,可以很优雅的 ...

  9. 转:关于垂直网格与CSS基线对其的探讨

    网页设计布局中一直比较流行网格对齐,但只是针对水平的对齐,很少或者没有涉及垂直对齐,这篇文章很详细的讲解了垂直网格,乃至基线对其的相关,而css3中的多列布局的也使其显得更为重要,因此还是很有必要去了 ...

  10. 初识css预处理器:Sass、LESS

    这篇文章是初步介绍css预处理的,详细学习请移步官网~ sass中文文档:https://www.sass.hk/docs less中文文档:http://lesscss.cn/ 什么是css预处理器 ...

最新文章

  1. iter迭代器的应用
  2. jsch mysql_java JDBC 连接MySql
  3. 2022年电商发展分析报告
  4. AndroidStudio快捷键——打开最近编辑文件列表视图——(一)
  5. UI设计超干货素材!小图标里的大学问!
  6. 经典最优滤波器(概述)
  7. 数码相机专业术语解答
  8. 模块讲解----XML模块
  9. Zookeeper案例之分布式全局唯一ID生成
  10. androidstudio图片居中_android studio textView 垂直居中
  11. CSS特效--图像悬停效果
  12. scrapy框架常用从头到尾巴
  13. 面试经历(某大型机器人少儿编程培训机构)
  14. SSR服务端渲染(nuxt重构项目)
  15. iPhone 越狱版本打包
  16. 信息系统项目管理-项目进度管理-(六)
  17. activeMQ消息发送过程与原理浅析
  18. 计算机与linux操作系统的发展
  19. 现场总线过程控制系统实验装置
  20. 通信算法之二十六:5G讲的这么简单明了

热门文章

  1. Java 8 新特性(一)lambda表达式
  2. SqlServer将特定字符串拆分并进行插入操作
  3. JS获取url参数,主域名等方法
  4. linux版Nacos安装、集群配置
  5. python数字时钟日期_Python数值日期时间笔记
  6. java foreach跳出本次循环_java控制流程最全示例
  7. python aes加密对于长字符数据丢失_Python 3中AES加密和解密的字符串字节数
  8. redis数据结构-hash
  9. java泛型范围_Java泛型类型中的通配符参数在其范围内的正式条件是什么?
  10. raft算法_MIT 6.824 分布式系统 | Lab 2A:Raft选举