首页

设计师必须要掌握的版式基础大全

涛涛

一、关于平面设计知识

提起平面设计,也许很容易联想到平面设计师。其实平面设计不仅是职业也是一个重要的设计知识体系,在我工作中发现平面设计知识是UI设计和其他设计领域中必备的能力,然而很多朋友认为「平面设计是属于纸媒行业的事」而忽略这部分知识的重要性,为此我想简明地将平面设计知识体系中最重要的知识点提出供大家汲取。

平面设计(graphic design),也称做视觉传达设计,是指在二维平面内通过多种设计组合来借此传递信息的视觉表现设计。平面版式设计需要使用字体知识(Font)、视觉设计(Visual Design)、版面(Layout)等方面的专业技巧来达成创作计划的目的。平面设计非常重视版式的设计,而版式并非只有纸媒才需要重视。如果想做好移动端设计、网页设计甚至是别的领域的设计,那么一定要加强学习平面版式的基础知识。

二、平面构成

在我们开始学习平面版式基础之前,我们先来讲一下简明平面构成原理。平面构成是运用点、线、面和其他技法来构成基本元素的学习方法。它是在我们工作之前必须要学会的视觉语言。以下的内容希望如果您有时间进行练习,边练边摄取知识效果才能更好。

1. 点的构成

点是组成平面构成的基础要素。点可以是不同大小的;可以是不同疏密的;可以是不同虚实的。可以是整齐的点,也可以是随意排列的点。在一个画面上也可以有大小、疏密、虚实、整齐和随意对比的,对比就会产生韵律感。仅仅依靠点来构建画面时,我们会想方设法地让画面丰富,体会点的变化。

2. 线的构成

线有哪些呢?垂直线、水平线、斜线、曲线等。垂直和水平都会有稳定的感觉,斜线会更加有冲击力,曲线会感受更加柔和。由不同粗细、不同韵律的线条组合,作品将更加有视觉引导的效果。尝试只用线条构建一个画面,你会体会到不一样的视觉感受。

3. 面的构成

面的种类有不规则形状和几何形状两种。在《纪念碑谷》游戏中有个词叫做「神圣几何」,我非常的喜欢。几何图形真的是很神奇的存在,几何形是可以用数学表达出来的,也是我们在初中时就开始学习的。比如三角形、圆形、矩形、正方形、椭圆等。这些几何形在视觉上是非常令人感觉舒适的,如果你在创作时没有灵感时,可以从几何形中寻求灵感。不规则形状其实也可以分解成不同的几何形的组合。

4. 平面构成的八种形式

平面构成的形式有重复构成形式、近似构成形式、渐变构成形式、发射构成形式、密集构成形式、对比构成形式、肌理构成形式等,如果平时您发现在工作中排版的图形能力比较差,那么建议您了解一下构成形式加以练习。

5. 重复构成形式

重复构成形式就是用一个基本的元素在一定的形式下重复排列,排列对方向和疏密会产生一种秩序的美感。谈起重复构成,我想顺便介绍一下重复构成的两种方式:第一种:二方连续。二方连续是图案的一种组织方法。二方连续是由一个单位纹样向上下或左右两个方向反复连续而形成的纹样。第二种:四方连续,是由几个纹样组成一个单位向四周重复地连续和延伸扩展而成的图案形式。

6. 近似构成形式

近似构成形式是使用相似的元素进行构成的一种方式。近似构成讲求在统一中带有变化。设计上采用基本形状之间相加相减求得近似的基本形。基本形类似的构成形式就是近似构成形式。总结来说就是看着一样实则要有变化。

7. 渐变构成形式

渐变构成形式是把基本元素的大小、方向、虚实、色彩等关系进行渐次变化排列的构成形式。渐变可以是通过颜色、方向、虚实的变化也可以是通过外形的变化来完成,不一定是我们通常理解的颜色渐变。

8. 发射构成形式

发射构成形式是以一个点或多个点为中心向周围发射扩散等效果,就会具有较强的动感及节奏感。首先我们需要有骨骼线。骨骼线就是我们画面走向的一个看不见的线索。其次我们可以选择使用离心式、向心式、同心式几种发射方法来设计。

9. 特异构成形式

特异构成形式是在整体画面都有规律有固定形态的状况中进行小部分的变异以突破单调画面的形式。特异构成的部分可以用颜色、形状、线条等方法来做。很多运营类设计也会应用到特异构成形式。

10. 密集构成形式

密集构成就是在画面中使用大量重复密集的元素来给观察者一种压迫感和与留白的对比,密集构成很容易给观察者造成震撼和心理压力。

11. 对比构成形式

我们做对比构成的时候,可以使用元素的形状、大小、方向、位置、色彩、肌理等进行对比,以及重心、空间、有与无、虚与实的关系元素的对比。对比会产生强烈的反差和感官刺激。

12. 肌理构成形式

视觉可理解的物体表面图案的纹理,我们就叫做肌理,以肌理为构成的设计,就是肌理构成。我们在做肌理构成时如果用Photoshop的时候会非常的方便,可以用图案、贴图等方式。

三、排版中的元素

在平面设计的过程中,我们其实是在组织图片、文字、按钮、图标等最小元素的信息架构。这些元素是画面中的最小单位,它们本身就附着着某个信息,比如作品的标题、一个功能、去展览的地址、一个景点的照片等。这些排版中的元素需要我们放在画面中,不可以因为好不好看而删去必要的信息,然后根据他们的重要性进行排列组合。

1. 字体

字体是排版中最重要的元素,也是最直接的信息传达方式。一般来说设计师通常需要了解的字体有中文和西文字体两种:西文字体由来已久,由最早的罗马字体到我们现在苹果手机里的SFUI字体,西文字体经历了许多的设计上的变革。西文字体可以分为:罗马字体或衬线体(roman,serif)、无衬线体(sanserif)、手写体(s cript)、雕刻字系(glayphic)、典籍体字系(Classical)、装饰体字系(decorative)、展示体字系(Display)、当代字体字系(Contemporary)、符号字系(Symbol)等。中文字体由于起先版权不够重视其实并没有西文字体发展得顺利,数量上也远远落后于西文字体甚至是日文字体。好在中国设计正在崛起,在一大批设计师前赴后继的努力中,中文字体的数量正在呈指数级别增加。中文字体分为三种:第一种是黑体(笔画上没有装饰的字体)。黑体也有不同的具体字体如苹方、微软雅黑、思源等;第二种是由书法作品演变来的字体如从宋代活字印刷而来的宋体(对了,日本因为误解原因将宋体叫做明朝体)、楷体、仿宋体、行楷、隶体、魏体、舒体、颜体以及钢笔书写的字体;第三种是美术字体,比如综艺体、美黑体、水柱体、娃娃体等。

2. 族类(generic family)

这里我引用了前端工程师在CSS样式表(一种用来表述网页样式的代码)中的族类概念。常见的族类有五种:衬线体(serif)、非衬线体(sans-serif)、手写体(cursive)、梦幻字体族(fantasy)、等宽字体族(monospace)。衬线体的特点就是笔画结尾处有装饰的处理,比如我们熟悉的Times New Roman、Georgia、宋体等。非衬线字体粗细比较均匀,比较现代并且在缩小的情况下依旧保持了可读性。非衬线字体如Arial、Helvatica、幼圆、楷体等。手写字体族就是由手写而产生的字体,比如迷你简黄草、Caflisch s cript等。梦幻字体族听上去稍显非主流,但是也是字体中不可忽视的一支力量。常见的梦幻字体族有WingDings、WingDings 2等。等宽字体族将西文的二十六个字母全部变成等宽,这样做的好处就是排版大大地轻松了。常见的等宽字族有Courier、Prestige等。总体来说字体的族类是衬线体和非衬线体两个大类,大家可以简洁地记忆:衬线就是笔画处有装饰的字体族,非衬线就是笔画较为相同粗细的字体族。

3. 字族(font family)

一个族类下面是不同的字体,然而一个字体又可能有好几个字族。字体文件中通常会包含几个字族,如果你安装了Helvetica,在Photoshop中你会发现字体选择器下包含了三十多个前缀是Helvetica的字族。原因很简单,字体设计师除了设计从A到Z的大小写字体、从0到9的数字、标点符号后,还为我们设计了同样字体的不同族类来协助我们在不同地使用场景下表达合适的意思。字族一般有:正常(Regular)、窄体(Narrow)、斜体(Italic)、粗体(Bold)、粗体斜体(Bold Ltalic)、黑体(Black)等等。虽然字体的字族有多有少,但是一般都具有正常、斜体、粗体、粗体斜体四种基本字族。应用场景上:粗体通常表示强调、斜体表示引用、正常是正文。很多时候我会发现很多设计师乱用斜体,其实斜体的设计并不是为了好看,而是在书中代表本段文字来自引用另一个著作的含义。

举个使用斜体的例子:「设计的作用在于寻找功能和社会间的接点,在功能足以说明一切的前提下,装饰成分是可以节制的,如何把握节制的度是考验一个设计师是否成熟的标尺。」 -《设计的觉醒》田中一光

4. 字重(Font Weight)

一个字族中的任何一个字体也会有不同的笔画粗细变化。这种粗细变化的字体称之为字重(Font Weight),字族后面的字重选项如「Thin」、「Light」「Regular」「Book」「Bold」「Black」「Heavy」都是一个字族下的不同粗细变化。实际上,国际标准 ISO组织规定了九种字重,但是由于有些字重不常见,我们就记忆以上七种字重即可。中文字体也有相应的字重,如「极细」、「细」、「标准」、「常规」、「中等」、「粗」、「特粗」。在使用场景中,如果我们需要强调一个内容,比如标题时,一般会用粗体;如果在正文的设计中,那么就会用常规或标准等字体。英文也类似,这些字重是为了我们突出文字使用的。注意一点:在PS中我们也可以通过字体面板给文字人工加粗,这种加粗如果变成形状时会提示「该字体使用了加粗样式,不能变换」,所以可见这种人工加粗是有一点缺陷的。

5. 字体的气质

任何字体都具有自身的气质。比如一款圆角萌萌的字体会给人温柔调皮的感觉;而边角锋利的字体会给人一种强硬的感觉;书法字体会让用户觉得充满中国风和个性;瘦长纤细的字体会给人一种未来感等等。每个字体都具有一定的感受,这与色彩心理学中每种颜色带给人不同的感觉一样,字体的外形和笔画也会给人一些心理暗示。

6. 全角与半角

全角指一个字符占用两个标准字符位置。中文字符、全角的英文字符、国标GB2312-80中的图形符号、特殊字符都是全角字符。半角指字符占用一个标准的字符位置。

通常的英文字母、数字键、符号键都是半角字符。半角全角主要是针对标点符号来说的,因为正常情况我们没有打全角英文的需求。

半角英文 english

全角英文 english

半角符号 ,.’」;:{}_+!@#$%^&*()

全角符号,'";:{}_+!@#$%^&*()

计算机编程基于英文,也就是半角字符。所以在编程中符号一定都是半角的,如:

name=”郗鉴”

全角符号编程就会无效,如:

name=「郗鉴」

在我们设计作品时也一定要记得中文搭配全角符号,英文搭配半角符号。不要出现如「好的.」或者「thanks。」这样的错误。全角半角的切换在中文输入法下按SHIFT+空格可相互转换,这个知识点虽然非常基础,但是无疑我们经常看到用错的设计。

7. 文字排版八条定律
  • 第一,保证文字是可读的。
  • 第二,不要在一个版面中使用三种以上的字体。
  • 第三,如果英文标题或单独进行排版时,尽量全部使用大写而非首字母大写。中文标题或单独进行排版时结尾不需要句号。
  • 第四,文字之间的间距在UI设计中一般设置为0,行距一般为字号本身的1.5倍到2倍。但是考虑到用户使用场景,比如用户在地铁内阅读新闻时可能地铁会出现晃的情况而导致串行,就需要我们考虑增加行距。总之字间距和行距以及文字大小都要依据实际场景来决定。在UI设计中文字大小单位须设置成PX(像素),大小必须是偶数。如:24px、26px、28px等。
  • 第五,文字阅读需要清晰地背景区分,比如黑纸白字和白纸黑字原则。
  • 第六,除非不得已尽量避免在一个版式中使用中英文混排。
  • 第七,文本左边对齐同时右边也需要对齐。可以通过PS中的段落面板设置间距组合和避头尾法则,但是有时半角符号可能会让我们很棘手,那就要通过调整间距和空格等方式让文本尽量对齐。
  • 第八,中文前面需要空两个全角字符空格,英文前面无需空格,但需要大写。

四、图片

我们在一个设计中一定会依靠一些配图或者照片素材来进行排版。有时我们会选择寻找素材或者是自己去拍,无论如何,作品中使用的图片一定要与整体设计色调相符,冷色暖色中性色都要符合整体的色调,一定是邻近色或对比色等色彩关系,不要因为自己的主观放置没有色彩关系的配图或者会抵消画面色彩倾向的配图。另外注意色彩会产生「水彩效果」,即两种颜色放在一起,如果其中一种是灰色或者比较脏的颜色,那么另一个颜色在我们大脑中也会感觉变脏了。类似于这种效果可以在作图中慢慢体会。

1. 图文比例

在一个设计中,图片与文字的量应该有一定的对比。人天生喜欢看图片而不是阅读,实际上人类有阅读能力的历史只有几千年,而欣赏图片的能力是天然的。如果你的需求上文字需求非常多,尝试与需求方商讨减少文字量。文字量越少,图形化设计越多,那么视觉上这个作品看起来就更轻松。

2. 图片比例

在平面设计中,因为最终目的是印刷,对我们的图片尺寸没有非常严格的要求。但是如果我们是为了互联网产品的设计的话,可能会涉及一些需要网站编辑直接上传的图片,如果你的尺寸不是一个固定尺寸,那么可能原本网站编辑不需要裁剪图片而可以直接上传的工序,要因为我们的一个尺寸变得很复杂。所以请牢记以下三个尺寸:4:3,16:9,1:1。4:3的原因是相机的画幅一般是4比3,所以我们看到的新闻客户端的图片大多是4:3。16:9的原因是视频宽荧幕画幅就是16:9,所以我们看到视频网站的截图一般都是直接由机器抓取的图片。1:1一般用于封面等图片素材的尺寸是正方形的。

五、排版的CRAP原则

1. 排版中的逻辑关系

任何一个设计中都需要把各个元素分级分清主次,这样才能更好的抓住重点。你可以想象自己在管理着一部玛丽苏电视剧,这部剧中谁是主角?谁是女二号?谁是群演?主角需要独立的化妆间和助理;女二号可能只有一个助理;群演可能就是整个剧里的一个过客。我们的设计也是如此,哪个信息是主角?哪个信息是女二号?哪些元素又仅仅是群演呢?女主元素首先要站C位(网络流行词,来源center)霸占画面的中心,然后这个元素要尽量突出,可以使用更鲜艳的颜色、更夸张的字重、加边框等方式突出;女二号信息一定不要抢了女主信息的风头,所以要和女主元素有一定的对比,字号上也要小很多,尽量让用户第一眼看到主要元素。而群演的元素一定要淡化,仅仅让人感知有这些元素就可以了,比如文字可以缩小到刚刚能注意到,颜色可以是接近背景色等。那么如何让这些信息按照他们的身份来排版呢?我们就要用到CRAP原则了,CRAP是这四个原则的首字母缩写,分别是对比、重复、对齐、亲密性四个原则。

2. 对比 CONTRAST

在同一个视觉区域内的逻辑不同的元素应该有所区别,避免视觉上相似。这样就可以有效地区分谁是主角谁是配角了。为了让主要元素更突出,让次要元素更后退,我们可以尽量使它们的颜色、字体、大小、留白不同。如果两个元素不尽相同,请让它们截然不同。比如如果你想使用12px的正文与14px的标题区分明显,不如用12px与40px进行区分反差更大,更容易区分哪个内容是需要优先浏览的、哪个内容是次要的。对比的方式有以下几种:

色彩对比

在我们排版时首先要产生对比效果的就是背景和文字了。文字是第一阅读元素,背景和文字如果颜色很接近,那么就不容易区分出来引发注意了。一般来说在很多媒介的设计中我们习惯了白纸黑字,即白色背景和黑色文字。我指的不仅是纯黑和纯白,也包括其他类似明度颜色的对比。黑纸白字是另一个选择,深色背景和浅色文字的搭配其实不适合大量阅读,如果你的作品信息不多是没有问题的,但是如果用户阅读很久黑纸白字的界面,就会产生视疲劳(比如再次盯着白色的墙的时候文字还会出现等)不舒服的感受。当然一切取决于用户使用场景,如果我们的设计被应用在夜晚等较暗的环境,黑纸白字更利于阅读。总之,不管你的设计采用橙蓝、黑白、蓝紫配色,一定要记住文字和背景的对比关系。

除了文字之外,图标和其他装饰信息的色彩对比也是非常重要的。辅助信息或者辅助功能的图标尽量淡化以突出主要功能和图标;重要功能如订单等按钮则需要突出和醒目。色彩对比是设计中一个非常常见的手法。

大小对比

大小对比是指文字、图片、图标等元素为了区分重要性采用的区分方法。比如两行文字:郗鉴和相声演员,同属文字但权重不同:第二行的文字用于解释第一行的内容,所以第二行内容应该通过大小和颜色变成次级,让用户阅读时分清主次。与此类似,比如音乐播放界面中的三个按钮一般并排放在一起:上一首歌、播放、下一首歌,哪个应该更大呢?当然是常用的、重要的功能-播放按钮。当然如果图标同属一个级别也应该放在一个尺寸的级别上。

3. 重复 REPETITION

如果相同的内容(如标题等)属于同一个逻辑,可使它们的颜色、字体、大小、留白保持相同。这样可以增加条理性和加强设计的统一性。这个原则看似简单,但是新手很容易犯这个问题,所以再次提醒,一个级别的信息尽量使用一种设计来保持用户的认知,避免用户认为是另一种信息分类。这就是重复原则。在一个属性或逻辑单元里的内容应该尽可能地使用重复的颜色、大小、间距。我们来看,一个注册页面可含有:注册、登录、忘记密码、跳过等内容。如果我们把登录页面分为四个属性,那么可能我们需要四种字体或四个不同的区域。但如果我们把它们分为两类呢?注册和其他。那么同一个分类就可以重复使用一种字体了。看上去就不会很乱了。在重复原则下,用户会因为视觉惯性变成寻找线索的「僵尸」,会根据线索而顺畅地浏览下去。

 

4. 对齐 ALIGNMENT

任何内容在版面上都尽量应该上下左右对齐。随意摆放绝对是错误的。这一点一定要和大家多次强调,比如一个元素上下左右的间距都要是一样的。大家看到网页和app设计之中经常会有间距和留白,留白和对齐都是我们在设计时需要考量的,留白不是随意的。

5. 亲密性 PROXIMITY

在逻辑上有关系的两个元素应该尽量放在一起。两个视觉元素在一起就会变成一个视觉单元。比如注册页面中的登录视觉单元是由输入表单和登录按钮组成的。相同的内容,如小标题等,属于同一个逻辑。可使它们的颜色、字体、大小、留白保持相同,这样可以增加条理性和加强设计的统一性。

六、用户浏览定律

左到右阅读:从左到右是受现代社会影响后天影响我们的一种习惯。我们看一个比较大面积的设计时也会从左到右依次阅读,这也就是为什么网站的logo都在左上角。从上到下阅读:我们阅读作品时也是从上到下依次阅读,所以重要的内容一定在上面,按优先级来排列。从大到小阅读:我们的视觉也是比较调皮的,如果一个元素很大,我们也会首先去注意大的元素再依次看中等和小的元素。从重到轻:元素的颜色也会影响我们阅读的顺序,从重到轻依次浏览。狩猎式阅读:狩猎式阅读用户在寻找可以完成当前界面或设计中的任务线索,比如在购买页面中会寻找支付按钮等。S曲线阅读:S型曲线阅读比较适合比较大的设计,眼球需要左顾右盼从上到下来浏览信息,在S型的浏览方式下比较能够全面地观察每个页面元素,S型成了目前主流的视觉导向模式。那么在S型曲线中,我们的对其方式有三种:左对齐、右对齐、居中对齐。重点元素可以依次左右摆放,让用户有一个视觉浏览的惯性,左-右-左-右-左-右。

七、构图

上面我们介绍了一些排版和平面的基本原理。那么实际上我们在应用中要做的就是将这些知识运用在具体的需求里。让多个元素能够完美地展现在一个画面里也是一种能力,我们管这种能力叫做构图能力。那么下面我来简单讲一下构图能力有哪些要点。

1. 重心

我们的任何一个排版里都会出现重心。重心是我们人类的一个心智模型,我们从物理世界里学习了重心的规律,在看平面作品的时候也会莫名地关注重心问题。在设计中我们可以利用这一点创作出倾斜的重心、居中的重心、左对齐的重心等。但是请大家注意,如果我们的排版里一个单元是居中的,那么这个单元内的元素也应该重心居中而不应该重心不稳,否则会感觉大厦即将倾倒。

2. 骨骼

设计某个元素或者几个元素组成的单元也要注重骨骼,骨骼有外延骨骼和内在骨骼两种。在做完设计以后可以将作品元素的外围连个线,看看是什么形状。有时我们会发现一些骨骼不好的设计确实会给人不舒服的感受。

3. 栅格系统

1692年法国国王路易十四命令成立管理印刷的皇家特别委员会。委员会由数学家尼古拉斯加宗(Nicolas Jaugeon)担任领导,他们采用方格为设计依据,每个字体方格分为64个基本方格单位,每个方格单位再分成36个小格,这样印刷版面就有 2304个小格组成,在严谨的几何网格中设计字体和版面来试验视觉传达的功能。栅格系统英文是「grid systems」,是一种平面设计的方法。栅格系统运用固定的格子设计版面布局,其风格工整简洁,这种方法现在也被应用在移动设备和网站设计等领域里。科学的栅格会给人一种秩序的美感和现代感。

△ 网格系统在书籍排版的应用 作品:Dale magazine by Rocio Gomez

△ 网格系统在图形中的应用 作品:Pixty App Branding by Ramotion

4. 为你的设计建立栅格

我们在设计任何作品时,首先考虑的是应用的尺寸。如iPhone8的分辨率为750x1334px、安卓1080P分辨率为1080x1920px等。在我们确立了我们排版的尺寸后,我们就可以根据这个宽度设计可以被整除的栅格了。我们把整体宽度定义为W。然后整个宽度分成多个等分单元A。每个单元A中有元素a和间距i。所以他们之间的关系就是 W =(a×n)+(n-1)i 。当然每个应用的尺寸不止可以整除成一种栅格,这就要看我们内容排版的疏密程度了。之后,我们将过多内容的栅格和另一个栅格相加得到更大的排版空间;其他元素都须老老实实呆在自己的栅格内,这样就完成了一个布局非常科学的设计了。

比如一个网页宽度是1000px的情况中我们可以使用:20列每列40px和10像素间隔、20列每列30px和20像素间隔、25列每列30px和10像素间隔、25列每列20px和20像素间隔。如果网页宽度是990px我们可以使用:11列每列80px和10像素间隔、18列每列35px和20像素间隔、25列每列45px和10像素间隔、33列每列20px和10像素间隔。如果网页宽度是页宽980px我们可以使用:14列每列60px和10像素间隔、14列每列50px和20像素间隔、28列每列25px和10像素间隔。

6. 8像素栅格

用8当然不是因为数字吉利,而是因为 8 是偶数,并且8可以被成倍缩小三次!(就是8可以缩小一倍到4,4可以缩小一倍到2,这对于移动端适配来说太有优势了)考虑到移动设计中的适配特殊性,缩小到其它尺寸可能会出现虚边和半像素,用偶数可以避免这种情况。 为什么是8?因为比如1920×1080、1280×1024、1280×800、1024×768都是8的倍数(尽管部分尺寸不是8的倍数,但也不会显得奇怪)。除此之外,我们在做其它设计时也可以将不同的留白设计成有倍数关系的数字,比如10px、20px、30px等,让设计内部更有逻辑性。


7. 黄金比例

黄金比例是一个定义为 (√5-1)/2的无理数。 运用到的层面相当的广阔,例如:数学、物理、建筑、美术甚至是音乐。 黄金比例的独特性质首先被应用在分割一条线段上。如果有一条线段的总长度为黄金比例的 分母加分子的单位长,若我们把他分割为两半,长的为分母单位长度,短的为分子单位长度,则短线长度与长线长度的比值即为黄金比例。

黄金比例(以下简称「黄金比」)约为: 0.618:1。

△ 使用黄金比例设计出来的苹果logo

8. 斐波那契螺旋线

斐波那契螺旋线也被叫做「黄金螺旋」,是根据斐波那契数列画出来的螺旋曲线,自然界中存在许多斐波那契螺旋线的图案,是自然界最完美的经典黄金比例。斐波那契螺旋线,以斐波那契数为边的正方形拼成的长方形,然后在正方形里面画一个90度的扇形,连起来的弧线就是斐波那契螺旋线。

斐波那契数列(FibonacciSequence),又称为黄金分割数列。在数学上,斐波那契数列是以递归的方法来定义:

F0=1

F1=1

Fn=Fn-1+Fn-2

△ 符合斐波那契螺旋线设计的Twitter logo

9. APP图标中的栅格

以64px为一个单位,即a=64px。那么大正方形的边长的一半=8a,大圆半径=7a,中圆半径=4.25a,小圆半径=3a。 8a/(8a-3a)=1.6 小圆与大正方形接近黄金比 7a/4.25a≈1.647 中圆与大圆接近黄金比 4.25a/3a≈1.417 中圆与小圆比例接近√2 整个栅格系统中的尺寸都是通过黄金比例互相联系的。

△ 内部符合斐波那契螺旋线和黄金分割的IOS启动图标骨骼

iOS的启动图标非常重要。并且苹果规定所有应用程序的启动图标都必须是圆角正方形作为图标背板。这个背板也给我们了一些参考线,苹果使用黄金分割和斐波那契螺旋线将画面分割为若干部分。如果我们绘制启动图标时可以贴合这些参考线。8a/(8a-3a)=1.6 小圆与大正方形接近黄金比7a/4.25a≈1.647 ,中圆与大圆接近黄金比,4.25a/3a≈1.417 中圆与小圆比例接近√2。

总结

平面与版式的设计知识涵盖了字体的选择、图片的选择、平面构成基础、排版的CRAP原则、栅格化设计、黄金比例等多个知识点。如果我们现在接到一个需求,可以首先将内容放进画面并排列好重要性、然后选择合适气质的字体和图片、使用CRAP的排版原则将信息排成合理的顺序、利用栅格化和黄金比例让画面更加科学、最后如果发现画面比较空可以加入几何形装饰。怎么样,思路清晰了吗?平面与版式知识背后是人类读取信息几千年来形成的习惯以及现代社会约定俗成的阅读方式和心理学等,要想成为一个优秀的设计师,我们还需要进一步地了解设计背后的原理以及表达信息的多种方法。希望本篇文章能够对您的平面与版式设计有所启迪。

优秀UI界面设计评析

蓝蓝设计的小编

男生运动鞋商店支付界面,颜色搭配非常舒服,鞋子摄影也很漂亮,字体字号运用非常到位。

超全面总结!产品设计中的可拓展性原则

涛涛

可拓展性原则是我自己瞎起的一个名字,高兴的话你说弹性原则也行。主要意思是指界面设计要足够的灵活,具有弹性,以满足将来可能出现的场景。我第一次考虑这个问题是从去年7月份开始,当时接到领导的一个临时需求,要给直投项目增加一个到期查询的功能。因为原来的界面设计比较死板,所以突然加一个新功能导致整个布局都被打乱了,结果做的很不理想。当时我就希望可以找到一个方法来应对领导这种突如其来的需求。

产品设计的可拓展性就是为了应对将来未知的改变。改变来自于功能的改变,因为产品是由一个个功能组成的。功能的改变可以分为两类:数量的改变和状态的改变。当然这里不涉及到具体的功能设计,只是探讨功能入口的展示。

一、数量

数量的改变指的是功能的增加,删减与合并。多数是指新功能的增加,这就要求我们在界面(布局)设计中要给将来可能添加的新功能预留坑位。在哪里预留坑位?又给哪些功能预留呢?这里我就例举最常见的两种界面布局(导航)样式来说:宫格式布局和列表式布局。

不知道大家有没有注意到一个现象:一级页面中主要用宫格式布局,而二级,三级页面多数用列表式布局。这主要是因为一级页面是产品的门户和脸面,而且又多属于功能的聚合页,特别是首页,这就要求一级页面在展示足够多入口的同时还要兼顾视觉吸引力。而以icon,插画,图像为主要表现形式的宫格式布局在视觉设计上更容易出彩。特别是icon,在相同的空间里,可以展示更多的入口。

但是其缺点就是可拓展性差,不管是2*5还是3*4,你如果想单独新增一个功能,界面就会失衡。当然我们可以给用户提供分页,这就意味着有些功能需要用户滑动才能看到,具有一定的风险。

还有一种方法就是提供全部按钮,用户点击可以查看全部功能。

列表式布局就没有这方面的顾虑,它可以在不打破界面布局的情况下增加新功能入口,但是它的缺点在于可展示的入口太少了。宫格式布局一屏可以展示20多个入口,而列表式布局只能达到其一半的水平。

这也是经常困扰设计师的一个问题,因为数据反馈一个页面超过一屏往下内容的点击量是急剧下滑的,所以一般的一级页面都不会设计的很长。如何在有限的空间里展示足够多的入口呢?

没有什么是可以难倒我们设计师的,最近我看到一些产品在底部栏tab里动起了心思。以苏宁易购为例,当你点击进入「发现」,tab会变成「直播大厅」;点击进入「首页」,tab会变成「猜你喜欢」。所以虽然只有5个坑位但是塞进了7个tab,这是一个很好的思路。

还有在京东首页中,用户下拉会进入520专属活动页面。同样的还有微信,用户下拉直接显示你最近打开的小程序。但是目前来说,大多数用户还认为下拉只能刷新界面,对于「下拉发现新功能」足够的缺乏认知。这样的入口可以吸引多少的流量还有待检验。

对于一级页面我还有一个建议:千万不要随意把功能入口放在顶部栏上。因为对于一些小功能的迭代,入口放在哪里都一样,用户看得到很好,看不到也无所谓。但是如果要上线一些层级比较高的功能,又不想打乱界面的原有布局,最好放到顶部栏上。特别是你的界面中如果还没有搜索、城市定位、分享、筛选、通知等全局功能,一定要把顶部栏的位置空出来。文章开头我说的「到期查询」其实就属于筛选功能。

二、状态

上面也说了,本文所提到的可拓展性指的是入口的可拓展性。那么入口在状态上的变化可以分为外部状态变化和内部状态变化。

外部状态变化主要说的产品层面的变化,针对的是C端产品。对C端产品来说,定期组织营销活动来拉新肯定是必不可少的。这种情况下我们需要对界面的元素进行处理使其来适应不同的活动氛围。从这个方面来说,我们可以发现为什么宫格式布局更容易受到各大电商平台的青睐。因为它可以根据不同的活动配置一套完全不同的icon,灵活多变。这种状态上的百变来打造营销氛围的能力是列表式布局所不具备的。

列表式布局可以向用户传递更多的信息,更能表现内部状态的变化。以下图为例,用户可以知道自己还有一张优惠券没有使用,知道自己本月还有126元没还。而宫格式布局碍于空间,很难向用户展示过多的信息。

以上方的日历为例,近期做了一个拆红包活动,用以icon为主的宫格布局只能加一个「拆红包」的角标。如果采用了列表式布局,可以直接展示金额,更能起到刺激用户的作用。

写分析总结写到现在读者越来越多,所以愈发担心自己写的不好会误导别人。对于设计来说,无所谓对错,只有合适和不合适。就像上面提到的两种布局方式,在列表式布局中你可以随意添加新功能,但是碍于空间,可添加的功能数目也不会太多;宫格式布局倒是不怕入口放不下,但是会引起界面的失衡。设计师的能力就体现在收集用户数据,分析具体场景,去思考得出最合理布局样式。不要拘泥于解决方案,因为解决方案有很多,我们要学习的是解决方案中所体现的思维方式和过程。

总结

以上就是我针对产品设计中可拓展性原则的一个简单分析总结,欢迎大家留言讨论。

微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1.把wxParse文件全部放入项目。

2.在wxml中import wxParse.wxml,并把template插入到到对应的位置上

[html] view plain copy
  1. <!--wxml-->  
  2. <import src="../../../wxParse/wxParse.wxml"/>  
  3. <view class="view-title">{{title}}</view>  
  4. <view class="view-time-box">  
  5.   <text class="view-date">{{date}}</text>  
  6.   <text class="view-time">{{time}}</text>  
  7. </view>  
  8. <template is="wxParse" data="{{wxParseData:article.nodes}}"/>  

3.在wxss中import wxParse.wxss,并设置样式;比如‘wxParse-image’是富文本图片转化成image组件之后的类名,‘wxParse-p’是p标签转化成view组件后设置的类名

[css] view plain copy
  1. <!--wxss-->  
  2. @import "../../../wxParse/wxParse.wxss";  
  3. page{  
  4.   background#fff;  
  5. }  
  6. .view-title{  
  7.   line-height80rpx;  
  8.   font-size48rpx;  
  9.   color:#0C0C0C;  
  10.   overflowhidden;  
  11.   text-overflow: ellipsis;  
  12.   display: -webkit-box;  
  13.   -webkit-line-clamp: 2;  
  14.   -webkit-box-orient: vertical;  
  15.   max-height190rpx;  
  16.   min-height80rpx;  
  17.   width:690rpx;  
  18.   padding:30rpx 30rpx 0;  
  19. }  
  20. .view-time-box{  
  21.   height66rpx;  
  22.   line-height66rpx;  
  23.   font-size30rpx;  
  24.   color:#999999;  
  25.   margin-bottom40rpx;  
  26.   padding:0 30rpx;  
  27. }  
  28. .view-date{  
  29.   margin-right20rpx;  
  30. }  
  31. .wxParse-img{  
  32.   margin-top:20rpx;  
  33.   displayblock;  
  34.   position:relative;  
  35.   top:0;  
  36.   left:50%;  
  37.   transform: translateX(-50%);  
  38. }  
  39. .wxParse-p{  
  40.   text-indent2em;  
  41.   margin-top:20rpx;  
  42.   color:#0C0C0C;  
  43.   line-height:50rpx;  
  44.   font-size:34rpx;  
  45.   padding:0 30rpx 30rpx;  
  46.   text-alignjustify;  
  47. }  

4.js

[javascript] view plain copy
  1. var WxParse = require('../../../wxParse/wxParse.js');  
  2. Page({  
  3.   
  4.   /** 
  5.    * 页面的初始数据 
  6.    */  
  7.   data: {  
  8.     title: '',  
  9.     date: "",  
  10.     time: "",  
  11.     id: ''  
  12.   },  
  13.   
  14.   /** 
  15.    * 生命周期函数--监听页面加载 
  16.    */  
  17.   onLoad: function (options) {  
  18.     this.setData({  
  19.       id:options.id  
  20.     })  
  21.   },  
  22.   onShow: function () {  
  23.     wx.showLoading({  
  24.       title: '加载中...',  
  25.     })  
  26.     var that = this;  
  27.   
  28.     // 模拟获取数据  
  29.     setTimeout(function () {  
  30.       that.setData({  
  31.         title:'侨宝柑普茶新会陈皮侨宝柑',  
  32.         date:"2018-03-01",  
  33.         time:"13:20:53"  
  34.       })  
  35.       var article = `  
  36.         <img src="../../../imgs/index/s.png"></img>  
  37.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  38.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  39.         <img src="../../../imgs/index/s.png"></img>  
  40.     <p>近两年,小青柑的火爆有目共睹,娇小玲珑的产品形态、便携式的消费场景、柑与茶结合的时尚方式以及独特的口感和养生功效,都在顺应着目前年轻化、多元化、便携化的茶叶消费市场需求,让它成为了一大爆品。</p>  
  41.       `;  
  42.       /** 
  43.       * WxParse.wxParse(bindName , type, data, target,imagePadding) 
  44.       * 1.bindName绑定的数据名(必填) 
  45.       * 2.type可以为html或者md(必填) 
  46.       * 3.data为传入的具体数据(必填) 
  47.       * 4.target为Page对象,一般为this(必填) 
  48.       * 5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选) 
  49.       */  
  50.       WxParse.wxParse('article''html', article, that, 20);  
  51.         
  52.       // 更改数据、获取新数据完成  
  53.       wx.hideLoading();  
  54.     }, 500)  
  55.   }  
  56. })  
具体的API可以去GitHub上查看:https://github.com/icindy/wxParse








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


js中常见的位置属性-offset,scroll,client系列

之晨

前言
       Javascript中的offset、scroll、client系列都是比较常用的坐标属性,也是比较容易混淆的知识点。
offset家族
       offset家族一般在节点对象里面使用。
       offsetParent
             1.    如果当前元素的父级元素没有进行css定位(position为absolute或relative),offsetParent为body。
             2.    如果当前元素的父级元素中有css定位(position为absolute或relative),offsetParent取最近的那个父级元素。
       offsetLeft/Top计算规则:
             标准流、浮动、非脱标定位
              offsetLeft = 自己的margin+offsetParent的margin、padding、border
              脱标定位
              offsetLeft = 自己的left + margin-left
        注意:与stlye.left的区别
              offsetLeft只可读,不可写。也就是说,通过offsetLeft只能获取元素的左偏移值,而无法去设置元素的左偏移值。
               stlye.left可读可写,但是通过style.left获取元素的偏移值,是一个带单位的字符串,例如“100px”。

            (offsetTop同理)

        offsetWidth(和offsetHeight:

        其实就是一个元素的实际宽度 = width+padding+border

client家族】

        clientWidth (clientHeight) = width+padding

              该属性指的是元素的可视部分宽度和高度

              假如元素有padding有滚动,且滚动是显示的

              clientWidth = width + padding - 滚动轴宽度

       clientTop(clientLeft):

             这一对属性是用来读取元素的border的宽度和高度的

             clientTop = border-top 的 border-width

             clientLeft = border-left 的 border-width

【scroll家族】

150537.jpg.png

  如上图所示
       scrollWidth(和scrollHeight
          无滚动轴时:scrollWidth = clientWhidth = width + padding
          有滚动轴时:scrollWidth = 实际内容的宽度 + padding
       scrollTop(和scrollLeft
           这对元素是可读写的,指的是当元素其中的内容超出其宽高的时候,元素被卷起的宽度和高度
【事件里面的clientXoffsetXscreenX


  • event.clientX:设置或获取鼠标指针位置相对于当前窗口的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条
  • event.clientY:设置或获取鼠标指针位置相对于当前窗口的 y 坐标,其中客户区域不包括窗口自身的控件和滚动条
  • vent.offsetX:设置或获取鼠标指针位置相对于触发事件的对象的 x 坐标
  • event.offsetY:设置或获取鼠标指针位置相对于触发事件的对象的 y 坐标
  • event.screenX 设置或获取获取鼠标指针位置相对于用户屏幕的 x 坐标。
  • event.screenY设置或获取鼠标指针位置相对于用户屏幕的 y 坐标。


【window系列】
  • window.innerHeight指的是浏览器窗口显示html文档的可视区域的高度
  • window.outerHeight指的是浏览器窗口的高度 ,包括了工具栏,地址栏等等高度

       window.screen包含了屏幕的信息
  • window.screen.width   电脑屏幕的整个宽度
  • window.screen.availWidth   电脑屏幕除去菜单条之后的宽度
  • window.screen.left   浏览器窗口的左上角距离电脑屏幕最左侧的距离




微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1.把wxParse文件全部放入项目。

2.在wxml中import wxParse.wxml,并把template插入到到对应的位置上

[html] view plain copy
  1. <!--wxml-->  
  2. <import src="../../../wxParse/wxParse.wxml"/>  
  3. <view class="view-title">{{title}}</view>  
  4. <view class="view-time-box">  
  5.   <text class="view-date">{{date}}</text>  
  6.   <text class="view-time">{{time}}</text>  
  7. </view>  
  8. <template is="wxParse" data="{{wxParseData:article.nodes}}"/>  

3.在wxss中import wxParse.wxss,并设置样式;比如‘wxParse-image’是富文本图片转化成image组件之后的类名,‘wxParse-p’是p标签转化成view组件后设置的类名

[css] view plain copy
  1. <!--wxss-->  
  2. @import "../../../wxParse/wxParse.wxss";  
  3. page{  
  4.   background#fff;  
  5. }  
  6. .view-title{  
  7.   line-height80rpx;  
  8.   font-size48rpx;  
  9.   color:#0C0C0C;  
  10.   overflowhidden;  
  11.   text-overflow: ellipsis;  
  12.   display: -webkit-box;  
  13.   -webkit-line-clamp: 2;  
  14.   -webkit-box-orient: vertical;  
  15.   max-height190rpx;  
  16.   min-height80rpx;  
  17.   width:690rpx;  
  18.   padding:30rpx 30rpx 0;  
  19. }  
  20. .view-time-box{  
  21.   height66rpx;  
  22.   line-height66rpx;  
  23.   font-size30rpx;  
  24.   color:#999999;  
  25.   margin-bottom40rpx;  
  26.   padding:0 30rpx;  
  27. }  
  28. .view-date{  
  29.   margin-right20rpx;  
  30. }  
  31. .wxParse-img{  
  32.   margin-top:20rpx;  
  33.   displayblock;  
  34.   position:relative;  
  35.   top:0;  
  36.   left:50%;  
  37.   transform: translateX(-50%);  
  38. }  
  39. .wxParse-p{  
  40.   text-indent2em;  
  41.   margin-top:20rpx;  
  42.   color:#0C0C0C;  
  43.   line-height:50rpx;  
  44.   font-size:34rpx;  
  45.   padding:0 30rpx 30rpx;  
  46.   text-alignjustify;  
  47. }  

4.js

[javascript] view plain copy
  1. var WxParse = require('../../../wxParse/wxParse.js');  
  2. Page({  
  3.   
  4.   /** 
  5.    * 页面的初始数据 
  6.    */  
  7.   data: {  
  8.     title: '',  
  9.     date: "",  
  10.     time: "",  
  11.     id: ''  
  12.   },  
  13.   
  14.   /** 
  15.    * 生命周期函数--监听页面加载 
  16.    */  
  17.   onLoad: function (options) {  
  18.     this.setData({  
  19.       id:options.id  
  20.     })  
  21.   },  
  22.   onShow: function () {  
  23.     wx.showLoading({  
  24.       title: '加载中...',  
  25.     })  
  26.     var that = this;  
  27.   
  28.     // 模拟获取数据  
  29.     setTimeout(function () {  
  30.       that.setData({  
  31.         title:'侨宝柑普茶新会陈皮侨宝柑',  
  32.         date:"2018-03-01",  
  33.         time:"13:20:53"  
  34.       })  
  35.       var article = `  
  36.         <img src="../../../imgs/index/s.png"></img>  
  37.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  38.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  39.         <img src="../../../imgs/index/s.png"></img>  
  40.     <p>近两年,小青柑的火爆有目共睹,娇小玲珑的产品形态、便携式的消费场景、柑与茶结合的时尚方式以及独特的口感和养生功效,都在顺应着目前年轻化、多元化、便携化的茶叶消费市场需求,让它成为了一大爆品。</p>  
  41.       `;  
  42.       /** 
  43.       * WxParse.wxParse(bindName , type, data, target,imagePadding) 
  44.       * 1.bindName绑定的数据名(必填) 
  45.       * 2.type可以为html或者md(必填) 
  46.       * 3.data为传入的具体数据(必填) 
  47.       * 4.target为Page对象,一般为this(必填) 
  48.       * 5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选) 
  49.       */  
  50.       WxParse.wxParse('article''html', article, that, 20);  
  51.         
  52.       // 更改数据、获取新数据完成  
  53.       wx.hideLoading();  
  54.     }, 500)  
  55.   }  
  56. })  
具体的API可以去GitHub上查看:https://github.com/icindy/wxParse








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


HTML5网页扫描二维码

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

[HTML]代码

<!DOCTYPE html>
<html>
<head>
    <title>二维码扫描测试</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<style type="text/css">
    html, body {
        height: 100%;
        width: 100%;
        text-align: center;
    }
</style>
<script src="../js/jquery-1.11.1.min.js"></script>
<script>
    //这段代 主要是获取摄像头的视频流并显示在Video 签中
    var canvas = null, context = null, video = null;
    window.addEventListener("DOMContentLoaded", function () {
        try {
            canvas = document.getElementById("canvas");
            context = canvas.getContext("2d");
            video = document.getElementById("video");
            var videoObj = { "video": true, audio: false },
                flag = true,
                MediaErr = function (error) {
                    flag = false;
                    if (error.PERMISSION_DENIED) {
                        alert('用户拒绝了浏览器请求媒体的权限', '提示');
                    } else if (error.NOT_SUPPORTED_ERROR) {
                        alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');
                    } else if (error.MANDATORY_UNSATISFIED_ERROR) {
                        alert('指定的媒体类型未接收到媒体流', '提示');
                    } else {
                        alert('系统未能获取到摄像头,请确保摄像头已正确安装。或尝试刷新页面,重试', '提示');
                    }
                };
            //获取媒体的兼容代码,目前只支持(Firefox,Chrome,Opera)
            if (navigator.getUserMedia) {
                //qq浏览器不支持
                if (navigator.userAgent.indexOf('MQQBrowser') > -1) {
                    alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');
                    return false;
                }
                navigator.getUserMedia(videoObj, function (stream) {
                    video.src = stream;
                    video.play();
                }, MediaErr);
            }
            else if (navigator.webkitGetUserMedia) {
                navigator.webkitGetUserMedia(videoObj, function (stream) {
                    video.src = window.webkitURL.createObjectURL(stream);
                    video.play();
                }, MediaErr);
            }
            else if (navigator.mozGetUserMedia) {
                navigator.mozGetUserMedia(videoObj, function (stream) {
                    video.src = window.URL.createObjectURL(stream);
                    video.play();
                }, MediaErr);
            }
            else if (navigator.msGetUserMedia) {
                navigator.msGetUserMedia(videoObj, function (stream) {
                    $(document).scrollTop($(window).height());
                    video.src = window.URL.createObjectURL(stream);
                    video.play();
                }, MediaErr);
            } else {
                alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器');
                return false;
            }
            if (flag) {
                //alert('为了获得更准确的测试结果,请尽量将二维码置于框中,然后进行拍摄、扫描。 请确保浏览器有权限使用摄像功能');
            }
            //这个是拍照按钮的事件,
            $("#snap").click(function () { startPat(); }).show();
        } catch (e) {
            printHtml("浏览器不支持HTML5 CANVAS");
        }
    }, false);
    //打印内容到页面
    function printHtml(content) {
        $(window.document.body).append(content + "<br/>");
    }
    //开始拍照
    function startPat() {
        setTimeout(function () {//防止调用过快
            if (context) {
                context.drawImage(video, 0, 0, 320, 320);
                CatchCode();
            }
        }, 200);
    }
    //抓屏获取图像流,并上传到服务器
    function CatchCode() {
        if (canvas != null) {
            //以下开始编 数据
            var imgData = canvas.toDataURL("image/jpeg");
            //将图像转换为base64数据
            var base64Data = imgData; //在前端截取22位之后的字符串作为图像数据
            $.ajax({
                type: 'post',
                url: '../ashx/HandlerScan.ashx?method=ParseImage',
                data: 'ImgData=' + base64Data,
                dataType: "json",
                cache: false,
                timeout: 10000,
                success: function (mes) {
                    if (mes.code == '1') {
                        alert('未识别二维码,请重新扫描!');
                    }
                    else {
                        alert(mes.name);
                    }
                },
                error: function (err) {
                    alert('扫描失败' + err);
                }
            });
        }
    }
</script>
<body>
    <div id="support"></div>
    <div id="contentHolder">
        <video id="video" width="320" height="320" autoplay></video>
        <canvas id="canvas" style="display:none; background-color:#F00;" width="320" height="320"></canvas><br/>
        <button id="snap" style="display:none; height:50px; width:120px;">开始扫描</button>
    </div>
</body>
</html>  

[C#后台]

    public class HandlerScan : IHttpHandler
    {
        private JsonResult js = new JsonResult();
        public void ProcessRequest(HttpContext context)
        {
            string result = string.Empty;
            string method = context.Request.QueryString.ToString();//获取想要做的操作
            switch (method)
            {
                case "method=ParseImage":
                    result = ParseImage(context);
                    break;
                default:
                    break;
            }
            context.Response.ContentType = "text/json";
            context.Response.Write(result);
        }
        private string ParseImage(HttpContext context)
        {
            try
            {
                string imgStr = context.Request.Params["ImgData"].ToString();
                imgStr = imgStr.Replace("data:image/jpeg;base64,", "");
                //整理字符串
                imgStr = imgStr.Replace(" ", "+");
                byte[] arr = Convert.FromBase64String(imgStr);
                MemoryStream ms = new MemoryStream(arr, 0, arr.Length);
                Bitmap bmp = new Bitmap(ms);
                //解析图片
                Result result = new BarcodeReader().Decode(bmp);
                if(result == null)
                {
                    return "{\"code\":1,\"name\":\"\"}";
                }
                else
                {
                    string[] a = result.Text.Split(','); 
                    string str = "{\"code\":0,\"name\":\"" + a[0] + "\"}";
                    return str; 
                }
            }
            catch (Exception ex)
            {
                return "{\"code\":1,\"msg\":\"" + ex.Message + "\",\"userName\":\"\"}";
            }
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

12条鲜有人知的css事实

之晨

      此文为译文,在这篇文章中提到了12条我们前端人员在日常工作中不是特别熟悉而又确实可以使用或者浏览器是可以很好支持的CSS技巧,熟知这些点,对我们深入研究CSS有很好的帮助。在本文中,用括号的方式加了一些简单的算是注释的个人理解。    原文地址:http://www.sitepoint.com/12-little-known-css-facts-the-sequel/

1、 border-radius属性可以使用'/'(斜杠)标签 

      不管你信不信,下边是有效的border-radius代码:

.box {
border-radius: 35px 25px 30px 20px / 35px 25px 15px 30px;

    }

    如果你之前没有见过这些,这里你可能会有一些困惑,所以这里有规范的解释:

   “如果斜杠/前后都设了值,那么斜杠前面的值就设定横向的圆角半径值,而斜杠后面的值就是设定纵向的半径值。如果没有斜杠的话,就把横向跟纵向的值设定为相等。”

763731149396848.png

图片注释:“border-top-left-radius: 55pt 25pt 的两个值定义了这个圆角的曲率(弯曲度) ”  所以,斜杠在值中的作用是让你创建不对称(横向跟纵向值)的圆角曲率

2、使用bolder、lighter相关关键字进行font-weight属性的定义

    正常来说你所看到的font-weight 属性的定义,它的值要么是normal要么是bold。你也偶尔能看到整数以整百为增量的值:100,200、、最大到900.
     然而,bolder跟lighter这两个值经常会被忘记。

         根据规范定义,这两个关键词指定了比继承值更粗或更细的值。它的出现会让你在处理一个比简单的‘bold’更粗一点或者比正常文本更细一点的多种权重的字号的时候表现的更加明显。(这块可能会有点难理解,其实这里是跟字体本身有关联的,如果你的字体,比如例子中用到的‘Exo 2’字体中,因为这个字体最细为100,bolder一下就变成400,再bolder一下是700,其实它这个bolder跟lighter是有个固定跳到的数值的,只会匹配到400,700,900这样的值里,当你的继承值为100、200或300,bolder一下,这个bolder的值都会是400,继承值为900,800,lighter一下,这个值都一样会是700,所以两个关键字其实是只会是400、700、900三个值的。)

3、关于outline-offset属性
    outline 属性由于它能够帮助调试而被众所周知(它不影响页面流)。规范上增加了一个outline-offset属性,它的作用完全跟它名字所表示的一样--让你定义它的外框线应该距离元素本身的偏移量。
    需要注意的就是,虽然outline属性是一个简写属性,但它不包含outline-offset属性,所以你每次都需要再单独定义outline-offset。

     outline-offset属性唯一的缺点就是,它在IE浏览器(即使是IE11)中不起效。

4、关于table-layout属性

    你可能会想,这是很老的信息了。我对display: table很熟悉,最早用来实现垂直居中的一种方法。但那不是我想说,注意我要说的是table-layout属性,而不是display属性。
    table-layout属性不像CSS的其他属性那样容易解释,所以我们还是先来看看规范是如何解释的:
    "根据这个算法,table的横向布局不依赖于单元格的内容;它仅仅依赖于表格的宽度、列的宽度以及边框和单元格的间距"
    这可能也是W3C规范史上第一次出现这样很难理解的东西

5、vertical-align属性用在表格跟非表格中的时候表现不一样
    如果你在2000年或者更早就开始接触网站编程,或者你处理过很多HTML电子邮件的话,那么你可能会认为vertical-align 属性是对老的HTML4中valign属性一个在HTML5里过时的,不符合功能要求的标签)的一个标准升级。
    但在CSS中vertical-align 并不是起到那样的作用。除开表格,我认为这个属性更牛逼的地方并不在于表格中的表现。
    所以,这个属性被应用于常规的元素跟表格单元的时候有什么不一样的地方呢?
    当vertical-align 不是应用在表格单元的时候,它遵循下边这些基本规则:

  • 它只在inline或inline-block元素中起效。
  • 它对元素中的内容不起效,但能改变该元素相对于其他inline或inline-block元素的对齐。
  • 它受文本/字体属性(比如行高line-height)或者相邻inline或inline-block元素的大小设置的影响。

6、伪元素::first-letter比你想象中更灵活

    伪元素::first-letter可以给元素的第一个字母定义样式,让你实现在印刷中多年前就有的段落效果(drop-cap 印刷的书本中经常能看到的段落中的第一个字比其他字号要大的效果)。
    有个好消息就是浏览器快要出一个关于元素的首字母构成的标准了。我最早在 Matt Andrews的twitter上看到有关这个推文,虽然他仅仅是发推文吐槽::first-letter选择器很糟糕。

7、你可以在HTML class列表中使用无效字符作为分隔符
    这个概念是Ben Everard在2013年的时候提出,而且我认为它值得推广一下。Ben的观点是用斜杠去将他的HTML类名进行分组,以便他的代码能够更好地阅读或浏览。他的观点认为,转义斜杠是一个无效字符,浏览器会无视它。
    所以你的HTML实例可能是这样的:

<div class="col col-4 col-8 c-list bx bx--rounded bx--transparent"> 使用斜杠后,变成这样: <div class="col col-4 col-8 / c-list / bx bx--rounded bx--transparent"> 你也可以使用任何字符(无效的或者空字符)去实现同样的效果: <div class="col col-4 col-8 ** c-list ** bx bx--rounded bx--transparent">[/font]
<div class="col col-4 col-8 || c-list || bx bx--rounded bx--transparent">
 
<div class="col col-4 col-8 && c-list && bx bx--rounded bx--transparent">

8、动画重复的次数可以是带小数的值

   在写CSS关键帧动画的时候,你应该可以用animation-iteration-count 属性来定义动画重复执行的次数:

.example {
animation-iteration-count: 3;
}

     这个例子中的整数值将会让这个动画重复执行3次。但你可能不知道这里我们可以使用小数值:

.example {
animation-iteration-count: .5;
}

   在这个案例中,这个动画将执行半次(它会在第一次动画循环的中途停止)

9、动画名称会在动画的简写方式中影响动画的使用
      有些开发者可能已经发现了这一点,在规范中对这个也有个提醒。比方说,你有以下的动画代码:

@keyframes reverse {
from {
left: 0;
}
  to {
left: 300px;
}
}
  .example {
animation: reverse 2s 1s;
}

    注意这里我使用reverse作为动画的名称。简单来看,这并没什么不妥,但要注意当我们在用上面的代码作为一个例子时发生了什么:
    这段动画并不起效,因为‘reverse’是animation-direction属性的一个关键字。任何的动画名称在匹配到一个简写语法中的关键字值的时候都会发生这样的情况。但在普通写法中这样的情况不会发生(animation-name这样单独的动画名称写法的时候)。
    动画命名在简写语法中包含了任何定时功能的关键字 (比如infinite, alternate, running, paused 等等)都会被阻断。

10、使用样式选取元素列表中元素的范围
    我不知道是谁首先这样用的,但我第一次是在Gunnar Bittersmann 的这个demo 中看到的。比如说有一个20个元素的有序列表,你想选择第7到14个元素。这里你可以使用一个选择器来实现:

ol li:nth-child(n+7):nth-child(-n+14) {
background: lightpink;

}

    这个代码使用了链式结构的伪类表达式。虽然表达式有点难理解,但你可以通过表达式中的数字看到你想要选中的范围。
    更详细地解释这个工作的原理:在链式结构的第一部分,表达式为“选中第七个元素及后面的所有元素”。第二部分的意思是“选取第十四个元素及前面的所有元素”。但由于两部分是链接在一起的,每一个限制前一个的范围。所以链式结构的第二部分不允许第一部分超过第十四个元素,然而第一部分又不允许第二部分选取到第七个元素之前的元素。

11、伪元素也适用于一些空元素
    如果你跟我一样,尝试过把伪元素附加到一个图片或者表格input标签上。你会发现这样并不生效因为伪元素在非闭合元素上无效。我想很多开发者都认为空元素(即没有闭合标签的元素)都是这样的。但这并不正确。

12、有些属性值在选择器中是不区分大小写的
    这是一个不起眼的点,让他们通过下边的HTML来看:

<div class="box"></div>
<input type="email">

    你可以通过属性选择器来给他们两个添加样式,像这样:

div[class="box"] {
color: blue;
}
 
input[type="email"] {
border: solid 1px red;
}

    上面这样是没问题的,那下边这样呢?

div[class="BOX"] {
color: blue;
}
 
input[type="EMAIL"] {
border: solid 1px red;
}

    现在两个属性值都是大写的。在这个示例中,因为class 属性是区分大小写的,所以 .box 元素的样式不生效。而另外一个email的标签,却由于type 的属性值不区分大小写,所以它的样式能生效。这并非什么重大发现,只是一些你之前可能没留意到的。

微信小程序学习参考demo源码集合

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

微信小程序学习参考demo源码集合,仅供参考学习用途!!!

面对面翻译 微信小程序源码下载,语音翻译类小程序工具http://www.henkuai.com/thread-37499-1-1.html

开源微信小程序,小团队管理小程序下载 :http://www.henkuai.com/thread-37498-1-1.html

微信小程序多用户商城demo,还在开发中:http://www.henkuai.com/thread-37497-1-1.html

微信小程序抢课列表demo :http://www.henkuai.com/thread-37496-1-1.html

微信小程序地图实时显示demo:http://www.henkuai.com/thread-37495-1-1.html

高质量微信小程序UI组件库:http://www.henkuai.com/thread-37492-1-1.html

购房摇号助手微信小程序下载:http://www.henkuai.com/thread-37471-1-1.html

股票金融微信小程序客户端:http://www.henkuai.com/thread-37470-1-1.html
接龙微信小程序脚本,创建房间等等:http://www.henkuai.com/thread-37469-1-1.html
微信小程序统一中央服务器的思路,校园小情书联盟:http://www.henkuai.com/thread-37468-1-1.html
辅导员预约微信小程序:http://www.henkuai.com/thread-37467-1-1.html
仿星巴克用心说微信小程序:http://www.henkuai.com/thread-37466-1-1.html
微信小程序顶部滑动导航菜单栏:http://www.henkuai.com/thread-37465-1-1.html
微信小程序朋友圈点赞功能,让你的朋友圈秀起来:http://www.henkuai.com/thread-37464-1-1.html
微信小程序版 “前端TOP100”:http://www.henkuai.com/thread-37463-1-1.html
微信小程序3D轮播图效果示例:http://www.henkuai.com/thread-37459-1-1.html
微信小程序仿滴滴打车小程序源码下载,欢迎加入开发:http://www.henkuai.com/thread-37458-1-1.html
微信小程序仿青桔单车,打开地图扫码开锁:http://www.henkuai.com/thread-37436-1-1.html
微信小程序投票器,投票小程序源码:http://www.henkuai.com/thread-37434-1-1.html
微信小程序时间轴源码,记录中国LGBT事件:http://www.henkuai.com/thread-37433-1-1.html
微信小程序api拦截器,完美兼容原生小程序项目:http://www.henkuai.com/thread-37431-1-1.html
微信小程序使用map组件实现多点定位显示:http://www.henkuai.com/thread-37421-1-1.html
微信小程序商城前端,展示婴幼儿商品: http://www.henkuai.com/thread-37418-1-1.html
答题小程序免费送,有人用这个“小程序”每天做100000:http://www.henkuai.com/thread-37412-1-1.html

使用微信小程序map组件开发的一个demo,各种坑:http://www.henkuai.com/thread-37400-1-1.html

微信小游戏2048源码下载,经典的小游戏:http://www.henkuai.com/thread-37399-1-1.html

微信小程序-菜谱百科,小程序开发学习demo :http://www.henkuai.com/thread-37380-1-1.html

鲜切水果微信小程序,水果商城小程序:http://www.henkuai.com/thread-37379-1-1.html

微信小程序线上图书馆前端+后端源码下载,图书查询小程序 :http://www.henkuai.com/thread-37378-1-1.html

微信小程序日历打卡项目下载,轻巧好用的日历打卡组件:http://www.henkuai.com/thread-37367-1-1.html

微信小程序练手项目,包含抽屉效果、底部tab效果实现等:http://www.henkuai.com/thread-37365-1-1.html

【独立小程序】志汇餐饮8.6 小程序前端修复版本:http://www.henkuai.com/thread-37344-1-1.html

仿今日头条3.0 小程序前端 demo分享:http://www.henkuai.com/thread-37338-1-1.html

微信小程序真心话大冒险游戏,朋友聚会必备小程序:http://www.henkuai.com/thread-37337-1-1.html

微信小游戏头脑王者自动答题辅助插件,小游戏作弊工具:http://www.henkuai.com/thread-37336-1-1.html

微信小程序左滑操作自定义组件,让你的小程序开发更:http://www.henkuai.com/thread-37334-1-1.html

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

设计规范|Web端设计组件篇—文本与选择器

博博


人人都是产品经理 2018-04-23 00:00:00

本文作者主要讲解表单中的文本和选择器,enjoy~

设计规范|Web端设计组件篇—文本与选择器

根据组件的用途,可以分为六大类:Feedback 反馈、form 表单、basic 基础、data 数据 、navigation 导航、other 其他。

设计规范|Web端设计组件篇—文本与选择器

表单在网页中主要负责数据采集功能;用户需要填写输入数据并且提交到数据库,则这种组件就是表单类。

本文主要讲解表单中的文本和选择器,其中文本分为input短文本、InputAutocomplete 短文本联想和InputMultiline 长文本。

input 短文本

定义:用于用户文本输入,并以字符串的方式提交到数据库。

使用场景:

  1. 用户需要输入字符时
  2. 通过鼠标键盘输入内容
  3. 输入的文本通常置于输入框

例如网易考拉优惠券兑换的表单填写,就是短文本输入组件,前面是标题,后面是文本输入框。

设计规范|Web端设计组件篇—文本与选择器

input短文本组件的展示形式可以分为三类。第1类是标题和输入框左右排列;第二类是标题和输入框上下排列;第三列不需要标题的排列。

标题和输入框左右排列时,短文本组件存在的状态有:初始态、激活态、报错态、完成态和禁用态。

设计规范|Web端设计组件篇—文本与选择器

常见的表单类排版都是左右排版,同时表单之间,标题采用左对齐,输入框左对齐的情况比较多。有时候标题名字过长这样话 左右排列就不够好,这时候需要采用上下排列。

设计规范|Web端设计组件篇—文本与选择器

标题和输入框上下排版时,存在状态和左右排列是一致的。

设计规范|Web端设计组件篇—文本与选择器

当没有标题时,存在状态同左右排列的规则和逻辑。

设计规范|Web端设计组件篇—文本与选择器

InputAutocomplete 短文本联想

定义:用户用于文本输入,在输入过程中会联想匹配文本选项,并以字符串的方式提交到数据库。

使用场景:

  1. 需要用户输入文本时。
  2. 提供联想匹配文本,减少用户输入成本。
  3. 在输入过程中根据用户输入的内容,出现匹配选项,提交的数据是文本而非枚举项。

例如百度搜索,在输入框输入关键词时会出现对应的联想匹配文本。

设计规范|Web端设计组件篇—文本与选择器

和input短文本组件相比,InputAutocomplete 短文本联想唯一的不同就是新增了联想匹配选项,并且提交的是文本而非枚举项。

标题和输入框左右排列时,InputAutocomplete 短文本联想组件存在的状态有:初始态、激活态、报错态、完成态和禁用态。

设计规范|Web端设计组件篇—文本与选择器

上下排列的状态和规则逻辑同左右排列。

设计规范|Web端设计组件篇—文本与选择器

不含标题的状态和规则逻辑同左右排列。

设计规范|Web端设计组件篇—文本与选择器

InputMultiline 长文本

定义:用户用于长文本输入,并以文本的方式提交到数据库。

使用场景:

  1. 多段文字输入
  2. 需要换行
  3. 输入的文本通常置于输入框中

例如新浪微博,在输入框发微博时,就是长文本输入,可以换行。

设计规范|Web端设计组件篇—文本与选择器

标题和输入框左右排列时,InputMultiline 长文本存在的状态有:初始态、激活态、报错态、完成态和禁用态。在输入过程中一般有字数统计,超过限制字数,不允许用户输入。

设计规范|Web端设计组件篇—文本与选择器

上下排列逻辑和规则同左右排列。

设计规范|Web端设计组件篇—文本与选择器

不含标题的逻辑同左右排列。

设计规范|Web端设计组件篇—文本与选择器

select 选择器

定义:用户通过选择枚举项,提交到服务器。后端存储为枚举项。

使用场景:

  1. 弹出一个下拉选项给用户选择操作
  2. 当选项少时(少于 5 项),建议直接将选项平铺,使用 Radio 是更好的选择。

例如淘宝卖家后台筛选订单的状态时,点击选择器,出现下拉列表。这就是一个常见的选择器,选择器分为多选和单选两大类。

设计规范|Web端设计组件篇—文本与选择器

下图为选择器基本样式,就是简单的下拉选项,不可进行关键词的搜索。

设计规范|Web端设计组件篇—文本与选择器

下图是可以搜索的选择器,当输入框处于激活态时,浮出下拉列表。在输入过程中,出现匹配枚举项,点击枚举项,则输入的关键词清空,同时下拉选项收起。输入框出现选择的选项。

设计规范|Web端设计组件篇—文本与选择器

有时候存在一个场景。用户对需要填写的选项设为空选项,则需要空值的选项。

设计规范|Web端设计组件篇—文本与选择器

有时候存在一个场景。用户选择了一个选项,但是后面想去掉选择的选项,不进行选择。

设计规范|Web端设计组件篇—文本与选择器

选择器多选组件中需要注意的一点就是:用户在输入关键词中,选择对应下拉选项,则输入的字符串清空,同时出现该选项tag。

设计规范|Web端设计组件篇—文本与选择器

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档