手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。
手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。這里為大家整理了一些優秀并富有創意的交互作品,為你的產品設計注入靈感。
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
(以上圖片均來源于網絡)
藍藍設計( m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務
更多精彩文章:
開發中,遇到數組排序的需求很頻繁,這篇文章會介紹幾個常見排序思路。
如果要從大到小排列,則 while(arr[n] > arr[n - interval] && n > 0) 。
// 希爾排序算法 function xier(arr){ var interval = parseInt(arr.length / 2);//分組間隔設置 while(interval > 0){ for(var i = 0 ; i < arr.length ; i ++){ var n = i; while(arr[n] < arr[n - interval] && n > 0){ var temp = arr[n]; arr[n] = arr[n - interval]; arr[n - interval] = temp; n = n - interval; } } interval = parseInt(interval / 2); } return arr; } // Array var arr = [10, 20, 40, 60, 60, 0, 30] // 打印排序后的數組 console.log(xier(arr))//[0, 10, 20, 30, 40, 60, 60]
一堆數組排序
// Array var arr = [10, 20, 40, 60, 60, 0, 30] // 排序方法 arr.sort(function(a,b){ /*
* return b-a; —> 降序排序
* return a-b; —> 升序排列
*/ return a-b; })//括號里不寫回調函數則默認按照字母逐位升序排列 // 打印排序后的數組 console.log(arr)//[0, 10, 20, 30, 40, 60, 60]
對象數組排序(數組套對象)
//對象數組排序 var arr = [ {name:'syy', age:0}, {name:'wxy', age:18}, {name:'slj', age:8}, {name:'wj', age:20} ]; // 排序方法 function compare(property) {//property:根據什么屬性排序 return function(a,b){ var value1 = a[property]; var value2 = b[property]; /*
* value2 - value1; ——> 降序
* value1 - value2; ——> 升序
*/ return value1 - value2;//升序排序 } } // 打印排序后的數組 console.log(arr.sort(compare('age'))) /*
0: {name: "syy", age: 0}
1: {name: "slj", age: 8}
2: {name: "wxy", age: 18}
3: {name: "wj", age: 20}
*/
特點:簡單,但非常浪費內存,幾乎不用。
桶中出現的數組元素都做個標記 1,然后將桶數組中有 1 標記的元素依次打印。
// Array var arr = [] // 每個數組項做標記(1) for(let i = 0; i < arr.length; i++) { let key = arr[i] arr[key] = 1 } // 遍歷打印出每項 for(let j in arr) { debugger console.log(j) }
性能:一般(需要每項進行比較)。
每一趟找出最大的值。
// Array var arr = [10, 20, 40, 60, 60, 0, 30] /*
* 總共比較次數為arr.length-1次
* 每次的比較次數為arr.length-1次
* 依次遞減
*/ var temp;//交換變量標識 // 兩層for分別表示當前項與第二項 for(let i = 0; i < arr.length - 1; i++) { for(let j = 0; j < arr.length - 1; j++) { // 如果當前項大于第二項(后一項)則交換 if(arr[j] > arr[j+1]) { temp = arr[j] arr[j] = arr[j+1]; arr[j+1] = temp; } } } // 打印排序后的數組 console.log(arr)//[0, 10, 20, 30, 40, 60, 60]
性能:一般(需要每項進行比較)。
假定某個位置的值是最小值,與冒泡排序類似。
// Array var arr = [10, 20, 40, 60, 60, 0, 30] var temp;//交換變量標識 // 兩層for分別表示當前項與第二項 for(let i = 0; i < arr.length - 1; i++) { for(let j = i + 1; j < arr.length; j++) { // 假設第二項是最小值(是則交換/否則繼續比較) if(arr[i] > arr[j]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } // 打印排序后的數組 console.log(arr)//[0, 10, 20, 30, 40, 60, 60]
// Array var arr = [10, 20, 40, 60, 60, 0, 30] // 排序算法 for(var i = 0; i < arr.length; i++) { var n = i; while(arr[n] > arr[n+1] && n >= 0) { var temp = arr[n]; arr[n] = arr[n+1]; arr[n+1] = temp; n--; } } // 打印排序后的數組 console.log(arr)//[0, 10, 20, 30, 40, 60, 60]
作者:王佳斌
手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。
手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。這里為大家整理了一些優秀并富有創意的交互作品,為你的產品設計注入靈感。
專業又貼心醫療App頁面設計
醫療行業設計案例
--手機appUI設計--
--手機appUI設計--
(以上圖片均來源于網絡)
藍藍設計( m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務
更多精彩文章:
v-cloak: 使用 v-cloak 指令可以有效解決屏幕閃動。
有時候,頁面沒渲染之前就會出現vue代碼塊,例如下圖。使用v-cloak可以很好解決這種問題。
![]()
<template> <div class="hello"> <span v-cloak>{{ content }}</span> </div> </template> <script> export default { name: "hello", data() { return { content: "測試" }; } }; </script> <style scoped> /* v-cloak這個屬性會在頁面渲染前作用于對應dom 在渲染完畢這個里面的樣式將被移除 */ [v-cloak] { display: none; } </style>
keep-alive
官網是這么解釋的:
![]()
例如:可以實現頁面緩存,比如從編輯頁切出去再切進來,頁面還是處于編輯狀態.
需要在router.js中設置meta屬性,meta下的keepAlive屬性設置為true,代表這個頁面需要進行緩存。
import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '@/components/HelloWorld' import is from '@/view/is' import list from '@/view/list' import detail from '@/view/detail' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld, meta: { keepAlive: false, title: 'HelloWorld' } }, { path: '/is', name: 'is', component: is, meta: { keepAlive: false, title: 'is' } }, { path: '/list', name: 'list', component: list, meta: { keepAlive: true, title: 'list' } }, { path: '/detail', name: 'detail', component: detail, meta: { keepAlive: true, title: 'detail' } } ] })
在app.vue中修改一下代碼<router-view />
<template> <div id="app"> <keep-alive> <!--緩存組件--> <router-view v-if="$route.meta.keepAlive" /> </keep-alive> <!--非緩存組件--> <router-view v-if="!$route.meta.keepAlive" /> </div> </template> <script> export default { name: "App" }; </script> <style> #app { font-family: "Avenir", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } </style>
在詳情頁detail.vue中,注意beforeRouteEnter和beforeRouteLeave兩個方法。
<template> <div class="detail"> <!-- form表單,用于測試是否緩存 --> <Form ref="formCustom" :model="formItem" :label-width="80"> <FormItem label="Input"> <Input v-model="formItem.input" placeholder="Enter something..."></Input> </FormItem> <FormItem label="Select"> <Select v-model="formItem.select"> <Option value="beijing">New York</Option> <Option value="shanghai">London</Option> <Option value="shenzhen">Sydney</Option> </Select> </FormItem> <FormItem label="DatePicker"> <Row> <Col span="11"> <DatePicker type="date" placeholder="Select date" v-model="formItem.date"></DatePicker> </Col> <Col span="2" style="text-align: center">-</Col> <Col span="11"> <TimePicker type="time" placeholder="Select time" v-model="formItem.time"></TimePicker> </Col> </Row> </FormItem> <FormItem label="Radio"> <RadioGroup v-model="formItem.radio"> <Radio label="male">Male</Radio> <Radio label="female">Female</Radio> </RadioGroup> </FormItem> <FormItem label="Checkbox"> <CheckboxGroup v-model="formItem.checkbox"> <Checkbox label="Eat"></Checkbox> <Checkbox label="Sleep"></Checkbox> <Checkbox label="Run"></Checkbox> <Checkbox label="Movie"></Checkbox> </CheckboxGroup> </FormItem> <FormItem label="Switch"> <i-switch v-model="formItem.switch" size="large"> <span slot="open">On</span> <span slot="close">Off</span> </i-switch> </FormItem> <FormItem label="Slider"> <Slider v-model="formItem.slider" range></Slider> </FormItem> <FormItem label="Text"> <Input
v-model="formItem.textarea" type="textarea" :autosize="{minRows: 2,maxRows: 5}" placeholder="Enter something..." ></Input> </FormItem> <FormItem> <Button type="primary">Submit</Button> <Button style="margin-left: 8px">Cancel</Button> </FormItem> <FormItem> <router-link :to="{name:'list'}"> <Button size="small" type="primary">跳轉到列表頁</Button> </router-link> <router-link :to="{name:'is'}"> <Button size="small" type="primary">跳轉到is頁</Button> </router-link> </FormItem> </Form> </div> </template> <script> export default { name: "detail", mixins: [], components: {}, filters: {}, props: [], computed: {}, data() { return { formItem: { input: "", select: "", radio: "male", checkbox: [], switch: true, date: "", time: "", slider: [20, 50], textarea: "" } }; }, watch: {}, created() { }, mounted() { }, methods: { // 重置表單 init() { this.$refs[formCustom].resetFields(); } }, // 路由進來之前,判斷是從哪個頁面過來的,設置不同的keepAlive屬性 beforeRouteEnter(to, from, next) { if (from.name === "list") { to.meta.keepAlive = true; } else { to.meta.keepAlive = false; } next(); // beforeRouteEnter不能通過this訪問組件實例,但是可以通過 vm 訪問組件實例(剛開始錯誤寫法) // next(vm => { // if (from.name === "list") { // // 在這里修改keepAlive值,是不能緩存數據的,因為在next()里面的代碼,是在vue掛載之后執行,處于activated之后,此時activated中keepAlive還是false // vm.$route.meta.keepAlive = true; // } else { // vm.$route.meta.keepAlive = false; // } // }); }, // 路由離開之前,判斷去往哪個頁面,設置不同的keepAlive屬性 beforeRouteLeave(to, from, next) { if (to.name === "list") { this.$route.meta.keepAlive = true; } else { this.$route.meta.keepAlive = false; } next(); }, activated() { // 此方法在頁面緩存時會被調用(this.$route.meta.keepAlive為true時),根據路由元信息決定是否重新加載數據。不加載則是上次填寫完的數據 // console.log(this.$route.meta.keepAlive); } }; </script> <style scoped lang="less"> .detail { position: relative; height: 100%; width: 100%; } </style>
插槽slot
解構插槽 Prop:可以傳遞子組件的變量
// 子組件 <template> <div class="isComponent"> <slot name='one' :childStr='childStr'></slot> <slot name='two'></slot> <slot></slot> </div> </template> <script> export default { name: "isComponent", data() { return { childStr: 'i am a child', }; } }; </script> <style scoped> </style> // 父組件 <is-component> <template #one="{childStr}">{{childStr}}</template> <template v-slot:two> two </template> <template> default </template> </is-component>
效果:// i am a child two default
強制刷新某個div
修飾符
事件修飾符:
.stop:相當于原生JS中event.stopPropagation(),阻止事件冒泡。
.prevent:相當于原生JS中event.preventDefault(),阻止默認事件的發生。
.capture:事件冒泡的方向相反,事件捕獲由外到內。即有冒泡發生時,有該修飾符的dom元素會先執行,如果有多個,從外到內依次執行。
.self:只會觸發自己范圍內的事件,不包含子元素。
.once:事件只能觸發一次。
.passive:事件會執行默認方法。
注:
- 每次事件產生,瀏覽器都會去查詢一下是否有preventDefault阻止該次事件的默認動作。我們加上passive就是為了告訴瀏覽器,不用查詢了,我們沒用preventDefault阻止默認動作。
passive和prevent沖突,不能同時綁定在一個監聽器上
按鍵修飾符: 去官網查看即可,這里不過多解釋。Vue.js-修飾符
:is: 動態組件
優點:使代碼更符合HTML語法驗證
官網是這么解釋的:
![]()
// 父組件: <template> <div class="is"> <table> <tr :is='is'></tr> </table> </div> </template> <script> import isComponent from '../components/isComponent' export default { name: "is", components: { isComponent }, data() { return { is: 'isComponent' }; } }; </script> <style scoped> </style> // 子組件: <template> <div class="isComponent"> <span>我是tr</span> </div> </template> <script> export default { name: "isComponent", data() { return {}; } }; </script> <style scoped> </style>
@click.native: 在封裝好的組件上使用,要加上.native才能click。
- router-link 加上@click事件,綁定的事件會無效因為:router-link的作用是單純的路由跳轉,會阻止click事件,你可以試試只用click不用native,事件是不會觸發的。此時加上.native,才會觸發事件。
- 根據Vue2.0官方文檔關于父子組件通訊的原則,父組件通過prop傳遞數據給子組件,子組件觸發事件給父組件。但父組件想在子組件上監聽自己的click的話,需要加上native修飾符。
// router-link <router-link :to="{name:'detail'}" @click.native="handleNative"> <Button size="small" type="primary">測試native</Button> </router-link> // 自己封裝的組件 <is-component @click.native="handleNative"></is-component>
作者:小城聽風雨
了解拷貝背后的過程,避免不必要的錯誤,Js專題系列之深淺拷貝,我們一起加油~
當我們在操作數據之前,可能會遇到這樣的情況:
當我們遇到類似需要場景時,首先想到的就是拷貝它,殊不知拷貝也大有學問哦~
下面簡單的例子,你是否覺得熟悉?
var str = 'How are you'; var newStr = str; newStr = 10 console.log(str); // How are you console.log(newStr); // 10
大家都能想到,字符串是基本類型,它的值保存在棧中,在對它進行拷貝時,其實是為新變量開辟了新的空間。 str和newStr就好比兩個一模一樣的房間,布局一致卻毫無關聯。
var data = [1, 2, 3, 4, 5]; var newData = data; newData[0] = 100; console.log(data[0]); // 100 console.log(newData[0]); // 100
類似的代碼段,但這次我們使用數組這個引用類型舉例,你會發現修改賦值后的數據,原始數據也跟著改變了,這顯然不滿足我們的需要。本篇文章就來聊一聊引用數據拷貝的學問。
如果大家對Js的數據類型存在著疑問,不妨看看《JavaScript中的基本數據類型》
拷貝的劃分都是針對引用類型來討論的,淺拷貝——顧名思義,淺拷貝就是“淺層拷貝”,實際上只做了表面功夫:
var arr = [1, 2, 3, 4]; var newArr = arr; console.log(arr, newArr); // [1,2,3,4] [1,2,3,4] newArr[0] = 100; console.log(arr, newArr) // [100,2,3,4] [100,2,3,4]
不發生事情(操作)還好,一旦對新數組進行了操作,兩個變量中所保存的數據都會發生改變。
發生這類情況的原因也是因為引用類型的基本特性:
數組中的slice和concat都會返回一個新數組,我們一起來試一下:
var arr = [1,2,3,4]; var res = arr.slice(); // 或者 res = arr.concat() res[0] = 100; console.log(arr); // [1,2,3,4]
這個問題這么快就解決了?雖然對這一層數據進行了這樣的的處理后,確實解決了問題,但!
var arr = [ { age: 23 }, [1,2,3,4] ]; var newArr = arr.concat(); arr[0].age = 18; arr[1][0] = 100; console.log(arr) // [ {age: 18}, [100,2,3,4] ] console.log(newArr) // [ {age: 18}, [100,2,3,4] ]
果然事情沒有那么簡單,這也是因為數據類型的不同。
S 不允許我們直接操作內存中的地址,也就是說不能操作對象的內存空間,所以,我們對對象的操作都只是在操作它的引用而已。
既然淺拷貝達不到我們的要求,本著效率的原則,我們找找有沒有幫助我們實現深拷貝的方法。
數據的方法失敗了,還有沒有其他辦法?我們需要實現真正意義上的拷貝出獨立的數據。
這里我們利用JSON的兩個方法,JSON.stringify(),JSON.parse()來實現最簡潔的深拷貝
var arr = ['str', 1, true, [1, 2], {age: 23}] var newArr = JSON.parse( JSON.stringify(arr) ); newArr[3][0] = 100; console.log(arr); // ['str', 1, true, [1, 2], {age: 23}] console.log(newArr); // ['str', 1, true, [100, 2], {age: 23}]
這個方法應該是實現深拷貝最簡潔的方法,但是,它仍然存在問題,我們先來看看剛才都做了些什么:
arr
JSON 字符串
值或對象
理解:
我們可以理解為,將原始數據轉換為新字符串,再通過新字符串還原為一個新對象,這中改變數據類型的方式,間接的繞過了拷貝對象引用的過程,也就談不上影響原始數據。
限制:
這種方式成立的根本就是保證數據在“中轉”時的完整性,而JSON.stringify()將值轉換為相應的JSON格式時也有缺陷:
所以當我們拷貝函數、undefined等stringify轉換有問題的數據時,就會出錯,我們在實際開發中也要結合實際情況使用。
舉一反三:
既然是通過改變數據類型來繞過拷貝引用這一過程,那么單純的數組深拷貝是不是可以通過現有的幾個API來實現呢?
var arr = [1,2,3]; var newArr = arr.toString().split(',').map(item => Number(item)) newArr[0] = 100; console.log(arr); // [1,2,3] console.log(newArr); // [100,2,3]
注意,此時僅能對包含純數字的數組進行深拷貝,因為:
但我愿稱它為純數字數組深拷貝!
有的人會認為Object.assign(),可以做到深拷貝,我們來看一下
var obj = {a: 1, b: { c: 2 } } var newObj = Object.assign({}, obj) newObj.a = 100; newObj.b.c = 200; console.log(obj); // {a: 1, b: { c: 200 } } console.log(newObj) // {a: 100, b: { c: 200 } }
神奇,第一層屬性沒有改變,但第二層卻同步改變了,這是為什么呢?
因為 Object.assign()拷貝的是(可枚舉)屬性值。
假如源值是一個對象的引用,它僅僅會復制其引用值。MDN傳送門
既然現有的方法無法實現深拷貝,不妨我們自己來實現一個吧~
我們只需要將所有屬性即其嵌套屬性原封不動的復制給新變量一份即可,拋開現有的方法,我們應該怎么做呢?
var shallowCopy = function(obj) { if (typeof obj !== 'object') return; // 根據obj的類型判斷是新建一個數組還是對象 var newObj = obj instanceof Array ? [] : {}; // 遍歷obj,并且判斷是obj的屬性才拷貝 for (var key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = obj[key]; } } return newObj; }
我們只需要將所有屬性的引用拷貝一份即可~
相信大家在實現深拷貝的時候都會想到遞歸,同樣是判斷屬性值,但如果當前類型為object則證明需要繼續遞歸,直到最后
var deepCopy = function(obj) { if (typeof obj !== 'object') return; var newObj = obj instanceof Array ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]; } } return newObj; }
我們用白話來解釋一下deepCopy都做了什么
const obj = [1, { a: 1, b: { name: '余光'} } ]; const resObj = deepCopy(obj);
obj,創建 第一個newObj
[]
0 (for in 以任意順序遍歷,我們假定按正常循序遍歷)
1
obj[1]
另外請注意遞歸的方式雖然可以深拷貝,但是在性能上肯定不如淺拷貝,大家還是需要結合實際情況來選擇。
作者: 余光
在學習彈性布局之前首先就要明白其概念
flex 就是flexible box的縮寫,意為彈性布局,用來為盒裝模型提供最大的靈活性
任何一個容器都可以指定為flex布局
.box{ display: flex; }
行內元素當然也可以使用flex布局
.box{ display: inline-flex; }
Webkit 內核的瀏覽器,必須加上-webkit前綴。
.box{ display: -webkit-flex; /* Safari */ display: flex; }
注意:設為 Flex 布局以后,子元素的float、clear和vertical-align屬性將失效。
采用 Flex 布局的元素,稱為 Flex 容器(flex container),簡稱"容器"。它的所有子元素自動成為容器成員,稱為 Flex 項目(flex item),簡稱"項目"。

容器默認存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end;交叉軸的開始位置叫做cross start,結束位置叫做cross end。
項目默認沿主軸排列。單個項目占據的主軸空間叫做main size,占據的交叉軸空間叫做cross size。
以上這些基礎概念,請務必牢記,下面說屬性時,不再重復說明!
- flex-direction
- justify-content
- align-items
- flex-wrap
- align-content
- flex-flow
flex items默認都是沿著main axis(主軸)從main start 開始往main end方向排布
flex-direction決定了main axis的方向,有四個取值row(默認值)、row-reverse、column、column-reverse
.box { flex-direction: row | row-reverse | column | column-reverse; }
row(默認值):主軸為水平方向,起點在左端。
row-reverse:主軸為水平方向,起點在右端。
column:主軸為垂直方向,起點在上沿。
column-reverse:主軸為垂直方向,起點在下沿。
justify-content決定了flex item在main axis上的對齊方式
flex-start(默認值):與main start對齊
flex-end:與main end對齊
center:居中
space-between:flex items 之間的距離相等,與main start、main end兩端對齊
space-evently: flex items 之間的距離相等,flex items與main start 、main end 之間的距離等于flex items之間的距離
space-around :flex items 之間的距離相等,flex items與main start 、main end 之間的距離等于flex items之間的距離的一半
這個屬性的目的主要就是為了排列main axis的item位置

當然,這些屬性你可以自己嘗試一下,這里就不再一一嘗試了,但是注意,這些都是容器的屬性,要寫在容器的css中!
決定flex items在cross axis上的對齊方式
normal:在彈性布局中,效果和stretch一樣
stretch:前提是items不設置高度,當flex items 在cross axis 方向的size為auto時,會自動拉伸至填充flex container(或者換句話說:如果項目未設置高度或設為auto,將占滿整個容器的高度。)
flex-satrt:與cross start 對齊
flex-end:與cross end 對齊
center:居中對齊
baseline:與基準線對齊
決定了flex container 是單行還是多行
nowrap(默認):單行
warp:多行
//這個比較少用
wrap-reverse:多行(對比wrap,cross start 與cross end相反)
默認情況下,項目都排在一條線(又稱"軸線")上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。
決定了多行flex items 在cross axis的對齊方式 用法與justify-content相似 一個是橫軸。一個控制豎軸
stretch(默認值):與align-items的stretch類似,當items有高度的時候,無效果
flex-start:與cross start 對齊
flex-end :與cross end 對齊
center:居中對齊
space-between:flex items 之間的距離相等,與cross start、cross end兩端對齊
space-evently: flex items 之間的距離相等,flex items與cross start 、cross end 之間的距離等于flex items之間的距離
space-around :flex items 之間的距離相等,flex items與cross start 、cross end 之間的距離等于flex items之間的距離的一半
也就是說,當你使用這個屬性的時候,你可以使用上述兩個的屬性值,例如:flex-flow: row wrap;(水平排列,多行顯示)
- order
- flex-grow
- flex-shrink
- flex-basis
- align-self
- flex
order 決定flex items的排布順序 (用的不多)
可以設置為任意整數(正整數、負整數、0),值越小越排在前面
默認值為0
這個屬性了解即可,說實話沒怎么用過
可以通過align-self 覆蓋flex container 設置的align-items
auto(默認值):遵從flex container的align-items設置
stretch、flex-start、flex-end、center、baseline效果與align-items一致
相當于繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。
決定了flex items如何擴展
可以設置為任意非父數字(小數,整數 0),默認為0
當flex container 在main axis方向上有剩余得size時,flex-grow屬性才會有效
如果所有flex items 的flex-grow 綜合sum不超過1,這直接乘以剩余size就是擴展大小、
如果超過1 擴展size=剩余size*flex-grow/sum
flex-grow屬性定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。
flex-shrink (shrink 縮小,收縮)與flex-grow相似,一個擴展,一個伸縮
可以設置為任意非父數字(小數,整數 0),默認為1
當flex items在main axis 方向上超過了flex container 的size flex-shrink屬性才會生效、
如果所有flex items 的flex-shrink 總和sum超過1,每個flex item 收縮的size為:
flex item 超出flex container 的size*收縮比例/每個flex items 的收縮比例之和
如果sum不超過1,每個flex item 收縮的size為:
size = 超出的size * flex-shrink值
flex items收縮后的最終size不能小于min-width\min-height
有擴大自然就會有縮小,flex-shrink屬性定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。
如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。具體的可以自己動手嘗試一下哦,最后將會給出一個骰子布局的案例!
用來設置flex items 在 main axis方向上的base size
默認為auto,可以設置具體的寬度數值
決定flex items最終base size 的因素,優先級從高到低
max-width\max-height\min-width\min-height
flex-basis
width\height
內容本身的size
flex-basis屬性定義了在分配多余空間之前,項目占據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認值為auto,即項目(item)的本來大小。也可以設置跟width,height一樣的寬高,表示item將占據固定的空間!
flex 是flex-grow || flex-shink||flex-basis的簡寫
可以指定1 2 3個值 依次按照上述順序!默認值為 0 1 auto
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
注意:
- 該屬性的默認值為 0 1 auto(注意順序),后兩個屬性可選
- 該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。
- 如果需要這三個屬性的時候,建議使用flex,而不是單獨的三個分離的屬性,因為瀏覽器會推算相關值
光說不練假把式,手撕代碼真功夫!
下面利用flex寫了幾個骰子布局,可以參考一下!
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#container{
background-color: #CCCCCC;
height: 600px;
width: 500px;
/* flex */
display: flex;
justify-content: space-evenly;
align-items: center;
}
.item{
background-color: yellow;
width: 100px;
height: 100px;
}
/* 單點 */
.one{
/* 對點使用flex布局 */
display: flex;
justify-content: center;
align-items: center;
}
/* 點 */
.item-one{
display: block;
height: 20px;
width: 20px;
background-color: #1890FF;
border-radius: 50%;
}
/* 三點 */
.two{
display: flex;
justify-content: space-between;
}
.two span{
margin: 2px;
display: block;
height: 20px;
width: 20px;
border-radius: 50%;
background-color: #1890FF;
}
.two2{
align-self: center;
}
.two3{
align-self: flex-end;
}
/* 五點 */
.three{
display: flex;
justify-content: space-around;
}
.three span{
display: block;
height: 20px;
width: 20px;
border-radius: 50%;
background-color: #1890FF;
}
#three_one, #three_three{
padding: 2px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
#three_two{
display: flex;
flex-direction: column;
justify-content: center;
}
/* 六點 */
.four{
display: flex;
justify-content: space-around;
}
.four span{
display: block;
height: 20px;
width: 20px;
border-radius: 50%;
background-color: #1890FF;
}
#four1,#four2{
padding: 2px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
</style>
</head>
<body>
<div id="container">
<!-- 一個點居中 -->
<div class="item one">
<span class="item-one"></span>
</div>
<!-- 三點 -->
<div class="item two">
<span class="two1"></span>
<span class="two2"></span>
<span class="two3"></span>
</div>
<!-- 五點 -->
<div class="item three">
<div id="three_one">
<span></span>
<span></span>
</div>
<div id="three_two">
<span></span>
</div>
<div id="three_three">
<span></span>
<span></span>
</div>
</div>
<!-- 六點 -->
<div class="item four">
<div id="four1">
<span></span>
<span></span>
<span></span>
</div>
<div id="four2">
<span></span>
<span></span>
<span></span>
</div>
</div>
</div>
</body>
</html>
手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。
手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。這里為大家整理了12款優秀并富有創意的交互作品,為你的產品設計注入靈感。
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
(以上圖片均來源于網絡)
藍藍設計( m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務
更多精彩文章:
| 章節名稱 | 地址 |
|---|---|
| Vue.js教程-安裝和HelloWorld | https://coderhqf.blog.csdn.net/article/details/107574556 |
| Vue.js教程-Vue項目的目錄結構和.vue文件的構成 | https://coderhqf.blog.csdn.net/article/details/107621070 |
| Vue.js教程-Vue基本指令 | https://coderhqf.blog.csdn.net/article/details/107677588 |
| Vue.js教程-組件化開發 | https://coderhqf.blog.csdn.net/article/details/107783664 |
與傳統PC桌面不同,手機屏幕的尺寸更加小巧操作,方式也已觸控為主,APP界面設計不但要保證APP功能的完整性和合理性,又要保證APP的功能性和實用性,在保證其擁有流暢的操作感受的同時,滿足人們的審美需求。
接下來為大家介紹幾款手機appui界面設計
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
--手機appUI設計--
(以上圖片均來源于網絡)
藍藍設計( m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務
更多精彩文章:
藍藍設計的小編 http://m.skdbbs.com