關於 Element UI

關於 Element UI

Element UI 文章

如何快速製作 UI ?

手稿 快速製作 UI 雛形

1 蒐集 Element UI 原型寫法
2 預寫 Data 資料結構
3 繪製版型及 Data
4 撰寫版型 Html

 

如何在父組件下引用 Element UI 的子組件來修改樣式?

修改 Element UI 組件的方式有三種

第一種是直接於父組件下直接對 Element UI 的 Class 樣式做修改

<style scoped>
   .el-input__inner{
       background-color: red;
   }
</style>
  • 優點:可以快速修改樣式。
  • 缺點:如果把 scoped 拿掉的話,就會汙染到全局,不理想。
Tips
Element UI 元件,其本身就是一個組件,每個組件對應到一個 Class,透過 Class 來修改其樣式。

第二種直接將 Element UI 預設的 CSS 另外增加你的樣式,並由 JS 去添加

找到預設 Element UI 預設路徑
node_mouled/element-ui/lib/theme-chalk
引用預設樣式,並在你所預設路徑上增加樣式
src
├── assets
    ├── css
        └── vendors-extensions
            └── element-ui.scss

/* color:  */
$--color-primary: rgb(128, 0, 64);

/* icon font path, required */
$--font-path: '~element-ui/lib/theme-chalk/fonts';

@import "~element-ui/packages/theme-chalk/src/index";

在 src 目錄下建立一個資料夾及一個 JS 並引用你增加的樣式
src
├── plugins
    └── element.js

//element.js
import Vue from 'vue'
import Element from 'element-ui'
import '../assets/css/vendors-extensions/element-ui.scss'  //引用自訂樣式
import locale from 'element-ui/lib/locale/lang/zh-TW'

Vue.use(Element, { locale })
  • 優點:不會覆寫原本 Element UI 的預設樣式
  • 缺點: 需要花時間將整包 CSS 架構看完

第三種是直接在父組件中使用 vue loader 提供的 scoped 功能修改樣式

這裡有兩種寫法: >>> 和 /deep/ 
於 scoped 樣式中使用 ' 深度作用選擇器 '來影響子組件的樣式

style(scoped)
 .a>>>.b         //此段樣式編譯為下方程式碼
 .a[data-v-f3f3eg9] .b
Tips
某些預處理器 (如:sass ) ,無法正常解析 >>>,這時可以使用 /deep/ 組合器,它與 >>> 的作用相同。
style(scoped)
 .a /deep/ .b    //與 >>> 效果一樣
 .a[data-v-f3f3eg9] .b
  • 優點:可以直接在父組件中立即修改樣式
  • 缺點:以這種覆寫 Element UI 的 CSS 效能有待驗證
以第三種方式修改 Element UI 樣式:
<template lang="pug">
.test
 ElContainer(direction='vertical')
  ElHeader 頭部
  ElMain
   ElInput(v-model="input" placeholder='請輸入內容')
   ElInputNumber(v-model="num"  :min="1" :max="10" label="描述文字")
</template>
<style lang="scss" scoped>
.test /deep/ {
  .el-header {
    padding: 0;
    margin: 0;
    height: 0 !important;
  }
  .el-main {
    margin: 0 5rem;
    .el-input:nth-last-child(1) {
      /deep/ .el-input__inner {
        background-color: red;
      }
    }
    .el-input:nth-last-child(2) {
      /deep/ .el-input__inner {
        background-color: rgb(50, 200, 138);
      }
    }
  }
}
</style>

參考資料

  1. Vue Loader 作用域CSS(scoped)- /deep/ 深入組件選擇器
  2. Vue Element-ui 全局變量
  3. 如何在Vue裡面使用Element-ui並修改CSS樣式呢?

Element UI 筆記

Layout 布局

通過基礎 24分欄,迅速簡便地創建布局

基本布局

<el-row>
  <el-col :span="24"></el-col>
</el-row>

.el-row{
  margin-button: 20px;
  &:last-child{
    margin-bottom:0;
  }
}

以此可以分為一欄(24)、二欄(12)、三欄(8)、四欄(6)、五欄(4)

分欄間隔

<el-row :gutter="20">
  <el-col :span="12"></el-col>
  <el-col :span="12"></el-col>
</el-row>

Row 組件提供 gutter 屬性來指定每一欄之間的間隔,默認間隔為 0

:gutter 是利用 el-col 內的 padding 去控制

Tips
:gutter="0"

對齊方式

通過 flex 布局對齊分欄進行靈活的對齊

<el-row type="flex" justify="center">
  <el-col :span="12"></el-col>
  <el-col :span="12"></el-col>
</el-row>

將 type 屬性賦予 flex,並通過 justify 屬性指定  start, center, end, space-between, space-around 子元素排版方式。通過 align 屬性指定 flex 布局下的水平排列方式

Tips
type="flex"
justify="start"
justify="center"
justify="end"
justify="space-between"
justify="space-around"

響應式布局

參照 Bootstrap 的響應式設計,預設五個響應尺寸:xs、sm、md、lg、xl

<el-row>
  <el-col :xs="8" :sm="6" :md="4" :xl="1"></el-col>
  <el-col :xs="8" :sm="6" :md="4" :xl="1"></el-col>
</el-row>
Tips
:xs="12" :sm="16" :md="18" :lg="20" :span="20"

Container 佈局容器

<el-container></el-container>:外層容器。當子元素中包含<el-header> 或 <el-footer> 時,全部子元素會垂直上下排列,否則水平

<el-header>:頂欄容器。
<el-aside>:側邊欄容器。
<el-main>:主要區域容器。
<el-footer>:底欄容器。

以上元件採用了 flex 佈局,使用前請確定目標瀏覽器是否相容。此外,<el-container> 的子元素只能是後四者,後四者的父元素也只能是 <el-container>。


基於斷點的隱藏類
包含的類名及其含意為:

hidden-xs-only - 當視覺在 xs 尺寸時隱藏
hidden-sm-only - 當視覺在 sm 尺寸時隱藏
hidden-sm-and-down - 當視覺在 sm 及以下尺寸時隱藏
hidden-sm-and-up - 當視覺在 sm 及以上尺寸時隱藏
hidden-md-only - 當視覺在 md 尺寸時隱藏
hidden-md-and-down - 當視覺在 md 及以下尺寸時隱藏
hidden-md-and-up - 當視覺在 md 及以上尺寸時隱藏
hidden-lg-only - 當視覺在 lg 尺寸時隱藏
hidden-lg-and-down - 當視覺在 lg 及以下尺寸時隱藏
hidden-lg-and-up - 當視覺在 lg 及以上尺寸時隱藏
hidden-xl-only - 當視覺在 xl 尺寸時隱藏

/* Element 基於斷點的隱藏類 */
@media only screen and (max-width: 767px) {
  .hidden-xs-only {
    display: none !important;
  }
}
@media only screen and (min-width: 768px) {
  .hidden-sm-and-up {
    display: none !important;
  }
}
@media only screen and (min-width: 768px) and (max-width: 991px) {
  .hidden-sm-only {
    display: none !important;
  }
}
@media only screen and (max-width: 991px) {
  .hidden-sm-and-down {
    display: none !important;
  }
}
@media only screen and (min-width: 992px) {
  .hidden-md-and-up {
    display: none !important;
  }
}
@media only screen and (min-width: 992px) and (max-width: 1199px) {
  .hidden-md-only {
    display: none !important;
  }
}
@media only screen and (max-width: 1199px) {
  .hidden-md-and-down {
    display: none !important;
  }
}
@media only screen and (min-width: 1200px) {
  .hidden-lg-and-up {
    display: none !important;
  }
}
@media only screen and (min-width: 1200px) and (max-width: 1919px) {
  .hidden-lg-only {
    display: none !important;
  }
}
@media only screen and (max-width: 1919px) {
  .hidden-lg-and-down {
    display: none !important;
  }
}
@media only screen and (min-width: 1920px) {
  .hidden-xl-only {
    display: none !important;
  }
}

斷點使用在class上

<el-col :span="12" :md="12" class="hidden-xs-only">
  <div class="grid-content bg-purple "></div>
</el-col>

符合此寸大小時隱藏:

hidden-xs-only <767px 
hidden-sm-only 768px-991px
hidden-md-only 992px-1100px
hidden-lg-only 1200px-1919px
hidden-xl-only >1920px

Button 按鈕

//基本按鈕
ElButton 主要按鈕
ElButton(type="primary") 加入顏色按鈕
ElButton(type="primary" round)  圓角按鈕
ElButton(type="warning" round icon="el-icon-edit") <!-- Icon 加入按鈕 ElButton(type="text") 無框線按鈕 -->
ElButton(type="primary" icon="el-icon-search") 搜索 <!-- Icon 與文字按鈕-->
//按鈕組合
ElButtonGroup
 ElButton(type="danger" icon="el-icon-arrow-left") 上一頁
 ElButton(type="danger" icon="el-icon-arrow-right") 下一頁
//加載中
ElButton(type="success" :loading="loading") 加載中
ElButton(@click="checked()") 按鈕

Tips
type="primary" 藍色
type="success" 綠色
type="info" 灰色
type="warnig" 橘色
type="danger" 紅色

size="medium" 適當
size="small" 小
size="mini" 迷你

type="text" 無框線按鈕
round 圓形按鈕
icon="..." Icon 加入按鈕

autofocus="true" 是聚焦按鈕
autofocus="false" 不是聚焦按鈕

plain="true" 背景為半透明
plain="false" 背景為半透明

:loading="true" 加載中
:loading="false" 已加載完成 

native-type="button" (原生屬性)
native-type="submit" (原生屬性)
native-type="reset" (原生屬性)

data(){
 return{
  loading:false
 }
},
methods: {
  checked() {
    this.loading = !this.loading;
  }
}

修改 ElBottom 樣式
<template lang="pug>
.a
 ElButton(type="success" size="medium") 按鈕
 ElButton(type="success" size="medium") 按鈕
</template>
<style lang="scss">
.a {
  .el-button {
    background-color: rgb(145, 199, 163);
    border:none;
    &:hover {
      color:rgb(100, 138, 112);
      background-color: rgba(145, 199, 163, 0.5);
    }
  }
}
</style>

Radio 單選框


//一般常用的單選
<template lang="pug">
  ElRadio(v-model="radio" label="1") 選項一
  ElRadio(v-model="radio" label="2") 選項二
  ElRadio(v-model="radio" label="3") 選項三
//可以省略 v-model 的單選
  ElRadioGroup(v-model="radio")
     ElRadio(label="1") 選項一
     ElRadio(label="2") 選項二
     ElRadio(label="3") 選項三
//帶有邊框的單選
ElRadioGroup(v-model="radio")
  ElRadio(label="1" border) 選項一
  ElRadio(label="2" border) 選項二
  ElRadio(label="3" border) 選項三
//單選以 Button 方式呈現
  ElRadioGroup(v-model="radio")
     ElRadioButton(label="1") 選項一
     ElRadioButton(label="2") 選項二
     ElRadioButton(label="3") 選項三
//回傳 radio 資料
<template lang="pug">
ElRadioGroup(v-model="radio")
 ElRadio(label='M') 男生
 ElRadio(label='W') 女生
p {{radio}}
</template>
<style lang="scss">
data(){
  return{
   radio:''
  }
}
</style>
Tips
ElRadio
label="M" Radio 的 Value
border=true 有邊框

size="medium" 適當
size="small" 小
size="mini" 迷你

name="M" 原生 name 屬性

change="" 綁定值變化時觸發事件(回調,選中的 Radio label 值)


ElRadioGroup
change="" 綁定值變化時觸發事件(回調,選中的 Radio label 值)

Checkbox 多選框

//基本使用
ElCheckbox(v-model="checked") 選項欄位
data(){
 return{
  checked:true
 }
}
//多選框組
ElCheckboxGroup(v-model="checkList")
 ElCheckbox(label="選項 A")
 ElCheckbox(label="選項 B")
 ElCheckbox(label="選項 C")
 ElCheckbox(label="禁用" disabled)
 ElCheckbox(label="選中且禁用")
data(){
 return{
  checkList:['選項 A','選中且禁用']
 }
}
//全選 indeterminate 狀態
ElCheckbox(v-model="checkAll" label="全選" :indeterminate="isIndeterminate" @change="handleCheckAllChange")
ElCheckboxGroup(v-model="checkedCities" @change="handleCheckedCitiesChange")
 ElCheckbox(v-for="city in cities" :label="city" :key="city" ) {{city}}
data() {
  return {
    checkAll: false,
    isIndeterminate: true,
    cities: cityOptions,
    checkedCities: ["臺北"]
  };
},
methods: {
  handleCheckAllChange(val) {
    this.checkedCities = val ? cityOptions : [];
    this.isIndeterminate = false
  }, // 處理 cities 勾選與否
  handleCheckedCitiesChange(value) {
    let checkedCount = value.length;
    this.checkAll = checkedCount === this.cities.length;
    this.isIndeterminate =
      checkedCount > 0 && checkedCount < this.cities.length;
  }  // 處理 checkAll 勾選與否

//這邊的狀態發生變化,影響其他地方
//限制可選的數量
ElCheckboxGroup(v-model="checkedCities" :min="1" :max="3")
 ElCheckbox(v-for="city in cities" :label="city" :key="city") {{city}}
data() {
  return {
    cities:cityOptions,
    checkedCities:[]
  };
}
//按鈕樣式多選框
 

Tips
ElCheckbox
v-model="" Data 互動的資料(直接使用 label 上的字串,即可呈現 true)
label="選項 A" 當前 Checkbox 的 Value

disabled checkbox 禁止點選
border 帶有邊框

@change="" 數據變動時觸發事件

indeterminate="true" 設置 indeterminate 狀態,只負責樣式控制

ElCheckboxGroup
:min="1" 最小可選項目
:max="3" 最大可選項目

size="medium" 適當
size="small" 小
size="mini" 迷你

修改樣式
.is-bordered{
  margin:0;
}
.el-checkbox.is-bordered + .el-checkbox.is-bordered{
  margin-left:0.5rem;
} // border 之間距離

Select 選擇器

解決使用 v-for 的問題,需要加上 value-key="id",來指定他唯一的值

<template lang="pug">
ElSelect(v-model="form.regin" placeholder='請選擇活動區域')
 ElOption(v-for="item in listOne" value-key="id" :label="item.label" :value="item.value")
</template>
<script>
data(){
 return{
  listOne:[
    { label: "區域一", value: "1" },
    { label: "區域二", value: "2" },
    { label: "區域三", value: "3" }
  ]
 }
}
</script>

參考資料

  1. Element UI-[Select] :Value

Card 卡片

//基本用法(標題、內容、操作)
<template lang="pug">
ElCard(class="box-card-three")
 div(slot="header")
  div(class="card-title") 卡片名稱
  ElButton 操作按鈕
 div(v-for="item in name" :key="item") {{item}}
 div(class="card-footer") ..    
</template>
<script>
data() {
  return {
    name: ["name1", "name2", "name3", "name4"]
  };
},
</script>
<style lang="scss">
.box-card-three {
  width: 33%;
  .el-card__header {
    .card-title {
      width: 100%;
      text-align: center;
    }
    .el-button {
      float: right;
      margin-top: -15px;
      margin-right: -10px;
      padding: 3px 0;
    }
  }
  .el-card__body {
    background-color: #abd4e9;
    .card-footer {
      margin:0.5rem;
      background-color:#FFF;
    }
  }
}
</style>
Tips
ElCard
:body-style="{padding:'0px'}" 控制 card body 的樣式
shadow="always" 總是顯示陰影
shadow="hover" 鼠標懸浮顯示陰影
shadow="never" 從不顯示陰影

Carousel 走馬燈

在有限空間內,循環播放同一類圖片、文字等內容

//指示器默認 Hover 觸發
<template lang="pug">
ElCarousel(height="150px")
  ElCarouselItem(v-for="item in 4" :key="item")
   span {{item}}
//指示器 click 觸發
ElCarousel(height="150px" trigger="click")
  ElCarouselItem(v-for="item in 4" :key="item")
   span {{item}}
//指示器在容器外
ElCarousel(height="150px" indicator-position="outside")
  ElCarouselItem(v-for="item in 4" :key="item")
   span {{item}}
//一直顯示切換箭頭
ElCarousel(height="150px" arrow="always")
  ElCarouselItem(v-for="item in 4" :key="item")
   span {{item}}
//卡片化
//當頁面寬度方向空間空餘,但高度方向空間匱乏時,可以使用卡片風格
</template>
<style lang="scss">
.el-carousel__item:nth-child(2n) { 
background-color: #99a9bf; 

.el-carousel__item:nth-child(2n+1) { 
background-color: #d3dce6; 
}
</style>

Tips
ElCarousel
height="200px" 200高度
trigger="click" 下方指示器為 click 觸發(默認情況下為 hover 觸發)
indicator-position="outside" 指示器在外部
indicator-position="none" 指示器沒有顯示

arrow="always" 箭頭一直顯示(默認情況下,切換箭頭只有在滑鼠 hover 時顯示)
arrow="never" 從不出現箭頭 

direction="vertical" 走馬燈以垂直跑動
direction="horizontal" 走馬燈以水平跑動(默認)

:interval="4000" 自動切換的時間間隔(單位為毫秒)
:autoplay="false" 是否自動切換(否)

initial-index="0" 初始狀態激活(默認為從 index 0 開始)

 

Color 顏色

NavMenu 導覽菜單


導覽菜單默認垂直模式,通過 mode 屬性可以使導覽菜單變更為水平模式。另外,在菜單中通過 submenu 組件可以生成二級菜單。Menu 還提供了 background-color,text-color 和 active-text-color。

Menu Attribute

mode="horizontal 垂直 / vertical 水平" 設定 Menu 為水平或垂直

background-color="#FFFFFF" 背景顏色

text-color="#303133" 文字顏色

active-text-color="#409EFF" 激活顏色

Menu Events

@select="hangleSelect" 菜單激活回調 index:選單中菜單的index,indexPath:選中菜單項的 index path

        <el-menu
          :default-active="activeIndex"
          class="el-menu-demo"
          mode="horizontal"
          @select="handleSelect"
        >
          <el-menu-item index="1">Home</el-menu-item>
          <el-submenu index="2">
            <template slot="title"
              >PAGE</template
            >
            <el-menu-item index="2-1">選項一</el-menu-item>
            <el-menu-item index="2-2">選項二</el-menu-item>
            <el-menu-item index="2-3">選項三</el-menu-item>
            <el-submenu index="2-4">
              <template slot="title"
                >選項四</template
              >
              <el-menu-item index="2-4-1">選項一</el-menu-item>
              <el-menu-item index="2-4-2">選項二</el-menu-item>
              <el-menu-item index="2-4-3">選項三</el-menu-item>
            </el-submenu>
          </el-submenu>
          <el-menu-item index="3"
            ><a href="#">MEN</a></el-menu-item
          >
        </el-menu>

      data() {
        return {
          activeIndex: "1",
          activeIndex2: "1"
        };
      },
      methods: {
        handleSelect(index, indexPath) {
          console.log(index, indexPath);
        }
      }
<el-meun>
  //單一層寫法
  <el-menu-item index="1"></el-menu-item>

  //兩層以上寫法 
  <el-submenu>
   <template solt="title">顯示於第一層文字</template>
   //顯示第二層文字
   <el-menu-item index="1-1">選項一</el-menu-item>
   <el-menu-item index="1-2">選項二</el-menu-item>
  </el-submenu>
</el-meun>

:default-active,他說明為當前激活菜單的 index,其實,即使不加這個屬性,也能正常顯示選中的 item 變亮,但是之所以要加這個屬性,是為了瀏覽器刷新後,仍然可以定位到之前選中的路由

如果沒有多層嵌套路由的話,可以令:default-active="router.path",但是如果有多層嵌套,建議在計算屬性裡,更新數據如:

computed: {
 defaultActive() {
  return '/' + this.$route.path.split('/').reverse()[0];
}

elementui框架裡導航菜單的default-active的作用 v-for里key的意義

v-for裡,包含與此類似的指令,都需要綁定 Key,是因為這裡的key用於element 框架裡重新渲染定位,如果沒有,輕則重新渲染全部組件,重責報錯。並且,最好佈要綁定 index,否則述則更新的話,會重新渲染內容,最好能使用獨一無二的 id。

Menu 樣式修改

/* 設定 main 顯示寬度 */
#header {
  margin: 0 auto;
  width: 100%;
  padding: 0 15%;
}
/* 設定 el-menu */
#header .el-menu {
  display: flex;
  justify-content: space-between;
}
/* 水平第一層 無下拉 */
/* 水平第一層 有下拉 */
#header .el-menu--horizontal .el-menu-item,
#header .el-menu--horizontal > .el-submenu .el-submenu__title {
  height: 3rem;
  line-height: 3rem;
}
#header .el-menu--horizontal .el-menu-item:hover a {
  text-decoration: none;
}
/* 水平下拉 sole="title" */
/* 水平下拉 除sole以外的所有的子菜單 */
.el-menu--horizontal .el-menu .el-submenu > .el-submenu__title,
.el-menu--horizontal .el-menu .el-menu-item {
  height: 2.5rem;
  line-height: 2.5rem;
}

關於 Element UI 修改樣式的問題

Element-UI 這個前端框架,裡面的自定義標籤(例如 el-menu、el-header等)基本上都是通過設定原生 html 標籤的 class 屬性實現,包括自定義標籤的其他屬性,最後大部分都轉換成了class的值(例如el-menu的mode屬性如果是horizo​​ntal,那麼最後會轉換成class中的一個值“el-menu–horizo​​ntal”,而菜單中的slot屬性title會轉換為“ .el-submenu__title”,bootstrap就很直接,直接設置原生html標籤的類屬性),所以修改樣式時只需找到這些標籤對應的類名稱,然後按照結構用css語法做相應的處理。

element 組件結構

<el-row>
 <el-col></el-col>
</el-row>

//的結構為

<div class="el-row">
  <div class="el-col"></div>
</div>

引用 Element-UI

#main.js
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI) 

修改 Heme.vue

#Home.vue
<template>
  <div>
    <el-button type="success">測試</el-button>
  </div>
</template>

參考資料

  1. Layout 布局
  2. Element-UI 技術揭密(3)— Layout 布局組件的設計與實現
  3. ElementUI學習筆記
  4. Element 基於斷點的隱藏類
  5. Element-UI 修改默認的菜單樣式