CSS 中的简写到底有多少坑?以后不敢了...

73259a06ab74f16c19197ca334bf6be5.gif

作者 | 零一

来源 | 前端印象

简写(语法糖)可能给我们编码带来了很多便利,但简写也会带来一些问题,今天来讨论一下 CSS 中的简写的"爱恨情仇"

为什么说是爱恨情仇呢?因为简写给我们带来了很多的便利,但凡事都有好有坏,你不能说简写一点坏处都没有。所以我们就聊聊简写的 "好" 和 "坏"

background

这个 CSS 属性大家肯定是再熟悉不过了,给元素设置背景色

是这样?

.demo {background: #333;
}

还是这样?

.demo {background-color: #333;
}

应该都有吧,换作我自己,平常这两者用哪个好像也是看心情,如果你说肯定用前者啊,因为前者就一个单词,那其实后者也不麻烦,现在大家都用编辑器,在智能提示的辅佐下输入 bgc 再按回车就能打出 background: ; 了,其实也不麻烦。

a58059664fd508abfff0b48c7d6f19be.png

bgc

回到正题,其实这两者写法我更推荐后者,为什么?来看个例子🌰

<style>.demo {background: #333;  /* 给元素设置了背景色#333 */}/* ... 中间隔了很多样式代码 */.demo:hover {background: url("example.png"); }
</style><div class="demo"/>

这个场景很简单:鼠标移到元素上就展示某张照片,未加载前用一个纯色占位

然而实际效果是?

a991c0aa08461eb39f41618e75fb721d.gif

效果不尽人意

为了效果明显,我加了边框、文字,网速调成 slow 3G

可以看到 hover 时的 background 覆盖掉了前者的 background,使得效果差强人意

是因为前者和后者都是 background,所以后者自然会覆盖前者吗?不全是

即便我们前者用的 background-color: #333;,也仍然会被后者覆盖

大家都知道 background 是一个语法糖,即很多属性的简写 👇

a06129076d8ca9429c9fd6169a1813ec.png

那像例子中用 background: url('example.png')时,做了什么呢?

37bf62d9e5768ff6437d2d5803b91499.png

如上图所示,它默认把所有值都设置成了 initial,因此无论之前用到了其中哪个值都会被覆盖,虽然 initial 设置了跟没设置是一样,都表示保持元素该属性的初始值

会不会有人想说:我一直都这么用的,都没遇到啥问题啊!

我只想说一句:可能运气比较好,等代码比较复杂了,你可能会回来补这个窟窿的

结论:这就是一个简写造成的隐患,大家能避免则避免

margin

又提了一个大家再熟悉不过的属性 margin,这里面又有啥坑呢?没啥坑,就是想介绍一下其它用法

以下都是它的简写:

  • margin: 10px 20px 30px 40px

  • margin: 10px 20px 30px

  • margin: 10px

这些简写确实帮我们省去了不少的代码量

让我们投身到一个例子🌰中:现在我想让我的元素水平居中,我想用 margin 来实现

<style>.parent {width: 300px;height: 300px;border: 1px solid black;}.child {width: 100px;height: 100px;background-color: red;margin: auto;  /* 水平居中 */}
</style><div class="parent"><div class="child"/>
</div>

效果如你所愿:

99cdd1f6a761f431dc23229e67c0f041.png

但你使用 margin: auto 时有没有那么一瞬间想过,前面是否设置过 margin-topmargin-bottom 呢?比如这样:

<style>.parent {width: 300px;height: 300px;border: 1px solid black;}+ .child {
+   margin-top: 100px;
+ }+ /* ...省略几百行代码 */.child {width: 100px;height: 100px;background-color: red;margin: auto;  /* 水平居中 */}
</style><div class="parent"><div class="child"/>
</div>

预期的效果是什么样的?而此时的效果是什么样的?

b1d59a9b34f75e5bf156884852c99bd4.png

预期的效果

b57ca6212be286ab10efda2bfbdabf72.png

现在的效果

可以看到,预期是想要既水平居中,又距离顶部100px,而现在margin-top被覆盖了

其实你单纯想实现水平居中完全没必要用margin: auto,因为你本意是不想去修改顶部和底部的间距的,只是因为你用了这个简写,不得不这么做

不然试试另一个简写?让你只处理水平的间距

<style>.parent {width: 300px;height: 300px;border: 1px solid black;}.child {margin-top: 100px;}/* ...省略几百行代码 */.child {width: 100px;height: 100px;background-color: red;
-   margin: auto;  /* 水平居中 */
+   margin-inline: auto;  /* 真正的只是水平居中 */}
</style><div class="parent"><div class="child"/>
</div>

这样同样能实现我们想要的效果,且不会影响 margin-topmargin-bottom 的属性

那同理,有没有能只影响竖直方向的 margin 的简写呢?当然有,那就是 margin-block

一起来看另一个例子🌰

<style>.parent {position: relative;border: 1px solid black;width: 300px;height: 300px;}.child {position: absolute;top: 0;bottom: 0;left: 0;right: 0;width: 100px;height: 100px;margin: auto;background-color: red;}
</style><div class="parent"><div class="child"/>
</div>

效果如下:

1183083e4eec96ec5dbd0db41d3b1c21.png

这是一种对于非相对定位的垂直水平居中方法(记好了,面试官问你垂直水平居中的方法又多了一个),我是从 HTML 原生的 <dialog/> 标签中了解到的。

1f8c8d9a3e1b8ac5c7cc5165e220aeda.png

dialog的水平居中实现

为什么要用这个例子呢,我就是想引申出这个知识点,跟大家分享一下我最近看到的小 tips

我们可以删除 margin: auto,用上前面说的 margin-inline: automargin-block: auto

62fb760a64c6d820ad9569190935ed67.png

840df9092923fbaca63da5a6d0bfc488.png

结论:margin 的简写不如 background 那么复杂,但使用上了 margin-inlinemargin-block 也可以给自己降低心智负担

inset

上面说了那么多简写带来的隐患,要不再来说说简写带来的好处?

还是举个例子🌰

<style>.parent {position: relative;border: 3px solid blue;margin: 200px;width: 300px;height: 300px;}.child {position: absolute;top: 0;bottom: 0;left: 0;right: 0;background-color: red;}
</style><div class="parent"><div class="child"/>
</div>

这段代码大家应该都很熟悉,我们给 .child 元素设置成了绝对定位,并赋予了以下属性:

  • top: 0;

  • bottom: 0;

  • left: 0;

  • right: 0;

然后元素就撑满父元素了,达到了 width: 100% + height: 100% 的效果,那为啥不直接设置宽高都 100% 呢?只用设置两个属性

❌❌❌ 不这么做的原因还是要回到 position 本身,当一个元素脱离文档流时,若未设置 top、bottom、left、right,默认元素停留的位置就是其未脱离文档流时的位置

可能有点绕,直接上张图

d30692248d9279af1bfde7ed96ef197d.png

cd3e792785b5bfca4075c99ea15974bf.png

可以看到,这个元素在脱离文档流后,仍然是停留在它处于文档流时的位置,那此时如果给他设置宽高 100% 会是什么样呢?

1711f6bbcbf75d03d6b154e1c6e8b4ee.png

漂亮,超出父元素了,虽然解决这个问题也很简单,直接加一个 left: 0 即可但我们还有更简单的方法,那就是用 inset 这个属性

其实 inset 就是 top、right、bottom、left 的简写,不知道为什么,我看过很多人的代码,都没用过这个属性,所以也给大家安利一下

语法跟 margin 类似,因此我们用它来简化刚才的代码

<style>.parent {position: relative;border: 3px solid blue;margin: 200px;width: 300px;height: 300px;}.child {position: absolute;
-   top: 0;
-   bottom: 0;
-   left: 0;
-   right: 0;
+   inset: 0;background-color: red;}
</style><div class="parent"><div class="child"/>
</div>

这里为什么我又推荐大家用 inset 了呢?本质是因为此处我们确实是需要同时设置上下左右四个值的,那为何不用 inset 呢?

border

😖 天呐,受不了了!怎么全是平时常用到的属性,有这么多坑吗?

其实 border 这个还好,还是建议用简写的哈,只不过有一个特殊的 case,想给大家分享一下,避免踩坑

有这样一个场景:一个元素本身没有边框,当鼠标移入时出现边框,边框从有到无要有过渡动画;同时鼠标移除,边框消失,也伴随有过渡动画

<style>.demo {width: 100px;height: 100px;background-color: lightblue;border: none;box-sizing: border-box;transition: border 1s linear;}.demo:hover {border: 4px solid red}
</style><div class="demo"/>

大部分人都会这么写对不对?效果如何呢?可惜只成功了一半!

5218bf04bbb2a962fe847ee4d0457014.gif

为什么鼠标移出时,border 的过渡动画消失了?

b7adb22a5776fc9b1f216f580a388c1e.png

图中可以看到,border: none 其实就是把 border-style 设置成了 none,大家都知道 transition 对于 border 的过渡动画其实是针对 border-colorborder-width 的,但如果 border-style 都没有,那还怎么看得到过渡动画呢?

所以我们想要实现鼠标移出时的过渡动画,就不能用 border: none 这个简写了,那该怎么办?

我想到了一个思路,可能不是最完美的,但根本看不出瑕疵,大家可以借鉴一下:

将元素的 border 初始状态设置为 border: 0px solid transparent,这样既保证了 border-style 的存在,又能保证边框会从 4px 过渡到 0px,颜色也从 过渡到

效果如下:

6b1dd5ffc8d035e3d0ce821594f90933.gif

总结

对于 「我们到底该如何使用简写?」 这个问题,我认为:需要一次性设置简写属性中全部或绝大部分属性时,可以使用简写;反之,则不太应该使用简写。

2e9332816bb91a7f176e699761ec6e6d.gif

往期推荐

Cluster 集群能支撑的数据有多大?

Kubernetes 上容器的启动顺序如何把控?

Redis 内存满了怎么办?这样置才正确!

手工模拟实现 Docker 容器网络!

919a3bd752450f05ae7860c7e0982e3c.gif

点分享

e285c3cca5bae0d68251479ff5c1f205.gif

点收藏

cedd33d3486cef8c1a31e6a444948a55.gif

点点赞

04d1c9e3279c3a5ad3546e2def99b47c.gif

点在看

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

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

相关文章

智能巡检云监控指标的实践

简介&#xff1a;在真实的企业生产中&#xff0c;对研发和运维的同学都会面临一个十分繁复且艰难的问题&#xff0c;就是对指标的监控和告警。具体我枚举一些特定的问题请对号入座&#xff0c;看看在算力爆炸的时代能否通过算力和算法一起解决&#xff01; 背景介绍 在真实的…

新常态成型,飞连联手Forrester聚焦数字化办公新体验

随着互联网技术不断发展&#xff0c;在企业办公领域时间与空间的限制正在逐步消弭。但是&#xff0c;当企业面对内外部大量的不确定因素时&#xff0c;以往的办公模式无论是效率、安全性还是体验等各方面都将大打折扣。而在数字时代&#xff0c;混合办公模式则有望成为企业办公…

聊聊我们在业务链路升级中做的数据洞察

简介&#xff1a;关于数据相关的词条很多&#xff0c;虽然有不同的定义&#xff0c;但是本质上是相辅相成&#xff0c;通常结合使用才能拿到结果。类比词条诸如 数据分析&#xff0c;数据挖掘&#xff0c; 数据洞察。本文将聊聊我们在业务链路升级中做的数据洞察。 作者 | 金铎…

阿里云佘俊泉:创新探索不停,边缘云持续为客户创造价值

简介&#xff1a;在12月15日上午举办的分布式云领袖论坛中&#xff0c;阿里云边缘云产品负责人佘俊泉先生发表了《阿里云边缘云产品创新与场景探索》的主题演讲&#xff0c;分享了阿里云在边缘云领域的探索和思考&#xff0c;如何从产品演进、技术创新、场景应用等方面助力企业…

oracle 如何迁移到 mysql_怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL...

有时候我们有迁移数据库的需求&#xff0c;例如从Oracle迁移到SQL Server&#xff0c;或者从MySQL迁移到Oracle。很多江湖好汉一时不知如何手工操作&#xff0c;所幸的是Navicat提供了迁移的自动化操作界面。当然&#xff0c;Navicat的数据库迁移无法做到完美&#xff0c;一些依…

深度解析单线程的 Redis 如何做到每秒数万 QPS 的超高处理能力!

作者 | 张彦飞allen来源 | 开发内功修炼服务器端只需要单线程可以达到非常高的处理能力&#xff0c;Redis 就是一个非常好的例子。仅仅靠单线程就可以支撑起每秒数万 QPS 的高处理能力。今天我们就来带大家看看 Redis 核心网络模块的内部实现&#xff0c;学习下 Redis 是如何做…

阿里云李克:边缘云技术发展与实践

简介&#xff1a;7年磨砺&#xff0c;阿里云边缘云的技术积累和沉淀哪了些&#xff1f;今年全面升级后的技术形态具有什么特性&#xff1f;它可以成熟地赋能哪些商业化技术应用场景&#xff1f;阿里云资深技术专家李克带来分享。 备受关注的2021全球分布式云大会深圳站于12月1…

小程序下一破局点?钉钉小程序卡片,应用与平台的深度集成

简介&#xff1a;卡片技术在钉钉上的运用。 20秒了解小程序卡片 案例1&#xff1a;幸福大巴一键抢座 “幸福大巴”是阿里员工在域内使用的城际客运功能&#xff0c;但因为需要来回跳转VPN工具和H5页面&#xff0c;在用户体验上带来了一定的障碍 抢座流程对比&#xff1a; 以…

建站就用这个方法,无需购买服务器10分钟快速部署你的静态网页

简介&#xff1a;阿里云云开发平台重磅推出开源应用中心&#xff0c;聚合最热门的开源应用&#xff0c;让你像安装app一样快速上线一个网站。面向新人和持续活跃的开发者用户推出上线激励加油包&#xff0c;最高100元无门槛代金券免费送&#xff0c;现在体验还能够领取年轻人的…

用 Spring boot 简单搭建一个微服务项目

作者 | 桃花键神来源 | CSDN博客前言&#xff1a;工欲善其事&#xff0c;必先利其器。在对Spring Cloud各部分组件进行具体介绍之前&#xff0c;我们会对Spring Cloud微服务的基础Spring Boot进行介绍。Spring Boot是Spring一套快速配置开发的脚手架&#xff0c;可以基于Spring…

云未来、新可能 - 绿色、无处不在、可信的计算

简介&#xff1a;阿里云资深技术专家、容器服务研发负责人易立在大会主论坛进行了主题为 “云未来&#xff0c;新可能” 的演讲&#xff0c;分享了阿里云基于大规模云原生实践下的技术趋势判断和技术创新进展。 2021 年 12 月 9 日至 10 日&#xff0c;KubeCon CloudNativeCo…

线上教育核心竞争力是什么?声网发布在线素质、职业教育解决方案

5月11日&#xff0c;声网在线上举办了主题为“聚焦场景力&#xff0c;释放生态力”的在线教育发布会&#xff0c;正式发布了新生态下在线教育多场景教学解决方案&#xff0c;包括在线音乐、在线美术、在线职业教育、在线编程、Stem在线教学解决方案。同时为兼顾降低教学场景研发…

ClickHouse Keeper 源码解析

简介&#xff1a;ClickHouse 社区在21.8版本中引入了 ClickHouse Keeper。ClickHouse Keeper 是完全兼容 Zookeeper 协议的分布式协调服务。本文对开源版本 ClickHouse v21.8.10.19-lts 源码进行了解析。 作者简介&#xff1a;范振&#xff08;花名辰繁&#xff09;&#xff0c…

pidof -x 不管用_专业摄影师最佳助手富士X-T200评测

作为X-T100的升级款&#xff0c;X-T200可谓是一经发布就受到了众多关注。相对来说&#xff0c;前作X-T100我们认为已经足够出色&#xff0c;而这次的富士X-T200又有多方面的提升&#xff0c;尤其是视频及视频对焦性能。关于这款机器实际的表现究竟如何我们接下去看。富士X-T200…

Oracle数据到MaxCompute乱码问题详解

简介&#xff1a;集成Oracle数据到MaxCompute&#xff0c;乱码问题分析&#xff1b; 为什么&#xff0c;在oracle数据不乱码&#xff0c;集成到MaxCompute就乱码了? 问题在哪里&#xff1f; 1.1 乱码现象 DataWorks的数据离线集成(DataX)集成Oracle数据到MaxCompute的数据有…

Gartner:2022年全球半导体收入预计将增长13.6%

半导体元件供应链所受到的限制预计将在2022年逐步缓解 根据Gartner的预测&#xff0c;2022年全球半导体收入预计将达到6760亿美元&#xff0c;相比2021年增长13.6%。 Gartner研究副总裁Alan Priestley表示&#xff1a; “由于芯片短缺而引发的半导体平均销售价格&#xff08;AS…

V8 编译浅谈

简介&#xff1a;本文是一个 V8 编译原理知识的介绍文章&#xff0c;旨在让大家感性的了解 JavaScript 在 V8 中的解析过程。 作者 | 子弈 来源 | 阿里技术公众号 一 简介 本文是一个 V8 编译原理知识的介绍文章&#xff0c;旨在让大家感性的了解 JavaScript 在 V8 中的解析过…

rabbitmq接收不到消息 防火墙_用PHP+RabbitMQ实现消息的发送和接收

消费者&#xff1a;接收消息逻辑&#xff1a;创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息<?php /************************************* * PHP amqp(RabbitMQ) Demo - consumer * Author: Linvo * Date: 2018/7/…

斩获大奖|阿里云PolarDB-X引领云原生分布式数据库新时代

简介&#xff1a;阿里云原生分布式数据库PolarDB-X荣获“2021年度最佳分布式数据库”。 12月15-16日&#xff0c;以“引领分布式云变革 助力湾区数字经济”为主题的全球分布式云大会在深圳隆重召开&#xff0c;本届大会由全球分布式云联盟、深圳科技交流服务中心、深圳市通信学…

Gartner:2022年中国IT支出预计将突破5.5亿美元

2022年全球IT支出预计将达到4.4万亿美元&#xff0c;2022年中国IT支出预计将突破5.5亿美元&#xff0c;相比2021年增长7.76% 分析、云计算、无缝客户体验和安全等领域将成为首席信息官的重点采购和投资领域 根据Gartner的最新预测&#xff0c;2022年全球IT支出预计将达到4.4万亿…