修改输入占位符样式、多行文本溢出、隐藏滚动条、修改光标颜色、水平和垂直居中。多么熟悉的场景啊!前端开发人员几乎每天都会与它们打交道。本文收集了13个CSS技巧,我们一起来回顾一下。
1.解决图片5px间距问题
5px ,你是否经常遇到图片底部多余空间的问题?别担心,有4种方法可以解决。
方案一:更改其父元素的font-size:0px
方案二:增加img display:block的样式
方案三:增加img的样式vertical-align:bottom
方案四:增加父元素的样式line-height:5px
2.如何让元素高度与窗口相同
目前的前端中,CSS有一个单位vh,将元素高度样式设置为height:100vh
3.修改输入框占位符样式
这是表单输入框的占位符属性。修改默认样式的方法如下:
input::-webkit-input-placeholder {
color: #babbc1;
font-size: 12px;
}
4. 使用 :not 选择器
除了最后一个元素之外的所有元素都需要一些样式,而使用选择器实现这一点并不容易。
例如,要实现列表,最后一个元素不需要加下划线,如下所示:
li:not(:last-child) {
border-bottom: 1px solid #ebedf0;
}
5.使用caret-color修改光标颜色
有时需要修改光标的颜色。现在是插入符号颜色时间。
.caret-color {
width: 300px;
padding: 10px;
margin-top: 20px;
border-radius: 10px;
border: solid 1px #ffd476;
box-sizing: border-box;
background-color: transparent;
outline: none;
color: #ffd476;
font-size: 14px;
/* Key style */
caret-color: #ffd476;
}
.caret-color::-webkit-input-placeholder {
color: #4f4c5f;
font-size: 14px;
}
6.使用flex布局智能地将元素固定到底部
当内容不够时,按钮应该位于页面底部。当内容足够多时,按钮应该跟随内容。当你遇到类似的问题时,可以使用flex智能布局!
class="container"> class="main">Content here
class="footer">Button
CSS代码如下:
.container {
height: 100vh;
/* Key style */
display: flex;
flex-direction: column;
justify-content: space-between;
}
.main {
/* Key style */
flex: 1;
background-image: linear-gradient(
45deg,
#ff9a9e 0%,
#fad0c4 99%,
#fad0c4 100%
);
display: flex;
align-items: center;
justify-content: center;
color: #fff;
}
.footer {
padding: 15px 0;
text-align: center;
color: #ff9a9e;
font-size: 14px;
}
7.去掉type="number"末尾的箭头
默认情况下,type="number" 输入类型末尾会出现一个小箭头,但有时需要将其删除。你可以使用以下样式:
input {
width: 300px;
padding: 10px;
margin-top: 20px;
border-radius: 10px;
border: solid 1px #ffd476;
box-sizing: border-box;
background-color: transparent;
outline: none;
color: #ffd476;
font-size: 14px;
caret-color: #ffd476;
display: block;
}
input::-webkit-input-placeholder {
color: #4f4c5f;
font-size: 14px;
}
/* Key style */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
}
8.使用outline:none删除输入状态行
当输入框被选中时,默认会有一条蓝色的状态行,可以使用outline:none去掉。
9.解决iOS滚动条卡住的问题
在苹果手机上,滚动时元素经常会卡住。此时只有一行CSS会支持弹性滚动。
body,html{
-webkit-overflow-scrolling: touch;
}
10.画一个三角形
.triangle {
display: inline-block;
margin-right: 10px;
/* Basic style */
border: solid 10px transparent;
}
/* downward triangle */
.triangle.bottom {
border-top-color: #0097a7;
}
/* Upward triangle */
.triangle.top {
border-bottom-color: #b2ebf2;
}
/* Leftward triangle */
.triangle.left {
border-right-color: #00bcd4;
}
/* Right triangle */
.triangle.right {
border-left-color: #009688;
}
11.自定义选定的文本样式
文本选择的颜色和样式可以通过styles自定义。关键样式如下:
::selection {
color: #ffffff;
background-color: #ff4c9f;
}
12. 不允许选择文本
使用用户选择的样式:none;
13.使用filter:grayscale(1)将页面置于灰度模式
一行代码会将页面置于灰色模式。
body{
filter: grayscale(1);
}
总结
C语言中int到float的强制类型转换(转)
在看csapp书时对于书上的一个32位机器上强制转换的例题苦思冥想不得解:x==(int)(float)x为什么是错的?x转换为float不应该是舔几个0么,再转换为Int又将小数点后的0去了么。知道看了这篇博文才知道一切都得从二进制的角度来看。
转:
最近在看一本名为的书。由于我所看过的计算机理论方面的书较少,加上自己大学期间一直也不用功,所以对于计算机的工作原理以及程序的工作方式我始终只知甚少,印象也十分模糊。
不过,应该说我碰到了一本好书。至少,通过昨晚对浮点数一章的阅读(呃...我的确之前对浮点数从没弄明白过),我终于了解了C语言中为什么32位int型数据强制转换到float型会出现精度不能完全保留的现象:
首先来看看我们可爱的int型变量吧,在一台典型的32位机器上一个有符号的int型的取值范围为-2147483648 ~ 2147483647(-2^31 ~ (2^31-1))(注1)。也就是说,在一个4字节(32位2进制),除去首位用于符号位表示正负外,其余的31位都是数字的有效位。
下面再来看看“万恶的”float型变量:根据IEEE的浮点标准,一个浮点数应该用下述形式来表示:
V=(-1)^s * M * 2^E (公式1)
在C语言中,32位的float型变量有着这样的规定:首位表示符号位s,接下来的8位(指数域)用于表示2的指数E,剩余的23位(小数域)表示M(取值范围为[1,2)或[0,1))。除了上述规定以外,根据指数域的二进制表示情况不同,被编码的float型数字又可以分成三种情况——
1、规格化值。当指数域的8个二进制数字既非全零又非全1时,float数值就是这种情况。设指数域的八位二进制所表示的十进制数为e, 则公式1中的E就是 E = e - (2^7 - 1) (公式2);
而且此时,将小数域所表示的二进制假设为(f22)(f21)...(f1)(f0) (注2) ,则该小数域所表示的值即为f = 0.(f22)(f21)...(f1)(f0).于是M = 1 + f
2.非规格化值。当指数域的8个二进制数字为全0时,float数值就为这种情况。这时指数域所表示的十进制数为0,规定指数值为 E = 1 - (2^7 - 1),也就是E为定值-126;此时小数域的值仍表示f = 0.(f22)(f21)...(f1)(f0),但是M的值却变成M = f。
3.特殊值。当指数域的8个二进制数字为全1时即为这种情况。当小数域为全零时,该float值根据符号位的不同表示正无穷或者负无穷;当小数域为非全零时,该float值为NaN(Not a Number)。
以上,只是在C语言中对int和float的规约。具体在代码中执行强制类型转化究竟会发生什么?从下面两句很简单的语句开始:
int a = 3490593;
float b = (float)a;
那么在内存中a和b究竟存放的是什么值呢?
将a展开为二进制,其值为0000 0000 0011 0101 0100 0011 0010 0001,其十六进制即为0x00354321。 因为要转化为float型,所以首先要对上述二进制的表示形式改变为 M * 2^E 的形式.由于该数明显大于1,所以按照IEEE的标准,其浮点形势必然为规格化值。因此 ,转化后的形式为
a = 1.101010100001100100001 * 2^21
根据 规格化值的定义,M = 1 + f. 所以f = 0.101010100001100100001.因为float型变量的小数域一共23位。所以b的最后23位可以得出,其值为10101010000110010000100
下面再演绎指数域的值:因为a的指数表示法中,指数E = 21。根据公式2,e = E + (2^7 -1) = 148.所以可以得出b的指数域的二进制表示为:10010100。在加上原数为正,所以符号位s=0。
所以,可以得出b的二进制表示为0 10010100 10101010000110010000100。转化为十六位进制则是0x4A550C84。换句话说,它存储在内存中的值是与a是完全不同的。但是其间还是有关联性的——a的首位为1的数值位后的二进制表示是与b的小数域完全相同的。
很快,问题就出现了。int型的有效位数是31,而float型小数域的有效位只有23位,也就是说如果上面的a的二进制的有效位超过了24位,那么float型的小数域的精度就不够了。因此必须进行舍入。比如:如果上面的a的二进制为0000 0001 1111 0101 0100 0011 0010 0001。这时b的小数域必须有24位才够,但是,这显然是不现实的,因此必须舍入到23位,舍入的原则是:所得结果的最低有效位为0。因此这个a在转换到float时,其精度就会丢失,因为该float的最后23位变成了11110101010000110010000——这显然是与原值不符的。
实际上,C语言中对于double型在32位机器上的小数域有52位,对于int型的31位有效位是绰绰有余了。这就是为什么大部分C语言教材上鼓励读者在执行强制类型转换时将int型转换成double。同时,这可能也是为什么int型能够直接隐式转换到double型的缘故。
注1:x ^ y表示 x的y次方
注2:(fn)取0或1