写于 2016.07.03css
原文连接:22 Essential CSS Recipeshtml
你们好,今天咱们将会介绍一些很是实用的CSS小技巧,让咱们开始吧!git
不久以前Firefox和Safari浏览器已经开始支持相似Photoshop的混合模式,可是在Chrome和Opera浏览器中须要添加前缀。举个栗子:github
// 你也能够尝试不一样的样式
.blend {
background: #fff;
}
.blend img {
mix-blend-mode: darken;
}
复制代码
在线体验地址web
如今,你甚至能够在边框中使用渐变。 要使用渐变边框很是简单,只须要设置一个更低z-index
的伪元素便可:浏览器
.box {
margin: 80px 30px;
width: 200px;
height: 200px;
position: relative;
background: #fff;
float: left;
}
.box:before {
content: '';
z-index: -1;
position: absolute;
width: 220px;
height: 220px;
top: -10px;
left: -10px;
background-image: linear-gradient(90deg, yellow, gold);
}
复制代码
具体的例子能够看这里,或者看这里使用的是background-clip
和background-origin
属性。在不久的未来,也许全部浏览器都将支持border-image
属性,最终的代码会和下面同样:bash
.box {
border-image: linear-gradient(to bottom, #000000 0%, #FFFFFF 100%);
border-image-slice: 1; /* set internal offset */
}
复制代码
也许你不知道z-index
一样支持过渡!在过渡的每一步中,它的值都不发生改变,因此你觉得它不支持过渡——但其实它支持。 举个栗子svg
咱们可使用这个方法来侦测当前的颜色,以免常常地重复定义它。 这个方法在使用SVG图标的时候很是有用,由于它们的颜色由其父元素决定。一般咱们是这么作的:post
.button {
color: black;
}
.button:hover {
color: red;
}
.button:active {
color: green;
}
.button svg {
fill: black;
}
.button:hover svg {
fill: red;
}
.button:active svg {
fill: green;
}
复制代码
但咱们可使用currentColor
这么作:字体
svg {
fill: currentColor;
}
.button {
color: black;
border: 1px solid currentColor;
}
.button:hover {
color: red;
}
.button:active {
color: green;
}
复制代码
附上其它带有伪元素的例子:
a {
color: #000;
}
a:hover {
color: #333;
}
a:active {
color: #666;
}
a:after,
a:hover:after,
a:active:after {
background: currentColor;
...
}
复制代码
你是否还记得为了解决一些问题而给一幅背景图设置background-size
属性的时刻呢?如今你可使用object-fit
属性啦,webkit浏览器都支持它,Firefox也将在近期予以支持。
.image__contain {
object-fit: contain;
}
.image__fill {
object-fit: fill;
}
.image__cover {
object-fit: cover;
}
.image__scale-down {
object-fit: scale-down;
}
复制代码
让咱们一块儿不使用图片来设置复选框的样式:
<!-- html -->
<input type="checkbox" id="check" name="check" />
<label for="check">Checkbox</label>
复制代码
<!-- css -->
input[type=checkbox] {display: none;}
input[type=checkbox] + label:before {
content: "";
border: 1px solid #000;
font-size: 11px;
line-height: 10px;
margin: 0 5px 0 0;
height: 10px;
width: 10px;
text-align: center;
vertical-align: middle;
}
input[type=checkbox]:checked + label:before {
content: "\2713";
}
复制代码
正如你所看见的,咱们隐藏了原有的复选框,改成使用伪元素和伪类:checked
(IE9+)来表现它。当它被选中时,一个设置在content
里的Unicode编码的字符将会显示出来。
值得注意的是,Unicode编码在CSS和HTML中的写法是不同的。在CSS中它是一个以反斜杠为开始的十六进制数,而在HTML中它是十进制的,好比
✓
。 接着为咱们的复选框添加一些动画效果:
<!-- checkbox -->
input[type=checkbox] + label:before {
content: "\2713";
color: transparent;
transition: color ease .3s;
}
input[type=checkbox]:checked + label:before {
color: #000;
}
<!-- radio -->
input[type=radio] + label:before {
content: "\26AB";
border: 1px solid #000;
border-radius: 50%;
font-size: 0;
transition: font-size ease .3s;
}
input[type=radio]:checked + label:before {
font-size: 10px;
}
复制代码
总所周知CSS中是可使用计数器的:
<!-- html -->
<ol class="list">
<li>a</li>
<li>b</li>
<li>c</li>
</ol>
复制代码
<!-- css -->
.list {
counter-reset: i; //reset conunter
}
.list > li {
counter-increment: i; //counter ID
}
.list li:after {
content: "[" counter(i) "]"; //print the result
}
复制代码
咱们定义了一个ID在counter-reset
属性中做为初始值(默认为0)。你能够设置另外一个值在counter-increment
属性中做为每一步的递增值。
你能够计算出有多少个复选框被用户勾选了:
<!-- html -->
<div class="languages">
<input id="c" type="checkbox"><label for="c">C</label>
<input id="C++" type="checkbox"><label for="C++">C++</label>
<input id="C#" type="checkbox"><label for="C#">C#</label>
<input id="Java" type="checkbox"><label for="Java">Java</label>
<input id="JavaScript" type="checkbox"><label for="JavaScript">JavaScript</label>
<input id="PHP" type="checkbox"><label for="PHP">PHP</label>
<input id="Python" type="checkbox"><label for="Python">Python</label>
<input id="Ruby" type="checkbox"><label for="Ruby">Ruby</label>
</div>
<p class="total">
Total selected:
</p>
复制代码
<!-- css -->
.languages {
counter-reset: characters;
}
input:checked {
counter-increment: characters;
}
.total:after {
content: counter(characters);
}
复制代码
你也能够制做一个简单的计算器:
<!-- html -->
<div class="numbers">
<input id="one" type="checkbox"><label for="one">1</label>
<input id="two" type="checkbox"><label for="two">2</label>
<input id="three" type="checkbox"><label for="three">3</label>
<input id="four" type="checkbox"><label for="four">4</label>
<input id="five" type="checkbox"><label for="five">5</label>
<input id="one-hundred" type="checkbox"><label for="one-hundred">100</label>
</div>
<p class="sum">
Sum
</p>
复制代码
<!-- css -->
.numbers {
counter-reset: sum;
}
#one:checked { counter-increment: sum 1; }
#two:checked { counter-increment: sum 2; }
#three:checked { counter-increment: sum 3; }
#four:checked { counter-increment: sum 4; }
#five:checked { counter-increment: sum 5; }
#one-hundred:checked { counter-increment: sum 100; }
.sum::after {
content: '= ' counter(sum);
}
复制代码
你记得你有多么常常被迫须要一个“汉堡”图标吗?
这里有至少3个方式去实现它: 一、 Shadows
.shadow-icon {
position: relative;
}
.shadow-icon:after {
content: "";
position: absolute;
left: 0;
top: -50px;
height: 100%;
width: 100%;
box-shadow: 0 5px 0 #000, 0 15px 0 #fff, 0 25px 0 #000, 0 35px 0 #fff, 0 45px 0 #000;
}
复制代码
二、 Gradient
.gradient-icon {
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%);
}
复制代码
三、 UTF-8 你能够直接使用标准符号:☰ (Unicode: U+2630, HTML: ☰)。你也能够像其余元素那样灵活设置它的颜色或大小。看例子。 你也可使用SVG,字体图标,或者经过伪元素设置的border
边框。
这是一个新的叫作supports
的CSS表达式。顾名思义,它能够检测某些设定是否被浏览器所支持,并不是全部的浏览器都支持它,可是你仍然可使用它做为基本的检测手段:
@supports (display: flex) {
div { display: flex; }
}
/*You can check prefixes*/
@supports (display: -webkit-flex) or (display: -moz-flex) or (display: flex) {
section {
display: -webkit-flex;
display: -moz-flex;
display: flex;
float: none;
}
}
复制代码
依你估计,把一个设置为visibility: visible
的元素放在一个设置为visibility: hidden
的元素里面,会发生什么?
.hidden {
visibility: hidden;
}
.hidden .visible {
visibility: visible;
}
复制代码
你可能会认为两个元素都不显示——然而事实上整个父元素都被隐藏了,而子元素不会。请看DEMO。
咱们发现了一个新的特性,你能够新建一个sticky
属性的元素。它的运行效果和fixed
相同,但不会挡住任何元素。你最好看看例子 只有Mozilla和Safari浏览器支持这一属性,但你也能够像下面那样使用它:
.sticky {
position: static;
position: sticky;
top: 0px;
}
复制代码
咱们将会在支持的浏览器中获得一个sticky
属性的元素,而在不支持的浏览器中它将会是一个普通的元素。这在你须要创建一个不可替代的,能够移动的元素的移动端页面的时候很是实用。
不久以前,一些新的用以描述不一样元素大小的尺寸单位问世了,它们是:
有趣的是,几乎全部的现代浏览器都能很好地支持它们,因此你能够放心地使用。 为何咱们须要这些新的单位?由于它们可让不一样的尺寸更容易被定义,你不要为父元素指定任何的百分比或者别的什么,请看例子:
.some-text {
font-size: 100vh;
line-height: 100vh;
}
复制代码
或者你能够设置一个漂亮的弹出框在屏幕中间:
.blackSquare {
background: black;
position: fixed;
height: 50vh;
width: 50vw;
left: 25vw;
top: 25vh;
}
复制代码
这看起来酷毙了,看看在codepen的例子吧~ 可是目前仍然有一些关于这些新单位的不足之处:
咱们能够经过几行代码修改文字被选中时的效果:
*::selection {
color: #fff;
background: #000;
}
*::-moz-selection {
/*Only Firefox still needs a prefix*/
color: #fff;
background: #000;
}
复制代码
你不只能够定义文字被选中时的颜色,还能定义阴影或者背景颜色。
若是你须要在触摸屏当中为一些元素设置内滚动,那么你不只须要overflow: scroll / auto
,还须要-webkit-overflow-scrolling: touch;
实际上,移动端浏览器在某些时候并不能正确执行overflow: scroll / auto
,它可能会滚动整个页面而不是你想要的那部分。-webkit-overflow-scrolling
解决了这个问题,你能够在你的实际项目中体验一下。
有时候动画可能会致使用户的电脑卡顿,你能够在特定元素中使用硬件加速来避免这个问题:
.block {
transform: translateZ(0);
}
复制代码
你并不会察觉有什么不一样,但浏览器会为这个元素进行3D硬件加速,在will-change
这个特殊属性未被全面支持以前,这个方法仍是颇有用的。
你能够用Unicode符号明名class:
.❤ {
...
}
.☢ {
...
}
.☭ {
...
}
.★ {
...
}
.☯ {
...
}
复制代码
但这实际上是用来搞笑的,千万不要在大型项目中使用,由于不是全部的电脑都支持Unicode符号。
实际上垂直方向的排列计算是基于父元素的宽度而不是高度。定义两个元素:
<!-- html -->
<div class="parent">
<div class="child"></div>
</div>
复制代码
<!-- css -->
.parent {
height: 400px;
width: 200px;
}
.child {
height: 50%;
padding-top: 25%;
padding-bottom: 25%;
width: 100%;
}
复制代码
理论上,子元素的高会是父元素高的一半,可是看看咱们实际获得的状况:
记住,子元素的百分比是相对于父元素的宽度。
Firefox用它本身的方式去计算按钮的边距。这听起来有点奇怪,但它会自动地添加一些边距进去:
能够用如下方法来修复这个问题:
button::-moz-focus-inner,
input[type="reset"]::-moz-focus-inner,
input[type="button"]::-moz-focus-inner,
input[type="submit"]::-moz-focus-inner {
border: none;
padding:0;
}
复制代码
Border-Color
不多人知道,定义了一个元素的文字颜色,意味着这个元素的边框颜色也被定义了:
input[type="text"] {
color: red;
border: 1px solid;
}
复制代码
若是你仍须要适配IE7或者相似的古老浏览器,你能够在定义hack的时候使用笑脸符号,像这样:
body {
:) background: pink;
}
复制代码
是否是颇有趣?
若是你以为我翻译得不错,请点赞收藏并关注个人专栏,我会陆续推出更多精彩的内容。如发现任何的错漏欢迎指正,咱们下次见!