/*------------------------------------
├ 布局 ┆
└------------------------------------*/
// 盒子宽高
.size(@w, @h) {
width: @w;
height: @h;
}
// 最小尺寸, 兼容IE6
.min-width(@min-w) {
min-width: @min-w;
_width: @min-w;
}
.min-height(@min-h) {
min-height: @min-h;
_height: @min-h;
}
// 内联块级元素, 兼容IE6
.dib() {
display: inline-block;
*display: inline;
*zoom: 1;
}
// 固定定位, 兼容IE6
.fixed() {
position: fixed;
_position: absolute;
*zoom: 1;
}
// 统一盒模型
.border-box() {
*,
*:after,
*:before {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
}
// 文字图片居中
.center(text-x) {
text-align: center;
}
.center(text-y) {
display: table-cell;
vertical-align: middle;
}
// 块级元素水平居中
.center(auto-x) {
display: block;
margin-left: auto;
margin-right: auto;
}
// 居中, 不确定尺寸, 不兼容 IE6
.center(unknown) {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
.center(unknown-x) {
position: absolute;
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
}
.center(unknown-y) {
position: absolute;
top: 0;
bottom: 0;
margin-top: auto;
margin-bottom: auto;
}
// 居中, 确定尺寸, 兼容 IE6
.center(known, @w, @h) {
.size(@w, @h);
position: absolute;
top: 50%;
left: 50%;
margin-top: -(@w / 2);
margin-left: -(@h / 2);
}
.center(known-x, @w) {
width: @w;
position: absolute;
left: 50%;
margin-left: -(@h / 2);
}
.center(known-y, @h) {
height: @h;
position: absolute;
top: 50%;
margin-top: -(@w / 2);
}
// 居中, CSS3 平移方式, 兼容性不行
.center(translate) {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
// 居中, Flex 方式, 兼容性不行
.center(flex) {
display: flex;
align-items: center;
justify-content: center;
}
// 多个子项布局
.list(float, @w: 25%) {
float: left;
width: @w;
}
.list(inline, @w: 25%) {
.dib();
width: @w;
}
.list(flex) {
flex: 1;
}
// 遮罩层, 全屏遮罩、区域遮罩
.over-screen(fixed) {
.fixed();
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.over-screen(absolute) {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
// 容器宽高比固定
// 100* 1/1 = 100%
// 100* 3/4 = 75%
.fixed-ratio(@padding-top: 100%) {
position: relative;
width: 100%;
height: 0;
padding-top: @padding-top;
img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
// 扩展点击区域
.extend-click() {
position: relative;
&:before {
content: '';
position: absolute;
top: -10px;
left: -10px;
right: -10px;
bottom: -10px;
}
}
// 定宽居中页面布局
.layout-page(@width: 1200px) {
width: @width;
margin-left: auto;
margin-right: auto;
}
// 侧边栏
// 主要区域:overflow: hidden; margin-left: xx; margin-right: xx;
.sidebar(left, @width) {
position: absolute;
top: 0;
left: 0;
width: @width;
}
.sidebar(right, @width) {
position: absolute;
top: 0;
right: 0;
width: @width;
}
/*-------------------------------------
├ 字体 ┆
└------------------------------------*/
// 字体大小
.fz(@fz) {
font-size: @fz;
}
// 字体大小与行高
.fz(@fz, @lh) {
font-size: @fz;
line-height: @lh;
}
// 字体大小、行高、高度
.fz(@fz, @h, @lh: @h) {
font-size: @fz;
height: @h;
line-height: @lh;
}
// 行高与高度
.lh(@h, @lh: @h) {
height: @h;
line-height: @lh;
}
// 字体颜色, 包括链接与非链接
.color(@color) {
color: @color;
}
// 字体颜色 + 自身 Hover
.color(@color, @hovercolor) {
color: @color;
&:hover {
color: @hovercolor;
}
}
// 字体颜色 + 链接 Hover
.color(@color, @acolor, @hovercolor) {
color: @color;
a {
color: @acolor;
&:hover {
color: @hovercolor;
}
}
}
// 正常字体样式
.normal-font() {
font-weight: normal;
font-style: normal;
}
// 辅助性文字(灰色)
.assist-font(@color: #b0b0b0, @fz: 14px) {
color: @color;
font-size: @fz;
}
// 禁止换行, 文本溢出省略号显示 (一行)
.ellipsis() {
white-space: normal;
word-wrap: break-word;
word-break: break-all;
-o-text-overflow: ellipsis;
-ms-text-overflow: ellipsis;
text-overflow: ellipsis;
overflow: hidden;
}
// 文本溢出省略号显示 (多行)
// 只支持 webkit 浏览器, 解决方案:高度 = 行高*行数
// height: 90px; line-height: 30px; -webkit-line-clamp: 3;
.ellipsis-mult(@n: 3) {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: @n;
word-break: break-all;
-o-text-overflow: ellipsis;
-ms-text-overflow: ellipsis;
text-overflow: ellipsis;
overflow: hidden;
}
// 书写模式:牌匾从右至左水平单行排版效果、文笺从右至左、从上至下排版效果
.retext(x) {
direction: rtl;
unicode-bidi: bidi-override;
}
.retext(y) {
writing-mode: tb-rl;
writing-mode: vertical-rl;
}
// 文字透明
.transparent-text() {
font: 0/0 serif;
text-shadow: none;
color: transparent;
}
// 文字隐藏(常用于SEO优化)
// <a href="" title="Logo SEO 优化 "><h1 class="logo">xx</h1></a>
.hidden-text() {
text-indent: -9999px;
overflow: hidden;
text-align: left;
}
// 文字外发光效果
.glow-text(@r: 10px, @color: gold) {
text-shadow: 0 0 @r @color;
}
/*-------------------------------------
├ 图像 ┆
└------------------------------------*/
// 用 max-width 来防止图片撑破容器
.max-img() {
display: block;
max-width: 100%;
height: auto;
}
// 2x 3x 背景图片
.bg-image(@url) {
background-image: url("@url + '@2x.png'");
@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
background-image: url("@url + '@3x.png'");
}
}
// 全屏大图背景
.fullscreen-bg(@url) {
width: 100vw;
height: 100vh;
background: url(@url) no-repeat 50% 50%;
background-size: cover;
}
// 滤镜: 将彩色照片显示为黑白照片
.grayscale() {
filter: grayscale(100%);
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
}
/*-------------------------------------
├ 动效 ┆
└------------------------------------*/
// 链接默认无下划线,hover后有下划线的样式
.hover-link() {
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
// 将链接变成默认的文字样式
.unstyled-link() {
color: inherit;
cursor: inherit;
text-decoration: inherit;
&:active,
&:focus {
outline: none;
}
}
// 盒子阴影
// box-shadow: 水平阴影的位置, 垂直阴影的位置, 模糊距离, 阴影的大小, 阴影的颜色, 阴影开始方向(默认是从里往外,设置inset就是从外往里);
// box-shadow: h-shadow v-shadow blur spread color inset;
.box-shadow() {
box-shadow: 0px 14px 26px 0px rgba(0, 0, 0, 0.1);
}
// 盒子 Hover
.box-hover() {
// box-shadow: 0px 1px 2px 0px rgba(84, 107, 107, .4);
transition: all 0.2s linear;
&:hover {
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.1);
transform: translate3d(0, -2px, 0);
}
}
.box-hover2() {
transition: transform 0.5s ease;
&:hover {
transform: translateX(10px);
}
}
// 三维闪动 bug 处理
.transform-fix() {
-webkit-backface-visibility: hidden;
-webkit-transform-style: preserve-3d;
}
// Animation
.ani(@name, @time: 1s, @ease: ease-in-out, @fillmode: forwards) {
animation-name: @name;
animation-duration: @time;
animation-timing-function: @ease;
animation-fill-mode: @fillmode;
}
/*-------------------------------------
├ 功能 ┆
└------------------------------------*/
// 浮动, 兼容 IE6
.fl() {
float: left;
*display: inline;
_display: inline;
}
.fr() {
float: right;
*display: inline;
_display: inline;
}
// 清除浮动
.clearfix() {
*zoom: 1;
&:after {
display: block;
clear: both;
content: '';
visibility: hidden;
height: 0;
}
}
.clearfix(table) {
*zoom: 1;
&:before,
&:after {
content: ' ';
display: table;
clear: both;
}
}
// 禁止文本被选择
.user-select() {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
// 隐藏鼠标手势
.hide-cursor() {
cursor: none !important;
}
// 鼠标禁用样式,但仍然可以触发事件
// <input type="text" disabled="disabled">
.disabled() {
cursor: not-allowed;
}
// 禁用元素事件
// 1. 阻止任何点击动作的执行
// 2. 使链接显示为默认光标(cursor:default)
// 3. 阻止触发hover和active状态
// 4. 阻止JavaScript点击事件的触发
.pointer-events() {
pointer-events: none;
}
// 模糊
.blur(@blur: 10px) {
filter: blur(@blur);
-webkit-filter: blur(@blur);
-moz-filter: blur(@blur);
-o-filter: blur(@blur);
-ms-filter: blur(@blur);
filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='@{blur}');
*zoom: 1;
}
// 透明度, 兼容 IE8
.opacity(@opacity: 20) {
opacity: @opacity / 100;
filter: alpha(opacity= @opacity);
}
// 用伪类来显示打印时 a 标签的链接
.print-link() {
@media print {
a[href]:after {
content: ' (' attr(href) ') ';
}
}
}
// 隔行换色
.zebra-lists(odd, @color) {
&.odd {
> li:nth-child(odd) {
background-color: @color;
}
}
}
.zebra-lists(even, @color) {
&.even {
> li:nth-child(even) {
background: green;
}
}
}
// 首字下沉
.first-letter(@font-size: 6em) {
&::first-letter {
float: left;
line-height: 1;
font-size: @font-size;
}
}
// 特殊标记段落第一行
.first-line() {
&::first-line {
color: red;
}
}
// 美化选中文本
.beauty-select() {
&::selection {
color: #fff;
background-color: #6bc30d;
text-shadow: none;
}
}
// 美化占位符 placeholder 样式
.beauty-placeholder(@fz, @color: #999, @align: left) {
&:-moz-placeholder {
font-size: @fz;
color: @color;
text-align: @align;
}
&:-ms-input-placeholder {
font-size: @fz;
color: @color;
text-align: @align;
}
&::-webkit-input-placeholder {
font-size: @fz;
color: @color;
text-align: @align;
}
}
// 美化占位符 placeholder 样式(自定义属性和值)
.beauty-placeholder(custom, @property, @value) {
&:-moz-placeholder {
@{property}: @value;
}
&:-ms-input-placeholder {
@{property}: @value;
}
&::-webkit-input-placeholder {
@{property}: @value;
}
}
/*-------------------------------------
├ 图形 ┆
└------------------------------------*/
// 三角形
.triangle(@width: 4px,@color: #000) {
display: inline-block;
width: 0;
height: 0;
vertical-align: middle;
border-top: @width solid @color;
border-left: @width solid transparent;
border-right: @width solid transparent;
}
// 三角形箭头气泡效果, IE6-7 无表现
.arrow(top, @w: 10px, @color, @x: 50%) {
position: relative;
&:before {
position: absolute;
bottom: 100%;
left: @x;
content: ' ';
height: 0;
width: 0;
pointer-events: none;
border-style: solid;
border-color: transparent;
border-bottom-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-left: unit(@margin, px);
}
}
.arrow(right, @w: 10px, @color, @y: 50%) {
position: relative;
&:before {
position: absolute;
left: 100%;
top: @y;
content: ' ';
height: 0;
width: 0;
pointer-events: none;
border-style: solid;
border-color: transparent;
border-left-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-top: unit(@margin, px);
}
}
.arrow(bottom, @w: 10px, @color, @x: 50%) {
position: relative;
&:before {
position: absolute;
top: 100%;
left: @x;
content: ' ';
height: 0;
width: 0;
pointer-events: none;
border-style: solid;
border-color: transparent;
border-top-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-left: unit(@margin, px);
}
}
.arrow(left, @w: 10px, @color, @y: 50%) {
position: relative;
&:before {
position: absolute;
right: 100%;
top: @y;
content: ' ';
height: 0;
width: 0;
pointer-events: none;
border-style: solid;
border-color: transparent;
border-right-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-top: unit(@margin, px);
}
}
// 三角形箭头气泡效果, 带边框
.arrow-with-border(top, @w: 10px, @color, @border-w: 1px, @border-color, @x: 50%) {
position: relative;
&:before,
&:after {
bottom: 100%;
left: @x;
content: ' ';
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-style: solid;
border-color: transparent;
}
&:after {
border-bottom-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-left: unit(@margin, px);
}
&:before {
border-bottom-color: @border-color;
@arrbo: @w+ @border-w;
border-width: unit(@arrbo, px);
@margin-bo: -@arrbo;
margin-left: unit(@margin-bo, px);
}
}
.arrow-with-border(bottom, @w: 10px, @color, @border-w: 1px, @border-color, @x: 50%) {
position: relative;
&:before,
&:after {
top: 100%;
left: @x;
content: ' ';
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-style: solid;
border-color: transparent;
}
&:after {
border-top-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-left: unit(@margin, px);
}
&:before {
border-top-color: @border-color;
@arrbo: @w+ @border-w;
border-width: unit(@arrbo, px);
@margin-bo: -@arrbo;
margin-left: unit(@margin-bo, px);
}
}
.arrow-with-border(left, @w: 10px, @color, @border-w: 1px, @border-color, @y: 50%) {
position: relative;
&:before,
&:after {
top: @y;
right: 100%;
content: ' ';
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-style: solid;
border-color: transparent;
}
&:after {
border-right-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-top: unit(@margin, px);
}
&:before {
border-right-color: @border-color;
@arrbo: @w+ @border-w;
border-width: unit(@arrbo, px);
@margin-bo: -@arrbo;
margin-top: unit(@margin-bo, px);
}
}
.arrow-with-border(right, @w: 10px, @color, @border-w: 1px, @border-color, @y: 50%) {
position: relative;
&:before,
&:after {
top: @y;
left: 100%;
content: ' ';
height: 0;
width: 0;
position: absolute;
pointer-events: none;
border-style: solid;
border-color: transparent;
}
&:after {
border-left-color: @color;
border-width: unit(@w, px);
@margin: -@w;
margin-top: unit(@margin, px);
}
&:before {
border-left-color: @border-color;
@arrbo: @w+ @border-w;
border-width: unit(@arrbo, px);
@margin-bo: -@arrbo;
margin-top: unit(@margin-bo, px);
}
}
/*-------------------------------------
├ 组件 ┆
└------------------------------------*/
// 吸顶导航
.fix-header(@h: 70px) {
.fixed();
top: 0;
left: 0;
width: 100%;
height: @h;
z-index: 1000;
// background-color: rgba(256, 256, 256, .92);
// border-bottom: 1px solid rgba(7, 17, 27, 0.1);
// box-shadow: 0px 0px 20px rgba(0,0,0,0.2);
}
// 吸底导航
.fix-header(@h: 70px) {
.fixed();
left: 0;
bottom: 0;
width: 100%;
height: @h;
z-index: 1000;
}
// 输入框
.input-text() {
display: block;
width: 100%;
padding: 4px 8px;
font-size: 14px;
line-height: 1.42858;
color: #333;
border: 1px solid #ddd;
background-color: #fff;
border-radius: 3px;
}
// 分割线
// <span class="separator">|/-</span>
.separator() {
margin: 0 10px;
color: #999;
font-size: 14px;
}
// 分割线 / (面包屑导航)
.separator2() {
&:before {
padding: 0 5px;
color: #ccc;
content: '/\00a0';
}
}
// <hr class="hr">
// 支付宝:我也是有底线的
.hr() {
height: 1px;
margin: 10px 0;
border: 0;
clear: both;
background-color: #e2e2e2;
}
// 改装的 fieldset
// <fieldset><legend>返璞归真</legend></fieldset>
.fieldset() {
border-color: #d2d2d2;
border-width: 1px 0 0;
border-style: solid;
legend {
padding: 0 20px;
text-align: center;
font-size: 20px;
font-weight: 300;
}
}
// 引用区块(模仿 Layui)
// <div class="blockquote">Lorem ipsum dolor sit amet.</div>
.blockquote() {
margin-bottom: 10px;
padding: 15px;
line-height: 22px;
border-left: 5px solid #009688;
border-radius: 0 2px 2px 0;
background-color: #f2f2f2;
}
// 徽章 (椭圆、小圆点)
// <span class="badge">10</span>
.badge(...) {
position: relative;
display: inline-block;
font-size: 12px;
color: #fff;
background-color: #ff5722;
}
.badge(ellipse) {
min-width: 8px;
height: 18px;
padding: 2px 6px;
text-align: center;
line-height: 18px;
border-radius: 9px;
}
.badge(dot) {
width: 8px;
height: 8px;
border-radius: 50%;
}
// 关闭按钮
// <button class="close" type="button"><span>×</span></button>
.close() {
position: relative;
-webkit-appearance: none;
padding: 0;
cursor: pointer;
background: 0 0;
border: 0;
font-size: 20px;
font-weight: 700;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
filter: alpha(opacity=20);
opacity: 0.2;
&:hover {
color: #000;
text-decoration: none;
cursor: pointer;
filter: alpha(opacity=50);
opacity: 0.5;
}
&:before {
content: '';
position: absolute;
top: -10px;
left: -10px;
right: -10px;
bottom: -10px;
}
}
// 1 像素边框问题
.onepx(...) {
position: relative;
&:after {
content: '';
display: block;
position: absolute;
left: 0;
width: 100%;
border-top: 1px solid rgba(7, 17, 27, 0.1);
transform: scaleY(0.5);
}
}
.onepx(top) {
&:after {
top: 0;
}
}
.onepx(bottom) {
&:after {
bottom: 0;
}
}
.onepx-easy(top, @color: #ccc) {
box-shadow: inset 0px -1px 1px -1px @color;
}
.onepx-easy(bottom, @color: #ccc) {
box-shadow: inset 0px 1px 1px -1px @color;
}