首頁

子類對象實例化全過程

seo達(dá)人

標(biāo)準(zhǔn)格式注意:

super()和this()調(diào)用語句不能同時在一個構(gòu)造器中。

super()或this()調(diào)用語句只能作為構(gòu)造器中的第一句出現(xiàn)。原因:

無論通過哪個構(gòu)造器創(chuàng)建子類對象,需要保證先初始化父類。

目的是,當(dāng)子類繼承父類后,“繼承”父類所有的屬性和方法,因此子類有必要知道父類如何為對象進(jìn)行初始化。

從結(jié)果上看:繼承性

子類繼承父類以后,就獲取了父類中聲明的屬性或方法。

創(chuàng)建子類的對象,在堆空間中,就會加載所父類中聲明的屬性。

從過程上看:

當(dāng)我們通過子類的構(gòu)造器創(chuàng)建子類對象時,我們一定會直接或間接的調(diào)用其父類的構(gòu)造器,進(jìn)而調(diào)用父類的父類的構(gòu)造器,…直到調(diào)用了java.lang.Object類中空參的構(gòu)造器為止。正因為加載過所的父類的結(jié)構(gòu),所以才可以看到內(nèi)存中父類中的結(jié)構(gòu),子類對象才可以考慮進(jìn)行調(diào)用。

強(qiáng)調(diào)說明:

雖然創(chuàng)建子類對象時,調(diào)用了父類的構(gòu)造器,但是自始至終就創(chuàng)建過一個對象,即為new的子類對象。


html內(nèi)聯(lián)元素和塊級元素的基本概念及使用示例

前端達(dá)人

html標(biāo)簽分為兩種,內(nèi)聯(lián)元素和塊級元素,首先我們先了解一下內(nèi)聯(lián)元素和塊級元素的概念:



塊級元素:一般是其它元素的容器,可容納內(nèi)聯(lián)元素和其它塊級元素,塊級元素排斥其它元素與其位于同一行,可設(shè)置寬度(width)高度(height)屬性,正常流中的塊級元素會垂直擺放。常見塊狀元素為“div”



內(nèi)聯(lián)元素(行內(nèi)元素):內(nèi)聯(lián)元素只能容納文本或者其他內(nèi)聯(lián)元素,是塊級元素的后代,它允許其他內(nèi)聯(lián)元素與其位于同一行,不能設(shè)置高度(height)和寬度(width)。常見內(nèi)聯(lián)元素為“a”。



根據(jù)塊級元素的概念我們可以理解為塊級元素前后帶有換行符,也就相當(dāng)于元素前后加了一個<br>標(biāo)簽。我們可以把塊級元素想象成一個塊或一個矩形,所以塊級元素能設(shè)置高度寬度屬性



新建一個前端學(xué)習(xí)qun438905713,在群里大多數(shù)都是零基礎(chǔ)學(xué)習(xí)者,大家相互幫助,相互解答,并且還準(zhǔn)備很多學(xué)習(xí)資料,歡迎零基礎(chǔ)的小伙伴來一起交流。

例:

css文件:

 



復(fù)制代碼



代碼如下:




div1{ 

width:200px; 

height:200px; 

background:#666 



div2{ 

width:200px; 

height:200px; 

background:#F00 

}





html文件: 

 



復(fù)制代碼



代碼如下:





<div id="div1"> 

div1 

塊級元素排斥其他元素與其位于同一行 

</div> 

<div id="div2"> 

div2 

塊級元素排斥其他元素與其位于同一行 

</div>





顯示效果: 



兩個div元素不位于同一行



 



根據(jù)內(nèi)聯(lián)元素的概念,我們可以理解為內(nèi)聯(lián)元素前后沒有換行符。我們可以把內(nèi)聯(lián)元素想象成一條線,所以它不能設(shè)置height屬性和width屬性。



塊級元素(block element)標(biāo)簽



address -地址

blockquote - 塊引用

center – 居中對齊

dir -目錄列表

div - 常用塊級容易,也是CSS layout的主要標(biāo)簽

dl - 定義列表

fieldset - form控制組

form - 交互表單

h1 - 大標(biāo)題

h2 - 副標(biāo)題

h3 - 3級標(biāo)題

h4 - 4級標(biāo)題

h5 - 5級標(biāo)題

h6 - 6級標(biāo)題

hr - 水平分隔線

isindex - input prompt

menu - 菜單列表

noframes - frames可選內(nèi)容,(對于不支持frame的瀏覽器顯示此區(qū)塊內(nèi)容

noscript - 可選腳本內(nèi)容(對于不支持script的瀏覽器顯示此內(nèi)容)

ol - 排序表單

p - 段落

pre - 格式化文本

table - 表格

ul - 非排序列表



內(nèi)聯(lián)元素(inline element)



a - 錨點

abbr - 縮寫

acronym - 首字

b - 粗體(不推薦)

bdo - bidi override

big - 大字體

br - 換行

cite - 引用

code - 計算機(jī)代碼(在引用源碼的時候需要)

dfn - 定義字段

em - 強(qiáng)調(diào)

font - 字體設(shè)定(不推薦)

i - 斜體

img - 圖片

input - 輸入框

kbd - 定義鍵盤文本

label - 表格標(biāo)簽

q - 短引用

s - 中劃線

samp - 定義范例計算機(jī)代碼

select - 項目選擇

small - 小字體文本

span - 常用內(nèi)聯(lián)容器,定義文本內(nèi)區(qū)塊

strike - 中劃線

strong - 粗體強(qiáng)調(diào)

sub - 下標(biāo)

sup - 上標(biāo)

textarea - 多行文本輸入框

tt - 定義打字機(jī)文本

————————————————

版權(quán)聲明:本文為CSDN博主「前端學(xué)習(xí)線路」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/webxuexi168/article/details/104382660

CSS簡單實現(xiàn)圣杯布局和雙飛翼布局

seo達(dá)人

一、你能學(xué)到什么?

①如何使用css變量 ②實現(xiàn)圣杯布局和雙飛翼的簡單思路 ③了解浮動和margin的特性



css變量設(shè)置(兩個布局都有的部分)

:root{

    / 左邊欄寬度 /

    --lw:300px;

    /負(fù)左邊欄寬度/

    --lwf:-300px;

    / 右邊欄寬度 /

    --rw:400px;

    /負(fù)左邊欄寬度/

    --rwf:-400px;

    / 高度 /

    --height:300px;

}



二、圣杯布局的html和css代碼

html部分

  <div class="holyGrail">

    <div class="hg_main">main</div>

    <div class="hg_left">left</div>

    <div class="hg_right">right</div>

  </div>



css 實現(xiàn)對應(yīng)的四個class

.holyGrail {

    height: var(--height);

    / 留出左右兩欄的布局 為了字體不被覆蓋/

    padding-left: var(--lw);

    padding-right: var(--rw);

}

.hg_main{

    width:100%;

    float: left;

    height: var(--height);

    background-color: blanchedalmond;

}

.hg_left{

    position: relative;

    left: var(--lwf);

    float: left;

    margin-left: -100%;

    width:var(--lw);

    height: var(--height);

    background-color: blueviolet;

}

.hg_right{

    float: left;

    margin-right: var(--rwf);

    width:var(--rw);

    height: var(--height);

    background-color: brown;

}





三、雙飛翼布局的html和css代碼

html部分

<div class="doubleWing">

    <div class="dw_main">

      <div class="dw_con">main</div>

    </div>

    <div class="dw_left">left</div>

    <div class="dw_right">right</div>

  </div>



css 實現(xiàn)對應(yīng)的五個class

.doubleWing{

    padding-right: var(--rw);

}

.dw_left{

    float: left;

    margin-left: -100%;

    width:var(--lw);

    height: var(--height);

    background-color: blueviolet;

}

.dw_main{

    width:100%;

    float: left;

    height: var(--height);

    background-color: blanchedalmond;

}

.dw_con {

margin-left: var(--lw);

}

.dw_right{

    float: left;

    margin-right: var(--rwf);

    width:var(--rw);

    background-color: brown;

    height: var(--height); 

}



四、學(xué)會兩個布局的注意點

圣杯布局

在最外邊的類(holyGrail)左右要留出左欄和右欄的寬度(使用padding-left,padding-right)

中間的div.hg_main放在最上面,優(yōu)先渲染,中間div自適應(yīng),width為100%

左中右欄的div都設(shè)置浮動,左欄通過margin-left:-100%移動到和中間的div同一起點,然后通過position: relative;

left: -(左欄的寬度);會移動到最外層div的左內(nèi)邊距的區(qū)域(中間div的左邊)

右欄可以通過margin-right:-(右欄的寬度);移動到最外層div的右內(nèi)邊距的區(qū)域(中間div的右邊)

雙飛翼布局

在中欄的div再加一個div,設(shè)置margin-left:左欄的寬度,這樣可以省略左欄的div使用postion和left的屬性移動

最外層的div可以不用預(yù)留左欄的位置了

五、兩個布局的對比的優(yōu)缺點

布局 優(yōu)點 缺點

圣杯 無多余dom 當(dāng)中間的寬度小于左右的寬度時,結(jié)構(gòu)混亂

雙飛翼 可以支持各種寬度,通用性強(qiáng)較強(qiáng) 需要多加一層dom

代碼下載地址

記得一定要自己去實現(xiàn)一下


html+css基礎(chǔ)教程入門篇之css選擇器詳細(xì)解讀

前端達(dá)人

CSS 選擇器分組



CSS選擇器分組,可以把定義相同屬性的不同標(biāo)簽做為一組處理,縮短了CSS樣式編寫的時間和CSS樣式表的大小。



例如希望h2和p標(biāo)簽的字體顏色都設(shè)置為黑色,則可以寫成:



h2,p{color:black;}

通過分組,可以將相同屬性的樣式“壓縮”在一起,這樣就可以得到更簡潔的樣式表。例如:



/ no grouping /

h1 {color:blue;}

h2 {color:blue;}

h3 {color:blue;}

h4 {color:blue;}

h5 {color:blue;}

h6 {color:blue;}



/ grouping /

h1, h2, h3, h4, h5, h6 {color:blue;}



當(dāng)有多個標(biāo)簽有相同屬性時,可以抽出相同屬性進(jìn)行分組,不同的屬性另外書寫樣式。



除了使用標(biāo)簽來進(jìn)行相同標(biāo)簽CSS選擇外,還可以使用類選擇器來選擇。



類選擇器前面使用符號.



(1)基本使用



為了將類選擇器的樣式與元素關(guān)聯(lián),必須將 class 指定為一個適當(dāng)?shù)闹?。例如?br />


<h1 class="important">This heading is very important.</h1>

<p class="important">This paragraph is very important.</p>

在樣式表中定義:



.important {color:red;}

這樣定義后,class為important的h1和p標(biāo)簽的字體顏色也就都是紅色。



(2)結(jié)合元素選擇器



類選擇器可以結(jié)合元素選擇器來使用。



例如,您可能希望只有段落顯示為紅色文本:



p.important {color:red;}

這個樣式表示的是,所有class為important ,且為p標(biāo)簽的元素中的字體為紅色。其他標(biāo)簽的無效。



(3)CSS 多類選擇器



一個標(biāo)簽可以定義多class,則這個標(biāo)簽有這多個class的所有屬性,例如:



<p class="important warning">This paragraph is a very 

important warning.</p>





.important {font-weight:bold;}

.warning {color:red;}



例子中為p標(biāo)簽定義了important和warning兩個class,所以p標(biāo)簽的字體是加粗且字體顏色是紅色的。

————————————————

版權(quán)聲明:本文為CSDN博主「前端學(xué)習(xí)線路」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/webxuexi168/article/details/104349157

關(guān)于javascript跳轉(zhuǎn)與返回和刷新頁面

seo達(dá)人

javascript中window.open()與window.location.href的區(qū)別

window.open(‘index.html’) 表示新增一個窗口打開 index.html 這個頁面,并不刷新

location.href(‘index.html’) 表示在當(dāng)前窗口重定向到新頁面,打開并刷新 index.html 這個頁面



window.location 是 window 對象的屬性,用來替換當(dāng)前頁,也就是重新定位當(dāng)前頁

而window.open 是 window 對象的方法,是用來打開一個新窗口的函數(shù)



// 打開新頁面

// 注意:有些瀏覽器的安全設(shè)置會將window.open()屏蔽,例如避免彈出廣告窗

window.open('./index.html');



// 在原窗口打開新頁面

window.location.href="./index.html";



window.open()詳解



window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=n o, status=no')





參數(shù)解釋: 三個參數(shù)

window.open 彈出新窗口的命令;

‘page.html’ 彈出窗口的文件名;

‘newPage’ 彈出窗口的名字(不是文件名),非必須,可用空’'代替;

height=100 窗口高度;

width=400 窗口寬度;

top=0 窗口距離屏幕上方的象素值;

left=0 窗口距離屏幕左側(cè)的象素值;

toolbar=no 是否顯示工具欄,yes為顯示;

menubar=no 是否顯示菜單欄,yes為顯示;

scrollbars=no 是否顯示滾動欄,yes為顯示;

resizable=no 是否允許改變窗口大小,yes為允許;

location=no 是否顯示地址欄,yes為允許;

status=no 是否顯示狀態(tài)欄內(nèi)的信息(通常是文件已經(jīng)打開),yes為允許;



常用的js返回與刷新頁面

在此用a標(biāo)簽舉例





<a href="javascript: history.back(-1)">返回上一頁</a> 

<a href="javascript:history.go(-1)">返回上一頁</a> 

<a href="javascript:history.go(-2)">返回前兩頁</a> 

<a href="javascript:location.reload()">刷新當(dāng)前頁面</a> 

<a href="javascript:" onclick="self.location=document.referrer;">返回上一頁并刷新</a> 





js





// 刷新當(dāng)前頁面

window.location.Reload();

self.location.reload();

window.location.href = window.location.href;


耍好控件 | 了解圖標(biāo)落地,讓前端再愛你一次

ui設(shè)計分享達(dá)人

文中涉及到的所有工具與插件,考慮到部分小伙伴可能下載外網(wǎng)資源太慢,我已將相關(guān)插件全部打包整理完畢,可在公眾號中領(lǐng)??!

如期而至,這是標(biāo)簽欄控件總結(jié)的第二期。

 

 

這一期我們來聊一聊標(biāo)簽欄中的關(guān)鍵元素——圖標(biāo)。在此之前,如果你還沒有了解標(biāo)簽欄的平臺規(guī)范,可以回顧:《沒弄懂標(biāo)簽欄之前,先不談用戶體驗》

 

圖標(biāo)其實存在于界面中的許多地方,但因為這一期主要分析標(biāo)簽欄,所以我會借標(biāo)簽欄中較主流的圖標(biāo)樣式,總結(jié)一套圖標(biāo)制作與落地方法。這些方法在圖標(biāo)制作過程中都是相通的,大家可以舉一反三。

 

 

一、標(biāo)簽欄圖標(biāo)規(guī)范

 

1.1 圖標(biāo)樣式

 

圖標(biāo)具體樣式風(fēng)格的定義是非常主觀的,網(wǎng)絡(luò)上也流傳著許多的教程教大家如何設(shè)計五花八門的圖標(biāo),所以在這里我就不再贅述了。我主要來總結(jié)一下基礎(chǔ)的標(biāo)簽欄圖標(biāo)一般有哪些樣式變化。

 

我調(diào)研了諸多的應(yīng)用程序,發(fā)現(xiàn)主流的APP標(biāo)簽欄樣式變化,大致分為以下五種。其中最占比最多的是“由線型轉(zhuǎn)面型”。

 


 

調(diào)研的應(yīng)用程序中,所有使用到線性圖標(biāo)的應(yīng)用程序,都將描邊粗細(xì)限制在1pt-2pt之間。

 

 

1.2 圖標(biāo)視覺大小

 

上一期我們講到,iOS定義了一套標(biāo)簽欄圖標(biāo)的尺寸規(guī)范。

 

 


iOS在這里所定義的尺寸并不是圖標(biāo)文件最后輸出的尺寸,而是給設(shè)計師作圖時,針對不同圖標(biāo)形狀的參考尺寸,目的是為了讓圖標(biāo)的視覺大小看上去一致。

 

那么為什么iOS會根據(jù)不同的圖標(biāo)形狀給出不同的圖標(biāo)尺寸呢?因為50px*50px的正方形比50px*50px的圓形面積更大,所以正方形的視覺大小也會大于圓形。為了統(tǒng)一圖標(biāo)的視覺大小,正方形要做適當(dāng)?shù)?strong style="outline:0px;margin:0px;padding:0px;">面積收縮處理。(矩形同理)

 

 

于是我們看到許多平臺都推出了圖標(biāo)輔助網(wǎng)格規(guī)范。其實如果遵從“面積相等”原理,理論上所有的圖標(biāo)網(wǎng)格都應(yīng)該由下面這一套推理公式得出(以Material Design 標(biāo)準(zhǔn)圖標(biāo)網(wǎng)格為例):

 

 

但實際情況是,不同平臺的圖標(biāo)輔助網(wǎng)格規(guī)范建議尺寸都有一定的差異。原因就在于,雖然有時候我們參考“面積相等”原則對圖標(biāo)視覺尺寸進(jìn)行了規(guī)范,但項目落地后發(fā)現(xiàn)視覺上可能還是有一些不協(xié)調(diào),所以最終設(shè)計師還是會憑借自己的主觀判斷再進(jìn)行微調(diào)。

 
記?。汉玫脑O(shè)計作品是理性的設(shè)計理論與設(shè)計師本身感性的碰撞結(jié)果,二者缺一不可。

 

1.3 圖標(biāo)輸出尺寸

 

iOS規(guī)定標(biāo)簽欄圖標(biāo)的輸出尺寸統(tǒng)一為31pt*28pt;Material Design規(guī)定標(biāo)簽欄圖標(biāo)的輸出尺寸統(tǒng)一為24dp*24dp。

 

但我們發(fā)現(xiàn),在借助了圖標(biāo)網(wǎng)格解決了圖標(biāo)視覺大小的問題之后,每一個不同形狀的圖標(biāo),尺寸其實是不同的。為了方便前端落地,我們在輸出切圖文件時,要保持每一個圖標(biāo)文件的輸出尺寸是相同的。該怎么辦呢?

 

于是我們將一組圖標(biāo)都放置在一個比圖標(biāo)本身略大的相同尺寸容器中。而圖標(biāo)與這個容器之間的空白像素,正好也幫助我們規(guī)避了圖標(biāo)落地后,切圖邊緣像素可能被截斷的現(xiàn)象發(fā)生,所以我們稱這個區(qū)域為“安全邊距”。

 

 

對于安全邊距的規(guī)定:Material Design全平臺規(guī)定圖標(biāo)的安全間距統(tǒng)一2dp;iOS則根據(jù)不同的圖標(biāo)使用場景給出的不同的圖標(biāo)網(wǎng)格和圖標(biāo)安全間距


二、靜態(tài)圖標(biāo)


標(biāo)簽欄的圖標(biāo)一般分為靜態(tài)圖標(biāo)和動態(tài)圖標(biāo)兩種。


靜態(tài)圖標(biāo)的實現(xiàn)方法相對容易,可以與前端溝通確定本次項目交付的標(biāo)簽欄圖標(biāo)文件是采用位圖還是矢量圖。如果是位圖建議交付.png格式文件;如果是矢量圖建議交付.svg格式文件。


2.1 位圖圖標(biāo)

 

使用位圖時請注意以下兩點:

 

1)不同項目環(huán)境輸出的切圖套數(shù)不同

 

· 交付iOS原生的標(biāo)簽欄圖標(biāo)切圖需要 @1x/@2x/@3x 三種倍率的切圖文件;


· 交付Android原生的標(biāo)簽欄圖標(biāo)切圖需要 @1.5x/@2x/@3x/@4x 四種倍率的切圖文件(@0.75x和@1x切圖層分別用于ldpi和mdpi分辨率設(shè)備,但這些設(shè)備現(xiàn)在幾乎已退出市場,所以可不考慮,但最終視項目真實需求確定。);


· 交付web項目的切圖需要試情況而定,一般常用 @2x 切圖,因為@2x向下適配@1x、向上適配@3x,都不會產(chǎn)生太大的圖片失真。但有時候前端小哥會要求用到其他倍率切圖,所以最終以具體需求而定。

 

請注意:這里我所提到的倍率全都是“絕對倍率”,這個概念非常關(guān)鍵。

 

“絕對倍率”指的是:以上所有的倍率都是針對 @1x 設(shè)計稿下的輸出倍率尺寸。而當(dāng)你使用@2x作圖時,為了保證“絕對倍率”不變,你的切圖輸出倍率就應(yīng)該設(shè)置為 @0.5x/@1x/@1.5x 。

 

如果你在@2x下作圖,卻依然保持輸出 @1x/@2x/@3x 的切圖,那你輸出的文件尺寸最終其實是 @2x/@4x/@6x。

 

有一點繞的話,我們以Sketch導(dǎo)出位圖切圖為例:

 

 

所以如果你日常使用的是Sketch,也是用Sketch原生導(dǎo)出工具,那你的切圖預(yù)設(shè)應(yīng)該根據(jù)你的作圖尺寸而定,見下表:

 

 

如果你日常使用的是PS,用Cutterman切圖,那么Cutterman會自動識別你當(dāng)前的畫板,然后根據(jù)它的寬(橫屏情況下是高)來設(shè)定它的基準(zhǔn)分辨率。那么你在任何情況下輸出 @1x/@2x/@3x 的切圖,其實都是“絕對倍率”,不用像Sketch當(dāng)中一樣換算。前提是“設(shè)置當(dāng)前畫布為:Auto(自動識別)”。

 

 

假設(shè)你在@2x下作圖,執(zhí)意不管不顧“絕對倍率”,又忘了交代前端人員手動處理切圖尺寸的話,那你所有的切圖尺寸實際都是設(shè)計稿所需圖標(biāo)尺寸的2倍。就算前端小哥幫你手動處理了切圖尺寸,每一張切圖所包含的像素信息,都比項目真實所需的要多很多,完全就是在徒增所需切圖文件的大小。

 

2)注意切圖文件大小

 

切記,公司的線上項目中,用戶從服務(wù)器下載的每一單位的流量都是要公司花錢的,所以許多項目管理者都是很在意控制線上文件大小的。于是壓縮切圖是UI必備的技能之一。

 

雖然圖標(biāo)的文件大小一般只有幾KB,但是項目大了難免積少成多,所以在真實項目中,不管任何切圖我都會手動壓縮一次。

 

這里推薦一個壓縮.png文件大小,但幾乎不會產(chǎn)生失真的免費網(wǎng)站 tinypng

 

 

2.2 矢量圖

 

位圖切圖會面臨交付的倍率圖過多、容易失真、文件大小難控制等問題,但對于矢量圖,這些問題都得到了解決。目前.svg矢量圖落地也在項目中越來越流行了。UI可以在Sketch或Ai中制作。

 

一般與前端人員對接有在線圖標(biāo)庫對接與本地文件對接兩種。

 

在線矢量圖標(biāo)庫有很多,國內(nèi)比較流行的是阿里巴巴矢量圖標(biāo)庫-iconfont;本地對接就是直接將文件發(fā)送給前端人員,他們會自行進(jìn)行項目文件的管理與調(diào)用。

 

如果.svg切圖輸出后,與設(shè)計稿中樣式不符,請注意排查以下三點:

 

1、svg不支持漸變顏色填充;

2、svg不支持描邊,請將所有的描邊輪廓化。Sketch中可通過“圖層-輪廓化”(快捷鍵??O);Ai中可通過“對象-路徑-輪廓化描邊”;

3、要確保一組圖標(biāo)的文件尺寸一致,需在圖標(biāo)下方增加一個透明方形,和圖標(biāo)一同導(dǎo)出。


 

  

三、動態(tài)圖標(biāo)

 

為了提升用戶體驗和產(chǎn)品趣味性,動效微交互的標(biāo)簽欄圖標(biāo)也越來越流行了。

 

 

動效在前端落地的方法其實有很多:

 

· 前端代碼直接實現(xiàn):代碼是很強(qiáng)大的,但通常用代碼直接寫復(fù)雜動效會很浪費項目時間。簡單維度的動效如位移、透明度、大小變化等可以借助代碼,但復(fù)雜動效就不要去打擾前端小哥了;

· 直接剛gif:這已經(jīng)是老舊技術(shù)時代的動畫解決方案了,文件大且請求文件也需要時間,有時候無法給用戶及時的觸控反饋。再者它是位圖的原因,在高分辨率屏幕上縮放容易失真。

· png序列幀:我們知道,動畫是一張一張的靜態(tài)圖交替變化形成的。如果將每一幀動畫都拆分成一張圖片,就有了png序列幀。所以一套動畫的png序列幀往往非常多,文件大小自然就變大了。所以后來也有團(tuán)隊引進(jìn)了雪碧圖的方式,但文件大小依然不樂觀。并且同樣是位圖的原因,高分辨率屏幕容易失真。

· Facebook Pop/Rebound/Keyframes:Facebook Pop/Rebound是Facebook給iOS和Android提供的常用動畫預(yù)設(shè),是較早將動效代碼化的開源技術(shù)方案,但動畫效果預(yù)設(shè)只有彈簧/衰減等一些簡單樣式。后來Facebook又推出了Keyframes,允許設(shè)計師自己在Ae中自定義動畫并導(dǎo)出,然后交付給前端人員。

· Lottie動畫:和Facebook Keyframes相同,都是結(jié)合Ae輸出動畫代碼。但是Lottie更厲害的地方在于,它比起Facebook Keyframes來支持的Ae樣式更多,例如蒙版、遮罩、修剪路徑等等。

 

所以綜上所述,落地標(biāo)簽欄動態(tài)圖標(biāo),目前最可行的還是Lottie動畫。

 

3.1 Lottie的背景

 

Lottie是Airbnb開源的一個跨平臺動畫庫。表現(xiàn)層面它是一張圖片,但實現(xiàn)的方式是通過代碼,所以它是矢量的。很花式的動畫也可以把文件大小做到非常小。

 

UI與前端對接是通過交付一個json代碼文件。

 

如果這是你第一次接觸Lottie,再好不過的體驗方法就是玩一玩阿里提供的一站式動畫平臺:犸良動畫 。它最底層采用的技術(shù)就是Lottie,只是被阿里二次封裝了許多預(yù)設(shè)的動畫效果,你可以自定義其中的元素與參數(shù),然后試著導(dǎo)出你的第一個json文件~

 

3.2 Lottie如何上手

 

接下來是簡單粗暴的UI與前端對接實現(xiàn)Lottie動畫落地的全步驟參考。在此之前,想要全方位了解Lottie的相關(guān)信息,請參閱Lottie官方說明文檔。

 

· 步驟一:安裝Ae和bodymovin

 

制作Lottie動畫,首先你必需兩個工具:Ae和bodymovin插件。

 

Ae版本要求為Ae CC2014。又因為據(jù)很多設(shè)計師反饋,目前bodymovin在漢化后的Ae中使用會出現(xiàn)諸多問題,所以后面的教程都是基于Ae英文版。如果你漢化了Ae,最好在需要制作Lottie動畫時取消漢化。

 

然后獲取bodymovin。bodymovin插件更新至今,版本已非常多,并不一定版就適用于你當(dāng)前的項目,因為前端使用的bodymovin解析包可能無法解析你用版bodymovin插件輸出的json文件。

 

 

一旦確定使用Lottie,前端人員會在GitHub查詢Lottie相關(guān)文檔的,所以UI只需要配合前端確定一下合適的bodymovin插件版本就可以了。最終走查時,一定要確保當(dāng)前bodymovin輸出的動畫在項目所需要運行的所有環(huán)境中可運行,才說明UI使用的bodymovin插件和前端使用的bodymovin解析包版本是兼容的。

 

獲取了bodymovin后,將bodymovin拖入到ZXP Installer中,ZXP Installer會自動識別插件安裝到Ae。

 

 

安裝完成后,就可以在AE的“窗口-擴(kuò)展”中看到bodymovin啦~

 

 

· 步驟二:將Sketch或Ai中的文件導(dǎo)入Ae

 

如果你技術(shù)嫻熟,當(dāng)然也可以直接在Ae中繪制圖案動畫。但如果你還是習(xí)慣先在其他軟件中繪制好基礎(chǔ)圖案,再到Ae中制作動畫,那你需要了解如何將圖案導(dǎo)入Ae。

 

Ai和Ae都是Adobe旗下的工具,所以Ae是可以完美解析.ai文件的,如果你是使用Ai作圖,可直接存儲為.ai文件,再在Ae中打開。

 

 

如果你使用的是Sketch,可以先導(dǎo)出為.svg,再用Ai打開該.svg文件,轉(zhuǎn)換存儲格式為.ai,最后到Ae中打開。

 

當(dāng)然,Sketch還有直接和Ae對接的插件,AEUX(前身Sketch2AE)。需要在Sketch和Ae中同時安裝AEUX插件,Sketch負(fù)責(zé)傳送,Ae負(fù)責(zé)接收。具體的使用方法可以在官網(wǎng)教程中查看,我就不再贅述了。

 

 

·步驟三:制作動效并輸出

 

和靜態(tài)圖標(biāo)同理,為了保證落地時圖標(biāo)視覺大小一致,一組動效圖標(biāo)輸出的文件尺寸應(yīng)該是相同的。所以在你制作動畫之前需要確定合成文件的尺寸。Lottie官方建議:因為Lottie輸出的是矢量動畫,所以建議以@1x輸出動效,前端人員在任何屏幕上放大并不會失真。

 

 

在制作之前請務(wù)必詳細(xì)閱讀Lottie所支持的Ae參數(shù)文檔,以免辛苦做出的動效,前端無法解析。特別提醒:原生環(huán)境中bodymovin是不支持解析Ae表達(dá)式的。

 

完成制作動效后,就可以通過bodymovin導(dǎo)出動效了。

 

  

·步驟四:預(yù)覽與交付

 

導(dǎo)出完成后在你的目的地文件夾中將存在一個.json文檔,如果你的動效中還使用了位圖,系統(tǒng)還會自動生成一個images文件夾。這些都是你需要交付給與你對接的前端開發(fā)人員的文件。

 

 

.json文件中記錄的動效代碼UI不需要過多關(guān)心,但是其中兩個信息你是一定要了解的。它們是你與前端對接溝通和獲悉文件信息的一些關(guān)鍵參數(shù)。

 

 

UI自檢動效或其他相關(guān)人員需要預(yù)覽動效的時候,可以用LottieFiles,拖入.json文件即可預(yù)覽。iOS和Android還可以下載LottieFiles APP,掃描預(yù)覽頁中的二維碼即可在移動端預(yù)覽。

 

四、總結(jié)

 

整個制作圖標(biāo)的流程我已經(jīng)全部整理出來了。首先要注意圖標(biāo)的規(guī)范,然后制作位圖、矢量、動效圖標(biāo)時的注意點,我?guī)缀醢盐以谡鎸嶍椖恐胁冗^的坑都告訴大家了。剩下的創(chuàng)造性的環(huán)節(jié)就交給你了!

 轉(zhuǎn)自:站酷-UCD耍家 

交互設(shè)計:如何做到驚喜?

ui設(shè)計分享達(dá)人

保持好奇,巧妙融合,追求卓越,自然而然


上一篇,探討了如何做到品質(zhì)。這一篇,探討下如何做到驚喜。

一家之言,未必全面,甚至未必正確。歡迎交流探討。


01
交互設(shè)計的驚喜,是什么?

之前的文章,有簡單定義過交互設(shè)計的“驚喜”,即為:超出用戶預(yù)期,并讓用戶開心。

具體而言有兩類,分別是:小驚喜、大驚喜。

1 小驚喜

所謂小驚喜,是指一些頗具趣味性或人文屬性的交互設(shè)計小細(xì)節(jié)。


先說趣味性。常見的有兩類,第一類是比較好玩的動效,第二類是一些小功能。第二類有時也會包含第一類。

動效這塊,大家比較熟悉的,有 iPhone 上刪除應(yīng)用前圖標(biāo)的抖動,仿佛是嚇的發(fā)抖,也可能是在搖頭求饒;還有移動端登錄 B 站、輸入密碼時,動畫人物的捂眼捂臉動作。

(B 站登錄頁面)

小功能這塊,也可以分成兩類。一類是隱藏的小功能,一類是有趣的小功能。


很多隱藏功能,頭幾次用的時候,多少會有一些驚喜之感。

比如在訂閱號消息列表頁,某個公眾號你已經(jīng)幾個月沒看過,對它失去了興趣和信任。這時,嘗試長按這個公眾號的頭像或名稱,會呼出一個包含“刪除消息”和“取關(guān)”功能的彈窗。

(訂閱號消息列表)

還有些隱藏功能,既能讓用戶覺得驚喜和方便,又能引發(fā)用戶思考。這種思考,可能會讓用戶感嘆設(shè)計之妙,也可能也會給用戶一種猜對謎語的欣喜之感。

比如用墨刀的時候,嘗試按數(shù)字鍵 1,會呼出“內(nèi)置組件”這個使用頻率非常高的功能,會讓人覺得墨刀很聰明。

如果再仔細(xì)看一下,會發(fā)現(xiàn),“內(nèi)置組件”的縮略圖標(biāo),和其他 4 個諸如“我的組件”、“圖標(biāo)”等功能的縮略圖標(biāo),并成一列。這 5 個縮略圖標(biāo)的排列順序(上到下),和它們快捷鍵("、"鍵和數(shù)字鍵1、2、3、4)的排列順序(左到右),是完全一致的。不得不說,這是一個簡單又巧妙的設(shè)計。


再比如朋友圈里,某個不熟的好友每天都發(fā)集贊的小廣告,搞的我們不勝其煩。長按其頭像,會呼出設(shè)置權(quán)限(屏蔽等)的功能。

有意思的是,長按好友名字,則不會呼出這個功能。要知道點擊頭像或名字是都能進(jìn)入好友主頁的;另外剛才那個例子,長按公眾號頭像或名字,也都能呼出取關(guān)的彈窗。

個人的理解,生活中,我們用力長按一個人,通常是表達(dá)強(qiáng)烈不滿,比如打架時。比起長按名字,長按頭像更像是長按真人,所以也更能表達(dá)我們的不滿。


說完隱藏的小功能,再說下有趣的小功能。比如微信聊天里的扔骰子、石頭剪刀布,微信給朋友發(fā)生日快樂后漫天飄落的蛋糕,拍照軟件里的貼紙,等等。

最后說下帶有人文屬性的交互設(shè)計小細(xì)節(jié)。常見的有如下類型:幫助弱勢、關(guān)照情緒、表達(dá)情感、保護(hù)隱私。


幫助弱勢這塊,比如 iPhone 的輔助功能,里面有針對視力障礙的放大鏡功能、有針對不識字群體的旁白功能。

關(guān)照情緒這塊,很重要的一點,就是避免引起用戶的負(fù)面情緒。比如微信的刪好友是單方面刪除,被刪時我們很難察覺到,而且微信也不會通知我們。個人覺得,微信之所以不通知我們,其中一點,就是不給我們添堵。類似的還有,微信消息沒有“已讀”功能,這就大大減輕了接收者的回復(fù)壓力。

表達(dá)情感這塊,比較為人所知的例子,5 月 20 號這天,微信紅包的限額,從 200 元升到了 520 元。還有一個例子,在微信聊天里發(fā)一個“ohh”,長按并點翻譯,結(jié)果也是一個驚喜。

保護(hù)隱私這塊,比如借助 iPhone 的“引導(dǎo)式訪問”功能,可以讓小朋友只能訪問你的某個視頻應(yīng)用來看動畫片。再比如別人用你電腦的時候,如果你不想讓對方看到你的微信,就可以通過手機(jī)微信來鎖定或退出電腦版微信。

2 大驚喜

所謂大驚喜,是指那些系統(tǒng)性大創(chuàng)新,并且能夠引領(lǐng)潮流、代表未來的交互設(shè)計。通常而言,這些大驚喜,最開始給用戶的感覺,就是酷。

iPhone 就是典型例子之一 。

2007 年的初代 iPhone,帶來了當(dāng)時的大屏幕:3.5 寸屏幕,以及純觸摸屏,和極為靈敏的觸控體驗。

2011 年,Siri 同 iPhone 4S 一起問世,為我們帶來了語音交互。如今,在 100 元就能買到品牌類智能音響的情況下,依靠語音交互的智能音響也在慢慢走入尋常百姓家。

也許后喬布斯時代的 iPhone 創(chuàng)新不如以前,但不可否認(rèn)的是,時至今日,iPhone 依然在引領(lǐng)潮流,在給我們大驚喜。比如這幾年流行的手機(jī)無線充電和以 AirPods 為代表的極簡的無線耳機(jī)。

以上是比較廣為人知的交互設(shè)計,還有一些不太為人所知的設(shè)計。比如在家里網(wǎng)購一條床單,但是不知道床的尺寸,家里又沒有尺子。這時,打開 iPhone 里的測距儀這款 App,就可以量出床的尺寸,會不會覺得有點酷。

(測距儀 App)

微信在引領(lǐng)潮流方面也有一些建樹,比如極大的普及了二維碼和掃一掃。小程序作為一種體驗接近原生 App、同時又不用下載的產(chǎn)品,也正在引領(lǐng)新一輪的潮流。

還有一個比較酷的功能,就是以圖搜圖。筆者最早用過百度和谷歌的相關(guān)功能,主要是在電腦上搜索相似的圖片,使用頻率極低。

假設(shè)一個場景,比如在路上看到一個陌生人的外套很好看,但又不好意思上前問,就可以拿起手機(jī),利用淘寶的拍立淘功能,拍張照就能馬上看到相同或相似的商品。

如果淘寶上沒有搜到類似商品,還可以用微信的掃一掃識物。和拍立淘相比,區(qū)別之處有兩點。第一,不用拍,直接能識別,不過通常得等 1-3 秒;第二,識物結(jié)果里面,除了商品,可能還會有百科詞條和資訊。


02
交互設(shè)計:如何做到驚喜?

個人覺得,有 4 個要點:既要有好奇心,又要有卓越心;既要天馬行空,又要保持自然。

聽起來可能有點亂,且聽筆者一一道來。


1 保持好奇心

筆者觀察身邊讀小學(xué)的小孩,發(fā)現(xiàn),當(dāng)大人聊天時,特別是談?wù)聲r,小孩特別喜歡坐在旁邊聽,而且聽的很認(rèn)真。小孩有時也會說兩句,或是問問題,或是發(fā)表自己的看法。

看得出來,小孩對成年人的世界,懷有極大的好奇心。實際上,不止于成年人的世界,小孩對周遭世界都有比較強(qiáng)烈的好奇心。

整體而言,成年人對周遭世界的好奇心,遠(yuǎn)不如小孩。我們互聯(lián)網(wǎng)從業(yè)者也不例外。

好奇心和交互設(shè)計,有什么關(guān)系?

交互設(shè)計,某種程度上,也是一種創(chuàng)作。好的創(chuàng)作,一定來自生活。這就需要我們?nèi)ビ^察生活。

觀察生活,非常重要的一點,就是好奇心,對周遭人、事、物要有足夠的好奇心。

比如上文提到的例子,在 iPhone 上刪除應(yīng)用前,應(yīng)用圖標(biāo)會抖。這種抖是一種趣味隱喻,既可以理解成嚇的發(fā)抖,也可以理解成搖頭求生。如果對生活沒有足夠的好奇心,是很難留意到這種生活細(xì)節(jié),并把它們作為一種隱喻運用到交互設(shè)計中的。

以上是關(guān)于好奇心,還有一種特質(zhì),也是在小孩身上表現(xiàn)突出,同時也和本文主題有關(guān),那就是:童趣。

還是上文的例子,在 B 站 App 上輸入登錄密碼時,動畫人物會捂眼睛。這個設(shè)計,可能不會打動所有用戶,但至少一部分用戶會覺得比較有趣。如果我們內(nèi)心沒有一點童趣,可能也會覺得,這個設(shè)計,沒啥意思。

玩是人的天性。對于比較好玩的交互設(shè)計,大部分人是比較容易產(chǎn)生共鳴的。實際上,據(jù)筆者觀察,我們大部分從業(yè)者是有童趣的。我們比較缺的,是好奇心。

那么,怎樣判斷自己是否擁有足夠的好奇心,其標(biāo)志是什么?

個人觀點,有兩個標(biāo)志。第一,是對與個人利益無關(guān)的生活小事的關(guān)注,遠(yuǎn)多于對個人利益本身的關(guān)注。第二,觀察和思考,遠(yuǎn)多于評價和自大;追本和溯源,遠(yuǎn)多于偏見和傲慢。

為什么會提到個人利益?

因為,通常而言,個人利益,尤其是短期利益(比如少花時間設(shè)計和修改原型),往往會和用戶體驗存在一個此消彼長的關(guān)系。

如果過于關(guān)注個人利益,不僅很難照顧到用戶體驗,甚至?xí)τ脩趔w驗。至于給用戶帶來驚喜,就更無從談起了。

回到現(xiàn)實當(dāng)中。在時代洪流面前,好奇心的兩個標(biāo)志,顯得很難,該如何實現(xiàn)?

關(guān)鍵在于找到背后的源動力。這個源動力,在筆者看來,有兩點,分別是:求知若渴、淡泊寧靜。


求知若渴,可以源源不斷的驅(qū)動我們?nèi)ビ^察、去思考萬事萬物的規(guī)律和聯(lián)系。

淡泊寧靜,正如諸葛亮在《誡子書》中所說,“非淡泊無以明志,非寧靜無以致遠(yuǎn)”。人的心力和精力終歸是有限的,如果我們沉迷名利、物欲、享樂,就難有興趣和精力去琢磨萬事萬物了。

所以,只要找回自己童年的那種求知若渴,同時修身養(yǎng)性到淡泊寧靜,這份好奇心,就會回來。

2 巧妙融合

某種程度上,很多帶給我們驚喜的交互設(shè)計,都是一種巧妙融合。

筆者把這種巧妙融合,初步分成了三類,分別是:簡單融合、直接融合、委婉融合


簡單融合,最常見的就是隱藏功能。把一個較為簡單的操作動作,比如長按、雙擊、下拉、左滑等,和一個合適的功能,融合在一起。用電腦時我們常說的快捷鍵,也屬于這一類。

通常而言,操作對應(yīng)什么功能,講究的是合適,并無固定章法束縛。比如在微信朋友圈,發(fā)表文字的功能可以靠長按(相機(jī)圖標(biāo))喚起,設(shè)置權(quán)限的功能也可以靠長按(好友頭像)喚起。所以,簡單融合這塊,可供我們發(fā)揮的空間很大。

另外,簡單融合最常見的形式——隱藏功能,既實現(xiàn)了界面的簡潔,又帶來了一定驚喜。

簡單融合,既簡單,又實用。建議大家充分開發(fā)這一塊。

直接融合,是指將生活中的趣味性,直接搬到軟件中,搬到交互設(shè)計中。比如微信聊天中的扔骰子、石頭剪刀布,以及漂流瓶、抽獎等。

這一類融合,有點像商場里的電玩城,雖然我們不會經(jīng)常去玩,但確實比較好玩。

委婉融合,是指用明喻或隱喻的手法,將生活中微不足道的一些細(xì)節(jié),移植到交互設(shè)計中。

這種移植,有時是直白的。比如 Mac 上打開應(yīng)用時,其圖標(biāo)會在 dock 欄里有規(guī)律的彈跳,這會讓我們聯(lián)想到皮球的彈跳。

這種移植,有時是隱晦的。比如 iPhone 上刪除應(yīng)用前,其圖標(biāo)會抖。這種抖,是害怕還是求饒,任憑我們想象。

這種移植,有時是無聲的。比如在朋友圈,要想呼出隱藏的設(shè)置權(quán)限功能,只能長按頭像,長按名字則不行。這個設(shè)計,不乏想象空間。如果不嘗試長按名字,則不會發(fā)現(xiàn)這個細(xì)節(jié)。

委婉融合,有時會帶一些趣味性。更為重要的是,它能夠引發(fā)我們的思考和想象,所以是一種很出彩的融合。這種融合,也會賦予交互設(shè)計,一種禪的味道。

整體而言,筆者非常推薦委婉融合。

3 追求卓越

如果目標(biāo)是小驚喜,則保持好奇心、并做到巧妙融合,基本足矣。

如果目標(biāo)是大驚喜,則需要雄心壯志,需要舍我其誰,需要追求卓越。

日常工作中,可能會有這樣的對話。“這個動效/功能,實現(xiàn)不了”。

大驚喜里的幾個例子,比如初代 iPhone 的觸控體驗,iPhone 里的測距儀,微信的掃一掃識物。這種設(shè)計,意味著要修一條最好的長城,背后往往有很多技術(shù)難題要攻克,有很多臟活累活要做。

如果團(tuán)隊文化就是做出最優(yōu)秀的交互設(shè)計,那么,“實現(xiàn)不了”這句話,估計就聽不到了。取而代之的,可能是:“還在研究中”,“下個大版本能上”。

4 自然而然

提到驚喜,還有一款值得研究和學(xué)習(xí)的產(chǎn)品,那就是錘子手機(jī)的 Smartisan OS。

個人觀點,在小驚喜方面,Smartisan OS 頗有建樹。在大驚喜方面,Smartisan OS 也進(jìn)行了一些值得學(xué)習(xí)的探索。

先說小驚喜,比如華麗而細(xì)膩的桌面翻頁動畫,比如四指橫劃桌面可以切換桌面背景。還有一些貼心的小功能,比如靜音可以設(shè)置時間,比如方便的長截屏。

(靜音可設(shè)置時間)

(長截屏)

再說大驚喜。2016 年 10 月發(fā)布的一步和大爆炸,是比較大比較系統(tǒng)的功能,在當(dāng)時也很新。錘子公司也一直有宣傳這兩個功能。所以相對而言,這兩個功能是 Smartisan OS 的大驚喜。

筆者的備用機(jī)是錘子手機(jī),身邊也有朋友在用錘子手機(jī)。以一步為例,這個功能,筆者體驗過很多次。但平常很少用,身邊朋友的情況也類似。

(一步)

根據(jù)使用情況和主觀感受,個人覺得,一步這個大驚喜,還存在進(jìn)步空間,主要有兩個方面。

第一,宏觀層面。一步作為新生事物,好比一顆新種子。種子破土而出時,是一顆嫩芽,而不是一棵大樹。新生的一步功能繁多,猶如一棵破土而出的大樹,一方面有違自然規(guī)律,另一面因為功能繁多,很多用戶無法一下子看懂,看不懂可能就不想用了。

第二,微觀層面。一步這棵新大樹,結(jié)了很多不同的果子,比如拖拽圖片到其他應(yīng)用、切換后臺應(yīng)用、展示最近圖片/文件等。這些果子,是用戶真正需要的嗎?這個是要存疑的。

比如拖拽圖片到朋友圈就能發(fā)朋友圈這個設(shè)計。通常而言,我們發(fā)到朋友圈的圖片都是精挑細(xì)選的,會占用一定量的時間,比如旅游或聚會結(jié)束后發(fā)的照片。一步解決的是效率問題。發(fā)朋友圈的時候,少點幾下這種效率問題,優(yōu)先級是比較靠后的,我們沒那么在乎。

還有拖拽圖片/文件這個交互動作,大家通常在電腦上用的比較多,在手機(jī)上是沒有這個習(xí)慣的,實際上應(yīng)用場景也少。在手機(jī)上,大家一般只習(xí)慣拖拽應(yīng)用圖標(biāo)。

還有切換后臺應(yīng)用這塊,大家第一個想到的,一定是系統(tǒng)自帶的,已經(jīng)用慣了。而且喚起速度比一步快,點擊面積也比一步大。

總的來說,微觀層面上,比較缺讓大家能馬上想到一步的功能點。

最后,總結(jié)一下。對于領(lǐng)先時代、引領(lǐng)潮流的交互設(shè)計,需要做到自然。

具體而言,就是,大驚喜是一種系統(tǒng)性的大功能,好比一棵大樹。這棵大樹,最好有一個從種子到果子的生長過程,這樣最自然,生命力也會最旺盛。

因為,從破土而出的嫩芽階段,就可以通過用戶反饋和數(shù)據(jù)來檢驗,這種嫩芽,是不是真的對用戶有價值。如果價值不大或沒有價值,還可以再調(diào)整。如果長成大樹結(jié)滿果子,再去調(diào)整,就很難了。


結(jié)語

交互設(shè)計小細(xì)節(jié),如果有一定的趣味性或人文屬性,則是小驚喜。

系統(tǒng)性工程的交互設(shè)計,如果最初感覺很酷,而且能引領(lǐng)潮流、代表未來,則是大驚喜。

始終保持孩童身上那種非功利的好奇心,用心觀察并思考生活中的小事;

將生活小事和交互設(shè)計巧妙融合起來;

以上兩點,可以幫我們做出小驚喜類的交互設(shè)計。

追求卓越,獨立思考,做最酷最好的交互設(shè)計;

酷是結(jié)果也好,是目標(biāo)也好,都不是最重要的。最重要的是,避免刻意和心切。醞釀大驚喜,猶如培養(yǎng)一個新生的孩子,需要投入極大耐心和精力,需要讓孩子自然成長。沒有家長會教半歲的孩子唱歌、把 3 歲的孩子送到高中念書。

再加上以上兩點,可以幫我們做出大驚喜類的交互設(shè)計。

最后,用愛因斯坦的一句話來共勉。

想象力比知識更重要。


“抗擊肺炎”數(shù)據(jù)產(chǎn)品體驗分析報告

ui設(shè)計分享達(dá)人

站在設(shè)計師的角度去分析這場戰(zhàn)疫下各大互聯(lián)網(wǎng)公司快速響應(yīng)產(chǎn)出的數(shù)據(jù)產(chǎn)品“抗擊肺炎”專題。

轉(zhuǎn)自:站酷-Yuki_yee

彈性布局(Flex)+骰子旋轉(zhuǎn)實例^v^

seo達(dá)人

彈性布局(Flex)

隨著移動互聯(lián)網(wǎng)的發(fā)展,對于網(wǎng)頁布局來說要求越來越高,而傳統(tǒng)的布局方案對于實現(xiàn)特殊布局非常不方便,比如垂直居中。

2009年,W3C 提出了一種新的方案----Flex 布局,可以簡便、完整、響應(yīng)式地實現(xiàn)各種頁面布局。目前,它已經(jīng)得到了所有瀏覽器的支持,這意味著,現(xiàn)在就能很安全地使用這項功能。

下面是一些彈性布局的基本語法:

兩部分:


  1. 語法是添加到父容器上的

            display : flex;(彈性盒子的標(biāo)志哦!!?。?br />
            flex-direction: row; 布局的排列方向 (主軸排列方向)

                 row 默認(rèn)值,顯示為行。方向為當(dāng)前文檔水平流方向,默認(rèn)情況下是從左往右。

                 row-reverse  顯示為行。但方向和row屬性值是反的

                 column  顯示為列

                 column-reverse 顯示為列。但方向和column屬性值是反的

            flex-wrap : nowrap; 是否進(jìn)行換行處理。

                 nowrap; 默認(rèn)值,不換行處理

                 wrap; 換行處理

                 wrap-reverse; 反向換行

            flex-flow : flex-direction flex-wrap 復(fù)合寫法 (是有順序的)。

            justify-content ; 屬性決定了主軸方向上子項的對齊和分布方式。  

                flex-start : 子項都去起始位置對齊。

                flex-end : 子項都去結(jié)束位置對齊。

                center : 子項都去中心位置對齊。

                space-between : 表現(xiàn)為兩端對齊。多余的空白間距在元素中間區(qū)域分配,兩邊沒寬。 

                space-around : 邊緣兩側(cè)的空白只有中間空白寬度一半即每個塊都有左右間距。

                space-evenly :每個flex子項兩側(cè)空白間距完全相等。

            align-items : 每一行中的子元素上下對齊方式。

                stretch;默認(rèn)值,flex子項拉伸

                flex-start;容器頂部對齊

                center;容器居中對齊

                flex-end;容器底部對齊

            align-content : 跟justify-content相反的操作。側(cè)軸的對齊方式。(最少需要兩行才能看出效果,因為他是多行的一個上下對齊方式)

                默認(rèn):多行下,有幾行就會把容器劃分為幾部分,默認(rèn)就是stretch拉伸的。

                值跟justify-content取值是相同的。


  2. 語法是添加到子容器上的?

            order : 排序(值越大越后)

                0:默認(rèn)值      eg:1234

                1:放在后面    eg:1342

                -2:放在前面   eg:2134

            flex-grow : 擴(kuò)展 ( 想看到擴(kuò)展的效果,必須有空隙 )

                0 : 默認(rèn)值 , 不去擴(kuò)展

                0.5:占空隙的一半

                1 : 去擴(kuò)展 , 會把空白區(qū)域全部沾滿

             ( 注:子元素會按照設(shè)置的比例值來分配空隙,如果比例值總和小于1,那么會有空隙,如果比例值總和大于等于1,那么就沒有空隙。)

            flex-shrink : 收縮

                正常默認(rèn)值是1

                0表示不收縮,.5收縮小一些,2收縮大一些。(大小是跟正??s放1進(jìn)行比較的)

            flex-basis : 跟flex-shrink/flex-grow很像。

                flex-shrink/flex-grow是設(shè)置一個比例值,flex-basis是設(shè)置一個具體值。

            flex : 一種復(fù)合寫法

                flex-grow  flex-shrink  flex-basis

                flex:1;

                    flex : 1 1 0    

                flex:0;

                    flex : 0 1 0

            algin-self: 跟align-items操作很像,區(qū)別就是只是針對某一個子項。

                



    注:默認(rèn)情況下,在彈性盒子中的子元素的左右排列的。

    注:

        水平是主軸的時候:默認(rèn)情況下,當(dāng)寬高不寫的時候,寬度由內(nèi)容決定,高度由父容器決定。

        垂直是主軸的時候:默認(rèn)情況下,當(dāng)寬高不寫的時候,寬度由父容器決定,高度由內(nèi)容決定。



    注:當(dāng)子項的總寬度大于父容器的時候,會自動收縮的(彈性的優(yōu)先級是大于自身固定大小的)

    注:當(dāng)子項的內(nèi)容已經(jīng)達(dá)到了父容器最小寬高的時候,就會出現(xiàn)溢出的現(xiàn)象。



    注:彈性布局中用的頻率比較多的語法:

        display : flex;

        flex-direction;

        justify-content;

        align-items;

        flex;



    注:彈性布局的優(yōu)勢是做一維布局,網(wǎng)格布局的優(yōu)勢是做二維布局。



    下面是彈性布局骰子案例代碼:



    <!DOCTYPE html>

    <html lang="en">

    <head>

        <meta charset="UTF-8">

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

        <title>Document</title>

        <style>

            *{margin: 0;padding: 0;}

            ul{list-style: none;}

            a{text-decoration: none;}

            img{display: block;}



            .box1{width: 150px;height: 150px;display: flex;border: 1px black solid;margin: 20px auto;border-radius: 10px;justify-content: center;align-items: center;}

            .box1 div{width: 30px;height: 30px;border-radius:50%;background: black;}



            .box2{width: 150px;height: 150px;display: flex;border: 1px black solid;margin: 20px auto;border-radius: 10px;align-items: center;justify-content: space-between;}

            .box2 div{width: 30px;height: 30px;border-radius:50%;background: black;margin: 10px;}

            .box2 div:nth-of-type(1){align-self: flex-start;}

            .box2 div:nth-of-type(2){align-self: flex-end;}



            .box3{width: 150px;height: 150px;display: flex;border: 1px black solid;margin: 20px auto;border-radius: 10px;align-items: center;justify-content: space-between;}

            .box3 div{width: 30px;height: 30px;border-radius:50%;background: black;margin: 10px;}

            .box3 div:nth-of-type(1){align-self: flex-start;}

            .box3 div:nth-of-type(3){align-self: flex-end;}



            .box4{width: 150px;height: 150px;border: 1px black solid;margin: 20px auto;border-radius: 10px;display: flex;flex-direction: column;}

            .box4 div{height: 50%;display: flex;flex-direction: row;justify-content: space-around;align-items: center;}

            .box4 div li{display: block; width: 30px;height: 30px;border-radius:50%;background: black;}



            .box5{width: 150px;height: 150px;border: 1px black solid;margin: 20px auto;border-radius: 10px;display: flex;flex-direction: column;}

            .box5 div{height: 50%;display: flex;flex-direction: row;justify-content: space-around;align-items: center;}

            .box5 div li{display: block; width: 30px;height: 30px;border-radius:50%;background: black;}



            .box6{width: 150px;height: 150px;border: 1px black solid;margin: 20px auto;border-radius: 10px;display: flex;flex-direction: column;}

            .box6 div{height: 50%;display: flex;flex-direction: row;justify-content: space-around;align-items: center;}

            .box6 div li{display: block; width: 30px;height: 30px;border-radius:50%;background: black;}



            #box{width: 400px;height: 400px;margin: 20px auto;border: 1px springgreen solid; 

            perspective: 500px;perspective-origin: right top;}

            #box .main{position: relative;width: 150px;height: 150px;margin: 125px;

            transform-style: preserve-3d;transition: 4s;transform-origin: center center -50px;}

            #box .main .box1{position: absolute;background:limegreen;left: 0;top: 0;

            width: 150px;height: 150px;}

            #box .main .box2{position: absolute;background:limegreen;left: 0;top: 0;

            width: 150px;height: 150px;left: 150px;transform-origin:left; transform:rotateY(90deg);}

            #box .main .box3{position: absolute;background:limegreen;left: 0;top: 0;

            width: 150px;height: 150px;left: -150px;transform-origin:right; transform:rotateY(-90deg);}

            #box .main .box4{position: absolute;background:limegreen;left: 0;top: 0;

            width: 150px;height: 150px;top: -150px;transform-origin:bottom; transform:rotateX(90deg);}

            #box .main .box5{position: absolute;background:limegreen;left: 0;top: 0;

            width: 150px;height: 150px;top: 150px;transform-origin:top; transform:rotateX(-90deg);}

            #box .main .box6{position: absolute;background:limegreen;left: 0;top: 0;

            width: 150px;height: 150px;transform:translateZ(-150px) rotateY(180deg);}



            #box:hover .main{transform:rotateY(360deg);}

        </style>

    </head>

    <body>

        <div id="box">

            <div class="main">

                <div class="box1">

                    <div></div>

                </div>

                <div class="box2">

                    <div></div>

                    <div></div>

                </div>

                <div class="box3">

                    <div></div>

                    <div></div>

                    <div></div>

                </div>

                <div class="box4">

                    <div>

                        <li></li>

                        <li></li>

                    </div>

                    <div>

                        <li></li>

                        <li></li>

                    </div>

                </div>

                <div class="box5">

                    <div>

                        <li></li>

                        <li></li>

                    </div>

                    <div>

                        <li></li>

                    </div>

                    <div>

                        <li></li>

                        <li></li>

                    </div>

                </div>

                <div class="box6">

                    <div>

                        <li></li>

                        <li></li>

                    </div>

                    <div>

                        <li></li>

                        <li></li>

                    </div>

                    <div>

                        <li></li>

                        <li></li>

                    </div>

                </div>

            </div>

        </div>

    </body>

    </html>




日歷

鏈接

個人資料

存檔