首頁(yè)

JS基礎(chǔ)知識(shí)整理06-函數(shù)

seo達(dá)人

使用function關(guān)鍵字定義函數(shù)

函數(shù)聲明會(huì)被提升(Hoisting),將聲明移動(dòng)到當(dāng)前作用域頂端的默認(rèn)行為。



參數(shù):

如果函數(shù)調(diào)用的參數(shù)太多(超過(guò)聲明),則可以使用函數(shù)的內(nèi)置對(duì)象arguments

arguments.length 會(huì)返回函數(shù)被調(diào)用時(shí)收到的參數(shù)數(shù)目

arguments[index]可以得到相應(yīng)的參數(shù)



傳遞對(duì)象的時(shí)候是使用引用來(lái)傳遞的,如果函數(shù)修改了對(duì)象屬性,則原始對(duì)象也改變了。





調(diào)用:

以函數(shù)形式調(diào)用函數(shù):(這種方式調(diào)用默認(rèn)的是全局對(duì)象調(diào)用)

function myFunction(a, b) {

return a * b;

}

myFunction(10, 2);



作為方法來(lái)調(diào)用函數(shù):(這種方式調(diào)用屬于函數(shù)的擁有者myObject)

var myObject = {

firstName:"Bill",

lastName: "Gates",

fullName: function () {

return this.firstName + " " + this.lastName;

}

}

myObject.fullName(); 



通過(guò)函數(shù)構(gòu)造器來(lái)調(diào)用函數(shù):(如果函數(shù)調(diào)用的前面是 new 關(guān)鍵字,那么這是一個(gè)構(gòu)造函數(shù)調(diào)用)

function myFunction(arg1, arg2) {

this.firstName = arg1;

this.lastName  = arg2;

}

var x = new myFunction("Bill", "Gates");

x.firstName; 



call()和apply()方法:

var person = {

fullName: function() {

return this.firstName + " " + this.lastName;

}

}

var person1 = {

firstName:"Bill",

lastName: "Gates",

}

var person2 = {

fullName: function(city, country) {

return this.firstName + " " + this.lastName + "," + city + "," + country;

}

}



call() 方法是預(yù)定義的 JavaScript 方法。

它可以用來(lái)調(diào)用所有者對(duì)象作為參數(shù)的方法。

通過(guò) call(),您能夠使用屬于另一個(gè)對(duì)象的方法。

如:

person.fullName.call(person1)// person1來(lái)調(diào)用person的fullName方法



call()可以帶參數(shù),參數(shù)對(duì)應(yīng)按順序的傳給方法

person2.fullName.call(person1,"Seattle", "USA")



apply()方法和call()方法類似

區(qū)別在于接收參數(shù)的方式不一樣。

call(obj,"x","y") 方法分別接受參數(shù)

apply(obj,["x","y"]) 方法接收數(shù)組形式的參數(shù)





箭頭函數(shù):(ES6)

箭頭函數(shù)不需要function關(guān)鍵字、return關(guān)鍵字和大括號(hào)

var x = function(x, y) {

  return x y;

}



var x = (x, y) => x
y;

兩個(gè)的作用相同。



箭頭函數(shù)沒(méi)有自己的this、如果函數(shù)是單個(gè)語(yǔ)句,則只能省略 return 關(guān)鍵字和大括號(hào)

藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(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ù)。

Hibernate--使用離線查詢DetachedCriteria完成對(duì)列表的篩選

seo達(dá)人

User表:





User類:

package pers.zhang.domain;



public class User {



private Long user_id;

private String user_code;

private String user_name;

private String user_password;

private String user_state;

public Long getUser_id() {

return user_id;

}

public void setUser_id(Long user_id) {

this.user_id = user_id;

}

public String getUser_code() {

return user_code;

}

public void setUser_code(String user_code) {

this.user_code = user_code;

}

public String getUser_name() {

return user_name;

}

public void setUser_name(String user_name) {

this.user_name = user_name;

}

public String getUser_password() {

return user_password;

}

public void setUser_password(String user_password) {

this.user_password = user_password;

}

public String getUser_state() {

return user_state;

}

public void setUser_state(String user_state) {

this.user_state = user_state;

}

}



ORM元數(shù)據(jù):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    ";

<hibernate-mapping package="pers.zhang.domain" >

<class name="User" table="sys_user" >

<id name="user_id"  >

<generator class="identity"></generator>

</id>

<property name="user_code" column="user_code" ></property>

<property name="user_name" column="user_name" ></property>

<property name="user_password" column="user_password" ></property>

<property name="user_state" column="user_state" ></property>

</class>

</hibernate-mapping>



控制層:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

//獲得查詢參數(shù)

String userIdStr = request.getParameter("userId");

String userName = request.getParameter("userName");

//獲得離線查詢對(duì)象

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);

//拼裝查詢條件

if(userIdStr != null && !"".equals(userIdStr)) {

Long userId = (long) Integer.parseInt(userIdStr);

detachedCriteria.add(Restrictions.eq("user_id", userId));

}

if(userName != null && !"".equals(userName)) {

detachedCriteria.add(Restrictions.like("user_name", userName, MatchMode.ANYWHERE));

}



//作為參數(shù)傳遞給service層

UserService userService = new UserService();

List<User> list = userService.findUserByCondition(detachedCriteria);



request.setAttribute("userList", list);

request.getRequestDispatcher("list2.jsp").forward(request, response);

}



Service層:

public List<User> findUserByCondition(DetachedCriteria detachedCriteria) {

//傳遞給Dao層

UserDao userDao = new UserDao();

return userDao.findUserByCondition(detachedCriteria);

}

1

2

3

4

5

Dao層:

public List<User> findUserByCondition(DetachedCriteria detachedCriteria) {

Session session = HibernateUtils.openSession();

Transaction tx = session.beginTransaction();



//關(guān)聯(lián)session

Criteria criteria = detachedCriteria.getExecutableCriteria(session);

//查詢

List<User> list = criteria.list();

return list;



}



前端頁(yè)面:

忘記寫(xiě)查詢數(shù)據(jù)回顯了…



<%@ page language="java" contentType="text/html; charset=utf-8"

    pageEncoding="utf-8"%>

<%@ taglib uri="
http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<script type="text/javascript" src="js/jquery-2.1.0.js" ></script>

<script type="text/javascript" src="js/bootstrap.min.js" ></script>

<link rel="stylesheet" href="css/bootstrap.css" />

</head>

<body>

<form class="form-inline" role="form" method="post" action="${pageContext.request.contextPath }/findUserByCondition">

  <div class="form-group">

    <input type="text" class="form-control" id="exampleInputEmail2" placeholder="用戶ID" name="userId">

  </div>

  <div class="form-group">

    <input type="text" class="form-control" id="exampleInputPassword2" placeholder="用戶名" name="userName">

  </div>

  <button type="submit" class="btn btn-default">篩選</button>

</form>



<div style="text-align: center; width: 600px;">

<table class="table table-hover">

  <tr><td>編號(hào)</td><td>用戶ID</td><td>用戶名</td><td>昵稱</td><td>密碼</td></tr>

  <!-- 顯示數(shù)據(jù) -->

  <c:forEach items="${userList }" var="list">

  <tr><td>${list.user_id }</td><td>${list.user_code }</td><td>${list.user_name }</td><td>${list.user_password }</td><td>${list.user_state }</td></tr>

  </c:forEach>

</table>

</div>





</body>

</html>



測(cè)試:



藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(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ù)。

聊聊那些擁有“邊際效應(yīng)”的產(chǎn)品

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

講述邊際效應(yīng)對(duì)應(yīng)不同線上線下產(chǎn)品的不同狀態(tài)以及優(yōu)勢(shì)

現(xiàn)如今對(duì)于大多數(shù)的互聯(lián)網(wǎng)產(chǎn)品來(lái)說(shuō),其實(shí)都大致會(huì)用到“邊際效應(yīng)”這個(gè)概念,在看似華麗渲染的互聯(lián)網(wǎng)背后,真正支撐著的是對(duì)人的深刻認(rèn)識(shí)與理解。當(dāng)然,現(xiàn)如今的產(chǎn)品很多都有規(guī)律可循,包括商業(yè)模式、變現(xiàn)方式等等,那么這次我們就來(lái)說(shuō)說(shuō)那些在互聯(lián)網(wǎng)中產(chǎn)品的邊際成本遞減效應(yīng)的設(shè)計(jì)。



邊際成本

首先呢,在這里我要先為大家解釋一下何為邊際成本。

從概念性角度解釋:邊際成本指的是每一個(gè)單位新增的產(chǎn)品(或購(gòu)買(mǎi)的產(chǎn)品)所帶來(lái)的總成本增量。

( 舉例 )

比如說(shuō)現(xiàn)如今的共享單車,在僅生產(chǎn)第一輛的時(shí)候,其公司花費(fèi)的成本是極大的,它包含:設(shè)計(jì)費(fèi)、電話費(fèi)、路程費(fèi)、人工費(fèi)等等等等……但是,在生產(chǎn)第100輛的時(shí)候,小車兒的成本就低很多了,再不創(chuàng)新的前提下,只要復(fù)制就可以了,而如果在生產(chǎn)第1000輛的時(shí)候,那成本就更低了,這就是經(jīng)濟(jì)規(guī)模帶來(lái)的效應(yīng)。那么,同樣的復(fù)制,為什么越復(fù)制越便宜呢?其實(shí),這里面有一個(gè)對(duì)等的增產(chǎn)量對(duì)比,由于小車數(shù)量的增多,遍布區(qū)域的擴(kuò)大,所以,也就導(dǎo)致公司的機(jī)會(huì)成本增高,也就是成本更低,所以,考慮邊際成本遞減的同時(shí),也要考慮機(jī)會(huì)的增多。



邊際成本遞減

剛才說(shuō)到的其實(shí)就是邊際效應(yīng)里成本遞減的模式,也是我們這次討論產(chǎn)品的核心,所謂的邊際效應(yīng)遞減,就是指在其他條件不變的情況下,如果一種投入要素連續(xù)的等量增加,當(dāng)增加到一定產(chǎn)值后,所提供的產(chǎn)品增量就會(huì)下降,同時(shí)可變要素的邊際產(chǎn)量就會(huì)遞減。


我在舉個(gè)例子:日常的滴滴打車,就是遞減的模式,因?yàn)榈蔚未蠖鄶?shù)的供給側(cè)平臺(tái)用戶就是私家車出來(lái)接單,所以,當(dāng)平臺(tái)每多接入一輛車,那么對(duì)于滴滴平臺(tái)來(lái)講邊際成本就越趨于零。

其實(shí),類似于滴滴打車這樣的線上+線下的資源整合性平臺(tái),更加符合互聯(lián)網(wǎng)的經(jīng)營(yíng)模式,這是因?yàn)榛ヂ?lián)網(wǎng)在21世紀(jì),就是以免費(fèi)為前提的,隨著用戶的增多,邊際成本的下降,無(wú)非就是在完善經(jīng)營(yíng)的條件下,多開(kāi)一些服務(wù)器和寬帶罷了,其他的成本幾乎已經(jīng)可以忽略不計(jì),而這也正是互聯(lián)網(wǎng)產(chǎn)品成為霸主的必要因素之一。


    注(供給側(cè):經(jīng)濟(jì)學(xué)術(shù)語(yǔ)的一種,意思是指供給方面,國(guó)民經(jīng)濟(jì)的平穩(wěn)發(fā)展取決于經(jīng)濟(jì)中需求和供給的相對(duì)平衡。 供給顯示了隨著價(jià)錢(qián)升降而其它因素不變的情況下,某個(gè)體在每段時(shí)間內(nèi)所愿意賣出的某貨物的數(shù)量。在某一價(jià)格下,消費(fèi)者愿意購(gòu)買(mǎi)的某一貨物的總數(shù)量稱為需求量。在不同價(jià)格下,供給量會(huì)不同。供給和需求也就是說(shuō)價(jià)格與需求量的關(guān)系。若以圖像表示,便稱為供給曲線。)



邊際成本的線下產(chǎn)品案例


奶茶案例

在我們逛街購(gòu)物時(shí),幾乎都會(huì)買(mǎi)一杯奶茶飲品,而這里面就運(yùn)用到了邊際效應(yīng)的負(fù)效應(yīng)模式,他們運(yùn)用第二杯半價(jià)的手段來(lái)提升消費(fèi)者對(duì)產(chǎn)品第一次的貪婪程度,也就是“欲望值”,同時(shí)也提升了產(chǎn)品的銷售,但邊際成本不變,當(dāng)消費(fèi)者購(gòu)買(mǎi)后,負(fù)效應(yīng)可能就會(huì)產(chǎn)生,因?yàn)橄M(fèi)者不一定能喝完。這里就體現(xiàn)的是商品價(jià)值取決于人的欲望和欲望被滿足的程度比例。



服裝案例

再比如商場(chǎng)內(nèi)大牌服裝都寫(xiě)著全場(chǎng)8折,其實(shí)仔細(xì)想想,8折的價(jià)格真的很劃算么?他們這么做也同樣是在運(yùn)用了邊際效應(yīng)的同時(shí)調(diào)取了消費(fèi)者心理的欲望值,在消費(fèi)者第一次購(gòu)買(mǎi)時(shí),單純考慮的爽點(diǎn)而非負(fù)效應(yīng),但隨著商品購(gòu)買(mǎi)完的數(shù)量,才真正會(huì)產(chǎn)生負(fù)效應(yīng)。



電影票案例

還有一個(gè)是關(guān)于電影票的,我的一個(gè)朋友會(huì)經(jīng)常去看電影,之前去看電影的時(shí)候是在現(xiàn)場(chǎng)買(mǎi)的票,那次售票員給他推送了一個(gè)非常超值的套餐,就是單買(mǎi)一張票是原價(jià)48元,但是近期有一個(gè)限量套餐,這個(gè)套餐里包含:5場(chǎng)電影+1桶爆米花,價(jià)格是149元,但是需要一次性消費(fèi),聽(tīng)起來(lái)是不是非常超值?我的朋友考慮反正也沒(méi)事,那就多看幾場(chǎng),還便宜。但是如果按照邊際成本遞減與負(fù)效應(yīng)來(lái)講,這絕對(duì)是一件虧本的買(mǎi)賣,誰(shuí)能一直做著看十幾個(gè)小時(shí)的電影不走?我想電影院也一定有這樣的數(shù)據(jù)才會(huì)推出這樣的套餐吧。但隨著消費(fèi)者購(gòu)買(mǎi)人數(shù)越多,邊際成本遞減,其他人也會(huì)紛紛模仿,這里面包含一個(gè)人類固有的“羊群效應(yīng)”,也就形成了商業(yè)價(jià)值,但隨著消費(fèi)者看電影時(shí)間的延長(zhǎng),負(fù)效應(yīng)也隨之而來(lái)。


    注(羊群效應(yīng):羊群效應(yīng)理論,也稱羊群行為、從眾心理。經(jīng)濟(jì)學(xué)里經(jīng)常用“羊群效應(yīng)”來(lái)描述經(jīng)濟(jì)個(gè)體的從眾跟風(fēng)心理。)



邊際成本的線上產(chǎn)品案例


微信

首當(dāng)其沖的,自然是微信了,這個(gè)傳奇產(chǎn)品堪稱邊際成本做的最好的一個(gè),在我們之前都是運(yùn)用短信電話的時(shí)候,每發(fā)一條短信,每打一個(gè)電話都要考慮不同的費(fèi)用,但由于微信的出現(xiàn),極大的解決了用戶的這個(gè)痛點(diǎn),微信已最核心的打字聊天、語(yǔ)音/視頻通話為主要支點(diǎn),并賦予各種特色產(chǎn)品輔助。在微信最大化的邊際成本趨于零的同時(shí),迅速擴(kuò)大了用戶使用產(chǎn)品的范圍區(qū),所以,作為互聯(lián)網(wǎng)的邊際成本,我想微信的在這方面確實(shí)做的很好。



GoFun出行

這款產(chǎn)品為共享汽車類型,屬于線上+線下產(chǎn)品,Gofun出行的邊際成本做的比較合理是,首先是他的供給側(cè)能力較足,因?yàn)橐劳辛耸灼瘓F(tuán)的優(yōu)勢(shì)資源,極大的降低了邊際成本,并通過(guò)對(duì)用戶的日常作息將碎片打車時(shí)間、坐公交時(shí)間、出游時(shí)間等需求作為整體分析,提供了這一種出行服務(wù),并且現(xiàn)在的產(chǎn)品里還融合了長(zhǎng)時(shí)間租車服務(wù),這就極大的又一次挖掘了一批潛在用戶,在邊際成本遞減并趨于零的同時(shí),反響的用戶群體范圍也在逐漸擴(kuò)大。同時(shí)這個(gè)產(chǎn)品還在登陸時(shí)跳出有廣告提示,“分享可得免費(fèi)時(shí)長(zhǎng)開(kāi)車券等優(yōu)惠”,這種手法也是除了在邊際成本遞減的同時(shí),運(yùn)用的用戶酬賞機(jī)制,目的是通過(guò)用戶引流用戶。



摩拜單車

在文章開(kāi)篇的時(shí)候我拿共享單車舉過(guò)例子,其實(shí)摩拜單車的性質(zhì)與共享汽車的性質(zhì)大體一致,主線路相似程度可達(dá)到80%,這里我要和大家說(shuō)一個(gè)定律,關(guān)于用戶的定律。當(dāng)產(chǎn)品開(kāi)發(fā)者抓區(qū)并成功解決掉某幾種目標(biāo)用戶的痛點(diǎn)后,其相等模式可無(wú)限制復(fù)制,并形成范圍值生產(chǎn)從而解決掉這幾種用戶對(duì)等的群體用戶痛點(diǎn)。

我給大家舉個(gè)例子應(yīng)該就徹底明白了,就像醫(yī)藥行業(yè)診斷,當(dāng)醫(yī)生遇到一種從未遇見(jiàn)過(guò)的病毒時(shí),其第一次需要花費(fèi)的成本是極其昂貴的,但只要一旦得到解決,那么當(dāng)再次遇到同類型病毒時(shí),就可以快速?gòu)?fù)制解決,其邊際成本迅速降低,反之收益增高,同時(shí)同類型病毒則可批量解決。共享汽車和單車產(chǎn)品正是邊際成本與復(fù)制的這一體現(xiàn)。




總結(jié)

邊際成本在20世紀(jì)時(shí)是非常難得的一個(gè)概念,因?yàn)樵?0世紀(jì)的成本里,幾乎都是建立在“原子經(jīng)濟(jì)”上的,而直到21世紀(jì)互聯(lián)網(wǎng)形體的出現(xiàn),邊際成本將真實(shí)的成倍數(shù)下降,這是因?yàn)?1世紀(jì)的成本發(fā)生了轉(zhuǎn)移,建立在了“比特經(jīng)濟(jì)”上。

所謂原子經(jīng)濟(jì)的本質(zhì)就是需要以大規(guī)模生產(chǎn)取勝,它所遵從的是絕對(duì)的單一化、標(biāo)準(zhǔn)化、格式化創(chuàng)造。這種創(chuàng)造,并不能形成邊際成本的遞減,甭別說(shuō)是趨于零,它需要的是逐漸遞增服務(wù),就像和滴滴打車對(duì)抗的線下出租車,隨著消費(fèi)者的增多,它能做的不是整合,而是新增出租車和司機(jī)進(jìn)行匹配,如果不加入互聯(lián)網(wǎng)行業(yè),他們將很難維持下去。


而比特經(jīng)濟(jì),則正好是多元化、個(gè)性化、小眾化、扁平化的。它所崇尚的就是一種主客一體、多元共生共存的理念、可以使使用者分享滿足感和快樂(lè)感。這樣的好處是在快速擴(kuò)大用戶群體區(qū)值的同時(shí)還能使邊際成本下降。



文章來(lái)源:站酷


本質(zhì)思考是產(chǎn)品創(chuàng)新的基礎(chǔ)

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

不知道從什么時(shí)候我開(kāi)始 對(duì)“創(chuàng)新”這個(gè)詞感到些許乏力和恐懼,開(kāi)始思考為什么有些人能看透問(wèn)題本質(zhì)?于是有了本文的探索和總結(jié)。

平時(shí)我們大部分時(shí)間都在做一些“應(yīng)激反應(yīng)”的事情,經(jīng)常處于“被安排”的情況下,大腦逐漸懶得去思考背后的東西,通常根據(jù)自己的主觀意愿做出一些反應(yīng)。慢慢依賴一些“道聽(tīng)途說(shuō)”而來(lái)的方法論來(lái)做一些事情,“套用”效果也不理想。

有一定履歷的產(chǎn)品經(jīng)理多數(shù)也會(huì)迷上“經(jīng)驗(yàn)論”。

  • 迷上自己過(guò)往的經(jīng)驗(yàn),“我以前做這活動(dòng)就是用這個(gè)策略的,效果很不錯(cuò)”。
  • 迷上他人的經(jīng)驗(yàn),“那天和老同學(xué)吃飯,他們這個(gè)裂變做得不錯(cuò),我們也搞一個(gè)”
  • 迷上競(jìng)爭(zhēng)對(duì)手的經(jīng)驗(yàn),“它們的狙擊槍也有這個(gè)功能,我們也加一個(gè)”。

種種行為都是沒(méi)有通過(guò)本質(zhì)思考的行為表現(xiàn),都是一些脈沖式的思考。別人做什么 ,我們也跟著去做,只能在這個(gè)行業(yè)里面產(chǎn)生細(xì)微的迭代,無(wú)法實(shí)現(xiàn)真正的創(chuàng)新。

關(guān)于創(chuàng)新,埃隆馬斯克引爆了一個(gè)概念,回歸到事物本質(zhì),看透問(wèn)題本源的思維叫“第一性原理”,它不是一個(gè)定律也不是真理,而是一種思維模式。

我先不解釋到底什么是第一性原理,因?yàn)楸緛?lái)就處于蒙圈的情況下再去看一些專業(yè)的解釋就會(huì)更加蒙圈。

下面分享一個(gè)故事,一起來(lái)了解一下本質(zhì)思考這種思考方式,拋開(kāi)哲學(xué)、生命、宇宙本質(zhì),圍繞“搶域名”這件事,主角蔡文勝是如何將域名搶注成功率從十萬(wàn)分之一變成50%以上?他到底是怎么做到及如何思考的。

背景:fm365.com注冊(cè)于1999年10月21日,因忘記續(xù)費(fèi),到2003年10月21日過(guò)期,當(dāng)時(shí)這個(gè)網(wǎng)站是聯(lián)想重金打造的門(mén)戶網(wǎng)站流量非常可觀,當(dāng)時(shí)可能有10萬(wàn)人要想搶注這個(gè)域名。

想搶注域名的人都知道域名釋放時(shí)間是在2003年10月21日,但很多人沒(méi)有做好基本的調(diào)研與了解,不同域名服務(wù)商釋放時(shí)間不一樣,有些是次日0點(diǎn),有些是30天,所以當(dāng)時(shí)大部分人都不知道這個(gè)具體域名掉落時(shí)間,實(shí)際上這個(gè)域名掉落時(shí)間是在70天之后。

那么知道了域名掉落的具體日期, 也不可能一整天都去注冊(cè)搶注, 還需要知道具體時(shí)間才能搶注成功,而事實(shí)上當(dāng)時(shí)這個(gè)域名在美國(guó)一個(gè)域名商手上,所以掉落時(shí)間是在美國(guó)的中午12點(diǎn),對(duì)應(yīng)中國(guó)是凌晨3點(diǎn),在那個(gè)時(shí)間點(diǎn)域名才完全掉落。

那么問(wèn)題來(lái)了,知道了最后具體掉落日期和時(shí)間,怎樣才能脫穎而出,成為那個(gè)唯一一個(gè)能把域名搶到的人?

蔡文勝做了以下4件事:

第一件,首先注冊(cè)域名上所有信息、 名字、郵箱等字段事先填好 ,這個(gè)過(guò)程大概需要5秒鐘, 然后直接按f5就可以了,只要1秒不到,就能提交注冊(cè)信息。

第二件,蔡文勝當(dāng)時(shí)查了一下這個(gè)網(wǎng)絡(luò)請(qǐng)求到底是怎么走的,發(fā)現(xiàn)這個(gè)請(qǐng)求是先從廈門(mén)連到上海,上海連到美國(guó),請(qǐng)求的路徑非常長(zhǎng),當(dāng)時(shí)在2003年網(wǎng)速還是非常的慢,所以蔡文勝索性租了一臺(tái)上海的服務(wù)器,直接從上海連到美國(guó),這樣至少在中國(guó)理論上是最快的。

第三件,節(jié)省注冊(cè)資料字節(jié)長(zhǎng)度,把88888@qq.com改成 1@1.com,因?yàn)檫@信息回頭也可以修改,壓縮后比完整的信息要少幾百個(gè)字節(jié),這樣加快提交速度,又提高成功率。

第四件,當(dāng)時(shí)據(jù)說(shuō)搶注這個(gè)域名的人有10萬(wàn)人,蔡文勝預(yù)估有大概前面3件事能淘汰掉90%的人,還和剩余10%的人進(jìn)行競(jìng)爭(zhēng),所以還是不能保證能夠注冊(cè)并搶注成功。最后蔡文勝搞了一個(gè)自動(dòng)點(diǎn)擊腳本,每秒提交1000次。最終蔡文勝?gòu)?0萬(wàn)人里面脫穎而出,成為唯一一個(gè)搶到域名的人。

回歸到搶域名這件事的本質(zhì)上,把域名開(kāi)放時(shí)間設(shè)為T(mén)0,提交信息到域名服務(wù)器的時(shí)間設(shè)為T(mén)1,使T1-T0的時(shí)間最短就能搶注成功。

看完上面的故事,回歸產(chǎn)品人如何訓(xùn)練/培養(yǎng)自己的本質(zhì)思維。

01 擺脫原有思維慣性

每個(gè)人都有一定思維慣性,看到事物會(huì)下意識(shí)的做出一些反應(yīng)。

在《思考,快與慢》書(shū)中的知識(shí)叫“快系統(tǒng)”,人會(huì)本能直覺(jué)迅速做出一些判斷和反應(yīng),這套系統(tǒng)好處是大腦反應(yīng)非???,功耗低還”省電“。

所以我們一旦意識(shí)到自己在用過(guò)往或他人、競(jìng)爭(zhēng)對(duì)手等經(jīng)驗(yàn)時(shí)先打住,不是說(shuō)不能用,而先思考這些“經(jīng)驗(yàn)”對(duì)現(xiàn)在是否真正能用上。

每個(gè)人都有自己對(duì)主觀意識(shí),特別是產(chǎn)品經(jīng)理這個(gè)崗位主觀意識(shí)真的太強(qiáng)了。在數(shù)據(jù)報(bào)表或調(diào)研結(jié)果上看到一批數(shù)據(jù)會(huì)帶上自己的主觀想法來(lái)解釋這一批數(shù)據(jù)原因。

擺脫原有的思維慣性應(yīng)該啟動(dòng)大腦的“慢系統(tǒng)”,慢系統(tǒng)需要調(diào)動(dòng)我們的邏輯思維等能力,一旦啟動(dòng)邏輯思維能力周期很長(zhǎng),啟動(dòng)很慢很費(fèi)力,所以我們?nèi)粘D敲炊嗍虑樘幚淼臅r(shí)候,沒(méi)有什么時(shí)間去切換慢系統(tǒng),所以會(huì)造成前面所說(shuō)的應(yīng)激反應(yīng)。

當(dāng)然我們也非常難做到每次都使用“慢系統(tǒng)”來(lái)解決問(wèn)題,大腦處理不過(guò)來(lái),頭發(fā)也堅(jiān)持不住,但我們可以鍛煉出好的思維方式,讓自己思考時(shí)不輕易的跑到原有的思維慣性去。

02 成為“問(wèn)題少年”

蔡文勝在搶注FM365這事上就是不斷追問(wèn)自己,“我還能不能更快一點(diǎn)?”、“我怎樣才能比別人更快搶到!”、“如何將請(qǐng)求路徑變短?”、“怎樣才能提升請(qǐng)求速度?” 從解決問(wèn)題的路徑上,根據(jù)目標(biāo)一層一層的不斷的對(duì)自己發(fā)問(wèn),最終這些問(wèn)題都會(huì)迎刃而解。

有問(wèn)題請(qǐng)教別人也是突破思維慣性的好方法,拋開(kāi)對(duì)錯(cuò),觀點(diǎn)過(guò)濾,交流時(shí)可以認(rèn)真聽(tīng)但不要照著做,和老板給你提需求是一個(gè)道理。問(wèn)題方和解決方看到的視角都是不一樣的,利于思維開(kāi)闊。

03 在實(shí)踐中獲得反饋

“實(shí)踐”指的洞察已發(fā)生的事物做出自我思考的問(wèn)題和想法、比如在“產(chǎn)品分析”環(huán)節(jié)重點(diǎn)研究下對(duì)方可能接下來(lái)會(huì)做些什么事,預(yù)估做了會(huì)產(chǎn)生哪些結(jié)果?當(dāng)前的業(yè)務(wù)形態(tài)為什么會(huì)這樣設(shè)計(jì)?

總之產(chǎn)品方法論有時(shí)候并沒(méi)有那么重要,最重要的不是學(xué)習(xí)別人的方法論,而是通過(guò)自己的本質(zhì)思考,不斷總結(jié)出自己的方法論,有意識(shí)的去訓(xùn)練自己的思維習(xí)慣,養(yǎng)成思維模型,這對(duì)產(chǎn)品經(jīng)理才是重要的事情。

文章來(lái)源:人人都是產(chǎn)品經(jīng)理

復(fù)雜問(wèn)題該用理性決策還是感性決策?

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

一、明知識(shí)、默知識(shí)與暗知識(shí)的四象限圖

AI被熱捧那么久,王維嘉博士的《暗知識(shí)》是第一本把它講明白的中文科普書(shū)。

這本書(shū)第一個(gè)知識(shí)框架,就是下面這張4象限圖:

思考方式的革命(一)復(fù)雜問(wèn)題該用理性決策還是感性決策?

(該圖來(lái)自:王維嘉的《暗知識(shí)》)

該圖將知識(shí)按“是否可表達(dá)”、“是否可感受”的兩個(gè)維度分為四類:

  • 可表達(dá)的“明知識(shí)”(包括可感受的牛頓定律和不可感受的量子力學(xué))
  • 不可表達(dá)但能感受到的“默知識(shí)”
  • 而“暗知識(shí)”則是:不可表達(dá)、又沒(méi)法感受到。

具體來(lái)說(shuō),暗知識(shí)是機(jī)器發(fā)現(xiàn)的,人類無(wú)法感受也無(wú)法表達(dá)的知識(shí)。

就像圍棋,人類2000年來(lái)保留的棋譜大概有3000萬(wàn)個(gè)(8位數(shù)),但圍棋上棋子的擺放方法的可能性有2的361次方個(gè)(108位數(shù)),中間何止相差萬(wàn)億倍。人類對(duì)圍棋的認(rèn)知,就是基于3000萬(wàn)這個(gè)8位數(shù)范圍的認(rèn)知。與機(jī)器相比,相差10的100次方。這部分機(jī)器能掌握而人不能的,就是暗知識(shí)。

這是本書(shū)讓人驚嘆的第一個(gè)點(diǎn),通過(guò)設(shè)立一個(gè)新的二維坐標(biāo)模型,就能夠找到人類以往概念上的盲區(qū)!其次,王博士選的詞匯也是超一流的,“暗”和“默”兩個(gè)字都很有神采。

雖然是“科普書(shū)”,但書(shū)里還是不得不講到人類的“神經(jīng)網(wǎng)絡(luò)”、計(jì)算機(jī)的“機(jī)器學(xué)習(xí)”、“卷積”等復(fù)雜概念。

我用自己的語(yǔ)言,以“識(shí)別一只貓”為例,為大家簡(jiǎn)單講述一下AI吧:

(1)識(shí)別貓與計(jì)算“1+2=?”不同,前者是“默知識(shí)”—— 無(wú)法用準(zhǔn)確的語(yǔ)言描述出來(lái)。在計(jì)算機(jī)歷史上,通過(guò)“尖尖的耳朵”、“長(zhǎng)尾巴”、“圓眼睛”等信息來(lái)識(shí)別貓的程序都失敗了。

(2)我們閉上眼睛想想,如何把一只貓與一只豹子的照片區(qū)別開(kāi),需要補(bǔ)充很多語(yǔ)言描述。把一只貓與一只狗區(qū)別開(kāi),又需要補(bǔ)充一些描述,其實(shí)人是不能把“識(shí)別一只貓”這件事情用語(yǔ)言明確說(shuō)清楚的 —— 既然人說(shuō)不清,傳統(tǒng)計(jì)算機(jī)程序就做不到。但人,哪怕是三歲的孩子都能區(qū)別貓和狗,背后是什么原理呢?

(3)后來(lái)科學(xué)家通過(guò)研究人類大腦的神經(jīng)網(wǎng)絡(luò),發(fā)現(xiàn)大腦是通過(guò)分層判斷,最終在神經(jīng)元中留下“歷史痕跡”的邏輯鏈條的。這是很有趣的生物學(xué)現(xiàn)象,一個(gè)神經(jīng)元受到的刺激(生物電擊)越多,得到的營(yíng)養(yǎng)就越多、就會(huì)成長(zhǎng)得越強(qiáng)大。而每次判斷在每層神經(jīng)元中留下的痕跡,就會(huì)強(qiáng)化今后整個(gè)人腦神經(jīng)網(wǎng)絡(luò)的判斷能力。

(4)計(jì)算機(jī)科學(xué)家根據(jù)對(duì)人類大腦神經(jīng)網(wǎng)絡(luò)的認(rèn)識(shí),開(kāi)發(fā)了計(jì)算機(jī)“神經(jīng)網(wǎng)絡(luò)”。這個(gè)網(wǎng)絡(luò)不但可以識(shí)別“貓”,而且識(shí)別貓的過(guò)程也同樣無(wú)法輸出成為人能認(rèn)識(shí)的“文字描述”。

(5)這些識(shí)別算法就沉淀在“神經(jīng)網(wǎng)絡(luò)”中(表現(xiàn)為數(shù)據(jù)及數(shù)據(jù)關(guān)系),無(wú)法被人類直接掌握,人只能通過(guò)安裝了神經(jīng)網(wǎng)絡(luò)的計(jì)算機(jī)獲得這個(gè)能力。

(6)不知大家注意到?jīng)]有,為了讓計(jì)算機(jī)解決這個(gè)“默知識(shí)”的問(wèn)題,我們最終是用了“暗知識(shí)”來(lái)解決。

(7)這類“暗知識(shí)”,能夠在計(jì)算機(jī)之間快速?gòu)?fù)制,但無(wú)法在人和人之間復(fù)制,人和人之間能傳遞的只能是控制AI計(jì)算機(jī)的方法。

暗知識(shí)大體說(shuō)完,我再回到與我們的思考方式相關(guān)度更高的“默知識(shí)”。

二、《思考,快與慢》的“系統(tǒng)1”

《思考,快與慢》這本書(shū)大約是我2013年讀到的,我認(rèn)為這是那一年我讀到最好的書(shū)。好就好在研究老對(duì)象(人類行為與注意力)的過(guò)程中,用了新思考框架,并建立了有說(shuō)服力的體系。

幾年來(lái),這本書(shū)被我放在電腦顯示器下面,意喻為“抬高了我的視野”。當(dāng)然,最初是為抬高了顯示器,起到保護(hù)頸椎的作用。

思考方式的革命(一)復(fù)雜問(wèn)題該用理性決策還是感性決策?

書(shū)里是這樣定義人的兩種思維模式的:

  • 系統(tǒng)1 —— 其運(yùn)行是無(wú)意識(shí)且快速的,不怎么費(fèi)腦力,沒(méi)有感覺(jué),完全處于自主控制的狀態(tài)。例如會(huì)騎自行車的人,他在騎車時(shí)是不需要主動(dòng)意識(shí)指揮手如何轉(zhuǎn)動(dòng)車把的,系統(tǒng)1會(huì)接管這些動(dòng)作。
  • 系統(tǒng)2 —— 將注意力轉(zhuǎn)移到需要費(fèi)腦力的大腦活動(dòng)上來(lái)。例如:大家可以回憶一下自己第一次騎自行車的場(chǎng)景,當(dāng)時(shí)是需要非常專注地控制雙手和雙腳的,所以往往手忙腳亂。我記得我如果稍不能控制,雙手是會(huì)放掉車把,抱住旁邊的足球門(mén)柱的不知各位剛學(xué)自行車時(shí),是否也是如此?

當(dāng)系統(tǒng)2學(xué)習(xí)掌握了重復(fù)使用的套路后,大腦會(huì)將重復(fù)工作轉(zhuǎn)給系統(tǒng)1。

我高中時(shí),經(jīng)常因?yàn)楹?jiǎn)單的數(shù)學(xué)加減乘除四則混合運(yùn)算錯(cuò)誤,導(dǎo)致考試得不到高分。我訓(xùn)練自己做了大量專項(xiàng)練習(xí),后來(lái)不僅計(jì)算過(guò)程不出錯(cuò),而且感覺(jué)當(dāng)時(shí)是把簡(jiǎn)單的四則運(yùn)算從“系統(tǒng)2”挪到“系統(tǒng)1”了。考試時(shí),手上做著乘法豎式,腦子里考慮是否有更好的解題思路。

從另一個(gè)角度看,大腦的重復(fù)套路工作從“系統(tǒng)2”轉(zhuǎn)給“系統(tǒng)1”,還有一個(gè)更大的好處 —— 降低能力消耗。

系統(tǒng)1反應(yīng)很快,對(duì)能量的消耗遠(yuǎn)低于系統(tǒng)2。我查了《人類簡(jiǎn)史》、《文明是副產(chǎn)品》等書(shū)籍,看到這樣的資料:晚期智人的大腦占體重的1/20,但耗能、耗氧量卻達(dá)到全身的1/5。在工業(yè)革命前的5萬(wàn)年里,智人供養(yǎng)這樣一個(gè)大腦是極其不容易的,所以我推斷:

  • 第一,大腦不會(huì)有大比例未開(kāi)發(fā)區(qū)域,因?yàn)樵蹅兊拇竽X結(jié)構(gòu)在5萬(wàn)年前成熟時(shí)(今天人的腦容量與5萬(wàn)年前差別不大),人體根本沒(méi)有多余的營(yíng)養(yǎng)可以供它浪費(fèi)。
  • 第二,從機(jī)制上,大腦會(huì)盡量把一些套路工作從系統(tǒng)2轉(zhuǎn)給系統(tǒng)1,以期降低腦力消耗。

系統(tǒng)1畢竟簡(jiǎn)化了判斷過(guò)程,是否會(huì)造成很多誤判呢?我相信是的,但因?yàn)槟芰康南拗?,人類?dāng)時(shí)應(yīng)該是找到了中間最優(yōu)解。

我認(rèn)為:《思考,快與慢》的“系統(tǒng)1”,學(xué)習(xí)的其實(shí)就是前一節(jié)說(shuō)的“默知識(shí)”。

還是以騎自行車為例,咱們可以教新手一些保持自行車平衡的要領(lǐng),但一個(gè)新手學(xué)會(huì)騎車的過(guò)程,是實(shí)踐重于理論的。最后形成的知識(shí),就是無(wú)法說(shuō)清的“默知識(shí)”,這個(gè)默知識(shí)保存在我們每個(gè)人的“系統(tǒng)1”當(dāng)中。

當(dāng)然,系統(tǒng)1與系統(tǒng)2的關(guān)系還有很多層次,并對(duì)人類社會(huì)產(chǎn)生了深遠(yuǎn)影響。

例如:遇到緊急情況時(shí)(“快撞到行人了”),系統(tǒng)2會(huì)從系統(tǒng)1接管人體控制權(quán),多費(fèi)一點(diǎn)腦力控制好自行車的方向,避免造成交通事故。

畢竟我的讀者都是toB企業(yè)同事,我還是講一個(gè)書(shū)中與咱們業(yè)務(wù)有關(guān)的故事。作者丹尼爾·卡尼曼是諾貝爾經(jīng)濟(jì)學(xué)獎(jiǎng)獲得者,21歲時(shí)(1955年)曾經(jīng)在以色列軍隊(duì)里負(fù)責(zé)設(shè)計(jì)士兵面試流程。這之前,面試官完全根據(jù)感覺(jué)打分,結(jié)果篩選出來(lái)的新兵合格率很低??崧隽艘惶自O(shè)計(jì),聽(tīng)起來(lái)和我在《SaaS創(chuàng)業(yè)路線圖(六):如何擴(kuò)張團(tuán)隊(duì)?》中的做法類似,就是要求面試官嚴(yán)格按框架打分。

思考方式的革命(一)復(fù)雜問(wèn)題該用理性決策還是感性決策?

思考方式的革命(一)復(fù)雜問(wèn)題該用理性決策還是感性決策?

(上圖為我系列文章(六)中提供的打分表)

卡尼曼不是他的面試官們的上級(jí),面試官們不喜歡做“打分機(jī)器人”??崧淖尣绞牵饷嬖嚬俑鶕?jù)標(biāo)準(zhǔn)格式打分后,最后“閉上眼睛給士兵打個(gè)總分”。

最后的結(jié)果是,新的測(cè)評(píng)方法大幅提高了有效率。45年后卡尼曼回到該部隊(duì),發(fā)現(xiàn)他的面試方法還在延用。

而我的面試表最后也有這樣一行:“自己是否愿意帶領(lǐng)此人去完成一個(gè)困難的任務(wù)?”其實(shí)這是一個(gè)非常感性的問(wèn)題,與表格其它部分(記錄工作年限、記錄回答情況等)非常不同。

我觀察,這就是在很多領(lǐng)域中,決策復(fù)雜問(wèn)題的一個(gè)優(yōu)選方法:

  1. 把抽象問(wèn)題具象化:先用理性框架(“明知識(shí)”)、從多個(gè)角度用數(shù)字化的方法分項(xiàng)打分;
  2. 再把具象問(wèn)題抽象化:從內(nèi)心出發(fā),我是否要用這個(gè)人?(使用了“默知識(shí)”:更感性,但往往更準(zhǔn)確)

這個(gè)過(guò)程的好處是:

  1. 過(guò)程可操作性好,讓決策者全面思考,不會(huì)漏項(xiàng);
  2. 利用決策者的抽象判斷能力(“默知識(shí)”),更高緯度地做出判斷,不會(huì)因?yàn)榇蚍直淼脑O(shè)計(jì)缺陷造成決策錯(cuò)誤。

我們企業(yè)決策中,如果死板地使用調(diào)查前設(shè)計(jì)的“打分表”,往往會(huì)錯(cuò)過(guò)發(fā)展機(jī)會(huì)。因?yàn)榄h(huán)境在劇烈變化,調(diào)查前很難做出完美的打分表。而“默知識(shí)”會(huì)讓我們熟悉業(yè)務(wù)的決策者更準(zhǔn)確地做出判斷。

三、內(nèi)隱學(xué)習(xí)和外顯學(xué)習(xí)

上面說(shuō)了很多“默知識(shí)”的例子,具體怎么學(xué)習(xí)和使用“默知識(shí)”呢?最近“得到APP”的精英日課正好也推出了一篇文章“內(nèi)隱學(xué)習(xí)和外顯學(xué)習(xí)”。

簡(jiǎn)而言之,外顯學(xué)習(xí)就是學(xué)習(xí)“明知識(shí)”的過(guò)程,掌握歷史知識(shí)、化學(xué)公式……

內(nèi)隱學(xué)習(xí),則是學(xué)習(xí)“默知識(shí)”的過(guò)程,學(xué)到的是個(gè)“感”。例如:英語(yǔ)的語(yǔ)感。

1993年高考時(shí),記得我的英語(yǔ)成績(jī)大約是140分(滿分150)。因?yàn)椴豢伎谡Z(yǔ),這全都是英語(yǔ)語(yǔ)法和單詞,大多是“明知識(shí)”。

但我工作后能在外企說(shuō)流利的英文,全有賴于大學(xué)時(shí)在華中理工(現(xiàn)在的華中科技大學(xué))有一個(gè)教“外貿(mào)英語(yǔ)”的廖老師。他逼著我們每人整篇整篇地背誦外貿(mào)英語(yǔ),上課經(jīng)?,F(xiàn)場(chǎng)考對(duì)話,當(dāng)時(shí)那個(gè)厭惡哪……沒(méi)想到堅(jiān)持了一個(gè)學(xué)期,死記硬背了幾百句常用對(duì)話后,英語(yǔ)“語(yǔ)感”就形成了。大腦中可以用英文思考問(wèn)題,我是一生受用。

“精英日課”引用的一個(gè)調(diào)查研究還有個(gè)有趣的結(jié)論:外顯學(xué)習(xí)明知識(shí),注意力越集中越好;但集中注意力反而會(huì)妨礙內(nèi)隱學(xué)習(xí)。

為什么?因?yàn)椤澳R(shí)”是沒(méi)有明確規(guī)則的,越努力找規(guī)律越學(xué)不會(huì),不如放松一些,讓頭腦直接沉浸在直觀信息中,這樣更容易領(lǐng)悟那個(gè)“感”。

在企業(yè)經(jīng)營(yíng)中,我們經(jīng)常需要新的創(chuàng)意:如何設(shè)計(jì)一個(gè)擺脫俗套的新激勵(lì)方式?如何做營(yíng)銷上的創(chuàng)新?如何設(shè)計(jì)一個(gè)全新的內(nèi)容?這時(shí)候,讓注意力分散些,看看不相關(guān)的書(shū)籍、討論一些別的話題,可能靈感會(huì)來(lái)的更快。

就像我寫(xiě)這篇文章,目的與路線圖系列是一樣的,還是想幫助大家提升經(jīng)營(yíng)管理能力。但如果不引入更多關(guān)于思考方式、關(guān)于人類發(fā)展史的文章,就會(huì)跳不出日常操作的層面,不能給大家?guī)?lái)新的空氣。

四、小結(jié)

這篇文字是“思考方式革命”的第一篇。我講的不是明知識(shí)、也不是默知識(shí),我講的是一些新的思考方法

(1)如何通過(guò)增添新的維度,讓你對(duì)研究對(duì)象(無(wú)論是客戶群、團(tuán)隊(duì)或產(chǎn)品服務(wù))增加新的評(píng)估方式?操作工具就是最前面的四象限圖。

(2)設(shè)計(jì)新體系時(shí),用詞要精準(zhǔn)。王維嘉博士用一個(gè)“暗”字,一個(gè)“默”字,把體系講的很清楚?!懊徽圆豁槨保@是我經(jīng)常說(shuō)的道理。一個(gè)事兒的“名字”選錯(cuò)了,要費(fèi)很多口舌解釋,到頭來(lái)沒(méi)聽(tīng)到解釋的人看了還是會(huì)誤解。

(3)計(jì)算機(jī)AI算法是基于人類的“神經(jīng)網(wǎng)絡(luò)”模型的。企業(yè)管理中,一個(gè)體系的設(shè)計(jì)、一個(gè)測(cè)算模型的建立,都要基于“自然”的業(yè)務(wù)規(guī)則,基于人性的需求進(jìn)行考量。我不是講抽象的“道”,我說(shuō)的是可以操作的規(guī)則。

(4)例如:人的大腦將重復(fù)套路工作交給系統(tǒng)1,就是符合降低消耗的規(guī)則的。而“能量的限制”就是工業(yè)革命前的20萬(wàn)年里控制人類發(fā)展的主要因素。

(5)我們做企業(yè),也是同樣有很多限制,財(cái)務(wù)上有利潤(rùn)要求、有任何時(shí)點(diǎn)現(xiàn)金流不得低于安全線的要求。這屬于“明知識(shí)”。

(6)在不能用“明知識(shí)”直接通過(guò)計(jì)算做出決策的復(fù)雜情況下,基于“感覺(jué)”的判斷實(shí)際上更準(zhǔn)確。所以專業(yè)知識(shí)重要,但業(yè)務(wù)背景更重要。

(7)但如果只靠“感覺(jué)”決策,也很危險(xiǎn)。文中舉了一個(gè)新兵打分的例子。最佳方法是:讓決策者先結(jié)構(gòu)化地全面多維度打分,然后再“感性”地做出最終判斷。

(8)注意力分散些,有利于創(chuàng)新。所以需要新點(diǎn)子時(shí),要給團(tuán)隊(duì)成員新環(huán)境、新場(chǎng)景和一些新時(shí)間。

(9)默知識(shí)這么重要,如何得到?要反復(fù)練習(xí),不專注(忘掉規(guī)則)地學(xué)習(xí)。

品牌年輕化=品牌年輕人化?

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

當(dāng)下消費(fèi)市場(chǎng),年輕人是絕對(duì)的主力人群。對(duì)于品牌來(lái)講,抓住年輕人就是抓住了市場(chǎng),于是品牌們紛紛開(kāi)始“年輕化”。但是在這條路上,一不小心,可能就會(huì)陷入“坑”中。本文筆者對(duì)品牌年輕化進(jìn)行分析解讀,總結(jié)了自己的看法,供大家學(xué)習(xí)參考。

互聯(lián)網(wǎng)打破了渠道與媒介的壁壘,加速了整個(gè)社會(huì)消費(fèi)觀念、品味、需求的變遷。無(wú)論是消費(fèi)觀念還是購(gòu)買(mǎi)能力,顯然當(dāng)下的年輕人是絕對(duì)的主力人群。

對(duì)于品牌而言,就好像牧羊一般,草在哪兒,羊群就在哪兒,不追草的羊不是已經(jīng)餓死,就是在餓死的路上。

于是品牌年輕化好似成為了一切品牌問(wèn)題的解藥,不幸的是,這些品牌在年輕化的道路,都走到了相似的逼仄中,年輕化僅僅達(dá)到了“形”的貼近,卻夭折在了“神”的部分。

那品牌年輕化到底該如何做呢?

木蘭姐認(rèn)為,在回答這個(gè)問(wèn)題之前,我們需要先弄清楚一點(diǎn):

品牌年輕化≠品牌年輕人化

與人一樣,品牌也有自己的生命周期,會(huì)經(jīng)歷誕生-成長(zhǎng)-成熟-老化的過(guò)程。但與人不同的是,品牌生命周期并不單純以年齡來(lái)劃分,而是與市場(chǎng)環(huán)境、經(jīng)濟(jì)環(huán)境、消費(fèi)者行為綁定在一起。

但很多品牌往往容易陷進(jìn)一個(gè)誤區(qū):認(rèn)為品牌年輕化就是年輕人化,于是先給年輕人貼幾個(gè)標(biāo)簽,然后再把這些標(biāo)簽貼在自己身上,試圖收獲年輕人的認(rèn)同,混進(jìn)他們的圈子,用看似時(shí)尚、熱門(mén)、流行的元素將自己打扮成“年輕人”,但往往最后結(jié)果卻是不被年輕人買(mǎi)單的無(wú)效溝通。

舉個(gè)例子:

KFC前段時(shí)間的形象風(fēng)波就是大型的翻車現(xiàn)場(chǎng),讓消費(fèi)者者覺(jué)得品牌對(duì)“年輕”有誤解。

KFC為了更貼合年輕消費(fèi)者對(duì)顏值的要求,完全翻轉(zhuǎn)了大家對(duì)爺爺慈祥微胖的印象,以更時(shí)尚的高顏值形象走入消費(fèi)者眼簾。

但這個(gè)形象橫空出現(xiàn),只給消費(fèi)者帶來(lái)了短暫的視覺(jué)沖擊,并沒(méi)有讓其產(chǎn)生情感上的認(rèn)同,甚至是嚇到了部分消費(fèi)者,很多人直呼不買(mǎi)賬。

△圖片截取自網(wǎng)絡(luò)

所幸這只是KFC品牌年輕化的一次嘗試,并沒(méi)有真正投入市場(chǎng),也沒(méi)有給品牌帶來(lái)太多的影響。

從KFC的案例中我們可以得到什么樣的警醒呢:或許品牌用表面的裝嫩的方式能夠獲得一時(shí)關(guān)注,但混入年輕人的圈子,走進(jìn)他們的內(nèi)心卻有些難度。

就像1000個(gè)讀者就有1000個(gè)哈姆雷特一樣,1000個(gè)消費(fèi)者可能會(huì)有1000種需求或喜好,品牌無(wú)法對(duì)這個(gè)群體“一刀切”,也沒(méi)有一個(gè)品牌能做到被所有年輕人追捧。

要知道,這一代年輕人并不是很多品牌自以為所謂的 “狂拽炸酷吊炸天”這么簡(jiǎn)單,品牌需要做的是真正洞察年輕人的生活態(tài)度,先在價(jià)值觀上找到和年輕人真正的契合點(diǎn),強(qiáng)調(diào) “我”,而不是追隨 “他”。

那正解如何呢?

一、為品牌灌注新鮮活力

就像物理學(xué)中的杠桿支點(diǎn)一樣,支點(diǎn)找得準(zhǔn)不準(zhǔn),直接影響其他要素的確定。對(duì)企業(yè)而言,突破品牌桎梏,精準(zhǔn)地找到品牌年輕化的支點(diǎn),才是贏得消費(fèi)群體的王道。

而這個(gè)“品牌年輕化”的支點(diǎn),木蘭姐認(rèn)為應(yīng)該是為品牌灌注新鮮活力,延長(zhǎng)或恢復(fù)品牌的“青春期”,讓品牌可以一直活躍在時(shí)代主力消費(fèi)人群的面前,不至于被消費(fèi)者和市場(chǎng)遺忘。

無(wú)疑,旺旺是其中的佼佼者者。

旺旺在年輕化的道路上摸索出了一條康莊大道,除了主打情懷回憶殺,還不斷嘗試將品牌時(shí)尚化,以此來(lái)滿足年輕人的潮流需求,比如六一攜手奈雪的茶推出寶藏奶茶;與自然堂聯(lián)合,打造自然堂x旺旺定制款氣墊BB霜組合裝,以及聯(lián)名款服裝等,一系列令人意外又驚喜的跨界合作,無(wú)疑賺足了眼球。

這一波國(guó)民經(jīng)典IP與原創(chuàng)潮牌的跨界合作,不僅意味著旺旺已經(jīng)洞察到現(xiàn)如今年輕一代的喜好,更代表了旺旺作為一個(gè)國(guó)民老品牌,有著高度的包容性,在打破以往成就、固化的品牌形象后,以有活力、年輕化、時(shí)尚潮流的品牌范兒,不斷刷新品牌的高曝光度,以及年輕人對(duì)品牌的認(rèn)可度。

可以說(shuō),旺旺在嘗試年輕化營(yíng)銷的同時(shí),也能看到其要做年輕化內(nèi)容、年輕化產(chǎn)品、年輕化品牌的決心。

還有我們的國(guó)民老品牌百雀羚,不管是提到廣告,還是產(chǎn)品,百雀羚都是美妝界永遠(yuǎn)繞不開(kāi)的話題,而百雀羚能在消費(fèi)者心中留下如此重要的認(rèn)知,都離不開(kāi)其一直以來(lái)的努力和創(chuàng)新。

從三生花系列到現(xiàn)如今的故宮美什件,從《一九三一》到今天的《見(jiàn)微知著》、《多了一點(diǎn)》,通過(guò)消費(fèi)者喜歡的方式,為品牌注入新鮮的血液,讓經(jīng)典老品牌顯得“年輕力”十足,成功激活了消費(fèi)群體,并在品牌年輕化的形象和銷售轉(zhuǎn)化量上都實(shí)現(xiàn)了質(zhì)的突破。

可見(jiàn),只有為品牌注入與時(shí)代相符的新內(nèi)涵,才能積極契合消費(fèi)族群的變遷,才是品牌永葆年輕的護(hù)城河。

二、傳遞年起人認(rèn)同的品牌價(jià)值觀

提到這一點(diǎn)之前,我們先來(lái)看一個(gè)2018年最佳汽車營(yíng)銷廣告案例,來(lái)自?shī)W迪。

在這支廣告里,奧迪沒(méi)有流于表面的年輕元素,而是全程展現(xiàn)了一位滑雪飛人,觀眾跟著他腳下的雙板劃過(guò)幾乎地球上所有的地貌:山地,森林,沙漠,草原,火山,長(zhǎng)城,海洋…

而整個(gè)片子中,奧迪車全程沒(méi)有入境,只在影片結(jié)尾,藍(lán)色海洋的背景里出現(xiàn)奧迪的廣告語(yǔ):“All Conditions Are Perfect Conditions.(所有場(chǎng)景,都是完美場(chǎng)景)”。

但就是這支充滿“挑戰(zhàn)、無(wú)畏、前進(jìn)等精神”的廣告大片最后贏得戛納社會(huì)化營(yíng)銷金獎(jiǎng),引起熱議,深受年輕觀眾的喜愛(ài)。

這說(shuō)明了什么?品牌年輕化,不應(yīng)拘泥于品牌面貌的年輕,更多的是品牌內(nèi)核的年輕。

再舉個(gè)極端的案例:

年過(guò)123歲的銳步(Reebok)簽下80歲“高齡青年”王順德為品牌代言人。這個(gè)加在一起超過(guò)200歲的“超高齡組合”,如果純粹按年紀(jì)來(lái)說(shuō),絕對(duì)稱不上“年輕”,而如果單從代言人王順德的外形上硬要找一點(diǎn)年輕元素的話,可能也就能是那一頭狂野白發(fā)中的“狂野”了。

為什么會(huì)選中王順德?銳步看中了王順德身上年輕的態(tài)度——堅(jiān)持、自信、突破極限,向消費(fèi)者傳遞出“任何年紀(jì),都可以活出自己的樣子,突破極限,打破年齡的疆界”的心態(tài)。

而這跟當(dāng)代年輕人釋放個(gè)性,崇尚平等,追求自由,積極進(jìn)取,享受生活,不喜歡權(quán)威,不喜歡說(shuō)教的價(jià)值觀是一致的,銳步升華了代言人背后的品牌精神。

所以木蘭姐認(rèn)為,如果你正在為品牌年輕化發(fā)愁,不妨從品牌的核心精神和態(tài)度入手,形成年輕的品牌價(jià)值觀,去發(fā)現(xiàn)目標(biāo)消費(fèi)群的價(jià)值需求,找到一個(gè)能在你們之間產(chǎn)生共鳴的態(tài)度,讓他們對(duì)品牌產(chǎn)生認(rèn)同。

三、幫用戶發(fā)聲彰顯自我

此外,90后及00后的自我意識(shí)是全面覺(jué)醒的,與以往的群體不同,他們天生具有強(qiáng)烈的表達(dá)欲及掌控欲,這也進(jìn)一步催化品牌要用“陪伴心態(tài)”去與年輕人相處,真正懂他們,幫他們發(fā)聲,彰顯自我……最終成為他們心里“陪在他們身邊的人”。

比如說(shuō)江小白的文案,其實(shí)不少是用戶自己寫(xiě)的文案,然后通過(guò)篩選量產(chǎn)出來(lái)。再比如有時(shí)間火爆的《我的說(shuō)明書(shū)》H5、DIY類H5,引發(fā)了同類H5作品的爆發(fā),背后都是用戶的自我價(jià)值表達(dá)。

還有今年五四青年節(jié)百度APP通過(guò)創(chuàng)意互動(dòng)手繪形式,站在年輕人的角度,說(shuō)出了他們的心聲,彰顯年輕人的才華和態(tài)度,也是狠狠地刷了一波存在感。

我們從不拒絕新事物

青年人,就要站在時(shí)代與潮流的風(fēng)口浪尖

甭管哪年,在愛(ài)國(guó)這個(gè)原則性問(wèn)題上

我們的脾氣還是有點(diǎn)大

在國(guó)家最需要我們的時(shí)候

青年人逆風(fēng)而行,救民于水火之中

這就像安裝了八個(gè)情感按鍵,撬動(dòng)用戶心中的共鳴開(kāi)關(guān),最終完成內(nèi)容與用戶的深度溝通,讓用戶認(rèn)同品牌價(jià)值;更重要的是設(shè)計(jì)出文案,讓用戶表達(dá)自我,從而在用戶群中分享傳播品牌價(jià)值。

由此可見(jiàn),年輕化不是品牌的一廂情愿,而是品牌和消費(fèi)者的合謀:“看見(jiàn)世界,找到自己”。

結(jié)語(yǔ)

最后,木蘭姐想說(shuō),年輕化的“套路”不可能一成不變,無(wú)須刻意貼合年輕人時(shí)下的熱點(diǎn),抓住深的洞察獲得年輕人共鳴,才是品牌年輕化的最好方式。

文章來(lái)源:人人都是產(chǎn)品經(jīng)理

區(qū)分「取消」與「關(guān)閉」的設(shè)計(jì)差異

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

區(qū)分取消與關(guān)閉,可以很大程度上避免丟失用戶已操作的內(nèi)容。在關(guān)閉視圖之前保存用戶的更改,使用文本標(biāo)簽而不是「X」圖標(biāo),并在破壞性操作之前提供確認(rèn)對(duì)話框。

讓人迷惑的「X」圖標(biāo)

很久以前,「X」這個(gè)符號(hào)是用在地圖上,標(biāo)記「寶藏的藏身地」。但在今天的數(shù)字化界面中,「X」符號(hào)不再用來(lái)標(biāo)記位置,而是被用來(lái)取消進(jìn)程,或者關(guān)閉某個(gè)臨時(shí)頁(yè)面/彈框。但是如何確定「X」代表的是「取消」 還是「關(guān)閉」?有的時(shí)候可以確定,有時(shí)卻模糊不清難以界定。

其實(shí),主要的問(wèn)題在于「X」圖標(biāo)缺少了文本標(biāo)簽。當(dāng)同一個(gè)圖標(biāo)在不同的界面,卻代表不同的含義,該圖標(biāo)的可用性就會(huì)受到影響,因?yàn)橛脩襞袛嗖涣说降资鞘裁春x。

為什么要區(qū)分「取消」與「關(guān)閉」

當(dāng)用戶單擊/點(diǎn)擊「X」按鈕來(lái)關(guān)閉模態(tài)彈框或視圖時(shí),系統(tǒng)會(huì)完全取消該過(guò)程并清空之前所有操作,這讓人沮喪,甚至抓狂。因?yàn)橛脩敉ǔUJ(rèn)為「X」圖標(biāo)表示取消或者關(guān)閉,所以區(qū)分這兩種可能性對(duì)于交互的成功至關(guān)重要。

在某些情況下,區(qū)分取消 or 關(guān)閉并不重要。當(dāng)一個(gè)彈窗占據(jù)你的大部分屏幕時(shí),點(diǎn)擊「X」按鈕(盡可能快地),既可以關(guān)閉該模態(tài),也可以取消它可能觸發(fā)的任何進(jìn)程。

但是,如果頁(yè)面中包含正在運(yùn)行的計(jì)時(shí)器,正在播放的音頻,正在選擇多個(gè)選項(xiàng)標(biāo)簽,或其他類型未保存的內(nèi)容,那就很有必要說(shuō)明「X」圖標(biāo)所代表的意義。因?yàn)橛脩艨赡艽蛩阕層?jì)時(shí)器或音頻繼續(xù)運(yùn)行,或者希望立刻應(yīng)用這些選好的選項(xiàng)標(biāo)簽,或保存正在進(jìn)行的工作,同時(shí)希望關(guān)閉該視圖繼續(xù)其他操作。

例如:絲芙蘭在結(jié)賬過(guò)程中,使用模態(tài)窗口來(lái)展示用戶可以添加到購(gòu)物車的免費(fèi)商品。在以下示例中,單擊「 ADD(添加)」按鈕選擇商品后, 該按鈕直接被變成了「 Remove(移除)」,看起來(lái)似乎商品已經(jīng)被添加到購(gòu)物車中了。但是,實(shí)際上當(dāng)用戶單擊右上角的「X」圖標(biāo)后,該商品并不在購(gòu)物車中。他需要再重復(fù)這個(gè)步驟,最后點(diǎn)擊「Done(完成)」按鈕,商品才會(huì)被加入購(gòu)物車。

Sephora:?jiǎn)螕粲疑辖堑摹竂」會(huì)取消選擇這些試用商品整個(gè)過(guò)程。用戶必須先單擊「ADD」,再單擊「Done」才能將商品添加到購(gòu)物車。

如何避免丟失用戶正在操作的內(nèi)容

要避免丟失用戶正在操作的內(nèi)容,首先需要確定用戶的意圖,是取消還是關(guān)閉,并提供明確的選項(xiàng)。有以下幾種方法:

  • 主動(dòng)要求用戶確認(rèn)他們的意圖;
  • 使用明確的文本標(biāo)簽而不是模糊圖標(biāo);
  • 顯示兩個(gè)不同的按鈕:「X」圖標(biāo)表示關(guān)閉視圖(可以自動(dòng)保存頁(yè)面內(nèi)容/操作),而「取消」則代表放棄該過(guò)程。

1. 要求確認(rèn)

如果用戶在已經(jīng)執(zhí)行操作的模態(tài)彈框或頁(yè)面視圖中,點(diǎn)擊「X」圖標(biāo),app 則可以在關(guān)閉視圖之前,直接詢問(wèn)用戶是否應(yīng)用該操作,來(lái)確認(rèn)其意圖。此解決方案非常適合會(huì)破壞用戶工作的破壞性取消操作。例如,過(guò)濾器視圖可能會(huì)被意外關(guān)閉,并且關(guān)閉會(huì)導(dǎo)致用戶丟失其選定的選項(xiàng)。

這個(gè)問(wèn)題在移動(dòng)端界面上很常見(jiàn),因?yàn)檫^(guò)濾器視圖占用了很大的屏幕空間,這使用戶很難或不能判斷是否已經(jīng)應(yīng)用了那些選擇。為了防止這種潛在的錯(cuò)誤,在關(guān)閉過(guò)濾器視圖之前,跟用戶確認(rèn)是否要應(yīng)用這些選擇并關(guān)閉視圖,抑或是清除這些選擇。例如:下圖中,當(dāng)用戶選擇后,點(diǎn)擊「X」圖標(biāo)時(shí),Lowes 會(huì)出現(xiàn)如下確認(rèn)彈框。

左 :點(diǎn)擊「X」圖標(biāo)或返回箭頭,所有的選項(xiàng)都會(huì)被取消,并將用戶帶回上一個(gè)頁(yè)面。右:點(diǎn)擊「X」后,出現(xiàn)一個(gè)確認(rèn)對(duì)話框,確認(rèn)用戶是應(yīng)用還是取消篩選,然后再返回結(jié)果列表頁(yè)。

同樣,當(dāng)用戶關(guān)閉正在進(jìn)行的課程時(shí),語(yǔ)言學(xué)習(xí)應(yīng)用Duolingo 會(huì)顯示一個(gè)確認(rèn)對(duì)話框,課程進(jìn)行中不能中途離開(kāi),除非確認(rèn)「退出」。至少,該 APP 向用戶傳達(dá)了這一限制,同時(shí)他們也可以選擇「取消」來(lái)繼續(xù)課程。點(diǎn)擊「X」按鈕將結(jié)束當(dāng)前課程。為了防止出錯(cuò),結(jié)束前會(huì)出現(xiàn)一個(gè)確認(rèn)對(duì)話框。

缺點(diǎn):

  • 雖然確認(rèn)對(duì)話框在避免「X」圖標(biāo)有歧義方面很有效,但它卻添加了額外的步驟;
  • 用戶在按下「X」圖標(biāo)之前還是不知道它到底做了什么,代表什么意思,因此他們可能會(huì)對(duì)這個(gè)操作感到疑惑。

2. 使用文本標(biāo)簽

不要完全依賴對(duì)話框來(lái)讓用戶確認(rèn)模糊的「X」圖標(biāo),而是使用明確的文本標(biāo)簽。文本可以消除歧義,并清楚地傳達(dá)將發(fā)生的操作:取消與關(guān)閉。

Yelp 的篩選頁(yè)面在屏幕頂部提供了標(biāo)有「Cancel(取消)」和「Reset(重制)」的按鈕,在底部提供了一個(gè)大大的「Apply(應(yīng)用)」按鈕。類似地,Etsy 中的 Filters 視圖提供了「Clear(清除)」和「Done(完成)」兩個(gè)按鈕。

注意:Etsy 使用「Done」而不是「Apply」,因?yàn)檫^(guò)濾器一經(jīng)選擇就可以被應(yīng)用,而這里是關(guān)于開(kāi)關(guān)切換與否的建議。

(左)Yelp:Cancel、Reset 和 Apply 這三個(gè)文本標(biāo)簽既直接又清晰,這樣用戶就不太可能不小心關(guān)閉視圖而丟失他們過(guò)濾器中的選擇。(右)Etsy:Clear 為用戶取消提供了一種清晰的方式,而點(diǎn)擊 Done 則返回到「產(chǎn)品列表」頁(yè),其中的選擇已經(jīng)應(yīng)用。

3. 關(guān)閉并保存

如果必須使用「X」圖標(biāo)而不是文本標(biāo)簽(比如為了以節(jié)省空間,或者正在遵循團(tuán)隊(duì)的設(shè)計(jì)語(yǔ)言),請(qǐng)謹(jǐn)慎使用,并在用戶完成前保存操作/內(nèi)容。另外,可以提供一個(gè)單獨(dú)的「取消」按鈕,讓用戶在進(jìn)程之外有一個(gè)緊急出口,并消除「X」在兩種含義之間的歧義。

例如:Gmail 會(huì)自動(dòng)保存在非模態(tài)窗口中填寫(xiě)的郵件信息到草稿(Drafts)。這樣的好處是,用戶在需要折疊或關(guān)閉該窗口時(shí),仍然保存原來(lái)的內(nèi)容以便于下次繼續(xù)編輯。將鼠標(biāo)懸停在消息窗口右上角的「X」圖標(biāo)上時(shí),會(huì)顯示一段提示:Save & Close(保存到草稿并關(guān)閉)。此外,點(diǎn)擊窗口右下角的「垃圾桶」圖標(biāo)可以刪除該郵件,這個(gè)圖標(biāo)離頂部的「保存和關(guān)閉」選項(xiàng)很遠(yuǎn),可以防止用戶誤點(diǎn)。

Gmail:Hover 透露,「X」圖標(biāo)是用于關(guān)閉窗口而不是刪除草稿,它允許用戶保存并關(guān)閉消息窗口而不會(huì)丟失剛剛正在編輯的郵件。

對(duì)于長(zhǎng)進(jìn)程或傾向于在后臺(tái)運(yùn)行的進(jìn)程(如計(jì)時(shí)器),默認(rèn)自動(dòng)保存也是一種很好的解決方案。

例如,Glow Baby 中,后臺(tái)運(yùn)行喂食或睡眠計(jì)時(shí)器時(shí),用戶還可以瀏覽 APP 的其他區(qū)域。因?yàn)檫@些計(jì)時(shí)器一般會(huì)運(yùn)行很長(zhǎng)一段時(shí)間。此功能還能讓用戶在 APP 中做其他的任務(wù)操作,例如記錄之前換尿布的時(shí)間、瀏覽文章、逛論壇等。點(diǎn)擊計(jì)時(shí)器視圖中的「X」圖標(biāo)也只是關(guān)閉窗口并不會(huì)取消正在運(yùn)行的計(jì)時(shí)器。

Glow Baby:(左)點(diǎn)擊運(yùn)行計(jì)時(shí)器視圖中的「X」圖標(biāo),在不停止計(jì)時(shí)器的情況下取消視圖,從而允許用戶繼續(xù)使用 APP 記錄其他類型的事件、參與社區(qū)討論、閱讀文章等。(中)運(yùn)行計(jì)時(shí)器的狀態(tài)顯示在屏幕頂部的狀態(tài)欄中。(右)在計(jì)時(shí)器暫停時(shí)點(diǎn)擊「X」圖標(biāo),彈出「放棄」或「取消」按鈕以確認(rèn)用戶的真正意圖。

請(qǐng)注意:在關(guān)閉前保存中間工作或維護(hù)正在進(jìn)行的過(guò)程是主動(dòng)的,但有時(shí)可能會(huì)與用戶的意圖相反。如果用戶打算通過(guò)單擊「X」按鈕取消其選擇,那自動(dòng)應(yīng)用這些選擇可能會(huì)令人困惑和沮喪。

這就是為什么還必須有一個(gè)單獨(dú)的「取消」按鈕,給用戶一個(gè)出口,而不是強(qiáng)迫他們必須關(guān)閉時(shí)自動(dòng)保存。

結(jié)論

雖然「X」圖標(biāo)會(huì)造成模棱兩可,而且經(jīng)常導(dǎo)致可用性問(wèn)題,但它不太可能馬上從所有接口中消失。設(shè)計(jì)人員應(yīng)該注意「X」圖標(biāo)的多重含義,消除「關(guān)閉」和「取消」之間的歧義,并提供確認(rèn)對(duì)話框或自動(dòng)保存等保護(hù)性措施,避免丟失任何用戶正在操作的內(nèi)容。

若存在疑問(wèn),請(qǐng)記?。合缺4妫偻顺?。

小思考

為什么手機(jī)驗(yàn)證碼登錄微信/淘寶時(shí),驗(yàn)證碼輸入錯(cuò)誤,二者都是用的模態(tài)對(duì)話框提示用戶,而不是用 Toast 呢?

  • 微信和淘寶的用戶群體都很龐大,幾乎橫跨所有年齡層。Toast 出現(xiàn)又自動(dòng)消失的交互體驗(yàn),用戶會(huì)感到不可控,尤其是對(duì)大齡、老齡的用戶不夠友好。
  • 也有悖于 iOS 人機(jī)交互指南中提到的「用戶控制」這一原則,我想這也是 iOS 設(shè)計(jì)語(yǔ)言沒(méi)有 Toast 這種控件的原因之一吧。
  • 而模態(tài)對(duì)話框雖然干擾性較強(qiáng),但用戶可以隨時(shí)控制,在使用過(guò)程中是用戶掌握主導(dǎo)權(quán)。

補(bǔ)充:Toast 這一控件,原是 Android 系統(tǒng)的控件。但自 Android 5.0 推出原質(zhì)化設(shè)計(jì)后,Toast 就被弱化,而是將 Snackbar 作為官方推薦的控件。如今在 Material Design 中更是找不到 Toast 的蹤影。主要原因還是 Snackbar 在交互友好性方面比 Toast 要好,例如:支持手勢(shì)交互、支持與 CoordinatorLayout 聯(lián)動(dòng)等。

跨平臺(tái)設(shè)計(jì) :平臺(tái)選擇

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

在本篇開(kāi)始之前,我們稍作回顧。目前已經(jīng)完成的兩個(gè)系列包括:「iOS 13 設(shè)計(jì)新特性」,涉及深色模式、SF Symbols、卡片面板及情境菜單等話題,錯(cuò)過(guò)的朋友不妨回看,畢竟新系統(tǒng)將會(huì)在近兩日正式推送。在「基礎(chǔ)設(shè)計(jì)原理」當(dāng)中,演講人通過(guò)一場(chǎng)夏威夷之旅帶領(lǐng)我們了解了一系列重要的設(shè)計(jì)原理,包括一致性、可供性、心智模型、漸進(jìn)呈現(xiàn)等等,深入淺出,老少咸宜,強(qiáng)烈推薦。

△ Mike Stern 老師的「基礎(chǔ)設(shè)計(jì)原理」

而本期開(kāi)始的新話題則聚焦于如何面向 Apple 生態(tài)體系中的多種設(shè)備進(jìn)行設(shè)計(jì),包括如何選擇平臺(tái),如何針對(duì)不同的平臺(tái)權(quán)衡功能與外觀風(fēng)格,如何構(gòu)建生態(tài)體驗(yàn)等等;演講者是 Apple 的設(shè)計(jì)師 Cas Lemmens。

跨平臺(tái)設(shè)計(jì) – 平臺(tái)選擇

在 Apple,我們非常自豪于我們所創(chuàng)造的一系列設(shè)備平臺(tái)。在創(chuàng)造和升級(jí)這些平臺(tái)的過(guò)程中,我們都會(huì)以提升人們的日常生活品質(zhì)為目標(biāo),并力圖在人與設(shè)備之間構(gòu)建富有意義的關(guān)聯(lián)。這關(guān)聯(lián)未必僅存在于單一平臺(tái)當(dāng)中;你所使用的 Apple 設(shè)備越多,便越發(fā)能體會(huì)到整個(gè)生態(tài)帶來(lái)的依存關(guān)系。

你可能會(huì)戴著 Apple Watch 晨跑,可能會(huì)在 MacBook 或是 iMac 上完成一天的工作;下班后,你可能會(huì)借助 iPhone 的一系列功能來(lái)使用公共交通,或是在你的車?yán)锸褂?CarPlay;回到家,你可能會(huì)通過(guò) Apple TV 看劇或電影;睡前,你可能還會(huì)在 iPad 上讀書(shū)。

無(wú)論你正在使用何種設(shè)備,Apple 的平臺(tái)生態(tài)都可以識(shí)別你、理解你,并幫助到你。

面向這樣的生態(tài)體系進(jìn)行設(shè)計(jì),你必須對(duì)其中的每一個(gè)平臺(tái)都有著深刻的理解。對(duì)于 Apple 的設(shè)計(jì)師而言,這樣的挑戰(zhàn)已經(jīng)變得司空見(jiàn)慣。我們必須謹(jǐn)慎思考每一個(gè) app 可能適合的平臺(tái)類型,以及如何使其針對(duì)不同的平臺(tái)進(jìn)行相應(yīng)的調(diào)整。

Apple 開(kāi)發(fā)的 app 當(dāng)中,有些是面向全平臺(tái)的,例如「照片」或「音樂(lè)」。

而有些則僅存在于特定的平臺(tái)當(dāng)中,例如「?jìng)渫洝?、「郵件」等等。

有些服務(wù)可以在你擁有多種設(shè)備的情況下帶來(lái)最優(yōu)體驗(yàn),例如 ApplePay;另外一些則必須基于多臺(tái)設(shè)備同時(shí)運(yùn)行,例如 FaceTime。

今天,我要與各位分享的,便是 Apple 的設(shè)計(jì)師在進(jìn)行跨平臺(tái)設(shè)計(jì)時(shí)所采用的典型流程。希望這些經(jīng)驗(yàn)可以幫助各位更加且目標(biāo)明確地將你的產(chǎn)品和服務(wù)推向 Apple 生態(tài)圈當(dāng)中的更多平臺(tái)。

我們首先會(huì)從「平臺(tái)選擇」開(kāi)始,即了解每一個(gè)平臺(tái)的情境特質(zhì)與能力特征,并以此為基礎(chǔ)選擇最恰當(dāng)?shù)哪繕?biāo)平臺(tái)。

然后是「平臺(tái)適配」,即基于目標(biāo)平臺(tái)的設(shè)備特性,對(duì)我們希望實(shí)現(xiàn)的功能進(jìn)行權(quán)衡與管理。

接下來(lái)是「風(fēng)格協(xié)調(diào)」,即在品牌風(fēng)格與平臺(tái)規(guī)范之間尋求平衡,對(duì) app 的視覺(jué)外觀及操作體驗(yàn)進(jìn)行定義。

然后是「平臺(tái)連接」,即探索如何在不同的設(shè)備平臺(tái)之間實(shí)現(xiàn)功能的連續(xù)性,打造輕松、無(wú)縫的使用體驗(yàn)。

最后,我們還會(huì)嘗試「平臺(tái)擴(kuò)展」,即探索如何同時(shí)基于多平臺(tái)實(shí)現(xiàn)最優(yōu)的綜合生態(tài)體驗(yàn)。

以上便是跨平臺(tái)設(shè)計(jì)的主要流程。接下來(lái),我們將對(duì)這五個(gè)步驟逐一進(jìn)行了解。

平臺(tái)選擇

所謂「平臺(tái)選擇」,即回答「我要面向哪個(gè)平臺(tái)進(jìn)行設(shè)計(jì)」這個(gè)問(wèn)題。

或許你還沒(méi)有上線過(guò)任何 app,目前正在考慮以哪個(gè)平臺(tái)作為首發(fā);或許你已經(jīng)在一兩個(gè)平臺(tái)上發(fā)布過(guò) app,正在考慮接下來(lái)應(yīng)該進(jìn)行怎樣的擴(kuò)展。

在選擇平臺(tái)時(shí),有兩個(gè)最為關(guān)鍵的概念需要我們重點(diǎn)思考:

  • 情境:特定平臺(tái)最為適用的時(shí)間、地點(diǎn)及其他環(huán)境要素。
  • 能力:特定平臺(tái)最具差異性的功能特征。

對(duì)于「情境」的理解至關(guān)重要,因?yàn)楫?dāng)情境發(fā)生變化時(shí),人們通常會(huì)切換他們所使用的設(shè)備,以不同的方式完成不同的任務(wù)。

舉個(gè)例子。譬如你正在辦公室里工作,或是在學(xué)校上著課;這些都是高度聚焦和穩(wěn)定的情境。當(dāng)你離開(kāi)這些場(chǎng)所,乘上了公交車或地鐵,你便進(jìn)入了高度動(dòng)態(tài)和移動(dòng)化的情境。這兩類情境之間的差異非常明顯,我們通常會(huì)從 Mac 切換至 iPhone 或 Watch,因?yàn)楹髢烧弑揪褪敲嫦蛞苿?dòng)化情境進(jìn)行設(shè)計(jì)的。

而對(duì)于「能力」的理解則可以幫助你掌握并充分利用特定平臺(tái)的獨(dú)特功能。

接下來(lái),讓我們從「情境」與「能力」這兩個(gè)方面,對(duì) Apple 生態(tài)體系當(dāng)中的一些典型平臺(tái)進(jìn)行分析。

平臺(tái)分析

首先是 iPhone,因?yàn)檫@可能是我們多數(shù)人最為熟悉的平臺(tái)了。

從情境的角度來(lái)看,iPhone 始終保持開(kāi)機(jī),始終與我們相隨,因此它是高度移動(dòng)化的;同時(shí),iPhone 也是高度私人化的設(shè)備,我們不會(huì)輕易與他人共享使用;此外,iPhone 通常被用于高頻而短時(shí)的互動(dòng),我們每次使用不會(huì)超過(guò)幾分鐘。

iPhone 所具有的能力可以有效地支持其情境特質(zhì)。「始終開(kāi)機(jī),常伴于身」的特性要求 iPhone 必須具備良好的環(huán)境感知能力,其內(nèi)置的陀螺儀、加速計(jì)等傳感器可以始終在背景進(jìn)程當(dāng)中處理環(huán)境相關(guān)的信息,即便是在我們沒(méi)有使用 iPhone 的時(shí)候;iPhone 的 Touch ID(及 Face ID 等機(jī)制)則會(huì)為我們提供私人化的保護(hù);其高清晰度的觸屏則能確保我們?cè)诙虝r(shí)間的互動(dòng)過(guò)程中獲得輕松與愉悅的體驗(yàn)。

與 iPhone 類似,Watch 也具備「始終開(kāi)機(jī),常伴于身」的特性,且同樣是高度私人化的。但 Watch 具有更強(qiáng)的即刻性,所面向的是更為短暫的互動(dòng),譬如你只需一瞥便可以從表盤(pán)上獲取與當(dāng)下情境最為相關(guān)的信息;而提示信息在你注視稍久時(shí)還會(huì)進(jìn)一步提供詳細(xì)信息。

Watch 所具備的能力與其私人化的情境特質(zhì)息息相關(guān)。Watch 可以追蹤你的運(yùn)動(dòng)狀態(tài)、地理位置及心率;其觸覺(jué)反饋可以通過(guò)輕觸手腕來(lái)提醒你查看信息;而表盤(pán)也是高度定制化的,你可以讓最為需要的信息始終呈現(xiàn)在表盤(pán)之上,便于一瞥之間快速獲取。

而 iPad 則具有較為復(fù)雜的情境特質(zhì),既可以被用于穩(wěn)定的環(huán)境,同時(shí)也支持移動(dòng)化場(chǎng)景。你可以用 iPad 完成一些而聚焦的任務(wù),也可以將其作為放松型設(shè)備來(lái)享受影視或游戲體驗(yàn)。而所有這些互動(dòng)過(guò)程都比 iPhone 或 Watch 更加持久。

從能力的角度,iPad 的大屏正是對(duì)這些情境特質(zhì)的有效支持。充足的屏幕尺寸可以幫助你完成高精度的操作,環(huán)境光傳感器可以使其良好適應(yīng)于日夜不同的光照條件;高保真揚(yáng)聲器和高精度觸屏可以為影音或游戲帶來(lái)更具沉浸感的視聽(tīng)體驗(yàn);若是配合 Apple Pencil,iPad 還能幫助你完成更加、更具創(chuàng)意性的工作。

再來(lái)看 Mac。其情境特質(zhì)具有高度的專業(yè)性,你可以進(jìn)行非常而聚焦的工作,譬如設(shè)計(jì)和開(kāi)發(fā) app;MacBook 可以被作為共享設(shè)備來(lái)使用,但它同時(shí)也是個(gè)人化的,因?yàn)槎鄶?shù)使用者都擁有獨(dú)立的個(gè)人帳戶;我們通常會(huì)長(zhǎng)時(shí)間使用 MacBook 或 iMac,譬如每天都會(huì)有幾個(gè)小時(shí)的互動(dòng)時(shí)間。

在能力方面,為了支持高度專業(yè)化的任務(wù),Mac 具備著非常高的性能表現(xiàn);鍵盤(pán)鼠標(biāo)可以幫助你進(jìn)行而復(fù)雜的操作;多任務(wù)能力允許你以自己所需的方式進(jìn)行工作;而多帳戶體系則能使 Mac 適用于更多樣的工作場(chǎng)景。

最后來(lái)看 Apple TV。這是生態(tài)當(dāng)中最具共享性的平臺(tái),我們通常會(huì)與家人或朋友一起觀看;TV 最具穩(wěn)定性,始終與電視機(jī)綁定在一起,不會(huì)四處移動(dòng);TV 是完完全全的放松型設(shè)備,我們用它來(lái)享受影音或游戲,每次使用時(shí)長(zhǎng)通常在三十分鐘到幾個(gè)小時(shí)之間。

配以高清顯示屏,TV 的畫(huà)質(zhì)將會(huì)鮮活得呼之欲出;TV 的遙控器輕便易用,你可以輕松地將其傳遞給朋友和家人;TV 可以與 HomeKit 良好配合,使其高度穩(wěn)定的特性得以在「家庭」這個(gè)場(chǎng)景中充分地發(fā)揮;其界面設(shè)計(jì)特別面向 10 碼左右的距離進(jìn)行優(yōu)化,使你可以輕松地窩在沙發(fā)里享受娛樂(lè)體驗(yàn)。

通過(guò)以上分析,你便能理解,為何了解每個(gè)平臺(tái)的「情境」與「能力」對(duì)于你的目標(biāo)平臺(tái)選擇來(lái)說(shuō)是如此重要的事了。

「情境」是平臺(tái)的立命之本,而「能力」則決定了其獨(dú)特性。

對(duì)于你的 app 來(lái)說(shuō)也是如此。你需要問(wèn)自己兩個(gè)關(guān)鍵問(wèn)題:我的 app 可以在怎樣的情境里體現(xiàn)產(chǎn)品價(jià)值?要實(shí)現(xiàn)產(chǎn)品價(jià)值,需要哪些特定的技術(shù)能力作為支持?

平臺(tái)選擇練習(xí)

在 Apple 內(nèi)部,每當(dāng)需要為 app 選擇目標(biāo)平臺(tái)時(shí),我們都會(huì)反復(fù)進(jìn)行一項(xiàng)簡(jiǎn)單的練習(xí)?,F(xiàn)在我來(lái)為各位進(jìn)行演示。

首先讓我們以「健身記錄」 app 為例。

想想看「健身記錄」的產(chǎn)品特性,你會(huì)發(fā)現(xiàn)它首先必須具備移動(dòng)性。它需要追蹤你全天的運(yùn)動(dòng)行為,以便進(jìn)行的數(shù)據(jù)統(tǒng)計(jì)。因此它需要設(shè)備平臺(tái)具備「始終開(kāi)機(jī),常伴于身」的特質(zhì),即高度的移動(dòng)性。

同時(shí),「健身記錄」還必須是私人化的。它應(yīng)該能且只能追蹤你個(gè)人的數(shù)據(jù)。

接下來(lái),我們要通過(guò)象限圖來(lái)建立情境特質(zhì)與平臺(tái)之間的映射關(guān)系。其中橫軸代表「移動(dòng)性」,從左到右遞減;一系列 Apple 設(shè)備平臺(tái)按照各自的特質(zhì)分布在軸線上,譬如 Watch 最具移動(dòng)性,而 TV 最具穩(wěn)定性。

而縱軸代表「私人性」,從上到下遞減。其中 Watch 最具私人性,TV 則最具共享性。

對(duì)于「健身記錄」而言,由于要同時(shí)具備高度的移動(dòng)性與私人性,因此在象限圖當(dāng)中會(huì)大致位于左上方的位置。這便解釋了為什么它會(huì)出現(xiàn)在 Watch 和 iPhone 當(dāng)中,而非其他平臺(tái)。

接下來(lái)我們以 GarageBand 為例。

GarageBand 涉及到的人機(jī)互動(dòng)是高度精準(zhǔn)型的,因?yàn)槿藗冃枰浅?zhǔn)確地操作音頻內(nèi)容,使它們出現(xiàn)在正確的時(shí)間和地點(diǎn)。

此外,GarageBand 必須良好地支持多任務(wù),因?yàn)槿藗兺鶗?huì)將多種音頻器材和樂(lè)器連接進(jìn)來(lái)同時(shí)進(jìn)行演奏。

我們通過(guò)象限圖來(lái)建立映射關(guān)系。其中橫軸代表交互的性,左端為粗放型,最具代表性的平臺(tái)是 Watch,因?yàn)槠淦聊惠^小,而人們的手指相對(duì)粗大,難以完成具有高精度要求的操作;右端為精準(zhǔn)型,代表平臺(tái)為 MacBook 或 iMac,因?yàn)殒I鼠操作具備最高的度。

縱軸則代表「多任務(wù)能力」,從上到下遞減。在 Mac 上,我們可以輕松地進(jìn)行多任務(wù)操作;而對(duì)于 Watch,你每次只能完成一項(xiàng)任務(wù)。

GarageBand 需要同時(shí)具備高度的交互能力,以及良好的多任務(wù)能力,因此在象限圖當(dāng)中會(huì)大致位于右側(cè)偏上的位置,所對(duì)應(yīng)的即是 Mac、iPad 和 iPhone。

這兩個(gè)例子都非常簡(jiǎn)單,各自僅涉及到兩方面的情境特質(zhì)。在實(shí)際當(dāng)中,我們通常需要將更多、更復(fù)雜的特質(zhì)因素考慮進(jìn)去;最終,我們希望能夠?yàn)?app 找到最適合其生存的平臺(tái)。

以上便是跨平臺(tái)設(shè)計(jì)流程中的第一步,「平臺(tái)選擇」,即綜合考量不同設(shè)備的情境特質(zhì)及能力特征,進(jìn)而為 app 選擇最為適合的平臺(tái)。

CSS3 終極布局指南

seo達(dá)人

對(duì)于同一個(gè)頁(yè)面布局,幾乎每個(gè)人的寫(xiě)法都不一樣,有人喜歡Flex彈性盒子布局,有的人則喜歡Float浮動(dòng)布局,有些人喜歡Margin負(fù)值布局,等等。從來(lái)就沒(méi)有一種統(tǒng)一的布局方案,現(xiàn)在大伙寫(xiě)代碼也就放飛自我,只要能在規(guī)定的環(huán)境上跑起來(lái),不會(huì)亂就行了。但是,身為腦癱正經(jīng)前端,我們還是有必要分出在不同情況應(yīng)使用的布局。



這一篇博客比起作為文章,不如作為工具書(shū)。當(dāng)你對(duì)布局迷茫時(shí),不妨打開(kāi)看看。我們可以不求甚解,只需要先把所有布局掌握熟練。



文章目錄

CSS3 終極布局指南

正常布局(語(yǔ)義化布局)

正常布局,按照瀏覽器的內(nèi)置CSS渲染

應(yīng)用場(chǎng)景

帶來(lái)的問(wèn)題



不兼容

沒(méi)有自適應(yīng)

解決方案

Float浮動(dòng)布局

什么是浮動(dòng)?

浮動(dòng)元素的排列

浮動(dòng)解決的布局問(wèn)題

浮動(dòng)帶來(lái)的問(wèn)題

父元素高度坍縮

不希望浮動(dòng)時(shí)清除浮動(dòng)

總結(jié)

定位布局

定位的應(yīng)用

static

relative

absolute

高度坍縮

對(duì)比f(wàn)loat

總結(jié)

fixed

祖先未使用transform:none

使用

sticky 粘性定位

Flex布局

瀏覽器支持

Flex使用介紹

Flex容器屬性

flex-direction 排布方向

flex-wrap 控制換行

flex-flow [排布方向/控制換行]的簡(jiǎn)稱

justify-content 子項(xiàng)目在主軸上的排布

align-items 子項(xiàng)目在交叉軸排布

align-content 定義多根軸線排布

Flex子項(xiàng)屬性

order 子項(xiàng)排布靠前排名

flex-grow 子項(xiàng)放大比例

flex-shrink 子項(xiàng)縮小比例

flex-basis

flex

align-self

Grid 布局

參考

聲明

正常布局(語(yǔ)義化布局)

正常布局,按照瀏覽器的內(nèi)置CSS渲染

大道至簡(jiǎn)在遠(yuǎn)古時(shí)代,CSS還有沒(méi)被發(fā)明,瀏覽器渲染HTML的時(shí)候,只是按照規(guī)定好的如標(biāo)題、段落、表格等格式渲染。且不同的瀏覽器對(duì)于相同元素的渲染也是不同的,現(xiàn)在這項(xiàng)傳統(tǒng)藝能保留到了今天。



不過(guò)到了今天,正常布局也稍微被W3C重視了一下。在HTML5的規(guī)定中,新增加了不少語(yǔ)義化的元素。所謂語(yǔ)義化元素就是讓大家規(guī)定它就是來(lái)做這件事的。



新增加的語(yǔ)義化元素。



標(biāo)簽名稱 作用

hearder header 標(biāo)簽定義文檔的頁(yè)面組合,通常是一些引導(dǎo)和導(dǎo)航信息。

nav nav 標(biāo)簽定義顯示導(dǎo)航鏈接不是所有的成組的超級(jí)鏈接都需要放在nav標(biāo)簽里。nav標(biāo)簽里應(yīng)該放入一些當(dāng)前頁(yè)面的主要導(dǎo)航鏈接。 例如在頁(yè)腳顯示一個(gè)站點(diǎn)的導(dǎo)航鏈接(如首頁(yè),服務(wù)信息頁(yè)面,版權(quán)信息頁(yè)面等等),就可以使用nav標(biāo)簽,當(dāng)然,這不是必須的。

article article標(biāo)簽裝載顯示一個(gè)獨(dú)立的文章內(nèi)容。例如一篇完整的論壇帖子,一則網(wǎng)站新聞,一篇博客文章等等,一個(gè)用戶評(píng)論等等 artilce可以嵌套,則內(nèi)層的artilce對(duì)外層的article標(biāo)簽有隸屬的關(guān)系。例如,一個(gè)博客文章,可以用article顯示,然后一 些評(píng)論可以以article的形式嵌入其中。

section section 標(biāo)簽定義文檔中的節(jié)(section、區(qū)段)。比如章節(jié)、頁(yè)眉、頁(yè)腳或文檔中的其他部分。

aside aside 用來(lái)裝載非正文類的內(nèi)容。例如廣告,成組的鏈接,側(cè)邊欄等等。

hgroup hgroup 標(biāo)簽用于對(duì)網(wǎng)頁(yè)或區(qū)段的標(biāo)題元素(h1-h6)進(jìn)行組合。例如,在一個(gè)區(qū)段中你有連續(xù)的h系列的標(biāo)簽元素,則可以用hgroup將他們括起來(lái)。

time time 標(biāo)簽定義公歷的時(shí)間(24 小時(shí)制)或日期,時(shí)間和時(shí)區(qū)偏移是可選的。該元素能夠以機(jī)器可讀的方式對(duì)日期和時(shí)間進(jìn)行編碼,這樣, 舉例說(shuō),用戶代理能夠把生日提醒或排定的事件添加到用戶日程表中,搜索引擎也能夠生成更智能的搜索結(jié)果。

mark mark 標(biāo)簽定義帶有記號(hào)的文本。請(qǐng)?jiān)谛枰怀鲲@示文本時(shí)使用 <mark> 標(biāo)簽。

figure figure標(biāo)簽規(guī)定獨(dú)立的流內(nèi)容(圖像、圖表、照片、代碼等等)。figure 元素的內(nèi)容應(yīng)該與主內(nèi)容相關(guān),但如果被刪除,則不應(yīng)對(duì)文檔流產(chǎn)生影響。

可以看到HTML5規(guī)定中增加了不少新的標(biāo)簽,但是這些標(biāo)簽大部分并不是為了補(bǔ)充正常的文檔布局的,而是服務(wù)于搜索引擎的爬蟲(chóng)。不要覺(jué)得頁(yè)面布局只是給人看的!對(duì)于布局清晰地頁(yè)面,搜索引擎的爬蟲(chóng)也會(huì)給出更高的分?jǐn)?shù)。



應(yīng)用場(chǎng)景

作為布局的基石。

開(kāi)發(fā)較為單一的頁(yè)面,比如電子書(shū)閱讀頁(yè)面,面向視力障礙人士的報(bào)紙頁(yè)面等。

帶來(lái)的問(wèn)題



使用瀏覽器默認(rèn)的CSS意味著你不可定制自己的頁(yè)面,對(duì)于像<ul>、<table>這樣的標(biāo)簽,你也只能忍受上世紀(jì)的設(shè)計(jì)風(fēng)格了。



不兼容

先前說(shuō)了,每個(gè)瀏覽器對(duì)于基礎(chǔ)的HTML節(jié)點(diǎn)的渲染都不一樣,也就是說(shuō)你寫(xiě)的頁(yè)面在IE上是一個(gè)風(fēng)格,換到Safari上又是一種風(fēng)格。



沒(méi)有自適應(yīng)

有一說(shuō)一,正常布局(語(yǔ)義化)還是用來(lái)當(dāng)基石比較好,對(duì)于響應(yīng)式、自適應(yīng)那還得看下面伙計(jì)的發(fā)揮。



解決方案

解決挫的方法就是使用style屬性,也就是使用CSS美化我們的頁(yè)面。解決不兼容的問(wèn)題則需要初始化CSS,大伙應(yīng)該在不少的頁(yè)面的頭部見(jiàn)過(guò)一大坨css代碼吧,就像下面Google頁(yè)面。(部分)



body{color:#000;margin:0}body{background:#fff}a.gb1,a.gb2,a.gb3,.link{color:#1a0dab !important}.ts{border-collapse:collapse}.ts td{padding:0}#res,#res .j{line-height:1.2}.g{line-height:1.2;text-align:left;}.ti,.bl{display:inline}.ti{display:inline-table}#rhs_block{padding-bottom:15px}a:link,.w,#prs a:visited,#prs a:active,.q:active,.q:visited,.kl:active,.tbotu{color:#1a0dab}.mblink:visited,a:visited{color:#609}.cur,.b{font-weight:bold}.j{width:42em;font-size:82%}.s{max-width:48em}.sl{font-size:82%}

1

頁(yè)面初始化也是很重要的,它可以使我們的代碼健壯的運(yùn)行在各個(gè)環(huán)境的瀏覽器上。



Float浮動(dòng)布局

什么是浮動(dòng)?

如果首先要認(rèn)識(shí)一個(gè)物品,認(rèn)識(shí)一個(gè)東西的最好方式是了解為什么會(huì)產(chǎn)生它,也就是要翻它的歷史。——NaoTan·Ma·Nong





看上圖,啊,報(bào)社最愛(ài)的環(huán)繞,一堆文字環(huán)繞一張圖片,這樣的布局使得頁(yè)面緊湊,并且有較好的閱讀體驗(yàn)。如果我們要在HTML中實(shí)現(xiàn)這樣的布局應(yīng)當(dāng)怎么設(shè)置呢?手動(dòng)設(shè)置換行?不行,缺少靈魂。如果能使文字繞過(guò)圖片排列下來(lái)就好了。



于是Float屬性出世,它不僅解決了文字環(huán)繞問(wèn)題,并且?guī)?lái)了新的布局方案。





如上面的布局,我們用代碼實(shí)現(xiàn)主要部分。

.side-bar{

    float:left;

}

.main-content{

    float:left;

}

1

2

3

4

5

6

浮動(dòng)元素的排列

當(dāng)一個(gè)元素被設(shè)置為浮動(dòng)元素時(shí),首先,它會(huì)被移除文檔流,設(shè)置float:left|right則元素會(huì)向設(shè)置方向排列,直到遇到父元素邊框(或者說(shuō)最大寬度)或者另一個(gè)浮動(dòng)元素時(shí)停止。



當(dāng)設(shè)置父元素display:flex時(shí),子元素的浮動(dòng)值無(wú)效!



浮動(dòng)解決的布局問(wèn)題

使用浮動(dòng)我們可以解決傳統(tǒng)的兩列布局、三列布局的自適應(yīng)。下面代碼是用浮動(dòng)實(shí)現(xiàn)的兩列布局。



<!DOCTYPE html>

<html lang="zh">



<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>兩列布局</title>

    <style>

        body,

        html {

            margin: 0;

            background-color: rgb(228, 228, 228);

        }



        header {

            margin-bottom: 20px;

        }



        footer {

            margin-top: 20px;

        }



        .layout {

            height: 50px;

            border: 1px solid black;

        }



        aside {

            width: 25%;

            float: left;

            border: solid 1px black;

            height: 500px;

        }



        article {

            width: 70%;

            border: solid 1px black;

            height: 500px;

            float: right;

        }

    </style>

</head>



<body>

    <header class="layout"></header>

    <div style="overflow:auto;">

        <aside>



        </aside>

        <article>



        </article>

    </div>



    <footer class="layout"></footer>

</body>



</html>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

效果如下





浮動(dòng)帶來(lái)的問(wèn)題

父元素高度坍縮

一般來(lái)說(shuō)新手在學(xué)習(xí)浮動(dòng)布局之后,遇到的第一個(gè)問(wèn)題就是父元素高度坍縮。什么是高度坍縮?







看上圖,在父元素的四個(gè)子元素均為浮動(dòng)元素,由于浮動(dòng)元素的特性浮動(dòng)元素脫離文檔流,所以父元素不會(huì)被撐起高度。



如何解決?答案很簡(jiǎn)單,使用BFC塊級(jí)格式上下文。當(dāng)父元素為BFC的時(shí)候,內(nèi)部計(jì)算高度會(huì)帶上浮動(dòng)元素的高度。



不希望浮動(dòng)時(shí)清除浮動(dòng)

使用clear屬性可以使元素清除周圍的浮動(dòng)。





如上圖,對(duì)段落文字清除浮動(dòng),導(dǎo)致原本環(huán)繞的文字,另起一行。順便解決了高度坍縮的問(wèn)題。



總結(jié)

浮動(dòng)在帶來(lái)方便的同時(shí)也引入了新的問(wèn)題,如果能處理好這些問(wèn)題那么浮動(dòng)也可以當(dāng)做布局的主力,但是都已經(jīng)9102年了,我們應(yīng)該追隨CSS3的布局方案,盡量少使用浮動(dòng)。



定位布局

收拾房子的時(shí)候總會(huì)把物品按照相應(yīng)的位置放置,這樣會(huì)讓房間看上去更加整潔。所以,我們CSS也是可以這樣做的。



使用position屬性,調(diào)整元素的位置。position一共有四種定位類型:定位元素、相對(duì)定位、絕對(duì)定位、粘性定位,五種取值:static、relative、absolute、fixed、sticky。



名稱 描述 定位類型

static 該關(guān)鍵字指定元素使用正常的布局行為,即元素在文檔常規(guī)流中當(dāng)前的布局位置。此時(shí) top, right, bottom, left 和 z-index屬性無(wú)效。 定位元素

relative 該關(guān)鍵字下,元素先放置在未添加定位時(shí)的位置,再在不改變頁(yè)面布局的前提下調(diào)整元素位置(因此會(huì)在此元素未添加定位時(shí)所在位置留下空白)。position:relative 對(duì) table-*-group, table-row, table-column, table-cell, table-caption 元素?zé)o效。 相對(duì)定位

absolute 不為元素預(yù)留空間,通過(guò)指定元素相對(duì)于最近的非 static 定位祖先元素的偏移,來(lái)確定元素位置。絕對(duì)定位的元素可以設(shè)置外邊距(margins),且不會(huì)與其他邊距合并。 絕對(duì)定位

fixed 不為元素預(yù)留空間,而是通過(guò)指定元素相對(duì)于屏幕視口(viewport)的位置來(lái)指定元素位置。元素的位置在屏幕滾動(dòng)時(shí)不會(huì)改變。打印時(shí),元素會(huì)出現(xiàn)在的每頁(yè)的固定位置。fixed 屬性會(huì)創(chuàng)建新的層疊上下文。當(dāng)元素祖先的 transform 屬性非 none 時(shí),容器由視口改為該祖先。 絕對(duì)定位

sticky 盒位置根據(jù)正常流計(jì)算(這稱為正常流動(dòng)中的位置),然后相對(duì)于該元素在流中的 flow root(BFC)和 containing block(最近的塊級(jí)祖先元素)定位。在所有情況下(即便被定位元素為 table 時(shí)),該元素定位均不對(duì)后續(xù)元素造成影響。當(dāng)元素 B 被粘性定位時(shí),后續(xù)元素的位置仍按照 B 未定位時(shí)的位置來(lái)確定。position: sticky對(duì) table 元素的效果與 position: relative相同。 粘性定位

一般使用position屬性時(shí),會(huì)使用其相對(duì)定位與絕對(duì)定位、粘性定位,它們都使用top、bottom、left、right來(lái)調(diào)整自身位置,但是調(diào)整的基準(zhǔn)不一樣。



定位的應(yīng)用

static

static是元素正常出現(xiàn)在文檔流中的定位,文檔流中的排列為自上而下,自左至右。一般來(lái)說(shuō)block元素自占一行,inline元素橫向排列。



正常情況下在我們的頁(yè)面中大部分元素為static定位,對(duì)于一些特殊需求我們需要使用其他定位。比如像wiki中的關(guān)鍵詞,鼠標(biāo)移動(dòng)上去的時(shí)候,關(guān)鍵詞下面顯示式卡片。



relative

relative是在實(shí)現(xiàn)一些特殊布局的時(shí)候經(jīng)常使用的一種定位方式。設(shè)置為relative的元素并不會(huì)脫離文檔流,但是可以通過(guò)top、bottom、left、right調(diào)整元素對(duì)于默認(rèn)基準(zhǔn)的位置。



.box {

  display: inline-block;

  width: 100px;

  height: 100px;

  background: red;

  color: white;

}


two {

  position: relative;

  top: 20px;

  left: 20px;

  background: blue;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14



使用相對(duì)定位可以實(shí)現(xiàn)一些炫酷的效果。



.content{

        text-align: center;

        margin: 20px;

    }

    .card{

        position: relative;

        display: inline-block;

        width: 200px;

        height: 200px;

        background-color: darkgray;

        top: 210px;

        right: 170px;

        visibility: hidden;

    }

    span:hover+.card{

        visibility:visible;

    }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

    <div class="content">

        <span>鼠標(biāo)移到我身上!</span>

        <div class="card">



        </div>

    </div>

1

2

3

4

5

6

效果





但是,使用相對(duì)定位依然會(huì)出現(xiàn)一些問(wèn)題。relative定位并不會(huì)脫離文檔流,所以.content元素的高度為200px。



absolute

與relative定位不同的是absolute是脫離文檔流的,而且相對(duì)基準(zhǔn)是position屬性不為static的祖先元素,如果祖先都是static則元素相對(duì)body定位。并且,對(duì)于absolute元素,如果不設(shè)置top/bottom/left/right的話依然排列在正常布局位置。



html,

        body {

            margin: 0;

        }



        .content {

            position: relative;

            / top: 50px; /

            margin-top: 50px;

        }



        .static {

            position: static;

        }



        .relative {

            position: relative;

            margin: 20px 0;

        }



        .absolute {

            display: inline-block;

            width: 50px;

            height: 50px;

            background-color: lightcoral;

            position: absolute;

        }



        .non-ab {

            display: inline-block;

            width: 50px;

            height: 50px;

            background-color: darkblue;

            margin-left: 100px;

        }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<div class="content">

        <div style="height: 50px;"></div>

        <div class="static">

            <div class="non-ab">



            </div>

            <div class="absolute">



            </div>



        </div>

        <div class="relative">

            <div class="absolute">



            </div>

            <div class="non-ab">



            </div>

        </div>

    </div>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20





上面的代碼很有意思,有興趣的同學(xué)可以放在codepen上面跑一下子。這個(gè)例子驗(yàn)證了absolute的排列方式。當(dāng)我們知道我們?cè)谧鍪驳臅r(shí)候,也就不需要墨守成規(guī)(對(duì)于absolute元素的父元素統(tǒng)一設(shè)置relative屬性)了。



高度坍縮

只要是脫離了文檔流的元素都會(huì)出現(xiàn)高度坍縮,所以在使用absolute屬性時(shí),請(qǐng)確保父元素不會(huì)因此而改變。



對(duì)比f(wàn)loat

Float與absolute都會(huì)使元素脫離文檔流,但是眾所周知對(duì)相同元素設(shè)置float與設(shè)置absolute會(huì)出現(xiàn)不同的效果。這是因?yàn)閒loat與absolute本身的排列不一樣。



float:脫離文檔流,排列時(shí)以父元素為基準(zhǔn),并且會(huì)為占用其他浮動(dòng)元素的位置。



absolute:脫離文檔流,排列時(shí)分情況:第一種情況,對(duì)于未設(shè)置left、right、top、bottom屬性的元素,排列在正常顯示位置,并不占用空間。第二種情況,設(shè)置位置屬性的元素,基于非static祖先元素排列。



上面兩者比較顯著的差異為float會(huì)影響下一個(gè)float元素,但是absolute元素不會(huì)。



總結(jié)

說(shuō)absolute為絕對(duì)定位也并不貼切,它也是基于祖先元素定位的,只是脫離了文檔流。我個(gè)人還是比較推薦在處理元素相對(duì)位置問(wèn)題上使用absolute屬性的,但前提是您已經(jīng)深刻理解了absolute的排列方式。



fixed

不為元素預(yù)留空間,而是通過(guò)指定元素相對(duì)于屏幕視口(viewport)的位置來(lái)指定元素位置。元素的位置在屏幕滾動(dòng)時(shí)不會(huì)改變。打印時(shí),元素會(huì)出現(xiàn)在的每頁(yè)的固定位置。fixed 屬性會(huì)創(chuàng)建新的層疊上下文。當(dāng)元素祖先的 transform 屬性非 none 時(shí),容器由視口改為該祖先。



fixed元素也會(huì)脫離文檔流,并且和absolute元素一樣,當(dāng)不設(shè)置任何left、top、bottom、right值的時(shí)候,元素依然按照正常定位的位置放置。



祖先未使用transform:none

當(dāng)祖先元素未使用transform:none的時(shí)候,fixed元素相對(duì)于該祖先元素進(jìn)行定位。







在上面的圖片中,我設(shè)置小黃塊為fiexd屬性,并讓父元素設(shè)置為 使用transform:matrix(1, 0, 0, 1, 0, 0);,這時(shí)候小黃塊并沒(méi)有相對(duì)于body進(jìn)行定位,當(dāng)滾動(dòng)條下拉時(shí),小黃塊定位固定在父元素左上角。



使用

fiexd元素一般用在如:to-top按鈕,或者側(cè)邊懸浮面板,或者懸浮導(dǎo)航欄之中。



sticky 粘性定位

盒位置根據(jù)正常流計(jì)算(這稱為正常流動(dòng)中的位置),然后相對(duì)于該元素在流中的 flow root(BFC)和 containing block(最近的塊級(jí)祖先元素)定位。在所有情況下(即便被定位元素為 table 時(shí)),該元素定位均不對(duì)后續(xù)元素造成影響。當(dāng)元素 B 被粘性定位時(shí),后續(xù)元素的位置仍按照 B 未定位時(shí)的位置來(lái)確定。position: sticky對(duì) table 元素的效果與 position: relative相同。



上面我們使用了fiexd與transform,發(fā)生了我們意想不到的效果,那就是fixed元素并未相對(duì)于body進(jìn)行移動(dòng),也沒(méi)有在父元素中進(jìn)行標(biāo)準(zhǔn)的fixed定位?,F(xiàn)在我們使用以下sticky屬性來(lái)看一下效果。



<style>

        .box{

            box-sizing: border-box;

            height: 150px;

            border:solid 3px black;

            margin: 0 0 20px 0;

            overflow: auto;

        }

        .block{

            width: 50px;

            height: 50px;

            background-color: orange;

        }

        .sticky-1{

            position:sticky;

            top: 0px;

        }

    </style>

<div class="box box-1">

        <p>下面這個(gè)小黃塊設(shè)置為sticky</p>

        <div class="sticky-1 block">



        </div>

        <p>

            hahah

        </p>

        <p>

            hahah

        </p>

        <p>hahaha</p>

        <p>hahaha</p>

    </div>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32



當(dāng)我們向下滾動(dòng)的時(shí)候神奇的事情發(fā)生了。







小黃塊固定到了父元素的top:0位置了,不僅如此,再向上滑動(dòng)后,小黃塊又回復(fù)了當(dāng)時(shí)的位置,而且占用了文檔本身的位置。



使用這個(gè)特性我們可以制作浮動(dòng)的Header組件,當(dāng)用戶向下滑動(dòng)至窗口上側(cè)的時(shí)候,Header組件也跟隨窗口滑動(dòng)。



Flex布局

對(duì)于前端工程師來(lái)說(shuō),最讓人頭疼的莫過(guò)于自適應(yīng)布局。對(duì)于不同分辨率的設(shè)備要做到頁(yè)面統(tǒng)一,在CSS3出現(xiàn)之前,還是挺不容易的。還有就是前端工程師頭疼的一個(gè)布局問(wèn)題:垂直居中。



CSS3中新出了一種布局技術(shù):CSS彈性盒子布局,我們來(lái)看一下MDN是如何介紹的。



CSS 彈性盒子布局是 CSS 的模塊之一,定義了一種針對(duì)用戶界面設(shè)計(jì)而優(yōu)化的 CSS 盒子模型。在彈性布局模型中,彈性容器的子元素可以在任何方向上排布,也可以“彈性伸縮”其尺寸,既可以增加尺寸以填滿未使用的空間,也可以收縮尺寸以避免父元素溢出。子元素的水平對(duì)齊和垂直對(duì)齊都能很方便的進(jìn)行操控。通過(guò)嵌套這些框(水平框在垂直框內(nèi),或垂直框在水平框內(nèi))可以在兩個(gè)維度上構(gòu)建布局。



接下來(lái),我會(huì)使用Flex布局技術(shù),設(shè)計(jì)一些我們常使用頁(yè)面布局,并指出優(yōu)點(diǎn)與缺點(diǎn)。但是,我們首先要來(lái)看一下瀏覽器的支持程度。



瀏覽器支持

特性 Firefox (Gecko) Chrome Internet Explorer Opera Safari

基礎(chǔ)支持 20.0 (20.0) 21.0-webkit 29.0 10.0-ms 11.0 12.10 6.1-webkit

主流的瀏覽器全部支持Flex屬性。注:與社會(huì)脫軌的IE9并不支持Flex,如果想寫(xiě)出兼容IE9的頁(yè)面,請(qǐng)不要使用Flex。



Flex使用介紹

使用flex務(wù)必清楚一些屬性概念。



Flex容器:對(duì)于一個(gè)基本元素(不含任何CSS屬性,如div),設(shè)置display:flex,即可創(chuàng)建一個(gè)Flex容器。



Flex子項(xiàng):父元素為Flex容器的元素,稱之為Flex子項(xiàng),其排布受到父元素影響。注:一定是父元素為Flex容器的元素,祖先不算。



排布方向:指Flex子項(xiàng)在Flex容器中的排布方向。排布方向有兩種:column、row。在Flex容器上使用flex-direction: column|row(默認(rèn));即可設(shè)置。



主軸:指的Flex容器中是與排列方式相同的方向的軸。如設(shè)置Flex容器direction: column;則其主軸為豎直方向。



交叉軸:指的Flex容器中是與排列方式相反的方向的軸。如設(shè)置Flex容器direction: column;則其主軸為水平方向。



我們一定要清楚上面的基礎(chǔ)概念,這對(duì)深入使用Flex有很大的幫助。下面我會(huì)介紹一些Flex常用的屬性,主要分為兩部分:對(duì)Flex容器、對(duì)Flex子項(xiàng)。



Flex容器屬性

flex-direction 排布方向

flex-direction 屬性指定了內(nèi)部元素是如何在 flex 容器中布局的,定義了主軸的方向(正方向或反方向)。



flex-direction屬性接受以下值:



row:子項(xiàng)目在flex容器中橫向,從左至右排列。



row-reverse:表現(xiàn)和row相同,也是橫向,但是是從右到左。



column:子項(xiàng)在容器中豎向排列,從上至下。

這里不貼圖了

column-reverse:表現(xiàn)和column相同,子項(xiàng)在容器中豎向排列,從下至上。

這里不貼圖了

flex-wrap 控制換行

CSS flex-wrap 指定 flex 元素單行顯示還是多行顯示 。如果允許換行,這個(gè)屬性允許你控制行的堆疊方向。



取值:



nowrap(默認(rèn))

flex 的元素被擺放到到一行,這可能導(dǎo)致溢出 flex 容器。 cross-start 會(huì)根據(jù) flex-direction 的值 相當(dāng)于 start 或 before。

wrap

flex 元素 被打斷到多個(gè)行中。cross-start 會(huì)根據(jù) flex-direction 的值選擇等于start 或before。cross-end 為確定的 cross-start 的另一端。



wrap-reverse

和 wrap 的行為一樣,但是 cross-start 和 cross-end 互換。



flex-flow [排布方向/控制換行]的簡(jiǎn)稱

CSS flex-flow 屬性是 flex-direction 和 flex-wrap 的簡(jiǎn)寫(xiě)。



示例:flex-flow: column-reverse wrap;



justify-content 子項(xiàng)目在主軸上的排布

CSS justify-content 屬性定義了瀏覽器如何分配順著父容器主軸的彈性元素之間及其周圍的空間。



justify-content同時(shí)受到父容器主軸的影響。



取值:



start



從行首開(kāi)始排列。每行第一個(gè)元素與行首對(duì)齊,同時(shí)所有后續(xù)的元素與前一個(gè)對(duì)齊。



flex-start(默認(rèn))



從行首開(kāi)始排列。每行第一個(gè)彈性元素與行首對(duì)齊,同時(shí)所有后續(xù)的彈性元素與前一個(gè)對(duì)齊。



flex-end



從行尾開(kāi)始排列。每行最后一個(gè)彈性元素與行尾對(duì)齊,其他元素將與后一個(gè)對(duì)齊。



center



伸縮元素向每行中點(diǎn)排列。每行第一個(gè)元素到行首的距離將與每行最后一個(gè)元素到行尾的距離相同。



left



伸縮元素一個(gè)挨一個(gè)在對(duì)齊容器得左邊緣,如果屬性的軸與內(nèi)聯(lián)軸不平行,則left的行為類似于start



right



元素以容器右邊緣為基準(zhǔn), 一個(gè)挨著一個(gè)對(duì)齊,如果屬性軸與內(nèi)聯(lián)軸不平行,則right的行為類似于start.



space-between



在每行上均勻分配彈性元素。相鄰元素間距離相同。每行第一個(gè)元素與行首對(duì)齊,每行最后一個(gè)元素與行尾對(duì)齊。



space-around



在每行上均勻分配彈性元素。相鄰元素間距離相同。每行第一個(gè)元素到行首的距離和每行最后一個(gè)元素到行尾的距離將會(huì)是相鄰元素之間距離的一半。



space-evenly



flex項(xiàng)都沿著主軸均勻分布在指定的對(duì)齊容器中。相鄰flex項(xiàng)之間的間距,主軸起始位置到第一個(gè)flex項(xiàng)的間距,主軸結(jié)束位置到最后一個(gè)flex項(xiàng)的間距,都完全一樣。



看上去與space-around的排布很相似,但其實(shí)還是有一些區(qū)別的。space-evenly會(huì)在每一行均勻分布間隙,而space-around是均勻分布項(xiàng)目。

借一張圖

看上去我們要學(xué)的屬性很多,但是其實(shí)我們只需要記住我們常用的幾個(gè)屬性就行:flex-start、flex-end、space-between、center、space-around、space-evenly。以上這幾個(gè)就是我們常用的屬性值,通過(guò)設(shè)置主軸方向、設(shè)置排列方式,我們可以靈活地組織我們的元素。



align-items 子項(xiàng)目在交叉軸排布

CSS align-items屬性將所有直接子節(jié)點(diǎn)上的align-self值設(shè)置為一個(gè)組。 align-self屬性設(shè)置項(xiàng)目在其包含塊中在交叉軸方向上的對(duì)齊方式。



取值:



normal



這個(gè)關(guān)鍵字的效果取決于我們處在什么布局模式中:在絕對(duì)定位的布局中,對(duì)于被替代的絕對(duì)定位盒子,這個(gè)效果和start的效果的一樣;對(duì)于其他所有絕對(duì)定位的盒子,這個(gè)效果和stretch的效果一樣。 在絕對(duì)定位布局的靜態(tài)位置上,效果和stretch一樣。對(duì)于那些彈性項(xiàng)目而言,效果和stretch一樣。對(duì)于那些網(wǎng)格項(xiàng)目而言,效果和stretch一樣,除了有部分比例或者一個(gè)固定大小的盒子的效果像start。這個(gè)屬性不適用于會(huì)計(jì)盒子和表格。



flex-start



元素向側(cè)軸起點(diǎn)對(duì)齊。



flex-end



元素向側(cè)軸終點(diǎn)對(duì)齊。



center



元素在側(cè)軸居中。如果元素在側(cè)軸上的高度高于其容器,那么在兩個(gè)方向上溢出距離相同。



因?yàn)閍lign-items其實(shí)和justify-content我這里就不放一些圖片湊字?jǐn)?shù)了。



align-content 定義多根軸線排布

該屬性對(duì)單行彈性盒子模型無(wú)效。(即:帶有flex-wrap: nowrap)。



CSS的align-content屬性設(shè)置了瀏覽器如何沿著伸縮盒子容器(flexbox container)的縱軸和網(wǎng)格容器(Grid Container)的主軸在內(nèi)容項(xiàng)之間和周圍分配空間。



它的取值和align-items差不多,經(jīng)常有人會(huì)把他們搞混。



align-content一般定義多行的交叉軸排列。



絕大多數(shù)情況下我們使用align-items即可實(shí)現(xiàn)我們的需求。



Flex子項(xiàng)屬性

order 子項(xiàng)排布靠前排名

CSS order 屬性規(guī)定了彈性容器中的可伸縮項(xiàng)目在布局時(shí)的順序。元素按照 order 屬性的值的增序進(jìn)行布局。擁有相同 order 屬性值的元素按照它們?cè)谠创a中出現(xiàn)的順序進(jìn)行布局。







取值:



<integer>



表示此可伸縮項(xiàng)目所在的次序組。



flex-grow 子項(xiàng)放大比例

CSS flex-grow 屬性定義彈性盒子項(xiàng)(flex item)的拉伸因子







取值:



<number>



默認(rèn)值0,即如果存在剩余空間,也不放大。負(fù)值無(wú)效。



flex-shrink 子項(xiàng)縮小比例

CSS flex-shrink 屬性指定了 flex 元素的收縮規(guī)則。flex 元素僅在默認(rèn)寬度之和大于容器的時(shí)候才會(huì)發(fā)生收縮,其收縮的大小是依據(jù) flex-shrink 的值。







總而言之,你定了這個(gè)屬性,其他項(xiàng)目會(huì)先壓榨你的空間,然后再均勻縮小其他項(xiàng)目。



flex-basis

flex-basis屬性定義了在分配多余空間之前,項(xiàng)目占據(jù)的主軸空間(main size)。瀏覽器根據(jù)這個(gè)屬性,計(jì)算主軸是否有多余空間。它的默認(rèn)值為auto,即項(xiàng)目的本來(lái)大小。



注:分配多余空間之前!!



也就是說(shuō)你給的flex-basis值大于當(dāng)前分配空間時(shí),依然會(huì)被壓縮。



flex

flex屬性是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫(xiě),默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。



align-self

align-self屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式,可覆蓋align-items屬性。默認(rèn)值為auto,表示繼承父元素的align-items屬性,如果沒(méi)有父元素,則等同于stretch。



這個(gè)屬性了不得,它也是我們經(jīng)常用的子項(xiàng)目屬性之一。



.item {

  align-self: auto | flex-start | flex-end | center | baseline | stretch;

}

1

2

3





就像上面的圖,他可以決定子項(xiàng)目的交叉軸單獨(dú)排列方式。



Grid 布局

未完待續(xù)…明天補(bǔ)上



參考

HTML5語(yǔ)義化標(biāo)簽屬性-HTML5屬性手冊(cè)

All About Floats | CSS-Tricks

清除浮動(dòng)的四種方式及其原理理解

【前端Talkking】CSS系列——CSS深入理解之a(chǎn)bsolute定位

CSS 彈性盒子布局

Flex 布局教程:語(yǔ)法篇

藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(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ù)

three.js 的簡(jiǎn)單實(shí)例

seo達(dá)人

three.js 的簡(jiǎn)單實(shí)例

三大主件: 渲染器、場(chǎng)景、相機(jī)



思想核心: 相機(jī)獲取到場(chǎng)景內(nèi)顯示的內(nèi)容, 然后再通過(guò)渲染器渲染到畫(huà)布上面



渲染器: 實(shí)例化渲染器的同時(shí)生成的一個(gè) Canvas 畫(huà)布, 之后將這個(gè)畫(huà)布添加到了 DOM 當(dāng)中



場(chǎng)景: 場(chǎng)景只是一個(gè)容器, 顯示的內(nèi)容需要進(jìn)行添加, 添加一個(gè)內(nèi)容稱作一個(gè)網(wǎng)格, 每個(gè)網(wǎng)格基本上包括幾何體和材質(zhì), 網(wǎng)格也稱之為模型



<!DOCTYPE html>

<html>



<head>

<meta charset="utf-8" />

<title>three</title>

<style>

body {

margin: 0;

}



canvas {

width: 100%;

height: 100%;

display: block;

}

</style>

</head>



<body onload="init()">

<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>

<script type="text/javascript" src="js/three.min.js"></script>

<script type="text/javascript" src="js/stats.min.js"></script>

<script type="text/javascript" src="js/dat.gui.min.js"></script>

<script>

//聲明一些全局變量

var renderer, camera, scene, geometry, material, mesh, stats, rotate = true;



//初始化渲染器

function initRenderer() {

renderer = new THREE.WebGLRenderer(); //實(shí)例化渲染器

renderer.setSize(window.innerWidth, window.innerHeight); //設(shè)置寬和高

document.body.appendChild(renderer.domElement); //添加到dom

}



//初始化場(chǎng)景

function initScene() {

scene = new THREE.Scene(); //實(shí)例化場(chǎng)景

}



//初始化相機(jī)

function initCamera() {

camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200); //實(shí)例化相機(jī)

camera.position.set(0, 0, 15); //初始化的坐標(biāo)

}



//創(chuàng)建模型

function initMesh() {

geometry = new THREE.BoxGeometry(2, 2, 2); //創(chuàng)建幾何體

material = new THREE.MeshNormalMaterial(); //創(chuàng)建材質(zhì)

mesh = new THREE.Mesh(geometry, material); //創(chuàng)建網(wǎng)格

scene.add(mesh); //將網(wǎng)格添加到場(chǎng)景

}



//運(yùn)行動(dòng)畫(huà)

function animate() {

requestAnimationFrame(animate); //循環(huán)調(diào)用函數(shù)



//判斷是否可以旋轉(zhuǎn)

if(rotate) {

mesh.rotation.x += 0.01; //每幀網(wǎng)格模型的沿x軸旋轉(zhuǎn)0.01弧度

mesh.rotation.y += 0.02; //每幀網(wǎng)格模型的沿y軸旋轉(zhuǎn)0.02弧度

}



stats.update(); //更新性能檢測(cè)框

renderer.render(scene, camera); //渲染界面

}



//性能檢測(cè)框

function initStats() {

stats = new Stats();

document.body.appendChild(stats.dom);

}



//創(chuàng)建調(diào)試框

function initGui() {



//控制參數(shù)初始值

controls = {

positionX: 0,

positionY: 0,

positionZ: 0,

rotate: true

};



gui = new dat.GUI(); //實(shí)例化對(duì)象

gui.add(controls, "positionX", -10, 10).onChange(updatePosition);

gui.add(controls, "positionY", -5, 5).onChange(updatePosition);

gui.add(controls, "positionZ", -10, 10).onChange(updatePosition);



function updatePosition() {

mesh.position.set(controls.positionX, controls.positionY, controls.positionZ);

}



gui.add(controls, "rotate").name("旋轉(zhuǎn)").onChange(function(e) {

rotate = e;

});

}



//初始化函數(shù),頁(yè)面加載完成是調(diào)用

function init() {

initRenderer();

initScene();

initCamera();

initMesh();

initStats();

initGui();

animate();

}

</script>



</body>



</html>

藍(lán)藍(lán)設(shè)計(jì)sillybuy.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(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ù)。

日歷

鏈接

個(gè)人資料

存檔