资讯专栏INFORMATION COLUMN

【译】22个必备的CSS小技巧

Cristic / 3278人阅读

摘要:当它被选中时,一个设置在里的编码的字符将会显示出来。接着为我们的复选框添加一些动画效果这里是所有的编码,以及可以在这里进行体验。这是一个新的叫做的表达式。设置介于和之间的最大最小值。至今并未得到全面的支持。

</>复制代码

  1. 原文链接:22 Essential CSS Recipes
    更多译文将陆续推出,欢迎点赞+收藏+关注我的专栏,未完待续……

大家好,今天我们将会介绍一些非常实用的CSS小技巧,让我们开始吧!

混合模式


不久之前Firefox和Safari浏览器已经开始支持类似Photoshop的混合模式,但是在Chrome和Opera浏览器中需要添加前缀。举个栗子:

</>复制代码

  1. // 你也可以尝试不同的样式
  2. .blend {
  3. background: #fff;
  4. }
  5. .blend img {
  6. mix-blend-mode: darken;
  7. }

在线体验地址

渐变边框


现在,你甚至可以在边框中使用渐变。
要使用渐变边框非常简单,只需要设置一个更低z-index的伪元素即可:

</>复制代码

  1. .box {
  2. margin: 80px 30px;
  3. width: 200px;
  4. height: 200px;
  5. position: relative;
  6. background: #fff;
  7. float: left;
  8. }
  9. .box:before {
  10. content: "";
  11. z-index: -1;
  12. position: absolute;
  13. width: 220px;
  14. height: 220px;
  15. top: -10px;
  16. left: -10px;
  17. background-image: linear-gradient(90deg, yellow, gold);
  18. }

具体的例子可以看这里,或者看这里使用的是background-clipbackground-origin属性。在不久的将来,也许所有浏览器都将支持border-image属性,最终的代码会和下面一样:

</>复制代码

  1. .box {
  2. border-image: linear-gradient(to bottom, #000000 0%, #FFFFFF 100%);
  3. border-image-slice: 1; /* set internal offset */
  4. }
z-index的过渡


也许你不知道z-index同样支持过渡!在过渡的每一步中,它的值都不发生改变,所以你以为它不支持过渡——但其实它支持。
举个栗子

currentColor

我们可以使用这个方法来侦测当前的颜色,以避免经常地重复定义它。
这个方法在使用SVG图标的时候非常有用,因为它们的颜色由其父元素决定。通常我们是这么做的:

</>复制代码

  1. .button {
  2. color: black;
  3. }
  4. .button:hover {
  5. color: red;
  6. }
  7. .button:active {
  8. color: green;
  9. }
  10. .button svg {
  11. fill: black;
  12. }
  13. .button:hover svg {
  14. fill: red;
  15. }
  16. .button:active svg {
  17. fill: green;
  18. }

但我们可以使用currentColor这么做:

</>复制代码

  1. svg {
  2. fill: currentColor;
  3. }
  4. .button {
  5. color: black;
  6. border: 1px solid currentColor;
  7. }
  8. .button:hover {
  9. color: red;
  10. }
  11. .button:active {
  12. color: green;
  13. }

附上其它带有伪元素的例子:

</>复制代码

  1. a {
  2. color: #000;
  3. }
  4. a:hover {
  5. color: #333;
  6. }
  7. a:active {
  8. color: #666;
  9. }
  10. a:after,
  11. a:hover:after,
  12. a:active:after {
  13. background: currentColor;
  14. ...
  15. }
Object Fit

你是否还记得为了解决一些问题而给一幅背景图设置background-size属性的时刻呢?现在你可以使用object-fit属性啦,webkit浏览器都支持它,Firefox也将在近期予以支持。

</>复制代码

  1. .image__contain {
  2. object-fit: contain;
  3. }
  4. .image__fill {
  5. object-fit: fill;
  6. }
  7. .image__cover {
  8. object-fit: cover;
  9. }
  10. .image__scale-down {
  11. object-fit: scale-down;
  12. }


举个栗子

单选框和复选框的样式

让我们一起不使用图片来设置复选框的样式:

</>复制代码

</>复制代码

  1. input[type=checkbox] {display: none;}
  2. input[type=checkbox] + label:before {
  3. content: "";
  4. border: 1px solid #000;
  5. font-size: 11px;
  6. line-height: 10px;
  7. margin: 0 5px 0 0;
  8. height: 10px;
  9. width: 10px;
  10. text-align: center;
  11. vertical-align: middle;
  12. }
  13. input[type=checkbox]:checked + label:before {
  14. content: "2713";
  15. }


正如你所看见的,我们隐藏了原有的复选框,改为使用伪元素和伪类:checked(IE9+)来表现它。当它被选中时,一个设置在content里的Unicode编码的字符将会显示出来。

</>复制代码

  1. 值得注意的是,Unicode编码在CSS和HTML中的写法是不一样的。在CSS中它是一个以反斜杠为开始的十六进制数,而在HTML中它是十进制的,比如
    接着为我们的复选框添加一些动画效果:

</>复制代码

  1. input[type=checkbox] + label:before {
  2. content: "2713";
  3. color: transparent;
  4. transition: color ease .3s;
  5. }
  6. input[type=checkbox]:checked + label:before {
  7. color: #000;
  8. }
  9. input[type=radio] + label:before {
  10. content: "26AB";
  11. border: 1px solid #000;
  12. border-radius: 50%;
  13. font-size: 0;
  14. transition: font-size ease .3s;
  15. }
  16. input[type=radio]:checked + label:before {
  17. font-size: 10px;
  18. }


这里是所有的Unicode编码,以及可以在这里进行体验。

CSS中的计数器

总所周知CSS中是可以使用计数器的:

</>复制代码

    1. a
    2. b
    3. c

</>复制代码

  1. .list {
  2. counter-reset: i; //reset conunter
  3. }
  4. .list > li {
  5. counter-increment: i; //counter ID
  6. }
  7. .list li:after {
  8. content: "[" counter(i) "]"; //print the result
  9. }

我们定义了一个ID在counter-reset属性中作为初始值(默认为0)。你可以设置另一个值在counter-increment属性中作为每一步的递增值。

高级CSS计数器

你可以计算出有多少个复选框被用户勾选了:

</>复制代码

  1. Total selected:

</>复制代码

  1. .languages {
  2. counter-reset: characters;
  3. }
  4. input:checked {
  5. counter-increment: characters;
  6. }
  7. .total:after {
  8. content: counter(characters);
  9. }

你也可以制作一个简单的计算器:

</>复制代码

  1. Sum

</>复制代码

  1. .numbers {
  2. counter-reset: sum;
  3. }
  4. #one:checked { counter-increment: sum 1; }
  5. #two:checked { counter-increment: sum 2; }
  6. #three:checked { counter-increment: sum 3; }
  7. #four:checked { counter-increment: sum 4; }
  8. #five:checked { counter-increment: sum 5; }
  9. #one-hundred:checked { counter-increment: sum 100; }
  10. .sum::after {
  11. content: "= " counter(sum);
  12. }


它同样得以运行,请看具体的DEMO和文章。

不使用图片的菜单图标

你记得你有多么经常被迫需要一个“汉堡”图标吗?

这里有至少3个方式去实现它:
1、 Shadows

</>复制代码

  1. .shadow-icon {
  2. position: relative;
  3. }
  4. .shadow-icon:after {
  5. content: "";
  6. position: absolute;
  7. left: 0;
  8. top: -50px;
  9. height: 100%;
  10. width: 100%;
  11. box-shadow: 0 5px 0 #000, 0 15px 0 #fff, 0 25px 0 #000, 0 35px 0 #fff, 0 45px 0 #000;
  12. }

2、 Gradient

</>复制代码

  1. .gradient-icon {
  2. background: linear-gradient(to bottom, #000 0%, #000 20%, transparent 20%, transparent 40%, #000 40%, #000 60%, transparent 60%, transparent 80%, #000 80%, #000 100%);
  3. }

3、 UTF-8
你可以直接使用标准符号:☰ (Unicode: U+2630, HTML: ☰)。你也可以像其他元素那样灵活设置它的颜色或大小。看例子。
你也可以使用SVG,字体图标,或者通过伪元素设置的border边框。

@Supports

这是一个新的叫做supports的CSS表达式。顾名思义,它可以检测某些设定是否被浏览器所支持,并非所有的浏览器都支持它,但是你仍然可以使用它作为基本的检测手段:

</>复制代码

  1. @supports (display: flex) {
  2. div { display: flex; }
  3. }
  4. /*You can check prefixes*/
  5. @supports (display: -webkit-flex) or (display: -moz-flex) or (display: flex) {
  6. section {
  7. display: -webkit-flex;
  8. display: -moz-flex;
  9. display: flex;
  10. float: none;
  11. }
  12. }
visibility: visible

依你估计,把一个设置为visibility: visible的元素放在一个设置为visibility: hidden的元素里面,会发生什么?

</>复制代码

  1. .hidden {
  2. visibility: hidden;
  3. }
  4. .hidden .visible {
  5. visibility: visible;
  6. }

你可能会认为两个元素都不显示——然而事实上整个父元素都被隐藏了,而子元素不会。请看DEMO。

position: sticky


我们发现了一个新的特性,你可以新建一个sticky属性的元素。它的运行效果和fixed相同,但不会挡住任何元素。你最好看看例子
只有Mozilla和Safari浏览器支持这一属性,但你也可以像下面那样使用它:

</>复制代码

  1. .sticky {
  2. position: static;
  3. position: sticky;
  4. top: 0px;
  5. }

我们将会在支持的浏览器中得到一个sticky属性的元素,而在不支持的浏览器中它将会是一个普通的元素。这在你需要建立一个不可替代的,可以移动的元素的移动端页面的时候非常实用。

新的尺寸单位

不久之前,一些新的用以描述不同元素大小的尺寸单位问世了,它们是:

vw (viewport width) - 浏览器窗口宽度的1%。

vh (viewport height) - 同上,只不过用来描述高度。

vmin and vmax 设置介于vh和vw之间的最大最小值。

有趣的是,几乎所有的现代浏览器都能很好地支持它们,所以你可以放心地使用。
为什么我们需要这些新的单位?因为它们可以让不同的尺寸更容易被定义,你不要为父元素指定任何的百分比或者别的什么,请看例子:

</>复制代码

  1. .some-text {
  2. font-size: 100vh;
  3. line-height: 100vh;
  4. }

或者你可以设置一个漂亮的弹出框在屏幕中间:

</>复制代码

  1. .blackSquare {
  2. background: black;
  3. position: fixed;
  4. height: 50vh;
  5. width: 50vw;
  6. left: 25vw;
  7. top: 25vh;
  8. }

这看起来酷毙了,看看在codepen的例子吧~
但是目前仍然有一些关于这些新单位的不足之处:

IE9应该用vm而不是vmin。

iOS7在使用vh的时候可能会有bug。

vmax至今并未得到全面的支持。

文字修饰

我们可以通过几行代码修改文字被选中时的效果:

</>复制代码

  1. *::selection {
  2. color: #fff;
  3. background: #000;
  4. }
  5. *::-moz-selection {
  6. /*Only Firefox still needs a prefix*/
  7. color: #fff;
  8. background: #000;
  9. }

你不仅可以定义文字被选中时的颜色,还能定义阴影或者背景颜色。

触摸屏当中的元素滚动

如果你需要在触摸屏当中为一些元素设置内滚动,那么你不仅需要overflow: scroll / auto ,还需要-webkit-overflow-scrolling: touch;
实际上,移动端浏览器在某些时候并不能正确执行overflow: scroll / auto ,它可能会滚动整个页面而不是你想要的那部分。-webkit-overflow-scrolling解决了这个问题,你可以在你的实际项目中体验一下。

使用硬件加速

有时候动画可能会导致用户的电脑卡顿,你可以在特定元素中使用硬件加速来避免这个问题:

</>复制代码

  1. .block {
  2. transform: translateZ(0);
  3. }

你并不会察觉有什么不同,但浏览器会为这个元素进行3D硬件加速,在will-change这个特殊属性未被全面支持之前,这个方法还是很有用的。

Unicode Classes

你可以用Unicode符号明名class:

</>复制代码

  1. .❤ {
  2. ...
  3. }
  4. .☢ {
  5. ...
  6. }
  7. .☭ {
  8. ...
  9. }
  10. .★ {
  11. ...
  12. }
  13. .☯ {
  14. ...
  15. }

但这其实是用来搞笑的,千万不要在大型项目中使用,因为不是所有的电脑都支持Unicode符号。

垂直方向的百分比边距

实际上垂直方向的排列计算是基于父元素的宽度而不是高度。定义两个元素:

</>复制代码

</>复制代码

  1. .parent {
  2. height: 400px;
  3. width: 200px;
  4. }
  5. .child {
  6. height: 50%;
  7. padding-top: 25%;
  8. padding-bottom: 25%;
  9. width: 100%;
  10. }

理论上,子元素的高会是父元素高的一半,但是看看我们实际得到的情况:

记住,子元素的百分比是相对于父元素的宽度。

火狐浏览器的按钮边距

Firefox用它自己的方式去计算按钮的边距。这听起来有点奇怪,但它会自动地添加一些边距进去:

可以用以下方法来修复这个问题:

</>复制代码

  1. button::-moz-focus-inner,
  2. input[type="reset"]::-moz-focus-inner,
  3. input[type="button"]::-moz-focus-inner,
  4. input[type="submit"]::-moz-focus-inner {
  5. border: none;
  6. padding:0;
  7. }
Color + Border = Border-Color

很少人知道,定义了一个元素的文字颜色,意味着这个元素的边框颜色也被定义了:

</>复制代码

  1. input[type="text"] {
  2. color: red;
  3. border: 1px solid;
  4. }

古老浏览器的彩蛋

如果你仍需要适配IE7或者类似的古老浏览器,你可以在定义hack的时候使用笑脸符号,像这样:

</>复制代码

  1. body {
  2. :) background: pink;
  3. }

是不是很有趣?

</>复制代码

  1. 如果你觉得我翻译得不错,请点赞收藏并关注我的专栏,我会陆续推出更多精彩的内容。如发现任何的错漏欢迎指正,我们下次见!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/111319.html

相关文章

  • 正在暑假中《课多周刊》(第1期)

    摘要:正在暑假中的课多周刊第期我们的微信公众号,更多精彩内容皆在微信公众号,欢迎关注。若有帮助,请把课多周刊推荐给你的朋友,你的支持是我们最大的动力。原理微信热更新方案涨知识了,热更新是以后的标配。 正在暑假中的《课多周刊》(第1期) 我们的微信公众号:fed-talk,更多精彩内容皆在微信公众号,欢迎关注。 若有帮助,请把 课多周刊 推荐给你的朋友,你的支持是我们最大的动力。 远上寒山石径...

    liukai90 评论0 收藏0
  • 正在暑假中《课多周刊》(第1期)

    摘要:正在暑假中的课多周刊第期我们的微信公众号,更多精彩内容皆在微信公众号,欢迎关注。若有帮助,请把课多周刊推荐给你的朋友,你的支持是我们最大的动力。原理微信热更新方案涨知识了,热更新是以后的标配。 正在暑假中的《课多周刊》(第1期) 我们的微信公众号:fed-talk,更多精彩内容皆在微信公众号,欢迎关注。 若有帮助,请把 课多周刊 推荐给你的朋友,你的支持是我们最大的动力。 远上寒山石径...

    yintaolaowanzi 评论0 收藏0
  • CSS及布局

    摘要:经过半年的打磨,正式发布,主要是新增了一些常用组件,并使用命名,为接下来的微信小程序开发做好准备。这两种方式实现的瀑布流式布局均支持首屏和网页窗口大小改变时的列数自适应。主要是对于标准里的布局方式草案中的布局方式进行一些总结。 一劳永逸的搞定 flex 布局 寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平、垂直同时居中。记得刚开始学习 CSS 的时候,看...

    jaysun 评论0 收藏0
  • []148资源让你成为CSS专家

    摘要:层叠样式表二修订版这是对作出的官方说明。速查表两份表来自一份关于基础特性,一份关于布局。核心第一篇一份来自的基础参考指南简写速查表简写形式参考书使用层叠样式表基础指南,包含使用的好处介绍个方法快速写成高质量的写出高效的一些提示。 迄今为止,我已经收集了100多个精通CSS的资源,它们能让你更好地掌握CSS技巧,使你的布局设计脱颖而出。 CSS3 资源 20个学习CSS3的有用资源 C...

    impig33 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<