<img>
的圆角、边框filter
滤镜animation
使用<input>
在父级添加
@mixin clearfix {
*zoom: 1;
&:after {
content: "";
display: table;
clear: both;
}
}
触发父级BFC
截断不影响时
.father {
overflow: hidden;
_width: 100%;
}
float: left/right;
position: absolute/fixed;
不要使用border: 0.5px
,因为浏览器会把数值换算成0
或1
。(客户端RN可以直接用0.5,不会取整)
scale
缩小一半
整个边框0.5px
div {
width: 宽度;
position: relative;
&:before {
position: absolute;
top: 0;
left: 0;
content: "";
width: 200%;
height: 200%;
border: 1px solid 颜色;
transform: scale(.5);
transform-origin: 0 0;
box-sizing: border-box;
}
}
某一边0.5px
div {
width: 100px;
position: relative;
&:before {
position: absolute;
top: 0;
left: 0;
content: "";
width: 100%;
height: 1px;
border-方向: 1px solid 颜色;
transform: scaleY(.5);
transform-origin: 0 0;
box-sizing: border-box;
}
}
<meta>的viewport
缩放为1/DPR
,切图用DPR倍大小(CSS媒体查询方案或JS方案)。
仅适用于iOS。Android机型太复杂,bug永无止境。
border-image/background-image
2像素图片,一半透明、一半目标颜色。box-shadow
。<img>
的圆角、边框圆角+边框
PC端
直接在<img>
上设置border-radius
、border
。
WAP端
在<img>
上设置border-radius
,并嵌套一层父级标签设置border-radius
、border
。
圆角
PC端、WAP端
直接在<img>
上设置border-radius
。
border-radius
与某些样式配合会导致锯齿(如:CSS渐变、透明opacity
、<img>
)。可以用交由GPU处理来解决:transform: translateZ(0);
或will-change
。
参考:CSS自定义浏览器滚动条样式。
WebKit
:
::-webkit-scrollbar
:滚动条整体部分,可以设置宽度
。::-webkit-scrollbar-track
:滚动条轨道,可以设置背景
、圆角
。::-webkit-scrollbar-thumb
:滑块,可以设置背景
、圆角
、阴影
。::-webkit-scrollbar-track-piece
:滚动条轨道上覆盖的一层轨道,可以设置背景
、圆角
。::-webkit-scrollbar-thumb:window-inactive
:浏览器未被选中时的滑块(也可以用于其他伪类)。::-webkit-scrollbar-button
:滚动条两端按钮,可以设置背景
、圆角
、阴影
。::-webkit-scrollbar-corner
:横竖滚动条相交的边角,可以设置背景
、圆角
。::-webkit-resizer
:定义右下角拖动缩放节点高宽的内容。一般只需要设置:
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-track {
border-radius: 3px;
background-color: #dac3a2;
}
&::-webkit-scrollbar-thumb {
border-radius: 3px;
background-color: rgba(255, 231, 198, .5);
box-shadow: inset 0 0 0 1px #dac3a2;
&:hover {
background-color: rgba(255, 231, 198, 1);
}
}
ie
:
scrollbar-arrow-color: 颜色;
:三角箭头的颜色。scrollbar-face-color: 颜色;
:立体滚动条的颜色(包括箭头部分的背景色)。scrollbar-3dlight-color: 颜色;
:立体滚动条亮边的颜色。scrollbar-highlight-color: 颜色;
:滚动条的高亮颜色(左阴影?)。scrollbar-shadow-color: 颜色;
:立体滚动条阴影的颜色。scrollbar-darkshadow-color: 颜色;
:立体滚动条外阴影的颜色。scrollbar-track-color: 颜色;
:立体滚动条背景颜色。scrollbar-base-color: 颜色;
:滚动条的基色。设置
<input>
或<textarea>
的placeholder
的样式:选择器::placeholder {}
(厂商前缀:::-webkit-input-placeholder
、::-ms-input-placeholder
)。
若设计稿的滚动条轨道不能融入背景
<style>
.outer {
width: 400px;
box-shadow: 0 0 0 1px #000;
}
.father1 {
overflow-y: auto; /* 自动生成滚动条 */
margin-right: -10px; /* 滚动条移出本容器 */
padding-right: 10px; /* 避免滚动条不出现时容器内容移出容器。会造成有滚动条时多一个间隔 */
max-height: 100px;
}
.father1::-webkit-scrollbar {
width: 10px;
}
.father1::-webkit-scrollbar-track {
background-color: rgba(0, 0, 0, .1); /* 若设计稿的滚动条轨道不能融入背景 */
}
.father1::-webkit-scrollbar-thumb {
border-radius: 5px;
background-color: rgba(0, 0, 0, .1);
}
</style>
<div class="outer">
<div class="father1">
<div style="background: red">
模拟内容,背景+文字
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
</div>
</div>
</div>
若设计稿的滚动条轨道融入了背景
<style>
.outer {
width: 400px;
box-shadow: 0 0 0 1px #000;
}
.father2 {
overflow-y: scroll;
margin-right: -10px;
max-height: 100px;
}
.father2::-webkit-scrollbar {
width: 10px;
}
.father2::-webkit-scrollbar-track {
/*background-color: rgba(0, 0, 0, .1);*/ /* 若设计稿的滚动条轨道融入了背景 */
}
.father2::-webkit-scrollbar-thumb {
border-radius: 5px;
background-color: rgba(0, 0, 0, .1);
}
</style>
<div class="outer">
<div class="father2">
<div style="background: red">
模拟内容,背景+文字
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
你好你好你好你好你好你好你好你好你好你好你好你好你
</div>
</div>
</div>
要求:图片根据浏览器窗口变化而宽高同时等比例变化,不使用
<img>
(只有内容图片才使用<img>
)。
宽高都用rem且雪碧图且background-position
用百分比(最佳方式):
自适应图片 {
width: 宽rem;
height: 高rem;
background-size: 雪碧图宽rem;
background: url(雪碧图) 计算出x轴的百分比 计算出y轴的百分比 no-repeat;
}
技术细节
1. 百分比公式: 1. `background-position-x = 小图横坐标px / ( 大图宽度px - 小图宽度px ) * 100%` 2. `background-position-y = 小图纵坐标px / ( 大图高度px - 小图高度px ) * 100%` 2. 可以用预处理语言计算: ```scss @function rem($px, $base-font-size: 20px) { @if unitless($px) { @return rem($px + 0px); } @if unit($px) != "px" { @error "rem()的参数单位必须是px或不带单位"; } // $base-font-size:切图时设计稿宽度对应的媒体查询中html的font-size 或 --rfz+px @return $px / $base-font-size + rem; } @function position-one($positon, $singleSize, $spritesSize) { @if $positon == 0 { @return 0; } @else { @return percentage($positon / ($spritesSize - $singleSize)); } } /* x轴排列雪碧图*/ @mixin sprites-x($x: 0, $width: 单图固定宽度或0, $fullWidth: 合并图宽度) { background-image: url(图片); background-position: position-one($x, $width, $fullWidth) 0; background-size: rem($fullWidth) auto; background-repeat: no-repeat; } /*/x轴排列雪碧图*/ /* y轴排列雪碧图*/ @mixin sprites-y($y: 0, $height: 单图固定高度或0, $fullHeight: 合并图高度) { background-image: url(图片); background-position: 0 position-one($y, $height, $fullHeight); background-size: auto rem($fullHeight); background-repeat: no-repeat; } /*/y轴排列雪碧图*/ /* x+y轴排列且等大雪碧图(参数:单图宽、高、x轴图片数量、y轴图片数量、图片间距)*/ @mixin sprites-xy($width, $height, $x, $y, $gap: 2) { width: rem($width); height: rem($height); background-image: url(图片前缀#{$width}x#{$height}.png); background-size: rem(($width + $gap)*$x - $gap) rem(($height + $gap)*$y - $gap); background-repeat: no-repeat; // $i:横轴;$j:纵轴 @for $j from 1 through $y { @for $i from 1 through $x { &.i-#{$j}-#{$i} { background-position: position-one(($width + $gap)*($i - 1), $width, ($width + $gap)*$x - $gap) position-one(($height + $gap)*($j - 1), $height, ($height + $gap)*$y - $gap); } } } } /*/x+y轴排列且等大雪碧图*/ ```
其他方式:
都用rem
单图
自适应图片 {
width: 宽rem;
height: 高rem;
background-size: 100%;
background: url(单图) center center no-repeat;
}
雪碧图
自适应图片 {
width: 宽rem;
height: 高rem;
background-size: 雪碧图宽rem;
background: url(雪碧图) -横轴rem -纵轴rem no-repeat;
}
background-position
用rem
会出现换算小数导致定位偏离问题,改用百分比可以解决偏离问题。
都用百分比
横向、纵向百分比的
padding
值都是以父元素的width
为基础,height
是以父元素的height
为基础。
单图
自适应图片 {
height: 0;
width: 宽%;
padding-bottom: 高%;
background-size: 100%;
background: url(单图) 0 0 no-repeat;
}
雪碧图
自适应图片 {
height: 0;
width: 宽%;
padding-bottom: 高%;
background-size: 雪碧图宽/单图宽度*100%;
background: url(雪碧图) 计算出x轴的百分比 计算出y轴的百分比 no-repeat;
}
缺点:只能用于空标签。
<img>
),图片宽度和高度按固定比例缩放</details>
animation-timing-function
的steps
(缓动函数)配合@keyframes
改变雪碧图的transform/background-position
(各项指标强于使用.gif)。
不同字数的一行文字等宽。
用inline-block
的元素填补间隙
<style type="text/css">
i {
display: inline-block;
*display: inline;
*zoom: 1;
width: 1em;
}
</style>
<p>文字文字</p>
<p>文<i></i><i></i>字</p>
用 
(字体宽度1/2em)、 
(字体宽度1em)填补间隙。
<p>三个字</p>
<p>两 个</p>
<p>四个字的</p>
<p>三 个 字</p>
.triangle {
border-width: 20px;
border-style: dashed solid dashed dashed; /* dashed兼容ie6 */
border-color: transparent #000 transparent transparent;
_overflow: hidden;
height: 0;
width: 0;
}
.trapezoid {
border-width: 20px;
border-style: dashed solid dashed dashed; /* dashed兼容ie6 */
border-color: transparent #000 transparent transparent;
_overflow: hidden;
height: 20px;
width: 20px;
}
两个同样大小的三角形,第二个设置为背景色并且覆盖到第一个上面,可以模拟箭头
>
。
支持内部包含的不仅仅是字符串,也能包含标签。
e.g. 行内元素可以截断展示一部分;非行内元素只能整个展示或不展示(如:
<img>
、inline-block
元素)。
单行
@mixin ellipsis($boolean: true) {
@if $boolean == true {
_width: 100%;
}
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
多行
@mixin multi-ellipsis($line-height, $line) {
line-height: $line-height;
height: $line-height * $line; // 或max-height: $line-height * $line; 非必须(用rem会因为小数点问题出现样式问题)
display: block;
display: -webkit-box;
*display: block;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: $line;
}
// rem模式
@mixin multi-ellipsis-rem($line-height, $line) {
line-height: rem($line-height);
height: rem($line-height * $line); // 或max-height: rem($line-height * $line); 非必须(用rem会因为小数点问题出现样式问题)
display: block;
display: -webkit-box;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: $line;
}
使用display: flex;
align-items: center;
justify-content: center;
可以解决部分移动端WebView文字渲染无法垂直居中问题。
filter
滤镜暂时还没有兼容所有浏览器的方案。
CSS3图形特效
兼容性:除了ie10与ie11之外的基本所有主流浏览器。
高斯模糊
.filter {
-webkit-filter: blur(10px);
-moz-filter: blur(10px);
-ms-filter: blur(10px);
filter: blur(10px);
filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius=10, MakeShadow=false); /* ie6~ie9 */
}
灰度
.filter {
/* filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); */
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
filter: grayscale(100%);
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); /* ie */
filter: gray; /* ie6~ie9 */
}
SVG滤镜元素
兼容性:较新版本的Firefox、Chrome、Opera。
新建一个SVG文件,把滤镜方法放进去,然后CSS调用filter: url(某.svg#某id);
。
高斯模糊
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="某id">
<feGaussianBlur stdDeviation="10" />
</filter>
</defs>
</svg>
灰度
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="某id">
<feColorMatrix type="matrix" values="0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0" />
</filter>
</defs>
</svg>
.filter {
-webkit-filter: url(某文件.svg#某id);
-moz-filter: url(某文件.svg#某id);
filter: url(某文件.svg#某id);
}
canvas
(待续)
flex
的align-items: stretch;/* 默认 */
(若子项未设置高度或设为auto,则将占满整个容器的高度。)参考:Buttons。
.button3d {
display: block;
width: 300px;
height: 50px;
line-height: 50px;
font-size: 20px;
text-align: center;
color: #fff;
background-color: #a5de37; /* 可以改为渐变背景 */
box-shadow: 0 7px 0 #8bc220, 0 8px 3px rgba(0, 0, 0, 0.3); /* 可以加一个内部阴影,制作按钮表面光泽 */
position: relative;
transform: translateY(0);
transition: .3s;
&:hover {
background-color: #b9e563;
box-shadow: 0 7px 0 #84b91f, 0 8px 3px rgba(0, 0, 0, 0.3);
}
&:active {
color: #8bc220;
background-color: #a1d243;
box-shadow: 0 2px 0 #6b9619, 0 3px 3px rgba(0, 0, 0, 0.2);
transform: translateY(5px);
transition: .15s;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.3);
}
}
<style type="text/css">
.item {
position: relative;
width: 宽度;
height: 高度;
}
.front {
position: relative;
z-index: 1;
transition: 1s;
backface-visibility: hidden;
transform: rotateY(0deg);
// 或:opacity: 1;
width: 宽度;
height: 高度;
}
.back {
position: absolute;
top: 0;
left: 0;
transition: 1s;
backface-visibility: hidden;
transform: rotateY(180deg);
// 或:opacity: 0;
width: 宽度;
height: 高度;
}
.item:hover .front {
z-index: 0;
// 或:opacity: 0;
transform: rotateY(180deg);
}
.item:hover .back {
// 或:opacity: 1;
transform: rotateY(360deg);
}
</style>
<div class="item">
<div class="front">
正面内容
</div>
<div class="back">
背面内容
</div>
</div>
(背景不透明情况)背景不规则,内容贯穿背景
上下级结构
<style type="text/css">
.main {
width: 宽度;
overflow: hidden;
}
.top {
background: url(背景图) 0 100% no-repeat; /* 横版背景图,分别从左到右是头部、中间、底部内容 */
height: 高度1;
}
.content-3 {
background: url(背景图) -宽度 0 repeat-y;
}
.content-2 {
position: relative;
top: -高度2;
*zoom: 1;
}
.content-1 {
position: relative;
margin-bottom: -2*高度2;
}
.bottom {
background: url(背景图) -2*宽度 0 no-repeat;
height: 高度1;
}
</style>
<div class="main">
<div class="top"></div>
<div class="content-3">
<div class="content-2">
<div class="content-1">
内容
</div>
</div>
</div>
<div class="bottom"></div>
</div>
层层覆盖
<style type="text/css">
.main {
width: 宽度;
}
.out {
background: url(背景图) -宽度 0 repeat-y; /* 横版背景图,分别从左到右是头部、中间、底部内容 */
}
.middle {
background: url(背景图) 0 0 no-repeat;
}
.in {
background: url(背景图) -2*宽度 100% no-repeat;
}
</style>
<div class="main">
<div class="out"><!-- 中间平铺的背景-->
<div class="middle"><!-- 头部背景(覆盖中间背景)-->
<div class="in"><!-- 底部背景(覆盖头部以及中间背景)-->
内容
</div>
</div>
</div>
</div>
(背景可透明情况)背景不规则,内容不贯穿背景
<style type="text/css">
.main {
width: 宽度;
}
.top {
background: url(背景图) 0 100% no-repeat; /* 横版背景图,分别从左到右是头部、中间、底部内容 */
height: 高度;
}
.content {
background: url(背景图) -宽度 0 repeat-y;
}
.bottom {
background: url(背景图) -2*宽度 0 no-repeat;
height: 高度;
}
</style>
<div class="main">
<div class="top"></div>
<div class="content">
内容
</div>
<div class="bottom"></div>
</div>
去除左右间隔效果
图片法:hover之后本身的背景被替换,前一个兄弟的背景被覆盖
ul {
overflow: hidden;
li {
@include left;
margin-left: -1px;
a {
background: url(宽度根据li的margin-left、高度根据a的高度决定的border样式图片) 100% center no-repeat;
display: block;
&:hover {
background: 背景色;
}
}
}
}
可以用
box-shadow
设置单边的间隔。
底部border替换父级border
用relative
控制
ul {
height: 高度1;
border-bottom: 高度2 solid 颜色1;
*zoom: 1;
/* 不能overflow: hidden; */
&:after {
content: "";
display: table;
clear: both;
}
li {
width:;
height: 高度1;
float: left;
_display: inline;
}
a {
display: block;
height: (高度1+高度2);
_position: relative;
_bottom: -高度2;
/* 不能有background */
&.hover,
&:hover {
height: (高度1+高度2-高度3);
border-bottom: 高度3 solid 颜色2;
}
}
}
用absolute
控制
ul {
height: 高度1;
border-bottom: 高度2 solid 颜色1;
*zoom: 1;
/* 能够overflow: hidden; */
&:after {
content: "";
display: table;
clear: both;
}
li {
width: 宽度;
height: 高度1;
float: left;
_display: inline;
a {
width: 宽度;
position: absolute;
height: 高度1;
/* 可以使用background */
&.hover,
&:hover {
height: (高度1+高度2-高度3);
border-bottom: 高度3 solid 颜色2;
}
}
}
}
用margin
控制
ul {
height: 高度1;
border-bottom: 高度2 solid 颜色1;
*zoom: 1;
/* 不能overflow: hidden; */
&:after {
content: "";
display: table;
clear: both;
}
li {
width:;
height: (高度1+高度2);
float: left;
_display: inline;
a {
display: block;
height: (高度1+高度2);
margin-bottom: -高度2;
_position: relative;
/* 不能有background */
&.hover,
&:hover {
height: (高度1+高度2-高度3);
_height: (高度1+高度2);
border-bottom: 高度3 solid 颜色2;
}
}
}
}
flex
实现animation
使用动画进行到一半取消动画(去除了相关类)或替换动画,会导致节点突兀地回到初始位置。
:hover
)
.dom:hover {
animation: func 1s infinite;
}
@keyframes func {
}
用JS控制启动时的动画效果和关闭时的动画效果
<style>
.dom.fade-in {
animation: func-in 1s infinite;
}
.dom.fade-out {
animation: func-out 1s 1;
}
@keyframes func-in {
}
@keyframes func-out {
}
</style>
<div class="dom j-dom">...</div>
<script>
$(document).on('mouseenter', '.j-dom', function () {
var self = $(this);
self.removeClass('fade-out');
setTimeout(function () {
self.addClass('fade-in');
}, 0);
}).on('mouseleave', '.j-dom', function () {
var self = $(this);
self.removeClass('fade-in');
setTimeout(function () {
self.addClass('fade-out');
}, 0);
});
</script>
纯色背景
复杂背景
实现文字添加下划线。
text-decoration: underline;
效果根据字体各异,无法控制展示位置,很可能无法满足设计需求。
模拟下换线:
若是模拟的下划线(非
text-decoration: underline;
),要注意文字换行时情况,一般只能针对display: inline;
的文本进行模拟。
border-bottom: 1px solid;
可以用padding-bottom
等修改展示位置。border
会受盒模型影响,如:高宽、圆角等。
box-shadow: 0 1px 0 0;
box-shadow
(非 )紧贴着盒模型之外展示,会受盒模型影响,如:圆角等。inset
box-shadow: 0 10px 0 -9px;
(第二个值大于第四个值的绝对值多少就是多少像素的下划线展示)。<input>
实现<input>
随着输入文字变化而变化其宽度。
没有设置
size
的<input>
输入框,会固定宽度,不会随着输入变化而变化其宽度。
嵌套一层
<template>
<div class="m-input-1">
<span></span>
<input v-model="value">
</div>
</template>
<script>
export default {
data () {
return {
value: ''
}
}
}
</script>
<style lang="scss">
.m-input-1 {
display: inline-block;
position: relative;
height: 20px;
border: 1px solid #000;
> span {
display: inline-block;
height: 100%;
min-width: 100px;
max-width: 200px;
white-space: nowrap;
overflow: hidden;
visibility: hidden;
}
> input {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
padding: 0;
border: none;
}
}
</style>
动态改变<input>
的size
<template>
<input class="m-input-2" v-model="value" :size="value.length + 2">
</template>
<script>
export default {
data () {
return {
value: ''
}
}
}
</script>
<style lang="scss">
.m-input-2 {
min-width: 100px;
max-width: 200px;
}
</style>
contentEditable
(缺点:输入超出的内容无法用鼠标滚动展示)
<template>
<div class="m-input-3" contentEditable="plaintext-only" />
<!-- 若contentEditable="true",则需要用JS控制仅可粘贴纯文本 -->
</template>
<style lang="scss">
.m-input-3 {
display: inline-block;
white-space: nowrap;
overflow: hidden;
min-width: 100px;
max-width: 200px;
border: 1px solid #000;
}
</style>
计算输入的字数,然后动态修改<input>
的宽度