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

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

混合模式

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

1// 你也可以尝试不同的样式

2

3.blend {

4background: #fff;

5}

6.blend img {

7mix-blend-mode: darken;

8}

体验地址:http://ilyashubin.github.io/FilterBlend/

渐变边框

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

1.box {

2margin:80px30px;

3width:200px;

4height:200px;

5position: relative;

6background: #fff;

7float: left;

8}

9.box:before {

10content:'';

11z-index:-1;

12position: absolute;

13width:220px;

14height:220px;

15top:-10px;

16left:-10px;

17background-image: linear-gradient(90deg, yellow, gold);

18}

具体的例子可以看这里(https://jsfiddle.net/4qypuono/),或者看这里(https://codepen.io/anon/pen/jEOGJe)使用的是background-clip和background-origin属性。

在不久的将来,也许所有浏览器都将支持border-image属性,最终的代码会和下面一样:

1.box {

2border-image: linear-gradient(to bottom, #0000000%, #FFFFFF100%);

3border-image-slice:1;/* set internal offset */

4}

z-index的过渡

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

举个栗子→(http://zomigi.com/demo/z-index_transition.html)

currentColor

我们可以使用这个方法来侦测当前的颜色,以避免经常地重复定义它。

顺便给大家推荐一个裙,它的前面是 537,中间是631,最后就是 707。想要学习前端的小伙伴可以加入我们一起学习,互相帮助。群里每天晚上都有大神免费直播上课,如果不是想学习的小伙伴就不要加啦。

 这个方法在使用SVG图标的时候非常有用,因为它们的颜色由其父元素决定。通常我们是这么做的:

1.button {

2color: black;

3}

4.button:hover {

5color: red;

6}

7.button:active {

8color: green;

9}

10

11.button svg {

12fill: black;

13}

14.button:hover svg {

15fill: red;

16}

17.button:active svg {

18fill: green;

19}

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

1svg {

2fill: currentColor;

3}

4

5.button {

6color: black;

7border:1px solid currentColor;

8}

9.button:hover {

10color: red;

11}

12.button:active {

13color: green;

14}

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

1a {

2color: #000;

3}

4a:hover {

5color: #333;

6}

7a:active {

8color: #666;

9}

10

11a:after,

12a:hover:after,

13a:active:after {

14background: currentColor;

15...

16}

Object Fit

你是否还记得为了解决一些问题而给一幅背景图设置background-size属性的时刻呢?

现在你可以使用object-fit属性啦,webkit浏览器都支持它,Firefox也将在近期予以支持。

1.image__contain {

2object-fit: contain;

3}

4.image__fill {

5object-fit: fill;

6}

7.image__cover {

8object-fit: cover;

9}

10.image__scale-down {

11object-fit: scale-down;

12}

举个栗子→(https://codepen.io/CSSKing/pen/XJEZeG)

单选框和复选框的样式

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

1

2

3Checkbox

1

2input[type=checkbox] {display: none;}

3

4input[type=checkbox] + label:before {

5content:"";

6border:1px solid #000;

7font-size:11px;

8line-height:10px;

9margin:05px00;

10height:10px;

11width:10px;

12text-align: center;

13vertical-align: middle;

14}

15

16input[type=checkbox]:checked + label:before {

17content:"\2713";

18}

正如你所看见的,我们隐藏了原有的复选框,改为使用伪元素和伪类:checked(IE9+)来表现它。

当它被选中时,一个设置在content里的Unicode编码的字符将会显示出来。

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

1

2input[type=checkbox] + label:before {

3content:"\2713";

4color: transparent;

5transition: color ease.3s;

6}

7input[type=checkbox]:checked + label:before {

8color: #000;

9}

10

11

12input[type=radio] + label:before {

13content:"\26AB";

14border:1px solid #000;

15border-radius:50%;

16font-size:0;

17transition: font-size ease.3s;

18}

19input[type=radio]:checked + label:before {

20font-size:10px;

21}

这里(https://unicode-table.com/en/)是所有的Unicode编码,以及可以在这里(https://codepen.io/anon/pen/CdzwB)进行体验。

CSS中的计数器

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

1

2

3

  • a
  • 4

  • b
  • 5

  • c
  • 6

    1

    2.list {

    3counter-reset: i;//reset conunter

    4}

    5.list > li {

    6counter-increment: i;//counter ID

    7}

    8.list li:after {

    9content:"["counter(i)"]";//print the result

    10}

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

    顺便给大家推荐一个裙,它的前面是 537,中间是631,最后就是 707。想要学习前端的小伙伴可以加入我们一起学习,互相帮助。群里每天晚上都有大神免费直播上课,如果不是想学习的小伙伴就不要加啦。

    高级CSS计数器

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

    1

    2

    3C

    4C++

    5C#

    6Java

    7JavaScript

    8PHP

    9Python

    10Ruby

    11

    12

    13Total selected:

    14

    1

    2.languages {

    3counter-reset: characters;

    4}

    5input:checked {

    6counter-increment: characters;

    7}

    8.total:after {

    9content: counter(characters);

    10}

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

    1

    2

    31

    42

    53

    64

    75

    8100

    9

    10

    11Sum

    12

    1

    2.numbers {

    3counter-reset: sum;

    4}

    5

    6#one:checked { counter-increment: sum1; }

    7#two:checked { counter-increment: sum2; }

    8#three:checked { counter-increment: sum3; }

    9#four:checked { counter-increment: sum4; }

    10#five:checked { counter-increment: sum5; }

    11#one-hundred:checked { counter-increment: sum100; }

    12

    13.sum::after {

    14content:'= 'counter(sum);

    15}

    它同样得以运行,请看具体的DEMO(https://codepen.io/CSSKing/pen/vEeMey)和文章(https://codersblock.com/blog/fun-times-with-css-counters/)。

    不使用图片的菜单图标

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

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

    1、 Shadows

    1.shadow-icon {

    2position: relative;

    3}

    4.shadow-icon:after {

    5content:"";

    6position: absolute;

    7left:0;

    8top:-50px;

    9height:100%;

    10width:100%;

    11box-shadow:05px0#000,015px0#fff,025px0#000,035px0#fff,045px0#000;

    12}

    2、 Gradient

    1.gradient-icon {

    2background: linear-gradient(to bottom, #0000%, #00020%, transparent20%, transparent40%, #00040%, #00060%, transparent60%, transparent80%, #00080%, #000100%);

    3}

    3、 UTF-8 你可以直接使用标准符号:☰ (Unicode: U+2630, HTML: ☰)。你也可以像其他元素那样灵活设置它的颜色或大小。

    顺便给大家推荐一个裙,它的前面是 537,中间是631,最后就是 707。想要学习前端的小伙伴可以加入我们一起学习,互相帮助。群里每天晚上都有大神免费直播上课,如果不是想学习的小伙伴就不要加啦。

     你也可以使用SVG,字体图标,或者通过伪元素设置的border边框。

    @Supports

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

    1@supports (display: flex) {

    2div {display: flex; }

    3}

    4

    5/*You can check prefixes*/

    6@supports (display: -webkit-flex) or (display: -moz-flex) or (display: flex) {

    7section {

    8display: -webkit-flex;

    9display: -moz-flex;

    10display: flex;

    11float: none;

    12}

    13}

    visibility: visible

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

    1.hidden {

    2visibility: hidden;

    3}

    4.hidden .visible {

    5visibility: visible;

    6}

    你可能会认为两个元素都不显示——然而事实上整个父元素都被隐藏了,而子元素不会。请看DEMO(https://codepen.io/CSSKing/pen/lxBfk)。

    position: sticky

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

    1.sticky {

    2position:static;

    3position: sticky;

    4top:0px;

    5}

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

    新的尺寸单位

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

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

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

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

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

    1.some-text {

    2font-size:100vh;

    3line-height:100vh;

    4}

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

    1.blackSquare {

    2background: black;

    3position: fixed;

    4height:50vh;

    5width:50vw;

    6left:25vw;

    7top:25vh;

    8}

    这看起来酷毙了,看看在codepen的例子(https://codepen.io/CrocoDillon/pen/fBJxu)

     但是目前仍然有一些关于这些新单位的不足之处:

    IE9应该用vm而不是vmin。

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

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

    文字修饰

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

    1*::selection {

    2color: #fff;

    3background: #000;

    4}

    5*::-moz-selection {

    6/*Only Firefox still needs a prefix*/

    7color: #fff;

    8background: #000;

    9}

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

    顺便给大家推荐一个裙,它的前面是 537,中间是631,最后就是 707。想要学习前端的小伙伴可以加入我们一起学习,互相帮助。群里每天晚上都有大神免费直播上课,如果不是想学习的小伙伴就不要加啦。

    触摸屏当中的元素滚动

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

    使用硬件加速

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

    1.block {

    2transform: 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

    2

    3

    4

    5

    1

    2

    3.parent {

    4height:400px;

    5width:200px;

    6}

    7.child {

    8height:50%;

    9padding-top:25%;

    10padding-bottom:25%;

    11width:100%;

    12}

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

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

    火狐浏览器的按钮边距

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

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

    1button::-moz-focus-inner,

    2input[type="reset"]::-moz-focus-inner,

    3input[type="button"]::-moz-focus-inner,

    4input[type="submit"]::-moz-focus-inner {

    5border: none;

    6padding:0;

    7}

    Color + Border =Border-Color

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

    1input[type="text"] {

    2color: red;

    3border:1px solid;

    4}

    古老浏览器的彩蛋

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

    1body {

    2:) background: pink;

    3}

    是不是很有趣?

    以上就是你所必备的22个CSS小技巧,感谢阅读。

    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 194,242评论 5 459
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 81,769评论 2 371
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 141,484评论 0 319
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 52,133评论 1 263
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 61,007评论 4 355
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 46,080评论 1 272
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 36,496评论 3 381
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 35,190评论 0 253
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 39,464评论 1 290
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 34,549评论 2 309
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 36,330评论 1 326
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 32,205评论 3 312
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 37,567评论 3 298
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 28,889评论 0 17
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 30,160评论 1 250
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 41,475评论 2 341
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 40,650评论 2 335