首頁

用棧判斷是否是回文字符串

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

加粗樣式
***@TOC

歡迎使用Markdown編輯器
你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學(xué)習(xí)如何使用Markdown編輯器, 可以仔細(xì)閱讀這篇文章,了解一下Markdown的基本語法知識(shí)。

新的改變
我們對(duì)Markdown編輯器進(jìn)行了一些功能拓展與語法支持,除了標(biāo)準(zhǔn)的Markdown編輯器功能,我們?cè)黾恿巳缦聨c(diǎn)新功能,幫助你用它寫博客:

全新的界面設(shè)計(jì) ,將會(huì)帶來全新的寫作體驗(yàn);
在創(chuàng)作中心設(shè)置你喜愛的代碼高亮樣式,Markdown 將代碼片顯示選擇的高亮樣式 進(jìn)行展示;
增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區(qū)域直接展示;
全新的 KaTeX數(shù)學(xué)公式 語法;
增加了支持甘特圖的mermaid語法1 功能;
增加了 多屏幕編輯 Markdown文章功能;
增加了 焦點(diǎn)寫作模式、預(yù)覽模式、簡(jiǎn)潔寫作模式、左右區(qū)域同步滾輪設(shè)置 等功能,功能按鈕位于編輯區(qū)域與預(yù)覽區(qū)域中間;
增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標(biāo)題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入代碼:Ctrl/Command + Shift + K
插入鏈接:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G

合理的創(chuàng)建標(biāo)題,有助于目錄的生成
直接輸入1次#,并按下space后,將生成1級(jí)標(biāo)題。
輸入2次#,并按下space后,將生成2級(jí)標(biāo)題。
以此類推,我們支持6級(jí)標(biāo)題。有助于使用TOC語法后生成一個(gè)完美的目錄。

如何改變文本的樣式
強(qiáng)調(diào)文本 強(qiáng)調(diào)文本

加粗文本 加粗文本

標(biāo)記文本

刪除文本

引用文本

H2O is是液體。

210 運(yùn)算結(jié)果是 1024.

插入鏈接與圖片
鏈接: link.

圖片: 

帶尺寸的圖片: 

居中的圖片: 

居中并且?guī)С叽绲膱D片: 

當(dāng)然,我們?yōu)榱俗層脩舾颖憬?,我們?cè)黾恿藞D片拖拽功能。

如何插入一段漂亮的代碼片
去博客設(shè)置頁面,選擇一款你喜歡的代碼片高亮樣式,下面展示同樣高亮的 代碼片.

// An highlighted block
var foo = 'bar';
1
2
生成一個(gè)適合你的列表
項(xiàng)目
項(xiàng)目
項(xiàng)目
項(xiàng)目1
項(xiàng)目2
項(xiàng)目3
 計(jì)劃任務(wù)
 完成任務(wù)
創(chuàng)建一個(gè)表格
一個(gè)簡(jiǎn)單的表格是這么創(chuàng)建的:

項(xiàng)目 Value
電腦 $1600
手機(jī) $12
導(dǎo)管 $1
設(shè)定內(nèi)容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左
SmartyPants
SmartyPants將ASCII標(biāo)點(diǎn)字符轉(zhuǎn)換為“智能”印刷標(biāo)點(diǎn)HTML實(shí)體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash
創(chuàng)建一個(gè)自定義列表
Markdown
Text-to-HTML conversion tool
Authors
John
Luke
如何創(chuàng)建一個(gè)注腳
一個(gè)具有注腳的文本。2

注釋也是必不可少的
Markdown將文本轉(zhuǎn)換為 HTML。

KaTeX數(shù)學(xué)公式
您可以使用渲染LaTeX數(shù)學(xué)表達(dá)式 KaTeX:

Gamma公式展示 Γ(n)=(n?1)!?n∈N \Gamma(n) = (n-1)!\quad\foralln\in\mathbb NΓ(n)=(n?1)!?n∈N 是通過歐拉積分

Unexpected text node: ' 'Unexpected text node: ' '
Γ(z)=∫ 
0


 t 
z?1
 e 
?t
 dt.

你可以找到更多關(guān)于的信息 LaTeX 數(shù)學(xué)表達(dá)式here.

新的甘特圖功能,豐富你的文章
Mon 06
Mon 13
Mon 20
已完成
進(jìn)行中
計(jì)劃一
計(jì)劃二
現(xiàn)有任務(wù)
Adding GANTT diagram functionality to mermaid
關(guān)于 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進(jìn)行渲染。 Mermaid. 例如下面產(chǎn)生的一個(gè)序列圖::

張三
李四
王五
你好!李四, 最近怎么樣?
你最近怎么樣,王五?
我很好,謝謝!
我很好,謝謝!
李四想了很長(zhǎng)時(shí)間,文字太長(zhǎng)了不適合放在一行.
打量著王五...
很好... 王五, 你怎么樣?
張三
李四
王五
這將產(chǎn)生一個(gè)流程圖。:

鏈接
長(zhǎng)方形

圓角長(zhǎng)方形
菱形
關(guān)于 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會(huì)支持flowchart的流程圖:

開始
我的操作
確認(rèn)?
結(jié)束
yes
no
關(guān)于 Flowchart流程圖 語法,參考 這兒.
導(dǎo)出與導(dǎo)入
導(dǎo)出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當(dāng)你完成了一篇文章的寫作, 在上方工具欄找到 文章導(dǎo)出 ,生成一個(gè).md文件或者.html文件進(jìn)行本地保存。

導(dǎo)入
如果你想加載一篇你寫過的.md文件或者.html文件,在上方工具欄可以選擇導(dǎo)入功能進(jìn)行對(duì)應(yīng)擴(kuò)展名的文件導(dǎo)入,
繼續(xù)你的創(chuàng)作。

mermaid語法說明 ??

注腳的解釋 ??
藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)

Vue的響應(yīng)式原理(MVVM)深入解析

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

1. 如何實(shí)現(xiàn)一個(gè)響應(yīng)式對(duì)象
最近在看 Vue 的源碼,其中最核心基礎(chǔ)的一塊就是 Observer/Watcher/Dep, 簡(jiǎn)而言之就是,Vue 是如何攔截?cái)?shù)據(jù)的讀寫, 如果實(shí)現(xiàn)對(duì)應(yīng)的監(jiān)聽,并且特定的監(jiān)聽執(zhí)行特定的回調(diào)或者渲染邏輯的??偟目梢圆鸪扇髩K來說。這一塊,主要說的是 Vue 是如何將一個(gè) plain object 給處理成 reactive object 的,也就是,Vue 是如何攔截?cái)r截對(duì)象的 get/set 的

我們知道,用 Object.defineProperty 攔截?cái)?shù)據(jù)的 get/set 是 vue 的核心邏輯之一。這里我們先考慮一個(gè)最簡(jiǎn)單的情況 一個(gè) plain obj 的數(shù)據(jù),經(jīng)過你的程序之后,使得這個(gè) obj 變成 Reactive Obj (不考慮數(shù)組等因素,只考慮最簡(jiǎn)單的基礎(chǔ)數(shù)據(jù)類型,和對(duì)象):

如果這個(gè) obj 的某個(gè) key 被 get, 則打印出 get ${key} - ${val} 的信息 
如果這個(gè) obj 的某個(gè) key 被 set, 如果監(jiān)測(cè)到這個(gè) key 對(duì)應(yīng)的 value 發(fā)生了變化,則打印出 set ${key} - ${val} - ${newVal} 的信息。 
對(duì)應(yīng)的簡(jiǎn)要代碼如下:

Observer.js

export class Observer {
  constructor(obj) {
    this.obj = obj;
    this.transform(obj);
  }
  // 將 obj 里的所有層級(jí)的 key 都用 defineProperty 重新定義一遍, 使之 reactive 
  transform(obj) {
    const _this = this;
    for (let key in obj) {
      const value = obj[key];
      makeItReactive(obj, key, value);
    }
  }
}
function makeItReactive(obj, key, val) {
  // 如果某個(gè) key 對(duì)應(yīng)的 val 是 object, 則重新迭代該 val, 使之 reactive 
  if (isObject(val)) {
    const childObj = val;
    new Observer(childObj);
  }
  // 如果某個(gè) key 對(duì)應(yīng)的 val 不是 Object, 而是基礎(chǔ)類型,我們則對(duì)這個(gè) key 進(jìn)行 defineProperty 定義 
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: () => {
      console.info(`get ${key}-${val}`)
      return val;
    },
    set: (newVal) => {
      // 如果 newVal 和 val 相等,則不做任何操作(不執(zhí)行渲染邏輯)
      if (newVal === val) {
        return;
      }
      // 如果 newVal 和 val 不相等,且因?yàn)?newVal 為 Object, 所以先用 Observer迭代 newVal, 使之 reactive, 再用 newVal 替換掉 val, 再執(zhí)行對(duì)應(yīng)操作(渲染邏輯)
      else if (isObject(newVal)) {
        console.info(`set ${key} - ${val} - ${newVal} - newVal is Object`);
        new Observer(newVal);
        val = newVal;
      }
      // 如果 newVal 和 val 不相等,且因?yàn)?newVal 為基礎(chǔ)類型, 所以用 newVal 替換掉 val, 再執(zhí)行對(duì)應(yīng)操作(渲染邏輯)
      else if (!isObject(newVal)) {
        console.info(`set ${key} - ${val} - ${newVal} - newVal is Basic Value`);
        val = newVal;
      }
    }
  })
}

function isObject(data) {
  if (typeof data === 'object' && data != 'null') {
    return true;
  }
  return false;
}

index.js

import { Observer } from './source/Observer.js';
// 聲明一個(gè) obj,為 plain Object
const obj = {
  a: {
    aa: 1
  },
  b: 2,
}
// 將 obj 整體 reactive 化
new Observer(obj);
// 無輸出
obj.b = 2;
// set b - 2 - 3 - newVal is Basic Value
obj.b = 3;
// set b - 3 - [object Object] - newVal is Object
obj.b = {
  bb: 4
}
// get b-[object Object]
obj.b;
// get a-[object Object]
obj.a;
// get aa-1
obj.a.aa
// set aa - 1 - 3 - newVal is Basic Value
obj.a.aa = 3

這樣,我們就完成了 Vue 的第一個(gè)核心邏輯, 成功把一個(gè)任意層級(jí)的 plain object 轉(zhuǎn)化成 reactive object

2. 如何實(shí)現(xiàn)一個(gè) watcher
前面講的是如何將 plain object 轉(zhuǎn)換成 reactive object. 接下來講一下,如何實(shí)現(xiàn)一個(gè)watcher.

實(shí)現(xiàn)的偽代碼應(yīng)如下:

偽代碼

// 傳入 data 參數(shù)新建新建一個(gè) vue 對(duì)象
const v = new Vue({
    data: {
        a:1,
        b:2,
    }
});
// watch data 里面某個(gè) a 節(jié)點(diǎn)的變動(dòng)了,如果變動(dòng),則執(zhí)行 cb
v.$watch('a',function(){
    console.info('the value of a has been changed !');
});

//  watch data 里面某個(gè) b 節(jié)點(diǎn)的變動(dòng)了,如果變動(dòng),則執(zhí)行 cb
v.$watch('b',function(){
    console.info('the value of b has been changed !');
})

Vue.js

// 引入將上面中實(shí)現(xiàn)的 Observer
import { Observer } from './Observer.js';
import { Watcher } from './Watcher.js';

export default class Vue {
  constructor(options) {
    // 在 this 上掛載一個(gè)公有變量 $options ,用來暫存所有參數(shù)
    this.$options = options
    // 聲明一個(gè)私有變量 _data ,用來暫存 data
    let data = this._data = this.$options.data
    // 在 this 上掛載所有 data 里的 key 值, 這些 key 值對(duì)應(yīng)的 get/set 都被代理到 this._data 上對(duì)應(yīng)的同名 key 值
    Object.keys(data).forEach(key => this._proxy(key));
    // 將 this._data 進(jìn)行 reactive 化
    new Observer(data, this)
  }
  // 對(duì)外暴露 $watch 的公有方法,可以對(duì)某個(gè) this._data 里的 key 值創(chuàng)建一個(gè) watcher 實(shí)例
  $watch(expOrFn, cb) {
    // 注意,每一個(gè) watcher 的實(shí)例化都依賴于 Vue 的實(shí)例化對(duì)象, 即 this
    new Watcher(this, expOrFn, cb)
  }
  //  將 this.keyName 的某個(gè) key 值的 get/set 代理到  this._data.keyName 的具體實(shí)現(xiàn)
  _proxy(key) {
    var self = this
    Object.defineProperty(self, key, {
      configurable: true,
      enumerable: true,
      get: function proxyGetter() {
        return self._data[key]
      },
      set: function proxySetter(val) {
        self._data[key] = val
      }
    })
  }
}

Watch.js

// 引入Dep.js, 是什么我們待會(huì)再說
import { Dep } from './Dep.js';

export class Watcher {
  constructor(vm, expOrFn, cb) {
    this.cb = cb;
    this.vm = vm;
    this.expOrFn = expOrFn;
    // 初始化 watcher 時(shí), vm._data[this.expOrFn] 對(duì)應(yīng)的 val
    this.value = this.get();
  }
  // 用于獲取當(dāng)前 vm._data 對(duì)應(yīng)的 key = expOrFn 對(duì)應(yīng)的 val 值
  get() {
    Dep.target = this;
    const value = this.vm._data[this.expOrFn];
    Dep.target = null;
    return value;
  }
  // 每次 vm._data 里對(duì)應(yīng)的 expOrFn, 即 key 的 setter 被觸發(fā),都會(huì)調(diào)用 watcher 里對(duì)應(yīng)的 update方法
  update() {
    this.run();
  }
  run() {
    // 這個(gè) value 是 key 被 setter 調(diào)用之后的 newVal, 然后比較 this.value 和 newVal, 如果不相等,則替換 this.value 為 newVal, 并執(zhí)行傳入的cb.
    const value = this.get();
    if (value !== this.value) {
      this.value = value;
      this.cb.call(this.vm);
    }
  }
}

對(duì)于什么是 Dep, 和 Watcher 里的 update() 方法到底是在哪個(gè)時(shí)候被誰調(diào)用的,后面會(huì)說

3. 如何收集 watcher 的依賴
前面我們講了 watcher 的大致實(shí)現(xiàn),以及 Vue 代理 data 到 this 上的原理?,F(xiàn)在我們就來梳理一下,Observer/Watcher 之間的關(guān)系,來說明它們是如何調(diào)用的.

首先, 我們要來理解一下 watcher 實(shí)例的概念。實(shí)際上 Vue 的 v-model, v-bind , {{ mustache }}, computed, watcher 等等本質(zhì)上是分別對(duì) data 里的某個(gè) key 節(jié)點(diǎn)聲明了一個(gè) watcher 實(shí)例.

<input v-model="abc">
<span>{{ abc }}</span>
<p :data-key="abc"></p>
...

const v = new Vue({
    data:{
        abc: 111,
    }
    computed:{
        cbd:function(){
            return `${this.abc} after computed`;
        }
    watch:{
        abc:function(val){
            console.info(`${val} after watch`)
        }
     }  
    }
})

這里,Vue 一共聲明了 4 個(gè) watcher 實(shí)例來監(jiān)聽abc, 1個(gè) watcher 實(shí)例來監(jiān)聽 cbd. 如果 abc 的值被更改,那么 4 個(gè) abc - watcher 的實(shí)例會(huì)執(zhí)行自身對(duì)應(yīng)的特定回調(diào)(比如重新渲染dom,或者是打印信息等等)

不過,Vue 是如何知道,某個(gè) key 對(duì)應(yīng)了多少個(gè) watcher, 而 key 對(duì)應(yīng)的 value 發(fā)生變化后,又是如何通知到這些 watcher 來執(zhí)行對(duì)應(yīng)的不同的回調(diào)的呢?

實(shí)際上更深層次的邏輯是:

在 Observer階段,會(huì)為每個(gè) key 都創(chuàng)建一個(gè) dep 實(shí)例。并且,如果該 key 被某個(gè) watcher 實(shí)例 get, 把該 watcher 實(shí)例加入 dep 實(shí)例的隊(duì)列里。如果該 key 被 set, 則通知該 key 對(duì)應(yīng)的 dep 實(shí)例, 然后 dep 實(shí)例會(huì)將依次通知隊(duì)列里的 watcher 實(shí)例, 讓它們?nèi)?zhí)行自身的回調(diào)方法

dep 實(shí)例是收集該 key 所有 watcher 實(shí)例的地方.

watcher 實(shí)例用來監(jiān)聽某個(gè) key ,如果該 key 產(chǎn)生變化,便會(huì)執(zhí)行 watcher 實(shí)例自身的回調(diào) 


相關(guān)代碼如下:

Dep.js

export class Dep {
  constructor() {
    this.subs = [];
  }
  // 將 watcher 實(shí)例置入隊(duì)列
  addSub(sub) {
    this.subs.push(sub);
  }
  // 通知隊(duì)列里的所有 watcher 實(shí)例,告知該 key 的 對(duì)應(yīng)的 val 被改變
  notify() {
    this.subs.forEach((sub, index, arr) => sub.update());
  }
}

// Dep 類的的某個(gè)靜態(tài)屬性,用于指向某個(gè)特定的 watcher 實(shí)例.
Dep.target = null
observer.js

import {Dep} from './dep'
function makeItReactive(obj, key, val) {
 var dep = new Dep()
Object.defineProperty(obj, key, {
  enumerable: true,
  configurable: true,
  get: () => {
    // 收集依賴! 如果該 key 被某個(gè) watcher 實(shí)例依賴,則將該 watcher 實(shí)例置入該 key 對(duì)應(yīng)的 dep 實(shí)例里
    if(Dep.target){
      dep.addSub(Dep.target)
    }
    return val
  },
  set: (newVal) => {
    if (newVal === val) {
      return;
    }
    else if (isObject(newVal)) {
      new Observer(newVal);
      val = newVal;
    // 通知 dep 實(shí)例, 該 key 被 set,讓 dep 實(shí)例向所有收集到的該 key 的 watcher 實(shí)例發(fā)送通知
    dep.notify()
    }
    else if (!isObject(newVal)) {
      val = newVal;
    // 通知 dep 實(shí)例, 該 key 被 set,讓 dep 實(shí)例向所有收集到的該 key 的 watcher 發(fā)送通知
    dep.notify()
    }
  }
})
     }    

watcher.js

import { Dep } from './Dep.js';

export class Watcher {
  constructor(vm, expOrFn, cb) {
    this.cb = cb;
    this.vm = vm;
    this.expOrFn = expOrFn;
    this.value = this.get();
  }
  get() {
    // 在實(shí)例化某個(gè) watcher 的時(shí)候,會(huì)將Dep類的靜態(tài)屬性 Dep.target 指向這個(gè) watcher 實(shí)例
    Dep.target = this;
    // 在這一步 this.vm._data[this.expOrFn] 調(diào)用了 data 里某個(gè) key 的 getter, 然后 getter 判斷類的靜態(tài)屬性 Dep.target 不為null, 而為 watcher 的實(shí)例, 從而把這個(gè) watcher 實(shí)例添加到 這個(gè) key 對(duì)應(yīng)的 dep 實(shí)例里。 巧妙!
    const value = this.vm._data[this.expOrFn];
    // 重置類屬性 Dep.target 
    Dep.target = null;
    return value;
  }

  // 如果 data 里的某個(gè) key 的 setter 被調(diào)用,則 key 會(huì)通知到 該 key 對(duì)應(yīng)的 dep 實(shí)例, 該Dep實(shí)例, 該 dep 實(shí)例會(huì)調(diào)用所有 依賴于該 key 的 watcher 實(shí)例的 update 方法。
  update() {
    this.run();
  }
  run() {
    const value = this.get();
    if (value !== this.value) {
    this.value = value;
    // 執(zhí)行 cb 回調(diào)
    this.cb.call(this.vm);
    }
  }
}

總結(jié):
至此, Watcher, Observer , Dep 的關(guān)系全都梳理完成。而這些也是 Vue 實(shí)現(xiàn)的核心邏輯之一。再來簡(jiǎn)單總結(jié)一下三者的關(guān)系,其實(shí)是一個(gè)簡(jiǎn)單的 觀察-訂閱 的設(shè)計(jì)模式, 簡(jiǎn)單來說就是, 觀察者觀察數(shù)據(jù)狀態(tài)變化, 一旦數(shù)據(jù)發(fā)生變化,則會(huì)通知對(duì)應(yīng)的訂閱者,讓訂閱者執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯 。我們熟知的事件機(jī)制,就是一種典型的觀察-訂閱的模式

Observer, 觀察者,用來觀察數(shù)據(jù)源變化. 
Dep, 觀察者和訂閱者是典型的 一對(duì)多 的關(guān)系,所以這里設(shè)計(jì)了一個(gè)依賴中心,來管理某個(gè)觀察者和所有這個(gè)觀察者對(duì)應(yīng)的訂閱者的關(guān)系, 消息調(diào)度和依賴管理都靠它。 
Watcher, 訂閱者,當(dāng)某個(gè)觀察者觀察到數(shù)據(jù)發(fā)生變化的時(shí)候,這個(gè)變化經(jīng)過消息調(diào)度中心,最終會(huì)傳遞到所有該觀察者對(duì)應(yīng)的訂閱者身上,然后這些訂閱者分別執(zhí)行自身的業(yè)務(wù)回調(diào)即可 
參考 
Vue源碼解讀-滴滴FED 
代碼參考
藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。

騰訊設(shè)計(jì)師:如何讓你的設(shè)計(jì)稿做到95%還原?

資深UI設(shè)計(jì)者

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

視覺設(shè)計(jì)師作為展示產(chǎn)品最終形態(tài)的執(zhí)行層,產(chǎn)品上線前走查視覺與交互還原是必經(jīng)環(huán)節(jié),而留給設(shè)計(jì)師走查修改的時(shí)間其實(shí)非常少,有時(shí)候?yàn)榱伺浜袭a(chǎn)品上線時(shí)間,通常只能犧牲一些細(xì)節(jié),在下一次迭代進(jìn)行優(yōu)化。為了每一次上線的產(chǎn)品都能夠得到更好地還原,這就需要設(shè)計(jì)師去了解開發(fā)到底是根據(jù)哪些規(guī)則還原我們的設(shè)計(jì)稿,以及在每一次制作和交付設(shè)計(jì)稿的時(shí)候,我們應(yīng)如何設(shè)定好每一個(gè)細(xì)節(jié)的規(guī)則。

開發(fā):這里已經(jīng)完全對(duì)齊了。

視覺:看起來還沒完全對(duì)齊,我的圖也沒有切錯(cuò)吧?

開發(fā):字體大小和間距都是按照視覺稿來的。

視覺:這里間距偏差這么大,為什么不按照視覺稿?

開發(fā):視覺樣式好多,每個(gè)設(shè)計(jì)師的間距好像都不一樣。

視覺:……

我們經(jīng)常會(huì)聽到身邊的設(shè)計(jì)師與開發(fā)小哥的一些對(duì)話,關(guān)于對(duì)齊、大小、間距等設(shè)計(jì)還原問題經(jīng)常會(huì)討論很久,有時(shí)甚至?xí)X得,幾個(gè)像素的間距是不是沒有必要這么糾結(jié)。以我較常接觸的云產(chǎn)品官網(wǎng)為例,云產(chǎn)品官網(wǎng)體量龐大,單個(gè)頁面或信息模塊的樣式復(fù)用可高達(dá)上百個(gè)子產(chǎn)品頁面,此時(shí)第一個(gè)模塊設(shè)計(jì)的規(guī)范性、擴(kuò)展性、復(fù)用性則變得尤為重要,所以為了讓設(shè)計(jì)方案更加合理,為了讓合作更加,這里總結(jié)一些設(shè)計(jì)經(jīng)驗(yàn),與大家一起探討。

本文將從以下三個(gè)方面,思考作為視覺設(shè)計(jì)師,應(yīng)當(dāng)如何讓設(shè)計(jì)更加合理有效:

  • 視覺處理(設(shè)計(jì))
  • 設(shè)計(jì)邏輯(方法)
  • 交付走查(合作)

視覺處理

1. 字體結(jié)構(gòu)

網(wǎng)頁設(shè)計(jì)中,我們總避免不了與字體打交道,字體也是我們?cè)谠O(shè)計(jì)中經(jīng)常容易忽視的部分,而經(jīng)常出錯(cuò)的原因往往是因?yàn)槲覀儗?duì)文字的理解不夠清晰。相比西文字體,中文字體結(jié)構(gòu)復(fù)雜,字庫龐大,網(wǎng)頁的渲染效果會(huì)比西文字體艱難很多。

但無論是中文還是西文,我們經(jīng)常需要用到的無非是字體大小、字重、字色,還有就是經(jīng)常被我們忽視的行高和行寬,我們從西文字體提取三個(gè)最主要的因素,即字高、行高、行寬?;谖魑淖煮w的結(jié)構(gòu)轉(zhuǎn)換為中文,我們可以理解為,字高指的就是我們?nèi)庋鬯芸吹降淖煮w的實(shí)際高度,而行高指的是字高+上邊距+下邊距,反過來說,行高減去字高除以 2 就能得到我們的上下邊距,行寬指的就是整個(gè)文本的寬度。

舉一個(gè)圖文模塊的例子,圖(1)中我們?nèi)庋鬯吹介g距,在我們做標(biāo)注時(shí),看到的其實(shí)是圖(2)中的三個(gè)色塊,我們實(shí)際給到開發(fā)的標(biāo)注,是色塊的尺寸和色塊之間的間距,以及詳細(xì)的文本屬性。

2. 文字行寬

關(guān)于行寬,以設(shè)計(jì) banner 的標(biāo)題及描述文字為例,定義行寬是為了讓文本在極限寬度的時(shí)候進(jìn)行換行,再固定好配圖的尺寸,從而得到文本與配圖之間的間距,定義行寬、行數(shù)、字?jǐn)?shù),能夠更好地為運(yùn)營人員規(guī)范輸出的文案,避免因字?jǐn)?shù)過多或過少所造成的視覺不平衡。

當(dāng)我們處理無序列表時(shí),四個(gè)短句文本,長(zhǎng)短不一,同樣我們需要限制一行文本寬度,定義一行能承載的最多字?jǐn)?shù),以及跟產(chǎn)品確認(rèn)可能出現(xiàn)的最多字?jǐn)?shù)的情況,確認(rèn)模塊設(shè)計(jì)的可行性,保證后續(xù)運(yùn)營人員在替換文案的時(shí)候不會(huì)出錯(cuò)。

以上兩個(gè)例子都是我們?cè)O(shè)計(jì)文字經(jīng)常出錯(cuò)的地方,正確的定義規(guī)范,無論是交付開發(fā)或者其他下游,都能保證模塊設(shè)計(jì)的可擴(kuò)展性及規(guī)范化,保證最終上線質(zhì)量。

3. 圖標(biāo)視錯(cuò)覺

關(guān)于圖標(biāo),這里提到一個(gè)幾何學(xué)錯(cuò)覺的概念,視覺上的大小、長(zhǎng)度、面積、方向、角度等幾何構(gòu)成,和實(shí)際上測(cè)得的數(shù)字有明顯差別的錯(cuò)覺,稱為幾何學(xué)錯(cuò)覺。人眼所接受的視覺平衡,往往不是設(shè)計(jì)軟件上精準(zhǔn)的對(duì)齊,我們總是會(huì)通過調(diào)整間距、大小或角度來補(bǔ)齊一些負(fù)空間,讓畫面保持視覺平衡。

以客戶案例的卡片樣式為例,客戶案例在 to B 產(chǎn)品中是必不可少的模塊,我們的客戶 logo 有的圓形,有的長(zhǎng)方形,有的純文字,尺寸差距比較懸殊,這種情況下我們需要給他限制一個(gè)高度,在這個(gè)高度以內(nèi),再根據(jù) logo 本身的體量來調(diào)整圖形的大小,處理好 logo 的視覺平衡,最后紅色區(qū)域是 logo 的實(shí)際尺寸,藍(lán)色區(qū)域則是我們實(shí)際給到開發(fā)的尺寸,從開發(fā)的角度來看其實(shí)就是占位符,而規(guī)范的作圖則是把占位符的透明度調(diào)整為 0,以占位符為實(shí)際有效作圖區(qū)。

UI 設(shè)計(jì)中通常以「向右箭頭」來表示當(dāng)前鏈接可跳轉(zhuǎn),使用箭頭作圖時(shí),當(dāng)我們把箭頭和文字右對(duì)齊,箭頭其實(shí)會(huì)更加的往外突出,這時(shí)候我們會(huì)人為的往里邊推 1 至 2 像素,最后實(shí)際給到開發(fā)的也應(yīng)該是紅框的尺寸,也就是 16×16 的占位圖尺寸。

「按鈕」也是 UI 設(shè)計(jì)中常用的組件,當(dāng)我們?cè)诎粹o里使用圖標(biāo)加文字時(shí),由于文字的體量更大,整體重心會(huì)往右偏,所以我們通常會(huì)認(rèn)為讓圖標(biāo)和文字整體往左偏移,使整體的視覺更加平衡,實(shí)際給到開發(fā)的,也是兩個(gè)不同等的邊距。

設(shè)計(jì)邏輯

1. 理性的設(shè)計(jì)

在 iOS 和 Android 的設(shè)計(jì)規(guī)范中,都有提到過使用「8點(diǎn)柵格」的概念,即建議使用 8×8 的網(wǎng)格系統(tǒng)進(jìn)行設(shè)計(jì),我們都知道 0.5px 的渲染在屏幕上會(huì)變模糊,之所以使用 8 的倍數(shù)是因?yàn)槭袌?chǎng)上主流的屏幕都能被 8 整除,使用 8 點(diǎn)柵格能夠的讓我們所設(shè)計(jì)的內(nèi)容樣式在屏幕上保持高清顯示,而在日常的網(wǎng)頁設(shè)計(jì)中,我其實(shí)更加傾向使用 4 點(diǎn)柵格系統(tǒng)。

我們以下圖 4 組數(shù)列為例,大家可能都曾使用過上面三組藍(lán)色數(shù)列中的數(shù)值應(yīng)用到設(shè)計(jì)中,或以 5 為倍數(shù),或以 10 為倍數(shù)、或以偶數(shù)為設(shè)計(jì)邏輯,而實(shí)際上以 5 為倍數(shù)則會(huì)包含奇數(shù),奇數(shù)會(huì)導(dǎo)致控件文字對(duì)不齊,當(dāng) 5 的倍數(shù)和偶數(shù)同時(shí)使用時(shí),則會(huì)出現(xiàn)類似 14、15、16 這種相差為 1 的相鄰數(shù),這樣會(huì)導(dǎo)致我們的尺寸規(guī)范不好定義規(guī)則,難以形成邏輯,而使用 4 的倍數(shù),他們的公差為 4,不會(huì)出現(xiàn)奇數(shù),也不會(huì)出現(xiàn)相鄰數(shù)。

我們?cè)倏纯匆恍┩ㄓ玫某叽缍x,例如常見的 icon 設(shè)計(jì)尺寸都是以 4 為倍數(shù)。

常見的網(wǎng)頁柵格及其所均分的卡片和間距,也都是 4 的倍數(shù),如果我們的控件尺寸,圖標(biāo)尺寸和間距都使用 4 的倍數(shù)來定義,那所有的信息模塊自然都能更好的相互適應(yīng),層層遞進(jìn)的邏輯關(guān)系也會(huì)更加明顯。

我們把 4 點(diǎn)柵格的設(shè)計(jì)邏輯套用到卡片設(shè)計(jì)上,第一眼我們可能比較難去評(píng)判兩者的好壞,但仔細(xì)看,我們就會(huì)發(fā)現(xiàn)第一個(gè)卡片的按鈕沒有水平對(duì)齊,相互之間的間距尺寸也是沒什么邏輯性。假如今天調(diào)整一個(gè) 8px 的間距,明天調(diào)一個(gè) 10px 的間距,設(shè)計(jì)師走查起來也很難發(fā)現(xiàn)有問題,對(duì)接的開發(fā)也難以有一個(gè)可以參考的規(guī)范標(biāo)準(zhǔn)。而相對(duì)的,以 4 為倍數(shù),我們會(huì)發(fā)現(xiàn)所有的信息都會(huì)完美對(duì)齊,而且倍數(shù)為 4 的每個(gè)數(shù)值之間公差為 4,即使設(shè)計(jì)稿微調(diào)了 1px 我們都能很快發(fā)現(xiàn),開發(fā)在還原設(shè)計(jì)稿時(shí)也會(huì)有一個(gè)衡量標(biāo)準(zhǔn)。

網(wǎng)格設(shè)計(jì)在報(bào)紙、雜志、海報(bào)等平面設(shè)計(jì)領(lǐng)域中也是十分常見的設(shè)計(jì)手法,通過建立網(wǎng)格,考究每一個(gè)信息模塊在頁面中的擺放位置,大小占比,顏色占比,從而使得頁面信息保持秩序、均衡。

使用 4 點(diǎn)柵格系統(tǒng),通過理性、秩序、邏輯的設(shè)計(jì)方式賦予畫面秩序感以及閱讀體驗(yàn),而以 4 為倍數(shù),每個(gè)數(shù)字之間都相差為 4,不會(huì)太大,也不會(huì)太小,同時(shí)保持著秩序,讓設(shè)計(jì)更加理性。對(duì)于團(tuán)隊(duì)合作,設(shè)計(jì)師與開發(fā)也將更有默契,不必再為不清不楚的間距浪費(fèi)時(shí)間。

交付走查

1. 有效切圖

關(guān)于切圖,切圖之前應(yīng)跟開發(fā)確定好輸出的格式和尺寸,確定應(yīng)該用 SVG,一倍圖或是兩倍圖。SVG 體量小渲染質(zhì)量好,單色使用時(shí)還能替換顏色,PNG 則通常用在實(shí)景圖,一倍圖和二倍圖則根據(jù)實(shí)際需要進(jìn)行輸出。

如果要做分層動(dòng)畫,那我們就需要分層切圖,如果桌面端和手機(jī)端樣式差別較大,那我們需要和開發(fā)溝通好如何實(shí)現(xiàn),是否需要特殊切圖,所有的特殊切圖和特殊樣式,我們都應(yīng)該提前跟開發(fā)溝通好。

2. 交互細(xì)節(jié)

如果某個(gè)控件或信息模塊交互樣式較多,那我們可以有一個(gè)空白畫板來清晰地標(biāo)注這些狀態(tài)和樣式,很多開發(fā)在還原過程中都是一手視覺稿一手交互稿,但視覺設(shè)計(jì)師作為展示產(chǎn)品最終形態(tài)的執(zhí)行層,很多情況下,視覺階段依然會(huì)有很多需要跟交互和產(chǎn)品溝通修改的地方,所以為了避免遺漏修改點(diǎn),視覺稿應(yīng)該呈現(xiàn)最完整的設(shè)計(jì)細(xì)節(jié),這樣也會(huì)很大程度上節(jié)省開發(fā)的時(shí)間,減少出錯(cuò)的幾率。

當(dāng)頁面內(nèi)容有一定的更新頻率,我們則需要標(biāo)明視覺樣式規(guī)范,以及后續(xù)的運(yùn)營規(guī)則,完整的收尾,可以避免產(chǎn)品經(jīng)常過來尋求上線素材和規(guī)范。有些需要隔三個(gè)月或半年才上線的需求,清晰的標(biāo)注也能幫助我們快速回憶起需求背景,讓我們?cè)谌粘9ぷ髦斜3诸^腦清晰,有條不紊,這其實(shí)也是在給我們自己節(jié)省時(shí)間。

3. 重構(gòu)稿走查

走查還原的時(shí)候,在 Chrome 瀏覽器的空白處右鍵點(diǎn)擊檢查,找到里面的 Computed 窗口,我們可以找到具體的文字、間距、投影等屬性,有時(shí)候一些比較細(xì)微的調(diào)整,我們可以雙擊具體的數(shù)值進(jìn)行調(diào)整,調(diào)整到自己滿意之后再把具體的數(shù)值給到開發(fā),這樣就不用在我們搖擺不定的情況下,造成雙方的困擾。

最后,在預(yù)發(fā)布的時(shí)候,我們可以利用 SwitchHosts 的客戶端來配置開發(fā)環(huán)境進(jìn)行體驗(yàn),保證最終上線的效果。

藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì)  包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)。

爬去動(dòng)態(tài)網(wǎng)站今日頭條圖片集

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

如何爬去爬去今日頭條動(dòng)態(tài)數(shù)據(jù),
網(wǎng)上有很多教程,我就不在啰嗦了
第一步如何分析得到存儲(chǔ)數(shù)據(jù)的真實(shí)url
首先打開https://www.toutiao.com/,搜索街拍,會(huì)跳轉(zhuǎn)https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D
你如果用傳統(tǒng)的方式你將的得不到任何有價(jià)值的信息
這個(gè)時(shí)候你怎么辦呢?



你這個(gè)時(shí)候注意查看requests url,
Request URL: https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=街拍&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp=1559831008973
到這里我們就找到了數(shù)據(jù)春芳的真正url了
你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學(xué)習(xí)如何使用Markdown編輯器, 可以仔細(xì)閱讀這篇文章,了解一下Markdown的基本語法知識(shí)。

后面就簡(jiǎn)單了,直接上代碼
import os
import re
import json
import requests
from requests import RequestException
from requests import exceptions
from urllib.parse import urlencode
from demo01.util import buid_proxy
‘’’
抓取今日頭條圖片圖片集
因?yàn)榻裉祛^條數(shù)據(jù)是動(dòng)態(tài),因此第一步是找到存儲(chǔ)圖片的真正url
第二步就是構(gòu)造瀏覽器(偽瀏覽器),因?yàn)楝F(xiàn)在防爬網(wǎng)站做的很好,他會(huì)更具某項(xiàng)標(biāo)準(zhǔn)你是否是機(jī)器人,因此這步很重要
‘’’
proxies=buid_proxy()

def get_one_page(offset, keyword):
‘’’
獲取網(wǎng)頁html內(nèi)容并返回
‘’’
params = {
‘a(chǎn)id’: ‘24’,
‘a(chǎn)pp_name’: ‘web_search’,
‘offset’: offset,
‘format’: ‘json’,
‘keyword’:keyword,
‘a(chǎn)utoload’: ‘true’,
‘count’: ‘20’,
‘cur_tab’: ‘1’,
‘from’: ‘search_tab’,
‘pd’: ‘synthesis’,
‘timestamp’: ‘1559660659001’}

header = {
    "User-Agen":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
    "referer":"https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D",
    "cookie":"tt_webid=6692573135994799624; UM_distinctid=16ace1c56988c-06f62adc4fd369-7a1437-144000-16ace1c5699a3; csrftoken=368635b7c1d736ff1889c2b70705afa9; tt_webid=6692573135994799624; WEATHER_CITY=%E5%8C%97%E4%BA%AC; s_v_web_id=152a5d87eb7690f9953388e50371f37b; CNZZDATA1259612802=1893030441-1558619693-https%253A%252F%252Flanding.toutiao.com%252F%7C1559662594; _ga=GA1.2.569135354.1559664708; _gid=GA1.2.419995265.1559664708; __tasessionId=wb39ej38m1559741348358",
}


url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params)
#print(url)

try:
    # 獲取網(wǎng)頁內(nèi)容,返回json格式數(shù)據(jù)
    response = requests.get(url, headers=header,proxies=proxies)

    # 通過狀態(tài)碼判斷是否獲取成功
    if response.status_code == 200:
        #此處必須這樣寫不然會(huì)出現(xiàn)中文亂碼
        response=response.content.decode('utf-8')
        html=response

        return html
    return None
except RequestException:
    return None

def parse_one_page(html):
‘’’
解析出組圖網(wǎng)址,并將網(wǎng)頁中所有圖集的標(biāo)題及圖片地址返回
‘’’
urls = []
data = json.loads(html,encoding=‘utf-8’)
if data and ‘data’ in data.keys():
for item in data.get(‘data’):
#print(item)
page_urls = []
title = item.get(‘title’)
#print(title)
image_list = item.get(‘image_list’)
if image_list !=None:
for i in range(len(image_list)):
# 獲取large圖片地址
url = image_list[i][‘url’]
# 替換URL獲取高清原圖
url = url.replace(‘large’, ‘origin’)
page_urls.append(url)
urls.append({‘title’: title,‘url_list’: page_urls})
return urls

def save_image_file(url, path):
‘’’
保存圖像文件
‘’’
ir = requests.get(url)
if ir.status_code == 200:
with open(path, ‘wb’) as f:
f.write(ir.content)
f.close()

def main(offset, word):
html = get_one_page(offset, word)
#print(html)

urls = parse_one_page(html)
print(urls)

#圖像文件夾不存在則創(chuàng)建
root_path = 'E:/test001/photo/TOUTIAO'
if not os.path.exists(root_path):
    os.mkdir(root_path)

for i in range(len(urls)):
    print('---正在下載 %s'%urls[i]['title'])
    folder = root_path + '/' + urls[i]['title']
    if not os.path.exists(folder):
        try:
            os.mkdir(folder)
        except NotADirectoryError:
            continue
        except OSError:
            continue

    url_list = urls[i]['url_list']
    try:
        for j in range(len(url_list)):
            path = folder + '/index_' + str("%02d"%j) + '.jpg'
            if not os.path.exists(path):
                save_image_file(urls[i]['url_list'][j], path)
    except exceptions.ProxyError:
        return  None


if name == ‘main’:
main(0,‘街拍’)

新的改變
我們對(duì)Markdown編輯器進(jìn)行了一些功能拓展與語法支持,除了標(biāo)準(zhǔn)的Markdown編輯器功能,我們?cè)黾恿巳缦聨c(diǎn)新功能,幫助你用它寫博客:

全新的界面設(shè)計(jì) ,將會(huì)帶來全新的寫作體驗(yàn);
在創(chuàng)作中心設(shè)置你喜愛的代碼高亮樣式,Markdown 將代碼片顯示選擇的高亮樣式 進(jìn)行展示;
增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區(qū)域直接展示;
全新的 KaTeX數(shù)學(xué)公式 語法;
增加了支持甘特圖的mermaid語法1 功能;
增加了 多屏幕編輯 Markdown文章功能;
增加了 焦點(diǎn)寫作模式、預(yù)覽模式、簡(jiǎn)潔寫作模式、左右區(qū)域同步滾輪設(shè)置 等功能,功能按鈕位于編輯區(qū)域與預(yù)覽區(qū)域中間;
增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標(biāo)題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入代碼:Ctrl/Command + Shift + K
插入鏈接:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G

合理的創(chuàng)建標(biāo)題,有助于目錄的生成
直接輸入1次#,并按下space后,將生成1級(jí)標(biāo)題。
輸入2次#,并按下space后,將生成2級(jí)標(biāo)題。
以此類推,我們支持6級(jí)標(biāo)題。有助于使用TOC語法后生成一個(gè)完美的目錄。

如何改變文本的樣式
強(qiáng)調(diào)文本 強(qiáng)調(diào)文本

加粗文本 加粗文本

標(biāo)記文本

刪除文本

引用文本

H2O is是液體。

210 運(yùn)算結(jié)果是 1024.

插入鏈接與圖片
鏈接: link.

圖片: 

帶尺寸的圖片: 

居中的圖片: 

居中并且?guī)С叽绲膱D片: 

當(dāng)然,我們?yōu)榱俗層脩舾颖憬?,我們?cè)黾恿藞D片拖拽功能。

如何插入一段漂亮的代碼片
去博客設(shè)置頁面,選擇一款你喜歡的代碼片高亮樣式,下面展示同樣高亮的 代碼片.

// An highlighted block
var foo = 'bar';
1
2
生成一個(gè)適合你的列表
項(xiàng)目
項(xiàng)目
項(xiàng)目
項(xiàng)目1
項(xiàng)目2
項(xiàng)目3
 計(jì)劃任務(wù)
 完成任務(wù)
創(chuàng)建一個(gè)表格
一個(gè)簡(jiǎn)單的表格是這么創(chuàng)建的:

項(xiàng)目 Value
電腦 $1600
手機(jī) $12
導(dǎo)管 $1
設(shè)定內(nèi)容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左
SmartyPants
SmartyPants將ASCII標(biāo)點(diǎn)字符轉(zhuǎn)換為“智能”印刷標(biāo)點(diǎn)HTML實(shí)體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash
創(chuàng)建一個(gè)自定義列表
Markdown
Text-to-HTML conversion tool
Authors
John
Luke
如何創(chuàng)建一個(gè)注腳
一個(gè)具有注腳的文本。2

注釋也是必不可少的
Markdown將文本轉(zhuǎn)換為 HTML。

KaTeX數(shù)學(xué)公式
您可以使用渲染LaTeX數(shù)學(xué)表達(dá)式 KaTeX:

Gamma公式展示 Γ(n)=(n?1)!?n∈N \Gamma(n) = (n-1)!\quad\foralln\in\mathbb NΓ(n)=(n?1)!?n∈N 是通過歐拉積分

Unexpected text node: '&ThinSpace;'Unexpected text node: '&ThinSpace;'
Γ(z)=∫ 
0


 t 
z?1
 e 
?t
 dt.

你可以找到更多關(guān)于的信息 LaTeX 數(shù)學(xué)表達(dá)式here.

新的甘特圖功能,豐富你的文章
Mon 06
Mon 13
Mon 20
已完成
進(jìn)行中
計(jì)劃一
計(jì)劃二
現(xiàn)有任務(wù)
Adding GANTT diagram functionality to mermaid
關(guān)于 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進(jìn)行渲染。 Mermaid. 例如下面產(chǎn)生的一個(gè)序列圖::

張三
李四
王五
你好!李四, 最近怎么樣?
你最近怎么樣,王五?
我很好,謝謝!
我很好,謝謝!
李四想了很長(zhǎng)時(shí)間,文字太長(zhǎng)了不適合放在一行.
打量著王五...
很好... 王五, 你怎么樣?
張三
李四
王五
這將產(chǎn)生一個(gè)流程圖。:

鏈接
長(zhǎng)方形

圓角長(zhǎng)方形
菱形
關(guān)于 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會(huì)支持flowchart的流程圖:

開始
我的操作
確認(rèn)?
結(jié)束
yes
no
關(guān)于 Flowchart流程圖 語法,參考 這兒.
導(dǎo)出與導(dǎo)入
導(dǎo)出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當(dāng)你完成了一篇文章的寫作, 在上方工具欄找到 文章導(dǎo)出 ,生成一個(gè).md文件或者.html文件進(jìn)行本地保存。

導(dǎo)入
如果你想加載一篇你寫過的.md文件或者.html文件,在上方工具欄可以選擇導(dǎo)入功能進(jìn)行對(duì)應(yīng)擴(kuò)展名的文件導(dǎo)入,
繼續(xù)你的創(chuàng)作。

mermaid語法說明 ??

注腳的解釋 ??
藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。

還在用 iPad 看劇嗎?蘋果全新發(fā)布的 iPadOS 不止能讓你做圖了!

資深UI設(shè)計(jì)者

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

WWDC19 可能是最近幾年最令人激動(dòng)的蘋果開發(fā)者大會(huì)了。

重回高端專業(yè)領(lǐng)域的 Mac Pro 不僅僅是性能怪獸,在專業(yè)度、設(shè)計(jì)感甚至細(xì)節(jié)的模塊化的設(shè)計(jì)上,體現(xiàn)出了蘋果這一頂尖大廠應(yīng)有的底蘊(yùn),說實(shí)話,考驗(yàn)民間硬件評(píng)測(cè)玩家們的資金實(shí)力和評(píng)測(cè)能力的時(shí)候到了。在發(fā)布Mac Pro 這一系列產(chǎn)品的環(huán)節(jié),空耳幾乎完全聽不懂說的是啥,不過可以全程感知到每一個(gè)單詞都是牛X的,蘋果官方頁面的介紹現(xiàn)在肯定是最有說服力的,因?yàn)樽罱脑u(píng)測(cè)起碼是要等到今年年底。

屬于 iOS 13 的 Dark Mode 正正好好滿足了所有人的想象,但是和簡(jiǎn)單直接的 Android Dark Mode 相比,又多出一絲優(yōu)雅,非常蘋果。擁有 App Store 和一連串新功能的 watchOS 終于成為了一個(gè)更加獨(dú)立、功能強(qiáng)大的硬件設(shè)備了,而 tvOS …… 不是重點(diǎn)。

重點(diǎn)是,在 iOS 和 macOS 之間,硬生生多出了一個(gè) iPadOS,這才是整個(gè)發(fā)布會(huì)上,最亮眼的星。

1、下沉:為更細(xì)分應(yīng)用場(chǎng)景所設(shè)計(jì)的 iPadOS

屏幕尺寸介于 iPhone 和 Mac 之間的 iPad ,一直沿用著交互機(jī)制相對(duì)比較簡(jiǎn)約的 iOS 。也正是因此,絕大多數(shù)的用戶的重度需求,被電腦尤其是Mac 所分走了,而高頻輕量的需求則被 iPhone 給分走了,iPad 系列產(chǎn)品在很多時(shí)候都是作為家庭娛樂設(shè)備而存在,你聽到更多關(guān)于它的功能應(yīng)用場(chǎng)景,是看視頻追劇。

Apple Pencil 是這個(gè)系列的轉(zhuǎn)折點(diǎn)。書寫,創(chuàng)作,搭配鍵盤輸入,屏幕尺寸從9.7 一路上探到 12.9,iPad 開始在觸摸為王的時(shí)代,開始切入更多的使用場(chǎng)景。在學(xué)校里面越來越多的學(xué)生開始使用一臺(tái)iPad 來作為 All in one 學(xué)習(xí)/娛樂設(shè)備,藝術(shù)家和音樂者開始使用 iPad 替代手繪板和合成器,AR和娛樂的結(jié)合也越來越緊密,從創(chuàng)作到專業(yè)領(lǐng)域,iPad 成為了越來越多輕應(yīng)用場(chǎng)景的核心。

吃灰的 iPad 擁有了更多的可能性,而 iOS 的功能限制反倒成為了 iPad 短板,這大概也是 iPadOS 在整個(gè)生態(tài)中獨(dú)立出來的最重要原因之一吧。

使用單一屏幕作為輸入核心,圍繞觸摸來交互,以原有 iOS 作為開發(fā)核心,深入到更多的細(xì)分應(yīng)用場(chǎng)景,連通 macOS 和 iOS ,iPadOS 的定位看似曖昧,實(shí)則在這個(gè)多元和高度垂直的時(shí)代,幫蘋果趟出了第三條路。

2、分屏:向著桌面端進(jìn)發(fā)的多任務(wù)交互

iPadOS 的新布局看起來終于不那么 iPhone了,原有最左一屏的小組件匯集到主屏幕之后,看起來越來越有桌面的意思的。

……專為多點(diǎn)觸摸的顯示屏而設(shè)計(jì),通過直觀的手勢(shì)實(shí)現(xiàn)多任務(wù)……它現(xiàn)在被稱為iPadOS。

這是蘋果給 iPadOS 所寫的出道宣言。

比起 iOS 12 時(shí)代更強(qiáng)的分屏模式,發(fā)布會(huì)現(xiàn)場(chǎng)演示的時(shí)候,展示了使用托拽在多個(gè)應(yīng)用之間快托拽內(nèi)容和元素的操作,多屏互通效率極高。

而多任務(wù)不僅僅體現(xiàn)在多個(gè)應(yīng)用之間的互動(dòng),同一個(gè)應(yīng)用同樣可以多屏存在——也就是我們常說的多任務(wù)。比如打開兩個(gè)「提醒事項(xiàng)」應(yīng)用,在兩個(gè)筆記之間,來回編輯內(nèi)容。點(diǎn)擊Dock 中的特定應(yīng)用圖標(biāo),你就能看到它到底開了多少個(gè)頁面。

仔細(xì)想想,這是不是和桌面端的系統(tǒng)的邏輯越來越接近了?

3、編輯:無需鍵鼠一樣精細(xì)化處理內(nèi)容

想成為了一個(gè)獨(dú)立的設(shè)備,iPad 在用戶輸入端的短板需要補(bǔ)足,而為了解決這一問題,蘋果為 iPadOS 精心定制化了一套組合拳:編輯手勢(shì),輸入提速,外設(shè)支持。

快速輸入是 iPad 的短板之一。不借助鍵盤而能快速輸入的方法之一,就是單手快速輸入。蘋果在iPadOS 上使用了一個(gè)全局的小鍵盤,使用雙指捏合快速呼出,全局浮動(dòng),使用QuichPath 滑動(dòng)手勢(shì)輸入法,減少輸入的難度。這就是使用輸入法和鍵盤輸入提速的方法之一。

長(zhǎng)段落或者是其他內(nèi)容,又要怎么編輯呢?蘋果巧妙地將 Macbook 系列觸控板的三指手勢(shì)微調(diào)了一下,給遷移過來了:三指捏合是復(fù)制,三指散開是粘貼,而三指滑動(dòng)是撤銷。

而輔助快速編輯手勢(shì)的, 是智能選取功能,光標(biāo)定位比以往更加智能和精準(zhǔn),把編輯輸入的最后一個(gè)短板也給補(bǔ)上了。

iPad 的多點(diǎn)觸摸屏幕本就支持大量不同的手勢(shì),功能支持不是難點(diǎn),難點(diǎn)在于用盡可能少、且認(rèn)知度足夠高的常見手勢(shì),以的認(rèn)知負(fù)荷,讓用戶更快上手,更舒適地做到各種各樣的事情。

以觸摸為核心的交互,以及的指針的交互,在iPadOS 上交匯了。這種交互模式無疑是實(shí)驗(yàn)性的,但是這也是未來所有的移動(dòng)端和數(shù)字產(chǎn)品的設(shè)計(jì)者都要考慮的問題,而iPadOS 就是最重要的試驗(yàn)田。

當(dāng)然,外置鍵盤輸入也并不是難事。iPad 本身的配套鍵盤套和第三方藍(lán)牙鍵盤,多數(shù)有輸入需求的用戶都已經(jīng)購置了,為此,蘋果給iPadOS 搭配了豐富的快捷鍵,來輔助輸入:

當(dāng)然,輸入這件事情上,Apple Pencil 也是非常重要的組成部分。蘋果將系統(tǒng)自帶的備忘錄應(yīng)用進(jìn)行了重設(shè)計(jì),其中很大一部分原因,就是為 Apple Pencil 提供更為強(qiáng)大的繪圖功能:

這樣一來,即使你沒有購買第三方的繪圖工具,同樣可以用它畫出足夠漂亮的插畫作品。除了特定APP中的手寫輸入和繪圖這樣的使用場(chǎng)景之外,Apple Pencil 還作為日常截圖批注的主力,方便日常作筆記:

更好的輸入,最終的目的,始終是為了更好地輸出內(nèi)容。

4、輸出:屏幕輸出,手繪板,還有應(yīng)用

iPadOS 的野心很大。作為一塊10英寸上下的屏幕之內(nèi)的操作系統(tǒng),它作為內(nèi)容承載的硬件,是一個(gè)很合理的想象,不然也不會(huì)有那么多開發(fā)者一直在開發(fā)將iPad 作為外接屏幕的應(yīng)用,而現(xiàn)在,用戶只需要連上Wifi ,它就能作為 Mac的外接屏幕。

打通了這一個(gè)環(huán)節(jié)之后,后面的事情就自然而然了:Apple Pencil 可以在屏幕上畫畫,這樣一來,它很自然而然就成了手繪板。發(fā)布會(huì)上,蘋果官方所放出的圖片當(dāng)中,涵蓋了多數(shù)設(shè)計(jì)師都在使用的設(shè)計(jì)軟件,其中不乏 AI、AE、Pr、Sketch、C4D、Zbrush 這些大熱設(shè)計(jì)工具。

更重要的一點(diǎn)在于,Apple Pencil 原本 20ms 的反應(yīng)延遲,在這次的更新之后,將會(huì)達(dá)到9ms,反應(yīng)速度提升了一倍以上!它已經(jīng)是一個(gè)稱職的手繪板了。

有意思的地方在于,并沒有 PS。為什么?答案很簡(jiǎn)單啊,iPadOS平臺(tái)上的原生 PS 馬上就要來了??!連上Adobe 的創(chuàng)意云,兩個(gè)平臺(tái)又呼應(yīng)上了……

畢竟,想要打通細(xì)分的應(yīng)用場(chǎng)景,iPadOS 是需要自身具備強(qiáng)大生產(chǎn)力的,這意味著大量的獨(dú)立功能、服務(wù)和應(yīng)用支撐。

5、獨(dú)立:一切都是為了讓 iPad 獨(dú)立生存

想要 iPadOS 能夠獨(dú)立完成視覺創(chuàng)造的工作,對(duì)于多種字體的支持是肯定需要的。在iPad 上獨(dú)立運(yùn)行 Photoshop 也同樣是需要這樣的功能支撐的,所以,干脆官方提供支持了:

而值得注意的是,作為一個(gè)設(shè)計(jì)公司,蘋果的想象力并不止于此。這次更新的功能當(dāng)中,有一個(gè)非常引人矚目的功能是 SF Symbols。

蘋果將1000多個(gè)常見的 iOS 和 macOS 的圖標(biāo)和蘋果官方的舊金山字體融為一體,這些圖標(biāo)和符號(hào)支持 iOS 13、iPadOS以及的 watchOS 6 和 tvOS 13,而且你還可以在官方的文檔支持之下,自己創(chuàng)造!

具體可以戳這里了解:SF-symbols 使用文檔

完全獨(dú)立的 iPadOS 將會(huì)需要好好管理本地和云端的文件系統(tǒng),官方將文件管理器進(jìn)行了升級(jí),確保它無需借助另外一臺(tái)電腦來完成操作。

核心應(yīng)用沒有問題,和外接內(nèi)容進(jìn)入口也要一并升級(jí)。功能強(qiáng)大的 TypeC接口能夠直接讀取U盤和存儲(chǔ)卡:

而作為主要的瀏覽器,Safari 瀏覽器也向著桌面端瀏覽器的方向進(jìn)了優(yōu)化和調(diào)整,比如支持下載:

此外,圖片、照片和視頻的本地管理和剪輯功能,也一并進(jìn)行了升級(jí),這也是為了讓iPad 能夠成為一個(gè)更加獨(dú)立的產(chǎn)品而存在。

而真正改變游戲玩法的東西,在開發(fā)和設(shè)計(jì)上。

6、融合:徹底打通平臺(tái)的應(yīng)用開發(fā)模式

多年以前,蘋果為了統(tǒng)一全平臺(tái)的應(yīng)用開發(fā),開發(fā)語言從原本的 Obj-C 遷移到自家的 Swift 語言。隨著移動(dòng)端應(yīng)用量的快速增長(zhǎng),移動(dòng)端的應(yīng)用數(shù)量其實(shí)早已超過 macOS 平臺(tái)的開發(fā)數(shù)量和頻度,這種變化也催生了 Project Catalyst。

圖片來自 engatget

這個(gè)名為「催化劑」的項(xiàng)目的目標(biāo)是希望開發(fā)者可以更加便捷地將 iOS 應(yīng)用遷移到 macOS 上,比如說 Twitter 的開發(fā)者只花了幾天時(shí)間,就將現(xiàn)有的 iOS APP 遷移到 macOS 上。緊隨其后,成千上萬的移動(dòng)端應(yīng)用將都可以逐步地反哺到 macOS 上。

但是 Project Catalyst 只是權(quán)宜之計(jì),真正治根又治本的東西,則是這次的新的UI框架,SwiftUI。SwiftUI 是一個(gè)典型的原生應(yīng)用框架,是蘋果在磨合了上十年的經(jīng)驗(yàn)之后,所創(chuàng)造出一個(gè)的UI開發(fā)框架,開發(fā)者僅僅只需要極少量的代碼和交互式的設(shè)計(jì),就能夠調(diào)用這一框架。這一改變對(duì)于 iOS 平臺(tái)的設(shè)計(jì)和開發(fā)都會(huì)有直接的影響。

在現(xiàn)場(chǎng)演示的時(shí)候,原本復(fù)雜無比的開發(fā)代碼,在換用 SwiftUI 之后僅需幾行代碼聲明就可以搞定:

新的 Xcode 11 當(dāng)中,開發(fā)者可以使用托拽的方式來增刪組件,而右側(cè)的實(shí)時(shí)預(yù)覽則能夠呈現(xiàn)每一點(diǎn)改變。而基于 SwiftUI 的代碼開發(fā)模式,可以快速復(fù)用遷移到整個(gè)蘋果的產(chǎn)品平臺(tái)上,比以往任何時(shí)候都要快:

關(guān)于SwiftUI 的相關(guān)文檔:https://developer.apple.com/documentation/swiftui/

官方教程:https://developer.apple.com/tutorials/swiftui/

在新的 iPadOS 和 iOS13 中,系統(tǒng)的整體速度和性能得到了進(jìn)一步的提升,解鎖速度提升了30%,啟動(dòng)速度是以往的2倍,而應(yīng)用的容量也比以往要小。

7、沉浸:深色模式無處不在

對(duì),深色模式也是蘋果這次 iOS 產(chǎn)品更新的最核心特點(diǎn),甚至整個(gè)WWDC19 主題演講環(huán)節(jié)的整體視覺設(shè)計(jì)也是完全沿用這種沉浸感極強(qiáng)的深色模式視覺來進(jìn)行構(gòu)建的。目前蘋果的 HIG 當(dāng)中 iOS 的章節(jié)中新增了 Dark mode 的章節(jié),而 iPadOS 相關(guān)的系統(tǒng)的設(shè)計(jì)設(shè)計(jì)指南還未更新。

「在 iOS 13 及以上的版本當(dāng)中,用戶可以選擇深色模式為默認(rèn)的外觀風(fēng)格。在深色模式下,系統(tǒng)界面、視圖、菜單和控件都會(huì)使用較暗的配色方案,并且讓前景元素更加鮮艷,確保突出。用戶可以選擇選擇深色模式作為默認(rèn)的視覺風(fēng)格,也可以通過設(shè)置,讓它在光線較暗的時(shí)候,自動(dòng)切換過去。需要注意的是,深色模式可以讓人更加專注。在設(shè)計(jì)的時(shí)候,需要在淺色模式和深色模式中都進(jìn)行測(cè)試,因?yàn)橛行┰睾团渖谝环N模式下可用,在另一種模式下并不一定適用。」

蘋果目前在設(shè)計(jì)規(guī)范中所提供的設(shè)計(jì)要求相對(duì)比較簡(jiǎn)略,感興趣的同學(xué)可以借助翻譯工具看一下:Dark Mode

如果你對(duì)于深色模式感興趣,我們還有文章提供給你:

由于目前蘋果官方暫時(shí)沒有更多的內(nèi)容,我們可以把深色模式更多的內(nèi)容留到今后來聊。

8、安全:更私密的網(wǎng)絡(luò),更安全的生活

覺得社交網(wǎng)絡(luò)帳號(hào)登錄不夠安全?Google 和 Facebook 兩大巨頭在發(fā)布會(huì)上成了反面案例,蘋果適時(shí)地推出了自家的帳號(hào)登錄服務(wù)。

蘋果將產(chǎn)品和用戶之間的邊界劃分得非常清晰,包括借助 Homekit 為用戶提供基于本地存儲(chǔ)的安全服務(wù),在網(wǎng)上登錄的時(shí)候使用經(jīng)過加密的郵箱帳號(hào),等等。

而被蘋果點(diǎn)名的兩家著名科技企業(yè),Google 和 Facebook 也是在之前的 Google I/O 大會(huì)以及F8 大會(huì)上,相繼針對(duì)隱私策略、安全服務(wù)進(jìn)行了提升。

如果你對(duì)于這些大會(huì)感興趣可以看看之前的文章:

結(jié)語

和每年9月的新品發(fā)布相比,WWDC 的信息量一點(diǎn)都不小。尤其今年還有超贊的 Mac Pro,單開2篇文章都不一定聊得完。但是在我看來,和設(shè)計(jì)關(guān)系最緊密的產(chǎn)品,應(yīng)該就是 iPadOS了。這個(gè)獨(dú)特操作系統(tǒng),巧妙地卡在一個(gè)獨(dú)特的需求點(diǎn)上,它本身的設(shè)計(jì)和定位、用戶體驗(yàn)的考量、服務(wù)用戶的思路、牽涉到的功能和服務(wù)乃至于它對(duì)于設(shè)計(jì)的影響,都是巨大的。

藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì)  cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì)  圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)。

Echarts數(shù)據(jù)化可視圖表

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

Echarts數(shù)據(jù)化可視圖表

開發(fā)工具與關(guān)鍵技術(shù):Visual Studio 2015  使用Echarts圖表
作者:郭海明
撰寫時(shí)間:2019年 6月 4日
1
2
3
在創(chuàng)建一個(gè)網(wǎng)頁的時(shí)候,有一些頁面會(huì)有許多數(shù)據(jù),瀏覽起來枯燥而乏味,而且數(shù)據(jù)之間的對(duì)比也不夠明顯。那么有什么方法可以讓這些數(shù)據(jù)的對(duì)比明顯起來,使數(shù)據(jù)看起來也沒有那么枯燥呢!答案當(dāng)然是有的,我們只需要引用Echarts數(shù)據(jù)可視化圖表就可以了。使用Echarts數(shù)據(jù)化圖表不僅可以讓數(shù)據(jù)之間對(duì)比明顯,還可以使數(shù)據(jù)更加生動(dòng)起來,增強(qiáng)用戶瀏覽頁面數(shù)據(jù)的體驗(yàn)感。
Echarts提供了常規(guī)的折線圖,柱狀圖,餅狀圖,散點(diǎn)圖。還有用于統(tǒng)計(jì)的盒型圖,用于地理數(shù)據(jù)可視化的地圖,熱力圖,線圖,用于關(guān)系數(shù)據(jù)可視化的關(guān)系圖,多維數(shù)據(jù)可視化的平行坐標(biāo)。還有用戶BI的漏斗圖,儀表盤,并且支持圖與圖之間的混搭。
Echarts圖表使用起來的方法頁很簡(jiǎn)單,首先將Echarts插件引用到視圖里面,視圖里面添加顯示Echarts圖表的類。給這個(gè)類顯示圖表的空間,并給類ID,用于后面寫好圖表之后將圖表放到這個(gè)類里面。

然后在

將學(xué)生信息數(shù)據(jù)表格需要用到的數(shù)據(jù)表,進(jìn)行多表的連接查詢,連接完成之后,

獲取到需要用到的數(shù)據(jù),封裝到自定義的AchievementInfor的實(shí)體類里面。

寫出接收不同階段成績(jī)的方法。用于接收每個(gè)不同階段的成績(jī).
寫完之后,返回到視圖里面去寫調(diào)用Echarts的圖表,這里我們顯示的是折線圖,所以首先在
藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)

什么場(chǎng)景思維?顧客體驗(yàn)地圖給你答案

藍(lán)藍(lán)設(shè)計(jì)的小編

 如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

今天我們就來討論一下什么是顧客體驗(yàn)地圖。

一、什么是顧客體驗(yàn)地圖?

顧客體驗(yàn)地圖( Customer Journey Map) 是一張超越時(shí)間和空間,從個(gè)體的視角得到用戶與企業(yè)、服務(wù)、產(chǎn)品之間的關(guān)系地圖。它能夠視覺化地描繪用戶在使用服務(wù)的整個(gè)過程中的流程、需求、痛點(diǎn)。它可以很好地幫助我們梳理和分析常見的場(chǎng)景可能存在的問題。在營銷、服務(wù)、產(chǎn)品的場(chǎng)景分析中CJM都能發(fā)揮很大作用。

我們來欣賞一些著名公司做的顧客體驗(yàn)地圖:

1. 星巴克:用戶到星巴克喝完咖啡的整個(gè)體驗(yàn)過程

  • 圖中央的橫軸是用戶在體驗(yàn)過程中步驟:準(zhǔn)備(Anticipate)、進(jìn)入(Enter)、參與(Engage)、退出(Exit)、反饋(Reflect),每一個(gè)步驟下還對(duì)用戶行為做了進(jìn)行一步細(xì)分,例如,“參與”步驟中包含了:排隊(duì)、點(diǎn)單、支付、坐下、喝、工作;
  • 在圖上方,標(biāo)識(shí)出了用戶在體驗(yàn)過程中心情變化,以積極和消極的進(jìn)行劃分,對(duì)每個(gè)觸點(diǎn)(圓點(diǎn))標(biāo)記了相應(yīng)的說明,例如:在工作階段,免費(fèi)的wifi就是一個(gè)積極的觸點(diǎn);
  • 下半部分是從用戶視角描述了他在該動(dòng)作下的不同用戶故事,例如:8.f 我享用著免費(fèi)Wi-Fi,而且信號(hào)也夠用。

2. 樂高:“用戶體驗(yàn)環(huán)(Customer Experience Wheel)”

在整個(gè)體驗(yàn)中找到樂高沒?

  • 雖然比畫成圓形,但是它本質(zhì)上也是顧客體驗(yàn)地圖;
  • 在圖的中心是這個(gè)用戶角色的說明;
  • 圓周是用戶體驗(yàn)的整個(gè)旅程,體驗(yàn)的好壞用表情來表示體驗(yàn)的好壞;
  • i 標(biāo)記出我們需要更多信息來幫助我們提升體驗(yàn);

3. 英國政府:使用CJM解決公共服務(wù)問題

受害人報(bào)案到打官司的體驗(yàn)流程

  • 站在用戶的視角,評(píng)估用戶的滿意度;
  • 尋找不同政府部門的服務(wù)邊界;

4. Desonance 繪制的CJM也很有特色

這張圖包含了很多便于瀏覽的視覺化信息:

  • 用戶類型 (Customer Type):“用戶類型”可以用“用戶角色分析法(Persona)”或者移情圖進(jìn)一步細(xì)化。
  • 體驗(yàn)階段及旅程 (Experience Phases & The Journey): 在不同的體驗(yàn)階段以圖文結(jié)合的故事化的方式來描述不同的行為活動(dòng),圖中包含了痛點(diǎn)、觸點(diǎn)、機(jī)會(huì)點(diǎn)……
  • 觸點(diǎn)詳情與交互動(dòng)作 (Specific touchpoint and interactions):觸點(diǎn)的解釋說明;
  • 情緒變化 (What the service is like — nights and lows ):通過高低來視覺化用戶情緒變化過程,從而體現(xiàn)服務(wù)效果;
  • 痛點(diǎn)和機(jī)會(huì)點(diǎn) (Point of delight/opportunities & Point of pain/service barriers ): 通過使用圖標(biāo)的方式標(biāo)記在旅程圖中 ;
  • 要點(diǎn)說明( Key to explain the map);

二、如何繪制?

了解完什么是顧客體驗(yàn)地圖后,我們開始學(xué)習(xí)如何創(chuàng)建它。顧客體驗(yàn)地圖的創(chuàng)建需要五步:明確目標(biāo)、探究、頭腦風(fēng)暴、繪制地圖、優(yōu)化迭代:

1. 確定目標(biāo)

考慮好產(chǎn)品或服務(wù)的整體目標(biāo),以及期望顧客旅程圖反應(yīng)出具體目標(biāo)。在做之前,最好把原有的體驗(yàn)流程感受一遍。并且與利益相關(guān)者溝通,探尋背后真正的動(dòng)因??梢允褂?W1H:

  • what:我們希望通過顧客體驗(yàn)地圖解決什么問題?
  • why:為什么要解決這個(gè)問題?
  • where:這些問題在哪些場(chǎng)合發(fā)生?
  • when:時(shí)間截止期限是什么?
  • who:涉及到哪些利益相關(guān)者?
  • how:期望達(dá)到的愿景是怎么樣的?

2. 探究

(1)檢視所有相關(guān)的用戶研究資料,其中包括定性和定量的調(diào)查結(jié)果,以便于提供洞察客戶體驗(yàn)。也可以通過書籍資料做更多的研究。常用的研究方法包括客戶訪談、人種學(xué)和情境調(diào)查、客戶調(diào)查、客戶支持/投訴日志、網(wǎng)絡(luò)分析、社交媒體收聽和競(jìng)爭(zhēng)情報(bào)。

(2)移情映射,從各個(gè)方面描述一個(gè)角色在特定場(chǎng)景中的經(jīng)歷。這個(gè)練習(xí)幫助我們的團(tuán)隊(duì)加深對(duì)顧客體驗(yàn)的理解,并對(duì)顧客所需要的東西做出驚人的洞察力。移情圖也為顧客體驗(yàn)地圖的繪制提供了物質(zhì)基礎(chǔ)。我們的目標(biāo)是獲得一個(gè)全面的感覺,在這段經(jīng)歷中扮演那個(gè)角色的感覺,特別是關(guān)注他們的想法、感覺、視覺、聽覺、說話和行動(dòng)。

(3)先生成一個(gè)客戶觸點(diǎn)清單以及這些觸點(diǎn)出現(xiàn)的場(chǎng)景。然后通過頭腦風(fēng)暴尋找被遺漏的接觸點(diǎn)或場(chǎng)景。例如,觸點(diǎn)可以是“付賬單”,與觸點(diǎn)相關(guān)的場(chǎng)景可以是“在線付費(fèi)”、“通過郵件付費(fèi)”或“親自付費(fèi)”。

3. 頭腦風(fēng)暴

為了收集更多的Idea,我們需要組建一個(gè)團(tuán)隊(duì)進(jìn)行頭腦風(fēng)暴。頭腦風(fēng)暴的目的是在短時(shí)間內(nèi)產(chǎn)生盡可能多的想法。我們可以選擇品牌屬性或心態(tài)的詞匯。頭腦風(fēng)暴的時(shí)候,圍繞這些詞進(jìn)行。我建議團(tuán)隊(duì)選擇3-5個(gè)詞(例如:可訪問的,社交的,安慰的),然后每個(gè)單詞使用2分鐘的時(shí)間。每個(gè)人都會(huì)寫下他們當(dāng)時(shí)所能想到的許多想法。2分鐘后切換到下一個(gè)詞,直到所有的詞被用作靈感。

使用親和圖進(jìn)行整理。親和圖是通過視覺方式組織團(tuán)隊(duì)的思想,凝聚和發(fā)現(xiàn)概念中的的方法。親和圖解有助于我們從一個(gè)廣泛的網(wǎng)絡(luò)轉(zhuǎn)移到探索許多可能性,以獲得對(duì)這個(gè)觀眾的正確解決方案的重點(diǎn)。所有的團(tuán)隊(duì)成員都應(yīng)該把他們的想法放在墻上的頭腦風(fēng)暴活動(dòng)中。有人把這些想法分類并貼上標(biāo)簽。作為一個(gè)群體,開始考慮你可以在哪里組合,提煉,并刪除想法,形成一個(gè)凝聚力的未來客戶體驗(yàn)的愿景。

4. 描繪顧客的體驗(yàn)旅程

把所有的東西放在一起:時(shí)間線、觸點(diǎn)、頻道、情緒波動(dòng),以及為如何改進(jìn)未來客戶旅程所產(chǎn)生的所有美妙的新想法。顧客體驗(yàn)地圖有5個(gè)關(guān)鍵要素:

  • 角色:這張圖的主角用戶是誰;
  • 觸點(diǎn):場(chǎng)景中服務(wù)與用戶接觸的關(guān)鍵點(diǎn);
  • 渠道:交互行為發(fā)生的地方是網(wǎng)頁端、App、電話、還是在線下某一個(gè)地方?
  • 時(shí)間線:從服務(wù)的前、中、后的不同階段,可以進(jìn)行細(xì)分;
  • 情緒:在體驗(yàn)過程中的情緒變化;

購買場(chǎng)景下的顧客體驗(yàn)地圖

另外,這張圖還可以提供一些額外信息:

  • 真實(shí)的瞬間: 通過照片拍攝一些能讓人留下足夠印象的積極的交互畫面。
  • 服務(wù)提供者:對(duì)體驗(yàn)有影響的相關(guān)人員,如服務(wù)員、朋友、同事等;

#專欄作家#

PM熊叔,微信公眾號(hào):PM熊叔,人人都是產(chǎn)品經(jīng)理專欄作家。教育類產(chǎn)品產(chǎn)品經(jīng)理出身,學(xué)過設(shè)計(jì),做過開發(fā),做過運(yùn)營的產(chǎn)品經(jīng)理。

設(shè)計(jì)思維是一種解決問題的方法,運(yùn)用同理心,橫向思考,做原型,講故事,

藍(lán)藍(lán)設(shè)計(jì)的小編

編輯:藍(lán)藍(lán)


設(shè)計(jì)思維是一種解決問題的方法,運(yùn)用同理心,橫向思考,做原型,講故事,令人信服地澄清洞見。


2004年,斯坦福大學(xué)機(jī)械工程系的教授戴維·凱利(DavidKelley)創(chuàng)辦了D.School(斯坦福大學(xué)哈索普萊特納設(shè)計(jì)學(xué)院),并在D.School教授關(guān)于設(shè)計(jì)方法論的課程,他也是世界最著名的創(chuàng)業(yè)設(shè)計(jì)與咨詢公司IDEO的創(chuàng)始人。

什么是設(shè)計(jì)思維?

設(shè)計(jì)思維需要將人放回故事的中心。要學(xué)會(huì)將人放在首位,這就是設(shè)計(jì)思維的核心精神:以人為本的設(shè)計(jì),也叫做以用戶為中心的設(shè)計(jì)(User-Centered Design)。設(shè)計(jì)思維,就是一套以人為本的解決問題的方法論。解決問題,要從人的需求出發(fā),多角度地尋求創(chuàng)新解決方案,并創(chuàng)造更多的可能性。

在“設(shè)計(jì)思維”在被不同的學(xué)者提出之后,IDEO是第一家將設(shè)計(jì)思維應(yīng)用于商業(yè)問題的解決之中。

D.School將設(shè)計(jì)思維分成五大步驟:“Empathy同理心思考”、“Define需求定義”、“Ideate創(chuàng)意構(gòu)思”、“Prototype原型實(shí)現(xiàn)”、“Test實(shí)際測(cè)試”,

接下來,就讓我們了解一下如何實(shí)施設(shè)計(jì)思維的五步驟!

1同理心思考(Empathy)

同理心思考,就是要獲得對(duì)你試圖解決的問題的共鳴。簡(jiǎn)單來說,就是換位思考。比如你希望改善學(xué)校的教室環(huán)境,那么,你就可以像學(xué)生一樣,坐在課桌后面上一整天的課?;蛘?,你希望學(xué)生們來解決班級(jí)紀(jì)律的問題,你可以讓一位學(xué)生來做一天的老師。這個(gè)步驟的目標(biāo)是深入解讀用戶,收集大量信息。

2需求定義 (Define)

在收集到的調(diào)查信息基礎(chǔ)上,我們需要更的定義需求。像“讓學(xué)生的成績(jī)更好”,這就不是一個(gè)的需求定義。而“提升學(xué)生在自習(xí)時(shí)間的專注力”,則是更精準(zhǔn)的,入手點(diǎn)明確的需求定義。只有精準(zhǔn)定義需求,我們才能開始入手解決問題!

3創(chuàng)意構(gòu)思(Ideate)

這個(gè)步驟可以看做是頭腦風(fēng)暴的階段。圍繞上一步定義的需求,我們可以跳出局限,打破慣性思維,天馬行空的提出各種各樣的點(diǎn)子。不要一定要想到好點(diǎn)子,而是要在一百個(gè)點(diǎn)子里選出最好的。

4原型實(shí)現(xiàn)(Prototype)

這個(gè)步驟是要做出可以是粗糙、簡(jiǎn)單的產(chǎn)品或產(chǎn)品中的特定功能的原始模型,用于測(cè)試上一階段提出的解決方案。原型可以是一個(gè)具體的產(chǎn)品的模型,也可以是一個(gè)小規(guī)模的環(huán)境或過程的簡(jiǎn)單模擬。

5實(shí)際測(cè)試 (Test)

這個(gè)階段,我們會(huì)使用實(shí)現(xiàn)的產(chǎn)品原型,或模擬環(huán)境來嚴(yán)格測(cè)試問題是否得到解決,需求是否得到滿足。這個(gè)階段非常重要,一些想法可能會(huì)在這個(gè)過程中被重新定義,甚至,發(fā)現(xiàn)新的問題。

以上,就是實(shí)施設(shè)計(jì)思維的五大步驟。

第6步:重復(fù)以上步驟進(jìn)行迭代 

反饋——原型——測(cè)試——反饋——原型.......


很多時(shí)候團(tuán)隊(duì)都是在缺乏對(duì)于真實(shí)目的和需求認(rèn)識(shí)清楚的基礎(chǔ)上被迫做一些徹底改造,怎么做?

藍(lán)藍(lán)設(shè)計(jì)的小編

編輯:藍(lán)藍(lán)

戰(zhàn)略設(shè)計(jì)中的一部分,是需要對(duì)自己和他人開誠布公,讓大家清楚你真正想要從一項(xiàng)創(chuàng)新活動(dòng)中尋求什么。很多時(shí)候,團(tuán)隊(duì)都是在缺乏對(duì)于真實(shí)的目的和需求認(rèn)知清楚的基礎(chǔ)上被迫使做一些徹底改造或是重新想象的事情。


需要探素的問題可能包括:


我們想要的解決方案的本質(zhì)是什么?

破壞性創(chuàng)新還是漸進(jìn)式創(chuàng)新?我需要很明確這點(diǎn)嗎?

我們是昨天需要還是明天需要?

我是否為我正投入做的挑戰(zhàn)耗費(fèi)了合適的資源?


破壞性創(chuàng)新是一些新的、之前沒有過的體驗(yàn),而漸進(jìn)式創(chuàng)新是在現(xiàn)有的給人們來的利益點(diǎn)的基礎(chǔ)上做的一些新的、改進(jìn)式創(chuàng)新。當(dāng)然,我們每大都在連續(xù)不斷地努力、改善我們提供的產(chǎn)品和服務(wù)。無論是哪一種創(chuàng)新変革,在不同的時(shí)間范時(shí)都有對(duì)它的需求。你希望哪種創(chuàng)新變革,以及你能花在上面的時(shí)間,都會(huì)影響到你如何實(shí)現(xiàn)創(chuàng)新。


變化的類型 :短期、中期、長(zhǎng)期

破壞性創(chuàng)新、漸進(jìn)式創(chuàng)新、持續(xù)改進(jìn)



舉個(gè)例子,假設(shè)一個(gè)領(lǐng)導(dǎo)者確實(shí)想要“盡快”做出破壞性創(chuàng)新,那么關(guān)鍵是就把它盡快培育起來并推向市場(chǎng),與所需要的資源、人力和資金的需求展開一番對(duì)話。這個(gè)簡(jiǎn)單的對(duì)話對(duì)于構(gòu)建你的戰(zhàn)略邊界是很重要的。沒有它,你可能會(huì)在一些不必要的努力上浪費(fèi)時(shí)間。時(shí)機(jī)很重要,不要等到太完美。

或許它不是人們想要放在首位的對(duì)話,但是從領(lǐng)導(dǎo)力的角度,確實(shí)最為重要的,也是會(huì)贏得參與挑戰(zhàn)的團(tuán)隊(duì)成員的高度贊賞的。



日歷

鏈接

個(gè)人資料

存檔