个人在做项目的过程中总结归纳的一些常用 Mixin,现在分享出来供大家学习。
基于 Less 编写。但是 CSS 预处理器都是相通的,你可以很轻易的修改成 Sass、Stylus
代码免不了错误和 Bug,如果你能帮我修改或者补充 万分感谢!!
参考了一些开源库,如:est、csslab 等
- /**
- * 作品:mixin.less
- * 更新:2017年12月14日
- * 简介:1. 一个基于 Less 的样式工具库,封装了常用 mixin,帮助您更轻松地书写 Less 代码。
- * 2. 只在调用时才输出代码,减少代码冗余,避免样式污染
- * 3. 不自带兼容前缀,减少代码量,而建议采用工具生成,如 postcss、Autoprefixer、less-plugin-autoprefix 等
- * 4. 附带 IE 各类 Hack
- */
- /*-------------------------------------
- ├ 布局 ┆
- └------------------------------------*/
- // 盒子宽高
- .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优化)
- //
- xx
- .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 .2s linear;
- &:hover {
- box-shadow: 0 15px 30px rgba(0, 0, 0, .1);
- transform: translate3d(0, -2px, 0);
- }
- }
- .box-hover2() {
- transition: transform .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; }
- // 鼠标禁用样式,但仍然可以触发事件
- //
- .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;
- }
- // 分割线
- // |/-
- .separator() {
- margin: 0 10px;
- color: #999;
- font-size: 14px;
- }
- // 分割线 / (面包屑导航)
- .separator2() {
- &:before {
- padding: 0 5px;
- color: #ccc;
- content: "/\00a0";
- }
- }
- //
- // 支付宝:我也是有底线的
- .hr() {
- height: 1px;
- margin: 10px 0;
- border: 0;
- clear: both;
- background-color: #e2e2e2;
- }
- // 改装的 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)
- //
- Lorem ipsum dolor sit amet.
- .blockquote() {
- margin-bottom: 10px;
- padding: 15px;
- line-height: 22px;
- border-left: 5px solid #009688;
- border-radius: 0 2px 2px 0;
- background-color: #f2f2f2;
- }
- // 徽章 (椭圆、小圆点)
- // 10
- .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%;
- }
- // 关闭按钮
- // ×
- .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: .2;
- &:hover {
- color: #000;
- text-decoration: none;
- cursor: pointer;
- filter: alpha(opacity=50);
- opacity: .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; }
来源: https://juejin.im/post/5a31f53f51882555cc41deda