【CSS in Depth2精译】1.4 简写属性

文章目录

    • 1.4 简写属性
      • 1.4.1 当心简写属性悄悄覆盖其他样式
      • 1.4.2 记住简写值的顺序
        • 1 上、右、下、左顺序
        • 2 先水平、再垂直的顺序

1.4 简写属性

简写属性(Shorthand properties 是可以一次性设置多个属性值的样式属性。例如, font 就是一个简写属性。它可以设置多个字体属性:font-stylefont-weightfont-sizeline-height 以及 font-family

font: italic bold 18px/1.2 "Helvetica", "Arial", sans-serif;

其他常见的简写属性还有:

  • background:可设置多个背景属性,如:background-colorbackground-imagebackground-sizebackground-repeatbackground-positionbackground-originbackground-clip 以及 background-attachment
  • border:边框样式的简写属性,可以设置:border-widthborder-style 以及 border-color,并且这几个属性也都是简写属性;
  • border-width:分别是上、右、下、左四个边框宽度的简写属性。

简写属性可以让代码简洁明了,但是也隐藏了一些怪异行为。


1.4.1 当心简写属性悄悄覆盖其他样式

大多数简写属性都可以省略一些值,而只设置我们关心的样式;但重要的是您必须清楚,这么做还是会影响到那些被省略的属性,它们会被隐式地设置为各自的初始值(initial value),从而悄悄覆盖其他地方设计好的样式。例如,在不指定字体粗细(font-weight)的情况下对标题使用简写属性,该标题的字体粗细仍会被赋上一个 normal 值(如图 1.11 所示)。

图 1.11 标题的字体粗细变为了初始值

图 1.11 简写样式 font: 32px sans-serif 将字体粗细和其他省略属性设为了初始值(initial value)

按如下代码更新样式表来验证上述过程。

代码清单 1.19 缩写属性指定所有关联值

h1 {font-weight: bold;
}
.title {font: 32px Helvetica, Arial, sans-serif;
}

乍一看, 似乎 <h1 class="title"> 会将标题加粗,但并非如此。代码清单 1.19 等价于以下代码:

代码清单 1.20 与代码清单 1.19 等价的展开后的简写属性

h1 {font-weight: bold;
}
.title {/* 这些属性的初始值都是 normal */font-style: normal;font-variant: normal;font-weight: normal;font-stretch: normal;line-height: normal;font-size: 32px;font-family: Helvetica, Arial, sans-serif;
}

这就意味着给 <h1> 元素设置简写样式得到的只是普通粗细的字体,并非粗体字。此外,它还会覆盖从某个祖先元素继承来的其他字体样式。在所有的简写属性中, font 的问题最为严重,因为受其干扰的样式属性实在是太多了。也正是这个原因,除非在 <body> 元素上设置通用样式,我一般都尽量避免用 font 来添加样式。其他简写样式可能也会遇到类似的问题,因此还请务必当心。


1.4.2 记住简写值的顺序

简写属性在指定样式的顺序上没那么严格。设置 border: 1px solid black 或者 border: black 1px solid 都是有效的。这是因为浏览器知道哪个值对应宽度、哪个值对应颜色、哪个值又对应边框样式。

但有不少属性的值是很容易混淆的。在这种情况下,理解并牢记这些样式值的顺序就显得至关重要了,尤其是那些会经常用到的简写属性。

1 上、右、下、左顺序

当遇到像 marginpadding 这样的属性、或者需要指定元素四条边上的边框样式时,开发人员尤其容易弄错这些简写样式的顺序。这些属性值是按顺时针方向、从顶部开始排列的。

记住这个顺序可以少走很多弯路。单词 TRouBLe 可以用作该顺序的记忆口诀:Top(上)、Right(右)、Bottom(下)、Left(左)。

下面就用这个口诀来设置元素各边的内边距。如图 1.12 所示,给导航链接分别指定 10px 的上内边距、15px 的右内边距、0 像素的下内边距、以及 5px 的左内边距。虽然看起来不太匀称,但足以说明这一排序规则:

图 1.12 每一侧的内边距都各不相同

图 1.12 声明 padding: 10px 15px 0 5px 后每一侧的内边距都不同

相应的 CSS 样式代码如下:

代码清单 1.21 给元素的每一边指定内边距

.nav a {color: white;background-color: #13a4a4;padding: 10px 15px 0 5px; /* 上、右、下、左内边距 */border-radius: 2px;text-decoration: none;
}

这种写法还可以再精简。如果声明结束时还有一个值没指定,则没有值的一边会和它对边的取值相同:指定三个值,左右两边用的是第二个值;指定两个值,则上下两边用第一个值,左右两边用第二个值;要是只有一个值,则将其应用到所有四个边。因此,下列声明都是等价的:

padding: 1em 2em;
padding: 1em 2em 1em;
padding: 1em 2em 1em 2em;

同理,以下声明也是等价的:

margin: 1em;
margin: 1em 1em;
margin: 1em 1em 1em;
margin: 1em 1em 1em 1em;

对许多开发人员而言,这当中最棘手的就是只有三个值的情形。请记住,三个值分别指定了上、右、下三个方向。因为左边方向的值缺失了,它的样式值与右侧相同,即左右两边的值皆为第二个值。因此,声明 padding: 10px 15px 0 会给左右两侧 15px 的内边距,与此同时顶部内边距为 10px,底部为 0。

但大多数情况下只需要设置两个值。尤其是像按钮或者本例中的导航链接这样较小的页面元素,左右两边的内边距最好比上下内边距更宽,这样显得更美观一些(如图 1.13 所示)。

图 1.13 很多元素增大水平内边距后会更好看些
图 1.13 很多元素增大水平内边距后会更好看些

按以下代码更新样式表。它利用简写属性先设置了垂直方向上的内边距,然后再设置水平方向的内边距。

代码清单 1.22 指定两个内边距

.nav a {color: white;background-color: #13a4a4;padding: 5px 15px; /* 先是上下内边距,再是左右内边距 */border-radius: 2px;text-decoration: none;
}

由于很多常见属性都遵循这个顺序,所以最好记住它。

2 先水平、再垂直的顺序

TRouBLe 口诀仅适用于给盒子四周设置简写属性的情形。其他一些属性最多只支持两个值,比如:background-positionbox-shadowtext-shadow(严格来讲它们并不算简写属性)。与 padding 这样需要四个值的属性相比,它们的属性值顺序恰巧是相反的。padding: 1em 2em 先指定垂直方向上的上/下属性值,再是水平方向的左/右属性值;而 background-position: 25% 75% 则先指定水平方向的属性值,然后才是垂直方向的值。

尽管这个看似相反的顺序有些违背人的直觉,但道理很简单:这两个值代表了一个笛卡尔网格(即平面直角坐标系)。笛卡尔网格的测量结果常按 x、y 的顺序给出(先水平再垂直)。打个比方,想要给如图 1.14 所示的元素添加一个阴影效果,就得首先指定 x(水平)值。

图 1.14 盒子的阴影位置为 10px 2px
图 1.14 盒子的阴影位置为 10px 2px

该元素对应的样式代码如下:

代码清单 1.23 box-shadow 先指定 x 值再指定 y 值

.nav .featured {background-color: orange;box-shadow: 10px 2px #6f9090; /* 阴影向右偏移 10px、向下偏移 2px */
}

第一个(较大的)值指定了水平偏移量,第二个(较小的)值指定了垂直偏移量。

如果属性需要指定相对某个位置出发的两个方向上的值,就多想想“笛卡尔网格”;如果属性需要指定元素四周环绕的每个方向上的值,则多想想“时钟”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

柯桥商务英语培训|老外和你说Tom和Jack,可不是在说人名!所以是啥意思?

小明和小李&#xff0c;这两个人在中国相信没有谁不认识他们了。而且有关他们的梗更是传遍大街小巷。 例如&#xff1a;小明他爷爷活了103岁&#xff0c;小明做数学题&#xff0c;又或者是小李的老婆比小明小2岁等等。 其实在国外&#xff0c;也有这么两个人像小明、小李一样&a…

面向对象的进阶---static

1.static 静态变量 package com.itheima.a01staticdemo01;public class Student {private String name;private int age;public static String teacherName;public Student() {}public Student(String name, int age) {this.name name;this.age age;}/*** 获取* return n…

FPGA 690T 高速存储设计

高速存储设计会有各种需求的考虑&#xff0c;那么对应的方案也不完全相同&#xff0c;这篇文章出一期纯FPGA实现的高速存储方案。用纯fpga实现高速存储板卡有易国产化&#xff0c;功耗低和体积小等特点&#xff0c;缺点就是灵活性不是很强&#xff0c;实现标准ext4和nfs文件系统…

让你的 Python 代码更快的小技巧

我们经常听到 “Python 太慢了”&#xff0c;“Python 性能不行”这样的观点。但是&#xff0c;只要掌握一些编程技巧&#xff0c;就能大幅提升 Python 的运行速度。 今天就让我们一起来看下让 Python 性能更高的 9 个小技巧 python学习资料分享&#xff08;无偿&#xff09;…

java:JWT的简单例子

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.springf…

U-Net for Image Segmentation

1.Unet for Image Segmentation 笔记来源&#xff1a;使用Pytorch搭建U-Net网络并基于DRIVE数据集训练(语义分割) 1.1 DoubleConv (Conv2dBatchNorm2dReLU) import torch import torch.nn as nn import torch.nn.functional as F# nn.Sequential 按照类定义的顺序去执行模型&…

安卓开发使用proxyman监控真机

1、真机跟电脑连接到同个网络中 2、手机里面设置代理&#xff0c;代理地址为proxyman上面指示的地址。 3、一般情况下&#xff0c;电脑的对应的端口是没开放的。需要到防火墙里面新建规则。入站规则 选择端口输入上方端口号 这样就能监控到了

计算机系统基础实训六-ShellLab实验

实验目的与要求 1、让学生更加理解进程控制的概念和具体操作方法&#xff1b; 2、让学生更加理解信号的概念和具体使用方法&#xff1b; 3、让学生更加理解Unix shell程序的原理和实现方法&#xff1b; 实验原理与内容 shell是一种交互式的命令行解释器&#xff0c;能代表…

Apple - Cryptographic Services Guide

本文翻译自&#xff1a;Cryptographic Services Guide&#xff08;更新时间&#xff1a;2018-06-04 https://developer.apple.com/library/archive/documentation/Security/Conceptual/cryptoservices/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011172 文章目录…

Butter Knife 8

// 部分代码省略… Override public View getView(int position, View view, ViewGroup parent) { ViewHolder holder; if (view ! null) { holder (ViewHolder) view.getTag(); } else { view inflater.inflate(R.layout.testlayout, parent, false); holder new ViewHolde…

电路仿真实战设计教程--平均电流控制原理与仿真实战教程

1.平均电流控制原理: 平均电流控制的方块图如下,其由外电路电压误差放大器作电压调整器产生电感电流命令信号,再利用电感电流与电流信号的误差经过一个电流误差放大器产生PWM所需的控制电压,最后由控制电压与三角波比较生成开关管的驱动信号。 2.电流环设计: 根据状态平…

外部存储器

外部存储器是主存的后援设备&#xff0c;也叫做辅助存储器&#xff0c;简称外存或辅存。 它的特点是容量大、速度慢、价格低&#xff0c;可以脱机保存信息&#xff0c;属于非易失性存储器。 外存主要有&#xff1a;光盘、磁带、磁盘&#xff1b;磁盘和磁带都属于磁表面存储器…

【Java毕业设计】基于JavaWeb的服务出租系统

本科毕业设计论文 题目&#xff1a;房屋交易平台设计与实现 系 别&#xff1a; XX系&#xff08;全称&#xff09; 专 业&#xff1a; 软件工程 班 级&#xff1a; 软件工程15201 学生姓名&#xff1a; 学生学号&#xff1a; 指导教师&#xff1a; 导师1 导师2 文章目录 摘…

从零对Transformer的理解(台大李宏毅)

Self-attention layer自注意力 对比与传统cnn和rnn&#xff0c;都是需要t-1时刻的状态然后得到t时刻的状态。我不知道这样理解对不对&#xff0c;反正从代码上看我是这么认为的。而transformer的子注意力机制是在同一时刻产生。意思就是输入一个时间序列&#xff0c;在计算完权…

PostgreSQL的学习心得和知识总结(一百四十五)|深入理解PostgreSQL数据库之ShowTransactionState的使用及父子事务有限状态机

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

信息技术课如何禁止学生玩游戏

在信息技术课上禁止学生玩游戏是一个常见的挑战&#xff0c;但可以通过一系列策略和工具来有效地实现。以下是一些建议&#xff1a; 明确课堂规则和纪律&#xff1a; (1)在课程开始时&#xff0c;明确告知学生课堂规则和纪律&#xff0c;包括禁止玩游戏的规定。 (2)强调遵守…

[Qt] QtCreator编辑区关闭右侧不必要的警告提示

在代码编辑页面&#xff0c;右侧总会出现一些即时Waring&#xff0c;不想看见&#xff1f; 取消勾选插件管理中的ClangCodeModel 插件即可

Linux 内核权限提升漏洞CVE-2024-1086三种修复方法

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享。一、漏…

NLP大语言模型的缩放定律

一、简述 ​论文《神经语言模型的缩放定律》包含对交叉熵损失的语言模型性能的经验缩放定律的研究&#xff0c;重点关注Transformer架构。 https://arxiv.org/pdf/2001.08361.pdfhttps://arxiv.org/pdf/2001.08361.pdf 实验表明&#xff0c;测试损失与模型大小、数据集…

已解决VirtualMachineError: 虚拟机错误的正确解决方法,亲测有效!!!

已解决VirtualMachineError: 虚拟机错误的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 分析错误日志 优化代码 内存泄漏排查 优化递归调用 调整JVM参数 使用监控工具 增加物理内存或升级硬件…