首页

微软设计负责人专访:我们是如何创造双屏设计的?

雪涛

接下来的访谈翻译自微软官方博客,微软的 Office 设计部门的两位主管 Jon Friedman 和 Deepak Menon 在访谈中聊了一下 Surface Duo 背后的设计故事:

微软设计负责人专访:我们是如何创造双屏设计的?

在过去的几十年当中,数码产品制造商经常会为了适应用户的习惯和需求,来不断创造产品。我们倾向于让事物变的更小、更轻、响应更快、更具包容性。我们将不同感官融入程序,创造而优雅的产品。

随着日常生活节奏和生产力的观念变化,我们经常需要反思一个问题:如何赋予人们在创作和消费、专业和个人之间流畅切换的可能性?

即将发售的 Surface Duo 是一款独特的双屏移动设备,它有着一套专门为它的硬件所定制化的产品体验,而它的设计也折射出我们探索问题的方式。

对于设计师来说,创造这样的独特产品的机会是难得的,就像你在一个住了十几年的房子里面,发现新的房间一样。会打开的是哪扇门?会通向哪个区域?会延伸出哪些创意?

对于 Surface Duo ,我们想知道,它的两块屏幕会延伸出哪些全新的工作流程,它的接缝要如何处理,怎样减轻用户的认知负荷?

受多年来我们在用户研究上的成果所启发,我们通过软硬件结合的方式来进行 Surface Duo 的研发,让它能适合你日常的需求,还可以带来独特的体验,比如在双屏上并排打开文档。

Surface Duo 仍然处于起步阶段,我们知道,它还有很多待解决的问题,这也是为什么微软会引入更多的用户和设计师,来不断地完善它。

为了让大家更好地了解 Surface Duo 的设计历程,我们请来了 Deepak Menon ,他不仅参与了 Surface Duo 的研发和设计,还是 Office 设计团队的负责人,让他来告诉大家,Surface Duo 背后的创意、研究和设计决策。

微软设计负责人专访:我们是如何创造双屏设计的?

Jon:谢谢你能来,Deepak,在过去的2个月时间里,我们一直在非常密集地使用和测试 Surface Duo~

Deepak:实际上,我干脆是拿它单主力机,现在我都觉得我已经不需要其他的任何设备了。

Jon:我们当然会这么说,毕竟是我们设计了它。但是,我想这也证明了一件事情,就是这种拓展式的双屏,已经具备应对日常工作的能力,并且贴合大家的需求了。

Deepak:对。这不仅仅是「2块屏幕智能手机」所带来的体验,它更接近于是一款「折叠式的平板电脑」的感觉。它是新事物,尽管是通过铰链和转轴来实现这种可能性。

Jon:我们接触 Surface Duo 的时候,我们首先想到的一问题是:人类还有哪些需求是未曾被实现的?人们在达成目标过程中,有哪些问题是需要工具来弥合的?我们要如何来帮助用户达成这个目标?双屏的这种形态,让我们有重新思考生产力的切入点。

Deepak:对,尤其是在移动端的生产力上。

微软设计负责人专访:我们是如何创造双屏设计的?

在双屏界面下,使用 Office 在 PDF 文档上签名,然后使用 Outlook 发送出去,签合同的便捷操作。

Jon:确实,你的团队在中国和印度这样移动端优先的国家做了非常深入的调研。

Deepak:我们注意到很多用户在同一设备上执行并完成一系列的任务,他们需要更快地切换。同时,企业也正在倚靠我们过去认为非常「娱乐化」的媒介来进行必要的经营。

Jon:在过去,生产力有这非常清晰的定量标准,比如一秒生产多少零件。但是如今,生产力和创意息息相关,你的情绪状态和输出的内容是一样重要的。我们在不断消费又不断创造,反思和行动来回切换。其实这都涉及到一种倾向或者流程,你会按照一定的方式来处理信息,或者当你脑中突然划过一个想法的时候,你会想立刻构建或者制作某个东西,而这也需要一系列的操作和任务来支撑。

从整个数字设备的发展历程来看,双屏的设备可能是最适合处理这种带有步骤的「流程」。Surface Duo 最精巧地的地方,就在于它可以按照你的各种需求来折叠翻转和交互,可大可小,同时也是一款贴合你的口袋尺寸的设备。

微软设计负责人专访:我们是如何创造双屏设计的?

在横屏模式之下,你可以像翻书一样浏览 Word 文档

Deepak:当然,它将内容消费提升到一个全新的层次,对于丰富内容的处理,Surface Duo 更加适合和专业。在 Outlook 当中,你可以快速浏览整个星期的工作安排,在 Word 中,你可以像翻书一样阅读内容。屏幕 折叠所赋予的空间让更多的信息有了自然的展现空间。

借助 Surface Duo ,创造性的工作也得到了增强。当我使用 PowerPoint 来制作幻灯片的时候,我喜欢在一个屏幕上编辑,在另外一块屏幕上预览,两块屏幕当中,一块帮我保持专注内容制作,另一块帮我统领全局。另外,我也会在屏幕上开启多个不同的应用。

微软设计负责人专访:我们是如何创造双屏设计的?

将团队的视频通话和 PowerPoint 并列摆放,让你一边沟通一边查看内容

Jon:使用它来进行远程会议可能是我最喜欢的场景之一。我喜欢在开会的时候使用双横屏模式,将视频置于顶端,在下面的屏幕浏览文档。

Deepak:或者用另外一块屏幕来调用婴儿监视器!哈哈,疫情让我们和家庭的关系更加密切,Surface Duo 让我可以更多兼顾到家庭这边。

Jon:对,很多人认为在疫情期间,家里有这么多人,移动设备的使用量可能会降低,但是很多数据表明,情况恰恰相反(仅2月初到3月下旬,微软的 Team 移动端的用户数量就增加了超过300%)。就我个人而言,我不想一直待在一个房间里面,盯着一块屏幕,其他人也都反映,需要四处走动,或者在外面工作。当我开始使用Surface Duo 的时候,开始从中获得更为强大的支撑,获得更加有效的体验。

当然,它最优雅的还是在窗口的管理上。打开多个窗口是一种非常常见的 PC 体验,但是在单屏的移动端设备上其实还不算太普遍和舒适,但是在 Surface Duo 上则很自然。

微软设计负责人专访:我们是如何创造双屏设计的?

Outlook 中双屏带来的额外空间让你可以更快查看相关的收件箱和日历

Deepak:关于用户如何使用窗口来提高生产力,有过很多研究,并且两块屏幕之间的天然接缝,或者说转轴,其实很自然地造就了「两块屏幕」和「多窗口」的认知。在某些情况下,因为接缝的存在,在两块屏幕上打开完全不同的两个应用,其实是非常自然的事情。

在很多其他的情况下,用户可能会在一个屏幕中打开一个新的程序,打开新的界面,执行单独的操作,或者通过一个程序,在另外一个屏幕中打开下一步操作,然后再在两个界面之间来回操作,这都是非常平稳的。这种被分割开的两块屏幕,创造了一种全新的交互契机,而不是制造约束。

Jon:对于 Surface 的软硬件团队,我最为欣赏的一点,就是这种共生和互相促进的模式。使用 Surface Duo,你可以拥有更大的屏幕空间,而且拥有众多不同的使用应用的新方法,而 Surface Duo 也正好可以适应各种各样不同的使用场景。而我们在创建这个产品的过程中,想要兼顾到如此之多的场景和需求,其实是需要两个团队亲密无间地协作,才能做好。

对了,你刚刚说道关于照片、视频、语音等内容——这些输入方式的协作,对于创造性的工作到底有多重要?

Deepak:的确,在移动端设备上,摄像头和麦克风是必不可少的。我们希望最大限度地让 Office 最大限度地利用这些传感器,在移动地使用过程中进行协同。用户在通勤过程中如何参与到线上课程的互动?老师如何更快地给孩子批阅作业,家长要如何协助孩子?其实,Surface Duo 在研发探索的过程中,就有意识地在兼顾这些场景和问题。

微软设计负责人专访:我们是如何创造双屏设计的?

从媒体库当中,将媒体拖放到 PowerPoint 当中

Jon:我喜欢这些富有包容性的解决方案。人们的学习方式和工作方式通常是截然不同的,这些自适应性良好的输入模型,能够帮助能力各异的用户完成他们所需的工作。

Deepak:当我们将新的输入模型和智能化的功能结合到一起的时候,有趣的事情就开始发生了。我们几乎还没有涉及到创作方面的内容,用户就已经拥有很多契机自由发挥,他们可以轻松、清晰地借用这种交互模式来表达自己。比如可以更加顺畅地利用模板来制作精美的 Word 文档和 PowerPoint 。

微软设计负责人专访:我们是如何创造双屏设计的?

Jon:物理世界中有太多东西,我们可以将其逐渐的数字化。

Deepak:的确,将智能化的程序和多样的传感器耦合到一起,提高生产力的方式有很多——无论是提升工作效率、家庭安全性还是让内心更加平静。其实第三方开发者身上,我看到了更多思维和想法的延展,以及可能性。

Jon:对,我们已经看到很多非常有趣智能的东西了!在 Microsoft Hackathon 大会上,有人为 Surface Duo 设计了一款双人游戏,两个玩家各占一块屏幕,隔着转轴来来操作,彼此面对面,非常有趣!

Deepak:确实如此!

Jon:我们很高兴 Surface Duo 最终能够面向普通用户,我很期待它最终会在普通用户手中会迸发出怎样的创意和灵思,他们能够构建出什么样的创新软件。

Deepak:有太多值得期待的东西了 !

译者按:

微软在硬件产品上,有着丰富的翻车历史。90年代的事情太过久远姑且不说,最近十几年,出过很多比较失败的产品,比如上架仅 6 天就全线下架的时尚社交手机 Kin One 和 Kin Two,比如被支付宝团队戏称为「1%」的 Windows Phone 系统和手机,比如几乎不存在兼容性的 Surface RT 系列的平板电脑。这些硬件我全都买过,可以说全是坑。

微软设计负责人专访:我们是如何创造双屏设计的?

微软设计负责人专访:我们是如何创造双屏设计的?

这些产品单独来看是失败的,但是放在更长的时间跨度上来看,却又是微软整个生态和产品链条的构成和发展上,不可或缺的部分。Kin One 是整个 Metro 设计美学真正成型并走入移动端智能设备的里程碑(之前仅用于Zune系列播放器上),Windows Phone 则是 Windows 系统向小屏幕探索的必经之路,而 Surface RT 固然失败,但是它是带着桌面端 Windows 系统从传统 X86 架构走上 ARM 的一次大胆尝试。

微软设计负责人专访:我们是如何创造双屏设计的?

失败总是难免的,而微软这种大厂更是有着试错买单的底气。从内部设计和产品团队各自为战,到统一到一个部门来统一管理,Surface 系列产品的诞生就是分水岭,而这件事情是在 10 年发生的。

当然,在此之后翻车的产品依然会有,但是成功的概率比起更早的阶段(比如应对 iPad 诞生时,仓促推出的触摸屏PC),已经提升很多了。

如今只剩下拼硬件参数数字产品的世界简直是太无聊了。我很期待 Surface Duo 这类双屏折叠硬件能带来改变。


文章来源:优设    作者:Jon Friedman

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

你不知道的vue——vue不常用的知识点的整理

前端达人

你不知道的vue——vue不常用的知识点的整理

  1. 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>  
            
  2. keep-alive

    官网是这么解释的:

    在这里插入图片描述

    例如:可以实现页面缓存,比如从编辑页切出去再切进来,页面还是处于编辑状态.

    1. 需要在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' } } ] })  
                      
    2. 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>  
                      
    3. 在详情页detail.vue中,注意beforeRouteEnterbeforeRouteLeave两个方法。

      <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>  
                      
  3. 插槽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

  4. 强制刷新某个div

    vue实现F5刷新整个页面无空白无间隔时间

  5. 修饰符
    事件修饰符:

    1. .stop:相当于原生JS中event.stopPropagation(),阻止事件冒泡。

    2. .prevent:相当于原生JS中event.preventDefault(),阻止默认事件的发生。

    3. .capture:事件冒泡的方向相反,事件捕获由外到内。即有冒泡发生时,有该修饰符的dom元素会先执行,如果有多个,从外到内依次执行。

    4. .self:只会触发自己范围内的事件,不包含子元素。
      在这里插入图片描述

    5. .once:事件只能触发一次。

    6. .passive:事件会执行默认方法。

      注:

      1. 每次事件产生,浏览器都会去查询一下是否有preventDefault阻止该次事件的默认动作。我们加上passive就是为了告诉浏览器,不用查询了,我们没用preventDefault阻止默认动作。
      2. passiveprevent冲突,不能同时绑定在一个监听器上

    按键修饰符: 去官网查看即可,这里不过多解释。Vue.js-修饰符

  6. :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>  
            
  7. @click.native: 在封装好的组件上使用,要加上.native才能click。

    1. router-link 加上@click事件,绑定的事件会无效因为:router-link的作用是单纯的路由跳转,会阻止click事件,你可以试试只用click不用native,事件是不会触发的。此时加上.native,才会触发事件。
    2. 根据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>


作者:

转自:https://blog.csdn.net/a5252145/article/details/107316953?utm_medium=distribute.pc_category.427508.nonecase&depth_1-utm_source=distribute.pc_category.427508.nonecase

JavaScript专题之深浅拷贝(系列五)[转载]

前端达人

JavaScript专题之深浅拷贝

了解拷贝背后的过程,避免不必要的错误,Js专题系列之深浅拷贝,我们一起加油~

目录

一、拷贝示例

当我们在操作数据之前,可能会遇到这样的情况:

  1. 会经常改动一组数据,但可能会用到原始数据
  2. 我需要两组一样的数据,但我不希望改动一个另一个随之改动
  3. 我需要对数据操作前后进行对比

当我们遇到类似需要场景时,首先想到的就是拷贝它,殊不知拷贝也大有学问哦~

下面简单的例子,你是否觉得熟悉?

1.1 基本类型拷贝示例
var str = 'How are you'; var newStr = str; newStr = 10 console.log(str); // How are you console.log(newStr); // 10 

大家都能想到,字符串是基本类型,它的值保存在栈中,在对它进行拷贝时,其实是为新变量开辟了新的空间。 strnewStr就好比两个一模一样的房间,布局一致却毫无关联。

1.2 引用类型拷贝示例
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] 

不发生事情(操作)还好,一旦对新数组进行了操作,两个变量中所保存的数据都会发生改变。

发生这类情况的原因也是因为引用类型的基本特性:

  • 存储在变量处的值是一个指针(point),指向存储对象的内存地址。赋值给新变量相当于配了一把新钥匙,房间并没有换。

数组中的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 不允许我们直接操作内存中的地址,也就是说不能操作对象的内存空间,所以,我们对对象的操作都只是在操作它的引用而已。

既然浅拷贝达不到我们的要求,本着效率的原则,我们找找有没有帮助我们实现深拷贝的方法。

在这里插入图片描述

三、深拷贝的方法?

数据的方法失败了,还有没有其他办法?我们需要实现真正意义上的拷贝出独立的数据。

3.1 JSON

这里我们利用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}] 

这个方法应该是实现深拷贝最简洁的方法,但是,它仍然存在问题,我们先来看看刚才都做了些什么:

  1. 定义一个包含都过类型的数组arr
  2. JSON.stringify(arr), 将一个 JavaScript 对象或值转换为 JSON 字符串
  3. JSON.parse(xxx), 方法用来解析JSON字符串,构造由字符串描述的值或对象

理解:

我们可以理解为,将原始数据转换为新字符串,再通过新字符串还原为一个新对象,这中改变数据类型的方式,间接的绕过了拷贝对象引用的过程,也就谈不上影响原始数据。

限制:

这种方式成立的根本就是保证数据在“中转”时的完整性,而JSON.stringify()将值转换为相应的JSON格式时也有缺陷:

  • undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。
  • 函数、undefined 被单独转换时,会返回 undefined,
    • 如JSON.stringify(function(){})
    • JSON.stringify(undefined)
  • 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
  • NaN 和 Infinity 格式的数值及 null 都会被当做 null。
  • 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。

所以当我们拷贝函数、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] 

注意,此时仅能对包含纯数字的数组进行深拷贝,因为:

  1. toString无法正确的处理对象和函数
  2. Number无法处理 false、undefined等数据类型

但我愿称它为纯数字数组深拷贝

在这里插入图片描述

3.2 Object.assign()

有的人会认为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传送门

四、自己实现深浅拷贝

既然现有的方法无法实现深拷贝,不妨我们自己来实现一个吧~

4.1 浅拷贝

我们只需要将所有属性即其嵌套属性原封不动的复制给新变量一份即可,抛开现有的方法,我们应该怎么做呢?

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; } 

我们只需要将所有属性的引用拷贝一份即可~

4.2 深拷贝

相信大家在实现深拷贝的时候都会想到递归,同样是判断属性值,但如果当前类型为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
    • 判断类型为 []
    • key为 0 (for in 以任意顺序遍历,我们假定按正常循序遍历)
    • 判断不是引用类型,直接复制
    • key为 1
    • 判断是引用类型
    • 进入递归,重新走了一遍刚才的流程,只不过读取的是obj[1]

另外请注意递归的方式虽然可以深拷贝,但是在性能上肯定不如浅拷贝,大家还是需要结合实际情况来选择。




作者: 

转自:https://blog.csdn.net/jbj6568839z/article/details/107964274?utm_medium=distribute.pc_category.none-task-blog-hot-4.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-4.nonecase&request_id=

最详细完整的flex弹性布局

前端达人

初了解

在学习弹性布局之前首先就要明白其概念
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。
以上这些基础概念,请务必牢记,下面说属性时,不再重复说明!

属性

容器属性(container)

  • flex-direction
  • justify-content
  • align-items
  • flex-wrap
  • align-content
  • flex-flow

1.flex-direction

 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:主轴为垂直方向,起点在下沿。

2.justify-content

 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中!

3.align-items

 决定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:与基准线对齐 

4.flex-wrap

 决定了flex container 是单行还是多行
    nowrap(默认):单行
    warp:多行
    //这个比较少用
    wrap-reverse:多行(对比wrap,cross start 与cross end相反) 

默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。

5 align-content

 决定了多行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之间的距离的一半 

6 flex-flow 是flex-direction与flex-wrap的简写

也就是说,当你使用这个属性的时候,你可以使用上述两个的属性值,例如:flex-flow: row wrap;(水平排列,多行显示)

flex 项目属性(item属性)

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • align-self
  • flex

1 order

 order 决定flex items的排布顺序  (用的不多)
    可以设置为任意整数(正整数、负整数、0),值越小越排在前面
    默认值为0 

这个属性了解即可,说实话没怎么用过

2 align-self

 可以通过align-self 覆盖flex container 设置的align-items
    auto(默认值):遵从flex container的align-items设置
    stretch、flex-start、flex-end、center、baseline效果与align-items一致 

相当于继承父元素的align-items属性,如果没有父元素,则等同于stretch。

3 flex-grow

 决定了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,即如果存在剩余空间,也不放大。

4 flex-shrink

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,则空间不足时,前者不缩小。具体的可以自己动手尝试一下哦,最后将会给出一个骰子布局的案例!

5 flex-basis

用来设置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将占据固定的空间!

6 flex

flex 是flex-grow || flex-shink||flex-basis的简写
可以指定1 2 3个值 依次按照上述顺序!默认值为 0 1 auto 
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] } 

注意:

  1. 该属性的默认值为 0 1 auto(注意顺序),后两个属性可选
  2. 该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
  3. 如果需要这三个属性的时候,建议使用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>

测试结果

在这里插入图片描述



手机appUI界面设计赏析(六)

前端达人

手机UI中的交互是保持产品鲜活生命力的源动力。好的交互可以帮助用户快速地获得反馈,认知布局,增强体验感和沉浸感。

手机UI中的交互是保持产品鲜活生命力的源动力。好的交互可以帮助用户快速地获得反馈,认知布局,增强体验感和沉浸感。这里为大家整理了12款优秀并富有创意的交互作品,为你的产品设计注入灵感。

微信图片_20200813161550.png


   --手机appUI设计--


微信图片_20200813161602.png



   --手机appUI设计--


微信图片_20200813161606.png


   --手机appUI设计--


微信图片_20200813161617.png



   --手机appUI设计--


微信图片_20200813161622.png



   --手机appUI设计--


微信图片_20200813161629.png



   --手机appUI设计--


微信图片_20200813161633.png



   --手机appUI设计--


微信图片_20200813161644.png



   --手机appUI设计--


微信图片_20200813161647.jpg



   --手机appUI设计--


微信图片_20200813161650.jpg



   --手机appUI设计--


微信图片_20200813161653.jpg



   --手机appUI设计--


微信图片_20200813161702.jpg



   --手机appUI设计--


微信图片_20200813161710.jpg



   --手机appUI设计--


微信图片_20200813161713.png



   --手机appUI设计--


微信图片_20200813161718.jpg



   --手机appUI设计--


微信图片_20200813161722.png



   --手机appUI设计--


微信图片_20200813161724.jpg



   --手机appUI设计--


微信图片_20200813161728.jpg



   --手机appUI设计--


微信图片_20200813161748.png



   --手机appUI设计--


(以上图片均来源于网络)



  蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服



  更多精彩文章:

       手机appUI界面设计赏析(一)

       手机appUI界面设计赏析(二)

       手机appUI界面设计赏析(三)

       手机appUI界面设计赏析(四)

       手机appUI界面设计赏析(五)




提升UI界面设计效果的快速检查清单

雪涛


这并不是一篇关于设计趋势的文章,而是一篇关于基础的设计准则的文章。如果你是一名 UI 设计师,无论你经验是否丰富,有些设计的基准是需要保证的,有些容易遗忘的细节,需要借助速查清单来进行走查优化。

这份优化 UI 界面的速查清单,就是帮你搞定这件事情的。

1、字体版式

首先声明,一个项目中最好不要使用超过2种主要字体。不过这种原则已经广为流传,就不多说了,下面说说更细节的事情:

1.1、注意大写

纯大写的字母文本,要额外拉开字母之间的字间距,提升可读性。

提升UI界面设计效果的快速检查清单

1.2、注意超细体的字体

字重超细的字体要谨慎使用。可以使用浅色,但是要根据字体情况进行选择。如果你设计的文本是装饰性也就算的,如果是需要用户能清晰阅读的,就要特别慎重,能不用就不用,否则在部分手机屏幕上看起来会非常糟糕。

提升UI界面设计效果的快速检查清单

1.3、标题和正文字体尺寸

先说说网页排版。标题通常分 H1 到 H6 总计6个不同层级,但是通常不会全部用到,你需要确保层级最多不超过 4 个,并且控制它们整体的逻辑和一致性。网页的首屏和登录页面上的大标题,可以用最大的那一级,毕竟,富有表现力的视觉排版是当下趋势。

但是其他的文本不要和这个标题文本差距太大。英文文本以Chrome 浏览器为例,正文使用 16px 和 17px 这种大小,并且保留 12px 文本作为最小文本。

另外,同一个段落中,不要同时使用 16px 和 17px 这样相近又不同的文本尺寸,会让用户感到迷惑。

1.4、行高

尽量不要在行高上采用自动行高。通常,现在比较流行的做法,是将行高拉高一些,确保整体版面的透气性和可读性,尤其是涉及到大量文本的时候。

提升UI界面设计效果的快速检查清单

1.5、文本和标题的层次结构

在需要突出显示的部分使用粗体。标题、链接、按钮都在这个范畴内。如果将粗体样式应用到全部文本,这样重点就不突出了。

提升UI界面设计效果的快速检查清单

1.6、文字对比

请特别注意文本的色彩。控制好对比度,确保任何类型的显示器上都可以清晰阅读。在设计占位符文本的时候,这个问题特别突出。

提升UI界面设计效果的快速检查清单

2、间距和边距

留白对于整体设计的重要性是毋庸置疑的。留白的变化有助于设计师理清元素之间的关系,提供节奏感,增加平衡感。

2.1、去掉多余的框架和线条

将一个语义块和另外一个语义块分开,最简单的方法就是在两者之间增加一条 1px 的线。但是这并不是最好的方法。

我见过不少设计作品中,界面中一个又一个线条绘制的盒子相互嵌套,复杂无比,每个盒子都是用 1px 粗细的线绘制的。但是,如今的UI界面上基本不用这种手法了,大量的卡片替代了以往的各种「盒子」,通过投影和间距来控制卡片之间的关系。

提升UI界面设计效果的快速检查清单

2.2、梳理从属关系

边距有助于从视觉上来判断元素之间的亲疏关系。当我们考虑一个新闻资讯卡片的布局的时候,它包含有一张图片、一个标题,还有3~4行预览文本和发布日期,那么应该如何分组和间隔?标题和文本应该是一组,这一组和图片、日期的距离更远一些。听起来很令人困惑?看下面的图片你就理解了:

提升UI界面设计效果的快速检查清单

2.3、少即是多

总会有客户或者产品会想把所有的功能和元素都怼到同一个页面或者 APP 当中。这个时候,要你让标题、菜单、文本、特价优惠、社交帐号和电话号码都齐齐整整地塞到一起,同时还要给每个组件搭配上图标。

说真的,这种问题总不能避免。这个时候可以使用这个理由来试图进行沟通:用户一次接收的信息越少,进行有效操作的可能性就越大。循序渐进地呈现信息,能够让人更加愉悦,用户对于信息的接受性也更强。

用户永远都不会费力巴拉地去拆解和分析你的页面布局,紧密局促的布局也早已不符合主流审美和日常需求了。

2.4、屏幕边缘留白不均匀

如果你设计的是海报、Banner 或者是 卡片 等我们所熟知的视觉元素,那么请注意边缘留白的设计。如果按照经典的方式来布置(从左上到右下),那么尽量让上方的留白更大,这看起来会让视觉更加稳当,并且更加具有视觉吸引力。

提升UI界面设计效果的快速检查清单

3、配色和图像

Logo、图像、图标、背景这些元素决定了整个设计给人的情绪。所以在设计的时候,需要有针对性地挑选和优化。

3.1、关于 LOGO

我并不经常做 LOGO,但是在我的职业生涯中也起码做过 20 个LOGO。我的经验是:好 LOGO 很难制作。但是设计师只要遵循基本的原则,就能创建出像样的 LOGO。

比如仔细选择配色。我有一次看到一家名为 「VIP catch」 的钓鱼用品店,他们使用了紫色的 LOGO,从名字、配色到色彩的选择都和钓鱼这个场景没有一点关系。如果选对配色,有针对性地加入一些和钓鱼相关的元素,其实也就好了。

另外就是,如果你时间有限,就不要试图给品牌 LOGO 设计一个特定的符号或者图形了,因为真的很难做好。最好制作成文本 LOGO,通过微调字体来制作。

3.2、阴影

元素下方的阴影一定不要用黑色。始终基于表层的、前景的元素来选取阴影的颜色和明暗。通常,一个看起来舒适的阴影是通过多个阴影叠加造就的,一个小且明确的阴影,位于正下方,另外一个阴影模糊且弥散,透明度更高。

提升UI界面设计效果的快速检查清单

3.3、图标和图像

任何可以矢量化的元素,都尽量制作成为矢量的。从符号、箭头到 LOGO ,现在都最好制作成为矢量 SVG 格式,方便开发人员嵌入到设计系统当中。PNG 图标的边缘模糊,在清晰度越来越高的视网膜屏幕上,矢量图形元素不仅更加锐利,而且消耗更少的系统资源。

如果你正在为网站处理一组图标,请尽量确保这些图标在视觉风格和细节处理上是统一的,看起来是同属一个「家族」的。这意味着图标的笔触宽度、边框半径、视觉重量都应该是一样的。

4、其他设计常识

除了上面的几个常见的要点之外,我还要额外补充几点,它们很难直接归结为一类,但是同样重要。

提升UI界面设计效果的快速检查清单

4.1、避免使用怪异的布局

很多 UI 界面元素在过去多年的发展过程中,已经形成了认知广泛的「最佳实践」。如果在设计这些 UI 组件的时候,采用打破甚至彻底违背「最佳实践」的做法,比如将图片+标题+ 文本 的顺序打乱,可能会让人感到迷惑。

熟悉的设计并不意味着无聊,你总能够在 UI 界面的一些地方找到发挥创造力的地方,而不是在这些有着清晰规则的地方搞创新。设计师和艺术家是截然不同的职业,在设计过程中,创意冲动应该在不干扰用户体验的前提下,进行发挥。

提升UI界面设计效果的快速检查清单

4.2、布局尺寸和参数

在设计移动端 UI 界面之前,应该和开发人员进行充分的沟通,这一点很重要。iOS 和 Android 端的 APP 的尺寸还相对固定,但是如果你设计的是移动端的网页,那么可能涉及到的页面尺寸就非常多了,这个时候就要用到断点非常多的网格系统来进行响应式的设计了。

4.3、乱数假文

Lorem Ipsum 在中文中叫乱数假文,它是自动生成的一种占位符。在如今的设计领域当中,直接使用乱数假文看起来非常不专业,因为无论是 Sketch 还是 Figma 当中都有太多的插件,可以帮你生成符合语境的占位符内容。在此基础上还有另外一个要点,就是展示性的组件内容也不要简单地复制,尽量使用不同的图片和配色,让它们看起来更加真实。

结语

这份UI快速检查清单目前是比较符合当下 UI 设计行业的需求的,但是它并非是教条,在特定的情况下,你可能不用遵循它。当然,在多数时候,这份清单能够帮你让设计更加优秀。

文章来源:优设    作者:Anna Sh

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

色彩搭配只是色相变化?应更注重明度与纯度

周周

不管是平面设计、品牌设计,还是UI设计,配色都是一个基础,决定着作品的视觉效果。这篇文章就从色相、纯度、明度(色彩的三大属性)三个角度,展开谈谈色彩的搭配。

远程桌面访问阿里云服务器的方法

seo达人

我用的是Windows版本的阿里云服务器。

首先,打开服务器,找到已经创建好的服务器实例并点击。

之后会跳转到实例页面,点击右侧的“管理”

然后配置安全组。安全组中就是设置哪些IP可以访问我们的服务器。

然后在安全组配置规则。

添加新规则。

想要让Windows电脑远程链接服务器需要开放3389端口。不然就无法用自己的电脑远程链接服务器了。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

从饿了么超级会员改版,聊聊背后的产品设计

雪涛


之前我也无意中看到饿了么把「超级会员」改成了「吃货卡」,感觉还不错。虽然并不了解饿了么的会员业务,但这次改版体现了一些有趣的设计思路,正好对应了我们在设计上的疑惑点。于是就着该读者的问题,一起来聊聊其中有意思的点。

从饿了么超级会员改版,聊聊背后的产品设计

比如,如何在同质化的功能上做出一些创新且有价值的改变;如何降低营销感,把商业需求统一到用户需求上;如何不需要再纠结今天到底吃什么了……

我们「以为」的,就是真实的吗?

今天的文章,从一张图开始。

在《认知与设计》的第一章里,作者提到了关于感知的话题,在影响感知的几种方式里,第一种就是「感知的启动」,其中很典型的案例是下面的一张素描,你能看出画面中是什么吗?

从饿了么超级会员改版,聊聊背后的产品设计

一条斑点狗。

或者你没看出来?如果你看到了这只狗,就很难再回头把这张素描看做随机无序的点了。就像书里说的那样,我们看到的很多东西取决于别人告诉我们它是什么。

产品功能也是如此,它告诉了我们这是什么,我们就会这么认为。如果一开始设计的就是吃货卡,也许很多人不会想到它是会员的变体,而是仅仅当做一个福利卡来看了。对于超级会员和吃货卡的感知差别仅仅在于定义上的不同,而非本质的改变,这是很有意思的一个点。

拿生活中的一个例子去看,相同的杯子,我们可以叫它咖啡杯,同样也可以叫它养生杯,当面对不同的叫法时,我们是不是就会产生不同的代入感?

而产品大多数时候都是通过渲染场景、营造氛围来达到这个目的,我们通常将其称之为产品定位。

所以产品需要定位,需要一个鲜明的形象,然后让产品中的所有信息、功能、风格、色彩都去表现它,才能树立起用户的认知,带来深入人心的记忆点。于是,相同的功能在不同产品中的差异除了内容的填充、使用的方法、规则的定义外,还可以改变的就是 —— 包装。

就饿了么这次改版的「吃货卡」而言,它本身并非一个新功能,只是「超级会员」的一个变体,会员的本质就是产品根据用户的投入而给予的特权。所以产品只是集合了这一部分有投入有特权的群体罢了,至于怎么称呼,会员也好、吃货也罢,在产品层面都是一样的。

会员,官方的解释是:通过正式手续加入某个会社或专业组织的人。

在任何地方,我们都可以成为会员,但不是任何地方,我们都能变成吃货。所以吃货卡这个定义,一下子就把强烈的产品属性透传了出来,并联结了我们的目标用户,会员的「积分」也自然地转化成了「吃货豆」,这种概念上的改变,就是一种包装。

这是我在这篇文章中要聊的第一个点,就是通过品牌塑造来重新包装一个功能,而包装的形式要依附于产品定位。

第二大点,我们来聊营销广告与产品功能的碰撞。

在广告滥用和形式多变的今天,我们已经逐渐习惯至无感那些具有丰富色彩和设计元素的广告内容,以至于可以自动筛选出它们,打上标签,从我们的视觉中过滤出去。

但总有一些广告似乎天生具有一种隐秘的商人气质,带着精明的窥探,去诱导大家浏览、点击、分享、消费。

广告是产品的一种营销语言,而营销有时就是让利,以广告的形式,通过优惠与福利来抓住用户的心,而用户往往会认为这是欺骗。那么当商业目标和用户目标无法趋于一致的时候,我们又该如何让用户为产品站台呢?

首先,对于广告的刻板印象常源自我们接触广告的失败经验,其大致可分为三类。

第一类「虚假利益」。夸大好处,或拿非最终的利益引诱,直到我们了解了详情才发现自己是个被骗的傻瓜。

于是,产品通过弱化营销性的信息流广告,并加上清晰的广告标签,公开透明的让用户感受到自己被平等地尊重,即满足商业利益,又解决了用户的诉求问题,将两者利益统一。

从饿了么超级会员改版,聊聊背后的产品设计

但这一类并不是我们今天要聊的重点,我们继续往下看。

第二类「难度操作」,比如那些假的关闭图标、广告背景中极小的跳过按钮、或者在领取福利时的层层步骤,都是用户在接触广告时难度操作的体现。

前两种对用户来说无法原谅,而最后一种往往会作为一种营销策略,去增加用户获得奖励前对产品的投入,比如浏览、转发、消费等,这是没有问题的,关键是用户是否提前获知了我们得到奖励的所有条件。我们厌恶的,是超出我们预期的那些负担任务。

从饿了么超级会员改版,聊聊背后的产品设计

吃货卡的任务模块在优化后就直接展示了任务详情。但是首页领任务的提示却隐藏了任务的重要条件,比如「下 2 单,赚 400 吃货豆」,实际是两笔超 20 元的订单。那是否会存在一类用户,没有点击查看详情而直接下单,下单之后,发现并没有完成进度?因为外卖费用没有超过 20 元。

如果产品是担心用户因为 20 元的门槛而不做任务,那么在点击查看后的任务详情不是把这一类用户推向进一步的否定吗?我们因这样的手段能够额外获得多少增长,同时,又有多少用户因此对所有的任务失去信任,我们无法准确计算,因为得到是显性的,而失去是隐性的。比如一些音乐产品的会员机制,用户办理好之后想听某首歌,发现还需要另外再付费,于是卸载了软件。

另外,改版后吃货豆的领取方式也对应发生了改变,不是直接的发放,而是转为点击领取。

虽然趣味的动效消解了部分用户对冗余操作的厌恶感,但还是能从反馈渠道中看到用户对这种强制限时去领取奖励做法的反感。这种领取模式也可说是一种变相签到,只不过这种签到的奖励不是你通过额外行为主动赚取的,而是在已经得到的情况下被迫操作领取,和支付宝领取积分的方式一样。限定时间内不领取,还会消失。

从饿了么超级会员改版,聊聊背后的产品设计

游戏积分的领取,之所以有领取操作,是因为积分积攒的宝箱奖励,是额外的收获。玩家玩游戏的目的是体验游戏而不是为了积分与宝箱,这两者之间是有差异的。

多余的操作看起来增加了页面的曝光度,带来了更多的转化可能,却「实在」地提高了用户获得奖励的成本,从而间接降低了奖励的价值,因为投入产出比太低,所以用户常常宁愿放弃这样的奖励。

产品想要让用户感觉到方便和实惠,体验满意,但又通过这种点击才能领取的方式,强制绑定用户与页面,来触发用户的下一步行动。表面上可玩性增强了,实则是体验感的缺失。

第三类是关于「过度选择」。交互设计有一本经典的入门书籍叫《Don’t make me think》,描述了如何通过设计帮助用户理解与操作,来提高产品的易用性。同理,当我们思考营销在产品中的表现时,难道就不需要考虑用户了么?

过去的营销就像过去的产品一样,以产品实现而非用户为中心,表现产品的实现方式而不去考虑用户的心理模型。

比如软件需要我们命名才能保存,特别是系统自带的记事本软件,不仅需要自己输入文件名,还用 *txt 占了命名位,使用星号让我们无法直接保存。相比之下,很多软件已不再需要用户命名,会直接提供默认命名,还有像 Typora 这类产品,可以自动将我们的第一段文本内容作为默认文件名。

从饿了么超级会员改版,聊聊背后的产品设计

从饿了么超级会员改版,聊聊背后的产品设计

对营销而言,以实现为中心的设计想法体现在制造了尽可能多的活动类型和规则上,希望触达不同的用户。而事实是,在过度选择的压力下,很多用户直接选择了忽视。

如果去看饿了么会员旧版的设计,我们会发现它有红包、奖励金和折扣商品三类福利,三者的关系是相对分离的。

从饿了么超级会员改版,聊聊背后的产品设计

其中的规则是,当我们成为了会员:

  • 可以直接领取红包;
  • 可以通过消费得到奖励金,再去兑换红包;
  • 可以直接低价购买红包;
  • 折扣商品与红包无关,只展示优惠价格,可直接购买。

所以我们有三种获得红包的途径:领取、购买、兑换。

再看新版吃货卡的设计,在直接领取与购买红包不变之外,新版强调以用户的消费去获得奖励,不管是直接兑换红包或者兑换店铺的专属红包,都是以吃货豆兑换为核心。相比旧版,将商铺折扣商品,替换为吃货豆兑换专项红包,其实本质是一样的,无非就是为了提高吃货豆与吃货卡的利用率罢了。

从饿了么超级会员改版,聊聊背后的产品设计

在这样一个前提下,产品增加了红包类别,给予了用户更多选择的自由。虽然随着红包的分类维度变多(专享和吃货联盟的红包、特定品牌和分类的红包、具体店铺的红包),产品的规则趋向复杂,但是理解变简单了,我们也只需要做好兑换这一件事就可以。

复杂的规则仍然可以呈现出简明的设计,我们不需要用户来负责过滤这些复杂信息,而应当要求产品,站在用户这边,去降低理解成本。自然地,产品与用户就能并轨而走,商业需求与用户需求也可统一。

当然,或许也会有用户反感这样的功能被活动化,但不得不说,这确实是一个品牌的升级。

这篇文章从几个角度聊了「吃货卡」好与不好的地方。

当然它不仅仅是一个会员功能的改版,在概念玩法上也是一种升级。从设计角度看,确实有创意的表现,虽然也有不可取之处,但是它背后的设计思考是值得学习的。

我们知道,设计虽然会受到许多框架和规则的限制,但从问题出发,思考方案的过程才是设计本身最有意思的地方。好比游戏,也是因为规则与框架的限制,以至于才有了如今丰富多彩的游戏形态。

所以即使看向那些常规的功能和成熟的设计,我们也可以融入一些不一样的东西,站在过去到现在的经验上,再做出一点改变,使其更具可玩性。


文章来源:优设    作者:呆呆U理

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

2020~2021年UI界面设计趋势

雪涛

2020年已经过去一大半,这些时间以来,我一直在关注数字设计领域未来的设计趋势。从年初就开始收集,到今8月份了,我想是时候将发现的一些趋势风格分享出来,这些风格很有可能继续延续到2021的产品设计上。

对于UI界面视觉趋势,同样需要我们高度重视。毕竟每年改版方向,视觉风格研究是必不可少的一个环节,下面正式开始。

少量的渐变

今年在各网站上看到大面积的渐变色设计,相对前两年来说越来越少,设计上有所克制。大面积的渐变色虽然视觉冲击力强,但大部分停留在概念中。

从今年设计中我们可以看到设计更加理性与克制,将渐变色彩运用到关键功能上,突出强调重要信息。

高手出品!2020~2021年UI界面设计趋势

机票选购界面,将渐变色运用到头部位置去强调功能。

高手出品!2020~2021年UI界面设计趋势

运用在功能卡片上,突出重点信息。

高手出品!2020~2021年UI界面设计趋势

如上图,设计上同样只将渐变色运用在背景上,其他卡片上基本没有渐变色。

包豪斯风格图形

几何图形设计是目前运用最多一个设计手法,今年发现一些比较抽象艺术化包豪斯风格几何图形,在UI设计中大量运用,且效果还不错。

这种图形带来好处就是记忆性强,应用广,它不仅可以拓展在品牌包装,品牌图形延展,还可以运用在UI设计中。

高手出品!2020~2021年UI界面设计趋势

卡片设计采用一些具有意向符号的图形,来表达功能的设计,形成记忆点。

高手出品!2020~2021年UI界面设计趋势

品牌设计上,也是重复这种极简包豪斯风格几何图形。将logo元素提取,进行包豪斯风格化,重复运用在设计中。

有深度的界面

今年这样的设计屡见不鲜,大量3D运用在界面设计中,二维的界面已经不再满足当前设计需要。设计师去探索更多维度学科与UI界面融合,形成一种全新的视觉感官。

uber的概念官网就通过3D来呈现,表达功能亮点。

高手出品!2020~2021年UI界面设计趋势

将二维世界三维化,将是2021年重要的趋势。目前国内外线上有一些产品,开始在部分功能模块使用这样设计手法,如Naver,支付宝等。

毛玻璃效果

可以说是趋势轮回,毛玻璃的效果又回来了。这也是今年在各网站设计上出现频次多一些的设计。

新的毛玻璃效果更加去注重功能说明,用在视觉强调的地方。

高手出品!2020~2021年UI界面设计趋势

如上图设计,毛玻璃运用在顶部关键信息上。这样设计即可减少其他色彩运用,还可以对功能信息进行强调。

高手出品!2020~2021年UI界面设计趋势

毛玻璃效果运用在个人中心,人物头像位置,进行设计强调。

高手出品!2020~2021年UI界面设计趋势

运用毛玻璃去包装UI界面,可以提升品质感与神秘感。

沉浸式界面

将功能与场景融合设计,用户在使用产品过程中,能产生更多情景体验感触。这也是最近今年喊的比较火的一种设计思路。在各网站上,这样设计出现次数越来越多,设计效果冲击力强,得到很多设计师的认可。

高手出品!2020~2021年UI界面设计趋势

场景中关键人物元素与设计进行巧妙集合。

高手出品!2020~2021年UI界面设计趋势

运用超现实设计手法,将人物与酒店场景进行排版布局。

高手出品!2020~2021年UI界面设计趋势

将制作材料与产品集合。

高手出品!2020~2021年UI界面设计趋势

拟真植物元素与土地进行巧妙集合,在视觉上传达逼真效果。

界面排版杂志化

杂志化设计风格鲜明,可以有助产品去打造强化记忆点。杂志化设计的优势可以不受到网格约束,排版使用大字体,同时设计排版上更加个性。我们在做产品概念探索前期,可以多去尝试这样的风格。

高手出品!2020~2021年UI界面设计趋势

拟物化图标

拟物图标又回来了,Apple新版本的Big Sur系统,就采用拟态图标,这也是一个新的尝试,当然也是一个开始。我们很有必要时刻关注这个趋势,未来将会在更多设计中看到拟物化图标的出现。

不过这种风格也不能大面积运用在界面中,我们可以运用在一些关键功能入口设计上。

高手出品!2020~2021年UI界面设计趋势

在天气上的运用,相对之前扁平化设计,目前具有空间的拟物化设计,增加了真实感。

高手出品!2020~2021年UI界面设计趋势

圆形的运用

圆形趋势,我想大家也许会忽略的点,最近几年设计中,圆形的设计无处不在。它的好处不言而喻,亲和力强、场景覆盖广,几乎任何设计都能去用圆形。因此我们有必要去注意圆形运用技巧。

高手出品!2020~2021年UI界面设计趋势

星巴克的web UI概念设计,采用圆形与产品进行集合设计排版。

2021新拟态界面

新拟态趋势是2020年受到广泛关注的趋势之一,这种趋势大量使用了柔和的阴影和微弱渐变,使设计既具有未来感又具有现实感,并且为熟悉的界面带来了新的感觉。相对之前大面积浓厚阴影而言,目前新的简化拟态界面,会克制使用这些元素。

高手出品!2020~2021年UI界面设计趋势

2021年拟态界面,更注重功能与体验。拟态效果会使用在关键功能上,如仪表、按钮,又或者需要重点强调的地方,避免了大面积使用这种设计手法。

写在最后

2021年的趋势相对来说,有继续延续2020年一些设计风格,这些风格将会在继续加强,同时我们也有发现,目前越来越多3D元素与二维界面进行集合设计,能更生动传达功能与将故事,2021年大家务必要注意这种趋势的延续。

作为设计师,我们对设计的思考不能只停留在表象层面,而更多的需要围绕信息传达这一设计的本质功能,以充满自省的精神深化和反思自己的设计意识,同时要时刻保持对趋势的敏感度。将新趋势合理的运用在产品设计中,以产生最大化收益。

文章来源:优设    作者:功夫UX

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档