1. vue项目配置scss
1.1 vue项目安装scss
# 安装sass的相关依赖配置
npm i node-sass sass-loader --save -dev
1.2 vue项目配置scss
// vuecli2配置( 在build文件夹下的webpack.base.conf.js的rules里面添加配置);vuecli3安装完即可使用
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
}
1.3 node-sacc安装失败处理
# 先配置淘宝镜像拉去资源,然后重新npm install
npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
2. vue项目使用scss
2.1 颜色常量定义(var.scss)
// !default指定变量默认值
/* Color
-------------------------- */
$--color-white: #FFFFFF !default;
/* Typography(排版)
-------------------------- */
$--font-size-base: 14px !default;
/* Border
-------------------------- */
$--border-width-base: 1px !default;
/* Button
-------------------------- */
$--button-active-shade-percent: 10% !default;
2.2 配置常量枚举(config.scss)
/* 常用配置枚举 */
$namespace: 'gxy'; // 命名空间( 类名以什么开头 )
/*
BEM命名模式
.block {}
.block__element {}
.block--modifier {}
· block 代表更高级的抽象或组件
· block__element 代表.block的后代, 用于形成一个完整的.block的整体
· block--modifier 代表.block的不同状态或不同版本
例子:
html:
<button class="article__button--primary">按钮</button>
scss:
.article {
max-width: 200px;
&__button {
padding: 5px 8px;
&--primary {
background: blue;
}
}
}
*/
$element-separator: '__'; // 分割符号( 命名分割符号 )
$modifier-separator: '--'; // 修饰符号
$state-prefix: 'is-'; // 状态类前缀( 与控制样式状态相关的前缀 )
2.3 默认模块样式封装(_button.scss)
/*
@mixin指令可以定义Mixins模块, 再使用@include导入;
同时支持写方法传参
例子:
定义button模块(_btn.scss):
@mixin button {
font-size: 1em;
padding: 0.5 em 1.0em;
text-decoration: none;
color: #fff;
}
使用button模块(btn.scss):
@import "_btn.scss";
.button-green {
@include button;
background: green;
}
*/
// 按钮默认样式
@mixin button-plain($color) {
color: $color;
/*
Mix 函数是将两种颜色根据一定的比例混合在一起,生成另一种颜色
mix($color-1,$color-2,$weight);
$color-1 和 $color-2 指的是你需要合并的颜色,颜色可以是任何表达式,也可以是颜色变量。
$weight 为 合并的比例(选择权重),默认值为 50%,其取值范围是 0~1 之间,若为0,则显示$color-2颜色
*/
background: mix($--color-white, $color, 90%);
border-color: mix($--color-white, $color, 60%);
&:hover,
&:focus {
background: $color;
border-color: $color;
color: $--color-white;
}
&:active {
background: mix($--color-black, $color, $--button-active-shade-percent);
}
&.is-disabled {
&,
&:hover,
&:focus,
&:active {
color: mix($--color-white, $color, 40%);
background-color: mix($--color-white, $color, 90%);
border-color: mix($--color-white, $color, 80%);
}
}
}
2.4 公共模块封装(BEM命名封装)(mixins.scss)
/* BEM
-------------------------- */
@mixin b($block) {
// !global效果类似!important,强制修改
$B: $namespace+'-'+$block !global;
// #{}插值语句,类似vue的{{}}
.#{$B} {
/*
在引用混合样式的时候,可以先将一段代码导入到混合指令中,然后再输出混合样式,额外导入的部分将出现在 @content 标志的地方:
例子:
@mixin apply-to-ie6-only {
* html {
@content;
}
}
@include apply-to-ie6-only {
#logo {
background-image: url(/logo.gif);
}
}
编译为:
* html #logo {
background-image: url(/logo.gif);
}
*/
@content;
}
}
@mixin e($element) {
$E: $element !global;
$selector: &; // 选择器
$currentSelector: ""; // 当前选择器
@each $unit in $element {
$currentSelector: #{$currentSelector + "." + $B + $element-separator + $unit + ","};
}
@if hitAllSpecialNestRule($selector) {
@at-root {
#{$selector} {
#{$currentSelector} {
@content;
}
}
}
} @else {
@at-root {
#{$currentSelector} {
@content;
}
}
}
}
@mixin m($modifier) {
$selector: &;
$currentSelector: "";
@each $unit in $modifier {
$currentSelector: #{$currentSelector + & + $modifier-separator + $unit + ","};
}
@at-root {
#{$currentSelector} {
@content;
}
}
}
/* 区分不同状态 */
@mixin when($state) {
/*
@at-root内联选择器模式 (编译出来的CSS无任何嵌套,让代码更加的简单)
例子:
.foo {
@at-root .bar {
color:gray;
}
}
.bar {
color: gray;
}
*/
@at-root {
&.#{$state-prefix + $state} {
@content;
}
}
}
2.5 工具类方法(util.scss)
/*
设置或检索是否允许用户选中文本
user-select:none |text| all | element
默认值: text
none: 文本不能被选择
text: 可以选择文本
all: 当所有内容作为一个整体时可以被选择。如果双击或者在上下文上点击子元素,那么被选择的部分将是以该子元素向上回溯的最高祖先元素
element: 可以选择文本,但选择范围受元素边界的约束
*/
@mixin utils-user-select($value) {
-moz-user-select: $value;
-webkit-user-select: $value;
-ms-user-select: $value;
}
3. vue组件封装
<template>
<button
class="gxy-button"
@click="handleClick"
:disabled="disabled || loading"
:autofocus="autofocus"
:type="nativeType"
:class="[
type? 'gxy-button--'+ type : '',
size? 'gxy-button--'+ size: '',
{
'is-disabled': disabled,
'is-loading': loading,
'is-plain': plain,
'is-round': round,
'is-circle': circle
}
]"
>
<i class="el-icon-loading" v-if="loading"></i>
<i :class="icon" v-if="icon && !loading"></i>
<!--
$slots.default 所有没有被包含在具名插槽中的节点
-->
<span v-if="$slots.default"><slot></slot></span>
</button>
</template>
<script>
export default {
props: {
loading: Boolean,
disabled: Boolean,
autofocus: Boolean,
plain: Boolean,
round: Boolean,
circle: Boolean,
size: String, // 按钮大小: medium
nativeType: { // 按钮type类型
type: String,
default: 'button'
},
type: { // 按钮类型: default,primary
type: String,
default: 'default'
},
icon: {
type: String,
default: ''
},
},
computed: {},
methods: {
handleClick(event) {
this.$emit('click', event);
}
}
}
</script>
<style scoped lang="sass">
@import "./button.scss"
</style>
4. button组件使用
<template>
<CustomBtn
type="primary">
按钮
</CustomBtn>
</template>
<script>
import {CustomBtn} from '_ele/components'
export default {
components: {CustomBtn},
}
</script>
组件封装详情