Shared posts

10 Jan 02:45

Web前端开发测试题

by Airen
Lei Ma

前端 47 题

David Shariff通过网站提供了Web前端开发中CSS、HTML和JavaScript三部分的测试题。到发稿之日共有8320人参与了这个测试,可平均得分是53.8%,这个分数并不能说明什么,我只想以这些题向大家介绍自己对这些题的个人理解。在此要特别感谢@99提供所有试题的翻译,也要非常感谢@民工精髓对JavaScript试题的分析。

CSS

Q1:CSS属性区分大小写吗?
ul {
    MaRGin: 10px;
}
A:NO(不区分)
个人见解

这对于初学者来说,可能会一时拿不定主义,他们区分大小写吗?但话说回来,如果你有使用过DW或者PSD生成的页面,你会发现你的代码中会有很多类似下面这样的代码:

.box {
    BORDER:1PX SOLID RED;
}

但这个样式完全是有效的。不过有一点需要特别注意,如果你的HTML的结构中定义的是大写类名,而在样式中使用的是小写的,那么他们是有区别的。我们来看一个简单的演示示例:

Web前端开发测试题

扩展阅读
Q2:你能给内联元素设置margin-topmargin-bottom吗?
A:No(不能设置)
个人见解

在我接触CSS知识的时候,我就知道margin-topmargin-bottom对于一个内联元素是根不起作用的。简单的理解,margin-top和margin-bottom就是让元素离远离自身顶部和底部的元素。(有关于更多的margin知识介绍,可以看看瑶姐对margin的系列介绍)。不过在此处,我们只是来演示一个示例。

假例我们有一个这样的DEMO:

HTML
<div>
    <span>我是一个行内元素span</span>
    <span>我是一个行内元素span</span>
    <span>我是一个行内元素span</span>
    <strong>我是一个行内元素strong</strong>
    <span>我是一个行内元素span</span>
    <strong>我是一个行内元素strong</strong>
    <span>我是一个行内元素span</span>
    <strong>我是一个行内元素strong</strong>
    <span>我是一个行内元素span</span>
    <strong>我是一个行内元素strong</strong>
    <span>我是一个行内元素span</span>
    <strong>我是一个行内元素strong</strong>
</div>
CSS
div {
  width: 300px;
  margin: 20px auto;
  border: 1px solid green;
  padding: 5px;
  line-height: 1.4;
}
span {
  border: 1px solid blue;
}
strong {
  border: 1px solid orange;
}
span,
strong {
  margin-top: 5px;
  margin-bottom: 5px;
}

margin-topmargin-bottom应用到内联元素上,这在规范中是允许的,不过由于在向一个行内非替换元素(如img)应用外边距,它对行高没有任何影响。由于外边距实际上是透明的,所以这个声明没有任何视觉效果。其原因就在于行内非替换元素的外边距(margin-top和margin-bottom)不会改变一个元素的行高。

我们来演讲一下,增加margin-top和margin-bottom值,对内联元素span和strong是否有所影响:

Web前端开发测试题

效果再次证明,margin-top和margin-bottom对于一个内联元素来说是没有任何影响的。

扩展阅读
Q3:内联元素设置padding-toppadding-bottom会添加到元素的尺寸上吗?
A:NO(不会)
个人见解

对于内联元素,margin和padding存在一个重大的区别。为了说明这一点,我们给行内元素设置一个padding-toppadding-bottom的值,另个给其附上一个背景色,行内元素的背景会向上和向下面延伸。

理论上,对于有背景色和行内距的行内非替换元素,背景可以向元素上面和下面延伸:

strong {
  border: 1px solid orange;
  background: orange;
  padding-top:10px;
  padding-bottom: 10px;
}

当然行高没有改变,不过由于内距确实延伸了背景,所以背景应该可见,是这样吗?不错,背景确实可见,它与前面的行重叠,这正是我们期望的结果。但回到试题上来,padding-toppadding-bottom并没有增加行内元素的尺寸,如背景延伸所示,他们重叠在一起了。

Web前端开发测试题

扩展阅读
Q4:如果你对<p>元素设置字体大小:10 rem, 当用户调整大小/拖浏览器窗口时文本将相应变化大小么?
A:NO(不能)
个人见解

REM是CSS3中新增的一个单位。在W3C官网上是这样描述rem的——“font size of the root element”。也就是说rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个参考值,在根元素中设置多大的字体,这完全可以根据您自己的需求。但他并不能实现,随着浏览器的缩小或放大,而改变元素的字号。他仅能通过修改<html>的字号大小来进行修改。接下来模仿一下这个问题的场景:

html {
    font-size: 16px;
}
p {
    font-size: 2rem;
}

接下来拖动浏览器大小,看其是否会修改p元素的字号:

Web前端开发测试题

扩展阅读
Q5:伪类:checked将选择input控件的单选或复选框,但不会选择
元素?
A:False(假的)
个人见解

这一题我也做错了,最初认为:checked是只对单选按钮和复选框有效。回想到HTML中定义了checked属性时,除了可以为单选按钮和复选框之外还可以为select的option设置这样的属性值。其作用表示的是选中。但万万没有想到option也可以通过:checked来设置选中的样式。下面的一段代码是来自于Mozilla:

/* any "checkable" element */
:checked {
  width: 50px;
  height: 50px;
}

/* only radio elements */
  input[type="radio"]:checked {
  margin-left: 25px;
}

/* only checkbox elements */
input[type="checkbox"]:checked {
  display: none;  
}

/* only option elements */
option:checked {
  color: red;
}
扩展阅读
Q6:在一个HTML文档中,伪类:root总是指<HTML>元素?
A:True(是的)
个人见解

在绝大多数情况下你可能遇到,:root在Web页上指的就是<html>元素。在HTML文档中<html>元素永远是最高级别的父元素。所以他是:root可想而知的。然而CSS是一种表现层,在其他的文档格式中,如svgXML:root可以引用不同的元素。无也许是什么标记语言,:root总是选择文档树中最顶部的元素。

来看一个简单的示例:

:root {
  background-color: red;
  padding: 2em;
  border:5px solid green;
}

body {
  background-color: white;
  padding: 1.5em;
}

看个演示图,更形象一些:

Web前端开发测试题

扩展阅读
Q7:translate()函数可以在z轴移动一个元素的位置吗?
A:False(不能)
个人见解

使用translate()函数,你可以把元素从原来的位置移动,而不影响在X、Y轴上任何组件。他是一个2D的transform,但他不能让元素在Z轴上进行移动。不过在3D的transform函数可以让元素在Z轴上进行缩放效果。

扩展阅读
Q8:“Sausage”文本的颜色是什么?
HTML
<ul class="shopping-list" id="awesome">
    <li><span>Milk</span></li>
    <li class="favorite" id="must-buy"><span class="highlight">Sausage</span></li>
</ul>
CSS
ul {
    color: red;
}
li {
    color: blue;
}
A:Blue(蓝色)
个人见解

这是一个很基础的试题,考的就是选择器的权重问题,上面两个选择器都是标签选择器,按照选择器的权重等级之分,他们都是“0,0,0,1”。但同一个元素有两个或多个冲突的属性声明,那么有最高特殊性的声明就会胜出。如果同一个元素具有相同的权重,处在后面的样式就会比前面的声明重。将上面的示例制作一个演示图:

Web前端开发测试题

Q9:“Sausage”文本的颜色是什么?
HTML
<ul class="shopping-list" id="awesome">
    <li><span>Milk</span></li>
    <li class="favorite" id="must-buy"><span class="highlight">Sausage</span></li>
</ul>
CSS
ul li {
    color: red;/*0,0,0,2*/
}
#must-buy {
    color: blue;/*0,1,0,0*/
}
A:Blue(蓝色)
个人见解

在选择器权重当中,一个ID的权重是“0,1,0,0”,而一个标签元素是0,0,0,1。针对这个示例来说,前一个选择器权重是"0,0,0,2";后者的权重是“0,1,0,0”。因此,在这里他的颜色是蓝色。

Q10:“Sausage”文本的颜色是什么?
HTML
<ul class="shopping-list" id="awesome">
    <li><span>Milk</span></li>
    <li class="favorite" id="must-buy"><span class="highlight">Sausage</span></li>
</ul>
CSS
.shopping-list .favorite {
    color: red;/*0,0,2,0*/
}
#must-buy {
    color: blue;/*0,1,0,0*/
}
A:Blue(蓝色)
Q11:“Sausage”文本的颜色是什么?
HTML
<ul class="shopping-list" id="awesome">
    <li><span>Milk</span></li>
    <li class="favorite" id="must-buy"><span class="highlight">Sausage</span></li>
</ul>
CSS
ul#awesome {
    color: red;/*0,1,0,1*/
}
ul.shopping-list li.favorite span {
    color: blue;/*0,0,2,3*/
}
A:Blue(蓝色)
个人见解

这个时候大家可能会感到很奇怪了,为什么这个还是蓝色的,而不是红色的。主要是他们作用的是不在同一个元素之上。

Q12:“Sausage”文本的颜色是什么?
HTML
<ul class="shopping-list" id="awesome">
    <li><span>Milk</span></li>
    <li class="favorite" id="must-buy"><span class="highlight">Sausage</span></li>
</ul>
CSS
ul#awesome #must-buy {
    color: red;/*0,2,0,1*/
}
.favorite span {
    color: blue!important;/*1,0,0,1,1*/
}
A:Blue(蓝色)
Q13:“Sausage”文本的颜色是什么?
HTML
<ul class="shopping-list" id="awesome">
    <li><span>Milk</span></li>
    <li class="favorite" id="must-buy"><span class="highlight">Sausage</span></li>
</ul>
CSS
ul.shopping-list li .highlight {
    color: red;/*0,0,2,2*/
}
ul.shopping-list li .highlight:nth-of-type(odd) {
    color: blue;/*0,0,3,2*/
}
A:Blue(蓝色)
Q14:“Sausage”文本的颜色是什么?
HTML
<ul class="shopping-list" id="awesome">
    <li><span>Milk</span></li>
    <li class="favorite" id="must-buy"><span class="highlight">Sausage</span></li>
</ul>
CSS
#awesome .favorite:not(#awesome) .highlight {
    color: red;/*0,2,2,0*/
}
#awesome .highlight:nth-of-type(1):nth-last-of-type(1) {
    color: blue;/*0,1,3,0*/
}
A:Red(红色)
个人见解

问题8~14都是在考CSS选择器相关方面的知识,而其中最主要的是要理清楚选择器的权重问题。在CSS中,选择器的特殊性由选择器本身的组件确定。特殊性值表述为4个部分,如"0,0,0,0"。一个选择器的具体特殊性如下确定:

  • 对于选择器中给定的各个ID属性值,加“0,1,0,0”。
  • 对于选择器中给定的各个类属性值,属性选择或伪类,加"0,0,1,0"。
  • 对于选择器中给定的各个元素为伪元素,加“0,0,0,1”。
  • 结合符和通配符“*”以及":not()"没有任何的加分权。
  • 对于行内样式,加为“1,0,0,0”
  • 对于"!important"加分高于上面的一切,将变成“1,0,0,0,0”

下面有几张图,能让你倍感亲切:

Web前端开发测试题

oocss

oocss

扩展阅读
Q15:#example元素位置会发生什么?
HTML
<p id="example">Hello</p>
CSS
#example {
    margin-bottom: -5px;
}
A:"#example"之后的所有元素会向上移动“5px”。
Q16:#example元素位置会发生什么?
HTML
<p id="example">Hello</p>
CSS
#example {
    margin-left: -5px;
}
A:"#example"自身向左移动“5px”。
个人见解

试题15和16测试的是margin对盒模型的影响。在CSS中,可以给元素设置负外边距(前面说过,对于内联元素,设置margin-topmargin-bottom是无效的),这会导致元素超出其父元素,或者与其他元素重叠,但这并不违反盒模型。同样来看一个示例:

Web前端开发测试题

通常我们很少使用负的margin,但他能做的其实很多。以下几条是有关于负margin需要注意的地方:

  • 负margin是绝对标准的CSS:这不是开玩笑。W3C甚至标注过:对于margin属性来说,负值是被允许的。这是Nuff说的,查看这篇文章会有更多详细内容。
  • 负maring不是一种hack方法:千真万确,不能因为缺乏对负marign的理解,或者因为它长得像hack,就认为它是一种hack方法。除非你是用来修复自己在其他地方造成的错误。
  • 不脱离文档流:不使用float的话,负margin元素是不会破坏页面的文档流。所以如果你使用负margin上移一个元素,所有跟随的元素都会被上移。
  • 完全兼容:所有现代浏览器都完全支持负margin(IE6在大多数情况下也支持)。
  • 浮动会影响负margin的使用:负margin不是你每天都用的CSS属性,应用时应小心谨慎。
  • Dreamweaver不解析负margin:DW的设计视图不会解析负margin。但问题是你为什么要在设计视图中检查你的网站呢?

如果使用得当,负margin是非常强大的属性,以下是2种(负margin占主导位置)的场景:

作用于static元素上的负margin属性

deodesign

当static元素的margin-top/margin-left被赋予负值时,元素将被拉进指定的方向。例如:

/* 元素向上移10px*/
#mydiv1 {margin-top:-10px;} 

但如果你设置margin-bottom/right为负数,元素并不会如你所想的那样向下/右移动,而是将后续的元素拖拉进来,覆盖本来的元素。

/* 
* #mydiv1后续元素向上移10px, #mydiv1 本身不移动
*/
#mydiv1 {margin-bottom:-10px;}  

如果没有设定width属性,设定负margin-left/right会将元素拖向对应的方向,并增加宽度,此时的margin的作用就像padding一样。

浮动元素上的负margin

如果给一个浮动元素加上相反方向的负margin,则会使行间距为0且内容重叠。这对于创建1列是100%宽度而其他列是固定宽度(比如100px)的自适应布局来说是非常有用的方法。

<div id="mydiv1">First</div>
<div id="mydiv2">Second</div>

/* 应用在与浮动相反方向的负margin */
#mydiv1 {float:left; margin-right:-100px;}  

若两个元素都为浮动,且#mydiv1的元素设定margin-right为20px。这样#mydiv2会认为#mydiv1的宽度比原来宽度缩短了20px(因此会导致重叠)。但有意思的是,#mydiv1的内容不受影响,保持原有的宽度。

如果负margin等于实际宽度,则元素会被完全覆盖。这是因为元素的完全宽度等于margin,padding,border,width相加而成,所以如果负margin等于余下三者的和,那元素的实际宽度也就变成了0px。

扩展阅读
Q17:浏览器会下载没有被应用的样式内引用的资源?
HTML
<div id="test1">
    <span id="test2"></span>
</div>
CSS
#i-am-useless {
    background-image: url('mypic.jpg');
}
A:NO(不会)
个人见解

对于HTML中的img,大家都知道,只要页面加载了,图片就会加载。但在CSS中的背景图片,没有被引用,那么会不会加载呢?有些人会认为会,因为他在样式中调用了,只不过不存在。有些人会认为不会,因为没用到这个资源。那么我们通过下面的图来看看:

Web前端开发测试题

测试题中做个修改,把id换成结构中存大的,如"#test1",在看一张图的变化:

Web前端开发测试题

不用说什么,两图一对比,胜过千言万语。

Q18:页面加载完毕后,浏览器会下载“mypic.jpg”图片吗?
HTML
<div id="test1">
    <span id="test2"></span>
</div>
CSS
#test2 {
    background-image: url('mypic.jpg');
    display: none;
}
A:Yes(会)
Q19:页面加载完毕后,浏览器会下载“mypic.jpg”图片吗?
HTML
<div id="test1">
    <span id="test2"></span>
</div>
CSS
#test1 {
    display: none;
}
#test2 {
    background-image: url('mypic.jpg');
    visibility: hidden;
}
A:No(不会)
个人见解

第18和19两个测试题,和第17探讨的是同一个问题,只不过多了元素隐藏和显示的参数。如果你拿不定主义,那么写一个测试文件。一测一目了然。如果你想知道为什么,那就需要GG一下了。因为对于他们的原理我也不懂,我就不误人子弟了。

Q20:"only"选择器起什么作用?
@media only screen and (max-width: 1024px) {
    margin: 0;
}
A:阻止老版本浏览器解析剩下的选择器
Q21:overflow:hidden会创建一个新的BFC(block formatting context)?
HTML
<div>
    <p>I am floated</p>
    <p>So am I</p>
</div>
CSS
div {
    overflow: hidden;
}
p {
    float: left;
}
A:Yes(会)
个人见解

w3c规范中的BFC定义:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。

在BFC中,盒子从顶端开始垂直地一个接一个地排列,两个盒子之间的垂直的间隙是由他们的margin 值所决定的。在一个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠。

在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘)。

BFC的通俗理解:首先BFC是一个名词,是一个独立的布局环境,我们可以理解为一个箱子(实际上是看不见摸不着的),箱子里面物品的摆放是不受外界的影响的。转换为BFC的理解则是:BFC中的元素的布局是不受外界的影响(我们往往利用这个特性来消除浮动元素对其非浮动的兄弟元素和其子元素带来的影响。)并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。

扩展阅读
Q22:"Screen""关键字是匹配设备的物理屏幕还是浏览器的viewport(视窗)?
@media only screen and (max-width: 1024px) {
    margin: 0;
}
A:浏览器的视窗
个人见解

第20和第21考的是媒体查询的知识,如果你对CSS的media有一定的了解,那么这两题对你来说就是小菜。

HTML

Q1:<keygen>是HTML5有效的标签?
A:Yes(是的)
个人见解

是不是有效标签,对于不熟悉HTML5的同学来说,就只能猜了,但对HTML5有观注过,或稍为了解了一点的同学,能马上回答出来。如果你对HTML5标签方面不太熟悉,可以猛击这里查看

Q2:<bdo>会直接修改文本的方向吗?
A:Yes(会)
Q3:下面的HTML是有效的?
<figure>
    <img src="myimage.jpg" alt="My image">
    <figcaption>
        <p>This is my self portrait.</p>
    </figcaption>
</figure>
A:Yes(合法)
Q4:什么情况下使用<small>标签?
A:当你想在<footer>标签添加一个copyright信息时。
Q5:如果一个web页面包含多个<h1>标签,它会影响SEO吗?
A: No(不会)
Q6:如果你有一个搜索结果页面,想突出显示搜索词,HTML标签,你会使用什么? <strong><mark><em><highlight>
A:<mark>
Q7:scoped属性起什么作用?
<article>
    <h1>Hello World</h1>
    <style scoped>
        p {
            color: #FF0;
        }
    </style>
    <p>This is my text</p>
</article>

<article>
    <h1>This is awesome</h1>
    <p>I am some other text</p>
</article>
A:若一个父元素含有Scope包裹的样式,则此样式规则适用于这个父元素中所有的子元素
Q8:HTML5中链接<a>能放置块元素?
<article>
    <a href="#">
        <h1>Hello</h1>
        <p>I am some text</p>
    </a>
</article>  
A:Yes(可以)
Q9:当页面第一次加载,下面的html会触发一个http请求么?
<img src="mypic.jpg" style="visibility: hidden" alt="My picture">
A:Yes(会)
Q10:当页面第一次加载,下面的html会触发一个http请求么?
<div style="display: none;">
    <img src="mypic.jpg" alt="My photo">
</div>
A:Yes(会)
Q11:main1.css会在hello world弹出前下载解析完毕么?
<head>
    <link href="main1.css" rel="stylesheet">
    <script>
        alert('Hello World');
    </script>
</head>     
A:Yes(会)
Q12:Main1.css需要被下载解析完毕后才请求main2css么?
<head>
    <link href="main1.css" rel="stylesheet">
    <link href="main2.css" rel="stylesheet">
</head>
A:No(不需要)
Q13:Main2.css会在paragraph1渲染完毕前下载并解析么?
<head>
    <link href="main1.css" rel="stylesheet">
</head>
<body>
    <p>Paragraph 1</p>
    <p>Paragraph 2</p>
    <link href="main2.css" rel="stylesheet">
</body> 
A: Yes(会)

在HTML部分,主要涉及了标签,以及文件加载和渲染的顺序。如果需要深入的了解,我想要尝试做一些案例测试。这样拿到的答案会更准确一些,也会让自己对所掌握的知识深刻一些。

JavaScript

JavaScript相关的知识,对于我来说,就是一片空白,在做这些测试的时候,几乎是以猜来完成,所以也阵亡一大片。下面这部分邀请了@民工精髓大大,为大家介绍JavaScript部分。

Q1:下面参数的值是多少?
"1" + 2 + "3" + 4;
A: 1234

加法优先级等同,从左往右,数字与字符串相加,数字转换成字符串进行运算,结果等同于:"12"+"3"+4 = "123"+4 = "1234"。

Q2:下面参数的值是多少?
4 + 3 + 2 + "1"
A:91

优先级同上,从左往右,等同于:7+2+"1" = 9+"1" = "91"。

Q3:下面代码弹出的是什么?
var foo = 1;
function bar() {
    foo = 10;
    return;
    function foo() {}
}
bar();
alert(foo);
A:1

function的定义会提前到当前作用域之前,所以等同于:

var foo = 1;

function bar() {

    function foo() {}

    foo = 10;

    return;

}

bar();

alert(foo);

所以,在foo=10的时候,foo是有定义的,属于局部变量,影响不到外层的foo。详细请参考Functions and function scope

Unlike functions defined by function expressions or by the Function constructor, a function defined by a function declaration can be used before the function declaration itself.

Q4:下面代码弹出的是什么?
function bar() {

    return foo;

    foo = 10;

    function foo() {}

    var foo = 11;

}

alert(typeof bar());
A:function

与上题类似,等同于:

function bar() {

    function foo() {}

    return foo;

    foo = 10;

    var foo = 11;

}

alert(typeof bar());

在return之后声明和赋值的foo都无效,所以返回了function。参考return

A function immediately stops at the point where return is called.

Q5:下面代码弹出值顺序是什么?
var x = 3;



var foo = {

    x: 2,

    baz: {

        x: 1,

        bar: function() {

            return this.x;

        }

    }

}



var go = foo.baz.bar;



alert(go());

alert(foo.baz.bar());
A:3,1

this指向执行时刻的作用域,go的作用域是全局,所以相当于window,取到的就是window.x,也就是var x=3;这里定义的x。而foo.baz.bar()里面,this指向foo.baz,所以取到的是这个上面的x,也就是1。参考this

Q6:下面代码弹出值是什么?
var x = 4,

    obj = {

        x: 3,

        bar: function() {

            var x = 2;

            setTimeout(function() {

                var x = 1;

                alert(this.x);

            }, 1000);

        }

    };

obj.bar();
A:4

不管有没有这个setTimeout,它里面这个function都是孤立的,this只能是全局的window,即使不延时,改成立即执行结果同样是4。

Q7:下面代码弹出值是什么?
x = 1;

function bar() {

    this.x = 2;

    return x;

}

var foo = new bar();

alert(foo.x);
A:2

这里主要问题是最外面x的定义,试试把x=1改成x={},结果会不同的。这是为什么呢?在把函数当作构造器使用的时候,如果手动返回了一个值,要看这个值是否简单类型,如果是,等同于不写返回,如果不是简单类型,得到的就是手动返回的值。如果,不手动写返回值,就会默认从原型创建一个对象用于返回。参考new

Q8:下面代码弹出值是什么?
function foo(a) {

    alert(arguments.length);

}

foo(1, 2, 3);
A:3

arguments取的是实参的个数,而foo.length取的是形参个数。参考arguments.length

arguments.length provides the number of arguments actually passed to a function. This can be more or less than the defined parameter count (See Function.length).

Q9:下面代码弹出值是什么?
var foo = function bar() {}; 

alert(typeof bar);
A:undefined

这种情况下bar的名字从外部不可见,那是不是这个名字别人就没法知道了呢?不是,toString就可以看到它,比如说alert(foo),可以看看能打出什么。参考Functions and function scope

The function name can be used only within the function's body. Attempting to use it outside the function's body results in an error (or undefined if the function name was previously declared via a var statement).

Q10:下面代码弹出值是什么?
var arr = [];

arr[0]  = 'a';

arr[1]  = 'b';

arr.foo = 'c';

alert(arr.length);
A:2

数组的原型是Object,所以可以像其他类型一样附加属性,不影响其固有性质。

Q11:下面代码弹出值是什么?
function foo(a) {

    arguments[0] = 2;

    alert(a);

}

foo(1);
A:2

实参可以直接从arguments数组中修改。参考arguments

The arguments can also be set

Q12:下面代码弹出值是什么?
function foo(){}

delete foo.length;

alert(typeof foo.length);
A:number

foo.length是无法删除的,它在Function原型上。参考delete

delete can't remove certain properties of predefined objects (like Object, Array, Math etc). These are described in ECMAScript 5 and later as non-configurable

总结

David Shariff在总共提供了47道题,22道CSS题,13道HTML题和12道Javascript题。这些题对于一位Web前端人员来说都不是什么很复杂的题,是一些基础题、概念题,但也是非常让人理解或者混淆的题。在此对CSS和javascript部分做了一些分析和推荐阅读。希望这些题能帮助大家能测试自己所掌握的知识以及扩展自己的阅读。

能够顺利完成这篇文章,要非常感谢@99提供所有试题的翻译,以及非常感谢@民工精髓大大对JavaScript试题的分析。不敢确保这里的分析是完全正确,如果我们做出的说明有误,还请大家在评论中给我们指正。如果你对上述部分试题有更好的理解,也希望能在下面的评论中与我们一起共享。

特别声明:以上试题由David Shariff提供,在线英文试题测试可以猛击http://davidshariff.com/quiz/

如需转载,烦请注明出处:http://www.w3cplus.com/css/front-end-web-development-quiz.html

03 Jan 06:42

当浏览器默认禁用第三方cookie

by oldj
Lei Ma

当浏览器禁用第三方 cookie 时的打点服务

前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示。

Safari默认阻止第三方cookie

问题

什么是第三方cookie呢?在访问一个网站A时,网站A算作第一方,如果网站A中引用了另一个网站X(网站X的域名与网站A的域名不同)的资源,这时这个网站X就被认为是第三方。需要注意的是,这儿区分不同网站的标准是域名是否相同,而不是这两个网站是否由同一个公司运营。比如,taobao.com和tmall.com被认为是两个网站,尽管它们都属于阿里集团。

在网站建设中,使用第三方资源非常常见,大多数据情况下,这并不会带来问题。不过有时候,我们可能希望能读写这个第三方域下的cookie,这时问题就来了。

比如我们有一个网站a.com,其中埋有一段JavaScript脚本,每当用户打开a.com中的页面时,这段脚本就会发送一个GET请求到x.com。这样,只需要分析x.com的日志,就可以了解a.com的访问情况。

如果只是要统计a.com的PV,那么只需要将x.com的日志中所有记录加起来就行了,但是,如果要统计UV呢?

这时就需要在x.com这个域下写一个cookie用于标识当前用户,比如叫USER_ID。当用户访问a.com的页面,也即发起到x.com的请求时,x.com的服务器检查x.com域下是否有USER_ID这个cookie,如果有则什么也不做,如果没有,则生成一个新的USER_ID并写入cookie。有了这个cookie之后,分析x.com的日志就可以同时得到a.com的PV与UV。整个打点过程如下图所示。

打点 使用第三方cookie

但问题是,x.com在这儿属于第三方域,在高版本的Safari浏览器中,向第三方域写cookie受到了阻止。带来的结果就是,用户每次访问a.com时,发向x.com的请求的cookie都为空,于是x.com的服务器每次都认为这是一个新访问者,每次都生成一个新的USER_ID写回去,但当同一个用户再访问下一个a.com的页面时,发向x.com的请求的cookie仍然为空。最后,分析x.com的日志时就会发现,访问PV没有变化,但UV却暴涨,几乎和PV持平。

或许有人会问,打点服务器为什么要使用第三方域x.com呢?如果使用与站点相同的域a.com不就没有问题了吗?的确,如果打点服务器与站点同域那就没有问题了,不过很多时候我们并不能做到这一点,比如我们可能需要向很多个域名完全不同的站点提供同一套打点服务。

这个问题目前并不算严重,因为还只有高版本的Safari有这样的限制。但是,Safari增加这个限制是为了保持用户隐私(因为有大量的广告站点滥用第三方cookie),很有可能在不久的将来其他浏览器也会跟进,因此我们不得不尽早寻找解决之道。

P3P方案在这儿也是走不通的,KISSY的开发者承玉曾经提出过一个解决方案,简单来说,就是使用POST来代替GET,这样就能继续在高版本的Safari中写入第三方cookie。但遗憾的是这个方案在Safari 5.1.4+的版本中失效了,估计Safari已经修复了漏洞。另外,Google曾经因为使用类似的方式继续在高版本Safari下读写第三方cookie而被告上法庭,在去年8月时被罚款2250万美元,也就是说,如果继续使用各种hack的方式绕过浏览器限制读写第三方cookie,有可能面临法律风险。而且随着浏览器不断升级,各种原来可用的hack方式也都陆续失效了。

因此,必须要寻找其他解决方案。

第二方方案

经过测试,我们发现目前Safari只会在第三方域下完全没有cookie时阻止第三方cookie,而第三方域下只要有过任意一个cookie,即可继续使用以前的方式顺利读写。但是,怎么才能在第三方域下写入第一个cookie呢?

我们测试了很多方案,包括iframe嵌套等,最后发现至少在Safari 6中,如果第三方域下完全没有cookie,那么就没有办法向其写入cookie,唯一的办法是将它变成第二方,也即让这个域在顶层窗口打开。也就是说,如果第三方域下没有cookie,要向它写入第一个cookie,要么将页面先跳到这个域,写入cookie,再跳回来,要么弹出一个新窗口,写入cookie,再关闭弹窗。

显然,这两种方案对用户体验来说都不好。

localStorage方案

我们注意到,高版本Safari只阻止了第三方cookie,并没有阻止第三方localStorage,于是,我们便有了一个更为激进的方案:放弃第三方cookie,使用localStorage来代替。

这个方案的本质是这样的:在a.com中嵌入一个w.com域的iframe,这个iframe读取localStorage(是w.com域下),取到各种原来需要保存在第三方cookie中的值,然后发送一个GET或POST请求到x.com,原来那些记录在cookie中随着HTTP请求头发送的信息则改为通过url参数(GET方式)或Form表单(POST方式)的形式发送。如果要发送的内容不多,那么可以使用GET方式发送,只需返回一个jsonp即可,然后iframe再将jsonp中的数据写入localStorage。如果需要发送的内容很多,有可能使URL超长,那么就需要使用POST方式发送,这时,需要在iframe中再创建一个iframe作为POST的target,然后新iframe再将数据用postMessage等方式传回原iframe,原iframe再写回localStorage。

整个过程(使用POST)如下图所示:

打点 使用localStorage

这个方案的问题是比较复杂,整个流程长了很多,需要用到一些HTML5特性,比如localStorage、postMessage等,不过好在不支持第三方cookie的浏览器基本上都是对HTML5支持良好的高版本浏览器。

就目前来看,比较保险的做法是新老方案并行,在老浏览器上继续使用第三方cookie,在高版本Safari等默认阻止第三方cookie的浏览器上使用新方案。虽然不完美,但确实是可行的。期待不久的将来能有一种更完美的方案。

 

2013-03-26更新:Firefox开始跟进Safari默认阻止第三方cookie的策略

03 Jan 01:51

Javscript 18 歲生日歷史演進

by appleboy
Lei Ma

javascript 18 years

resin.io 看到這篇 Happy 18th Birthday JavaScript! A look at an unlikely past and bright future. 裡面有些 Javascript 發展史,蠻有趣的,分享給大家看看。18 年前由 Netscape 和 Sun 共同 Release Javscript,在當年18天後,Ruby 也同時發佈了,底下來看看 Javscript 歷史演進。

JavaScript 發展史

1995: 由 Netscape 和 Sun 共同發佈 Javscript,並且命名為 MochaLiveScript,當時參與開發 Javascript 的其中一位負責人 Brendan Eich,現在為 Mozilla CEO。

1996: Microsoft Javscript 版本出現,並且命名為 JScript,同時發佈 Internet Explorer 3.0。這年也是 CSS 釋出第1版

1997ECMA 第1版釋出。

1998: Netscape 將 Netscape browser open source release 出來,並且成立 Mozilla Project。過了幾個月, AOL 買下 Netscape

1999: IE5 提出介紹 XMLHttpRequest

2001: IE6 正式 Release,截至目前為止,IE6 最大用戶還是在中國大陸 XD。

2002: 大家常用的 JSON 在這時候 Release,同時間 Mozilla 發佈 Firefox

2003: Apple 也不甘示弱發佈 Safari Beta Release。

2004: Google 發佈 Gmail released 產品,Gmail 用了大量 AJAX 技術,也造就現今的 Web Application。Google 挑4/1發佈,讓大家以為是惡作劇一場 XD。

2005: Apple open source Webkit,此專案是從 KHTML fork 出來的。同時間 Jesse James Garrett 發佈一篇 AJAX

2006: John Resig 發佈第1版 JQuery,現今的網站超過 90% 都會使用 jQuery,它被視為 “better cross-browser DOM API”。此年 Microsoft 同時發佈 IE 7。

2007: Douglas Crockford 講了一場 keynote 議題名稱為 JavaScript: The good parts 將來成為 O’Reilly 2008 年一本書。同年 Leonard Richardson and Sam Ruby 出了 RESTful Web Services 書。

2008: Google 推出自家瀏覽器 Chrome 和 V8 Engine,帶給瀏覽器不同的衝擊。

2009: 誰說 JavaScript 只能寫在 Client 端,Ryan Dahl 釋出 node.js,帶來用 js 寫 sever side 風潮,同年 PhoneGap 帶來 HTML5 和 JavaScript 整合到 Android 及 iOS。

2010: 一堆 JavaScript Library 同時釋出 NPM, BackboneJS, RequireJS

2012: Single-page app frameworks 出現: AngularJS 1.0, Ember 1.0.pre。

2013: Firefox OS 用 JavaScript 撰寫 UI Layer,並且正式 Release,Mozilla 同時發佈 asm.js

JavaScript 效能

Jan T. Sott 用 Kraken benchmark 發佈一篇 performance 報告,測試環境從 Firefox 3.5 to Chrome 23 同環境下測試

overall_kraken_2012

可以參考原始連結

JavaScript 生態

我們來看看眾多語言的變化

npm

可以發現 Node.js 正在往上衝阿,相信到 2015 年可以追上 Rubygems 及 Maven Central. 除了 55000+ 的 NPM package 及 6000+ package in broser 帶給使用者更好的體驗

另外 Github 也統計用其他語言寫的工具給 JavaScript 用

最後看看 Github repositories 的生態

jsgh 資料來源 Twitter,JavaScript 往上衝阿,難怪全世界都在缺 Frond End Engineer。

總結

現在用 JavaScript 寫 Client-Side 已經不稀奇了,現在有很多 Project 開始設計如何透過 JavaScript 去控制硬體,可以看到 File API and Device API 或者是 Chrome Apps, Mozilla WebAPI, and Tizen Web APIs 等專案,這些專案共通點就是希望開發者可以透過 JavaScript 來控制硬體裝置。另外也可以透過 node-webkit 來溝通。

想了解 EmbeddedJS 可以關注現有的專案或研討會 Nodebots, Nodecopter, Tessel.io, Espruino, Device.js,或者是 application 像是 heimcontrol.js and Google Coder for Raspberry Pi,很難想像 18 年後的 JavaScript 會變成什麼樣子 XD。

23 Dec 01:35

揭开面具——窥探用户的内隐态度

by wanglulu
Lei Ma

外显态度 vs 内隐态度

夜深人静,扪心自问:我是不是有心口不一的时候?我是不是说过善意的谎言?恐怕每个人脑海中都浮现出了各式各样的场景。有时我们为了种种目的无法表达自己真实的想法,那坐在桌子对面,对我们的产品畅所欲言的用户,话语中是否也掺杂了掩饰的成分?是否还有我们未曾了解的真实态度?

内隐态度

内隐态度有时才是我们追求的真实答案,它是指个体对事物所持的积极或消极的认知、情感或反应,由不自觉的以往经验或不能归因于以往某一确定经验所引起。内隐态度是相对于外显态度来说的,外显态度主要指个体自我报告的对事物的态度,是在个体意识范围内经过思考进行的表达。二者有什么区别呢?举一个经典的例子,美国学者研究了个体对白人和黑人态度的差异,美国白人自我报告的态度并无差异,也就是对白人和黑人一视同仁,但是内隐态度却出现了不一致的现象,美国白人对黑人显示出了明显的消极态度。更为有趣的是,美国黑人自我报告表现出对黑人更为积极的态度,但是内隐测试结果却显示出对白人的态度更积极。由此可见,外显态度和内隐态度有时是不一致的,个体倾向于做出社会上主流所期待、赞许、认可的行为,每个人都想迎合社会的需求,给他人留下良好的印象。当不合乎社会规范或可能影响自己形象的想法或行为产生时,个体可能就会产生掩饰的行为,甚至有些掩饰是自己都没有意识到的!这种存在于底层的,体现个体最真实、原始的情感的态度,则为内隐态度。

转载自科技中国


用户也是社会人,社会人的规律在用户身上也会有所体现。比如在用户研究工作中,我们时常会做一些竞品对比或者迭代版本之间的比较,用户报名参加测试,在潜意识中就会有“把测验做好”的信念,那什么是“把测验做好”呢?配合调研人员做出他们想要的结果。什么是“想要的结果”呢?我们的产品更好,新的版本更好。用户就会在测试过程中迎合他们认为的我们想要的结果,从而产生偏差。这样我们所得到的用户对各竞品或版本的态度结果就受到了污染,没有获得用户的真实态度。再比如,我们调查用户观看成人节目的情况,面对面的访谈显然不合适,用户往往难以启齿,或干脆作天真状:“没看过啊!”“不想看。”但真的是这样吗?

转载自互联网的一点事

内隐态度的测量

那如何避免这种情况呢?所以我们不妨在调研中尝试使用内隐测验。内隐测验是通过测量概念词和属性词之间的联结紧密性,从而对个体的内隐态度进行间接测量的方法。概念词比如三星&苹果,属性词比如美观&呆板,基本过程是通过计算机呈现概念词和属性词的联合,让被试尽快的按键反应并自动记录反应时。这种联结分为相容和不相容,相容是指这种联结与个体内在态度相一致,比如苹果—美观,因此加工相对容易,反应速度快,反应时短。当连结与个体内隐态度相冲突或联系不紧密时,个体需要进行更多的认知加工,反应速度慢,反应时相对较长。相容与不相容连结反应时差,就可以作为内隐态度的指标,在这种快速反应的条件下,个体很难有意识的控制自己的反应,所获得个体原始情感和态度的体现。

转载自StudyBlue

内隐态度的适用性

内隐态度并不总是与外显态度相分离,对于没有敏感性的主题,自我报告的外显态度测量既准确又便捷。有些主题社会敏感性比较高,个体自我掩饰的概率比较大,那么内隐态度测量也许是一个有用的工具。值得注意的是,虽然内隐态度是个体真实的表达,但是并不一定能够准确预测实际行为,对于需要谨慎考虑的行为,可能外显态度对行为有更好的预测作用。比如用户对于网络上成人资源比较感兴趣,但是考虑到可能会中病毒,就有可能不进行下载行为。再比如用户可能心里仍喜欢苹果手机,但是苹果已经是街机了,拿出来可能无法彰显个性,在购买时也可能选择其他。但不管行为怎样,得知用户内心真实的想法,应该本身就很有价值吧。
尽管如此,由于测量主题的局限性和测量方法的复杂性,内隐测验并不能普遍的用于用户研究领域,目前采用较多的是一些简便的技巧性手段,比如在进行调研之前尽量避免使用户知晓我们的调研目的,这样用户就不会为了这个目的而努力了,或者在访谈之中不时的重复提问关键问题,看用户的回答有无出入。有些用户难以启齿的问题或者自己描述不清的问题可以以他人为主人公询问,例如:“现在有好多人都爱使用苹果手机,你觉得他们为什么这么热衷呢?”这样用户会将自己的想法投射到假象的他人身上,看似描述他人,实则描述自己。除了言语上的技巧外,我们也应善用我们的眼睛来观察,实际的行为常常不会骗人,如我们的百度语音助手进行语音—文字连续上屏的测验中,直接观察用户在使用过程中是否会因文字连续上屏而停止语音输入,那结果一目了然,再辅助以主观感受询问,综合起来能够准确反映用户的感受。用户的内心世界是很丰富的,合理搭配多种手段进行探索,才能挖掘出有价值的钻石。


转载请注明出自”百度MUX”

20 Dec 11:43

PNG的使用技巧

by 白树
Lei Ma

png 的各种格式,以及使用场景

png
Png是图像文件存储格式,在网页设计中已经不是一个陌生的名词,在前端开发中经常使用到它,如常用CSS 雪碧图。而Png的使用不仅仅如此,Png有多少种格式,有哪些特点,PC端中常用的Png格式是哪些,手机端最合适的Png格式是什么呢?如果你对这些问题有疑问,那么很开心的告诉你,这里有你需要的答案。

目录:

PNG的格式和透明度

这个Fireworks会比较清楚,打开Fireworkd优化面板,可以清楚看到png有3种不同深度的格式:png8、png24、png32。
其中,在优化面板选择png8,可发现png8包括不透明、索引色透明、alpha透明3种格式。

PNG8

8位的png最多支持256(2的8次方)种颜色,8位的png其实8支持不透明、索引透明、alpha透明。

PNG24

支持2的24次方种颜色,表现为不透明。

PNG32

支持2的32次方种颜色,32位是我们最常使用的格式,它是在png在24位的png基础上增加了8位的透明信息,支持不同程度的半透效果。

其实PNG8的3种格式不透明、索引透明、alpha透明,正好把png的所有格式都归类好了:

  • 『png 不透明』格式
  • 『png 索引透明』格式
  • 『png alpha透明』格式

『PNG 不透明』格式

说到不透明,就像jpg格式一样,『png 不透明』只能为不透明,代表格式有:『png8 不透明』和『png24』,导出软件有:Photoshop、Fireworks。不推荐使用『png 不透明』格式,建议用jpg图片来代替它。
可能会有同学会问为什么png24是不透明的,我使用photoshop导出来的就是png24啊?
Png24实际为不透明图片
打开photoshop,任意打开一个带透明的psd文件,存储为web所有格式(ctrl+shift+alt+s),如下面板所示:
不勾选透明度单选框,图片的透明背景会被默认的白色填充

导出来的png图片深度为24位,图片为不透明,表现跟jpg图片相似
如果勾选了透明度(alpha通道),导出深度为32位的透明图片
从photoshop存储为web所有格式面板中这样理解,png24深度其实为24位,再勾选上8位的alhpa通道,24+8=32,即『png32』 = 『png24+alpha』,这也许是photoshop软件开发者不添加png32位格式的原因,下图为Photoshop存储为web所有格式界面的图片格式选择,并没有png32位的选项~

『PNG 索引透明』格式

说到索引颜色透明,我们可以了解下什么是索引颜色,『png 索引透明』代表格式有『png8 索引透明』,导出软件有:Photoshop、Fireworks,它的特点总结如下:
  • 挑选一副图片中最有代表性的若干种颜色(通常不超过256种)
  • 只能为不透明或全透明
  • 文件体积小
  • 带有杂边锯齿
  • 支持IE6

如何使用Photoshop导出『png8 索引透明』

使用Photoshop,存储为web所有格式,按照如下图片的红色边框配置,可导出png8索引透明
注:使用Photoshop导出『png8 索引透明』的效果比Fireworks导出的效果良好,这里不介绍使用Fireworks导出『png8 索引透明』

『png8 索引透明』产生杂边锯齿原因

『png8 索引透明』只有透明索引颜色,没有半透明索引颜色,下图左侧为带半透明像素的图片,在浏览器中打开不会有锯齿,而右侧图片为全透明或不透明的像素,在浏览器打开后有锯齿。
由于『png8 索引透明』没有半透明索引颜色,使用Photoshop导出时,原有的半透明转化为不透明,从而产生锯齿。

如何避免『png8 索引透明』的杂边锯齿

方法:设置杂边与背景色颜色一致可达到视觉上透明。

相信不难理解,利用杂边与背景色一致,可以来满足视觉上的透明,缺点是只能适应一种背景色,在其它背景色下同样会产生杂边。
怎么设置呢,打开Photoshop,在存储为web格式面板中进行如下操作,在杂边选项中选择与背景色一致的颜色。

『PNG Alpha透明』格式

说到alpha透明,我们可以了解下什么是alpha通道,『png alpha透明』代表格式有『png8 alpha透明』和『png32』,导出软件有Fireworks,它的特点总结如下:
  • 一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域
  • 支持全透明和半透明
  • 『Png8 alpha透明』文件体积小
  • 『Png8 alpha透明』在IE6下有毛边

如何使用Fireworks导出『png8 alpha透明』

Firewoks中,在优化面板,按照如下图片的红色边框配置,可导出png8 alpha透明。
注:Firewoks支持导出『png8 alpha透明』,Photoshop不支持导出『png8 alpha透明』

手机端选择哪种Png

说到手机,考虑流量的问题是必不可少的,所选png需要满足体积小和视觉效果良好,那么哪种png格式符合这2个要求呢?做个实验吧~
不同Png格式测试
测试平台:ios&android webkit浏览器
测试图片:彩种雪碧图1230*82
测试内容:同一张雪碧图导出不同png格式的大小、透明度、杂边以及在retina显示屏和普通显示屏下的对比
测试结果:
从上图可见png32和png24体积太大了,十分消耗手机用户流量,不是我们选择的范围,那么可以锁定目标在『png8 alpha透明』和『png8 索引透明』中,2者对比,可以看出『png8 alpha』在手机端的支持是良好,可能有童鞋会认为,单凭一张图片也不能下结论~
而经过笔者使用多张雪碧图测试后使用Fireworks导出的『png8 alpha』,在手机端的支持是比较好的~不仅文件体积小,节省流量,而且半透明效果良好
于是,移动端采用『Png8 alpha透明』,相信『Png8 alpha透明』是未来的一种趋势~

PC端选择哪种Png

PC端使用哪种png,其实这个话题很早就有结论了,这里简单介绍下。
使用png8的方案:
使用photoshop打开雪碧图,分别导出一张png32和一张『png8 索引透明』的图片,高级浏览器使用png32位图片,针对IE6使用『png8 索引透明』,并设置『png8 索引透明』杂边与背景色颜色一致可达到视觉上透明
注:为啥使用png32而不使用『png8 alpha透明』?因为pc端的网速大多良好,建议使用表现更佳的png图片,显然png32是最合适的,当然你也可以使用『png8 alpha透明』,但是在高清显示器下的质量不如png32
.bg{
background:url(global.png?v=20130530) no-repeat;
_background:url(global_png8.png?v=20130530) no-repeat;//IE6使用的背景图
}
使用IE滤镜的方案:
比较耗性能,而且存在不支持背景平铺,导致链接失效等缺点,不推荐该方案,不要为了IE而把自己搞得像IE~
.bg{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img. png", sizingMethod="scale");}
另外还有js和打补丁的办法,这里不做介绍,大家有兴趣可以百度下:IE6支持png24

Png的格式、颜色种类、位数、透明度、浏览器支持一览

20 Dec 02:11

关于用户体验的三个反思

by 阿智
Lei Ma

设计分工、 用户体验的重要性

“一个产品没用,体验再好用户也不会去用。——你觉得这句话是对还是错?”我曾在微博 里发起了这样一个讨论。

看到“一个产品做到60%才需要用户体验”的评论时,我很吃惊:用户体验难道只是锦上添花?不了解用户,不知道用户在体验的哪些环节发生什么事情,你的产品是如何做到60%的?

第一个反思:用户体验的概念和落地情况

笼统地说,用户体验(User Experience,简称UX 或是UE),它指用户在使用一个产品、系统或者服务时建立起来的纯主观感受。

这里边有两个重点。一是用户,二是纯主观感受。用户是指产品、系统或者服务的目标使用者,不是你自己。受个人经历的影响,对待同一件事情但每个人的感受可能不同。但是当我们了解到一个群体的感受时,比如淘宝的买家评分。一个买家的主观差评,可能是特例,但多个买家给差评时,就已经能客观地反映出一些事实了。因此,尽管体验是主观的,但也丝毫不影响我们对它的重视程度。

在与用户体验有关的工作中,我们经常会听到类似的意见:

  • 是不是足够易用?
  • 是不是足够易学?
  • 是不是足够美观?

不管你承不承认,大多数人在落实用户体验工作时,还是把可用性和用户体验混淆了,认为可用性就是用户体验。

这个现实有必要被改变。

尽管UI的可用性很重要,但它并不等于用户体验。用户体验和可用性之间具有非常奇妙的关系。大多数的情况下,可用性高意味着用户在使用过程中的体验好。但也有例外。高速公路就是一个例子,它又宽又直,可用性极高,但对于驾驶者而言,它的体验远不如弯曲狭小的盘山公路。

对于用户体验而言,它是一个全方位的概念。从我们的用户看到产品广告、媒体报道,到知晓我们的产品然后作出选择;再到他使用产品之后遇到问题咨询客服。在不同阶段,不同渠道,每一个可能和你的产品、服务,甚至是企业本身接触到的地方,都能够产生用户体验。

越来越多的用户体验设计师开始使用“用户体验地图”来指导设计工作。用户体验地图是对用户需求,以及满足这些需求的一系列交互行为的情绪状态的视觉化呈现。通过这张地图,我们很容易进入用户的世界,感受他们的体验,了解痛点和机会。这个方法也可以更好地将用户故事传达给每一个关联的角色去负责优化产品和服务。

【图:adaptive path公司为欧洲铁路公司创建的用户体验地图】

第二个反思:用户体验与产品价值

当你局限地将用户体验等同于用户接触UI时的可用性的时候,或者是局限地理解用户体验只是发生在用户使用产品过程中的时候,你就会说:有比它更重要的事情,比如用户价值、产品价值。

是的,没错。如果产品没有用,即对用户没有价值,UI的可用性绝对不是最重要且最紧急的事情。

但是我们仍然得时刻提醒自己,可用性不等同于用户体验,可用性只是用户体验(使用中)的一部分而已。用户体验设计超越产品设计。用户体验设计包括组织开展用户调研、可用性研究、创建人物角色、设计信息架构、设计使用流程、设计低/高保真原型等多项技能。它的本质是以用户为中心的产品设计、系统设计和服务设计,它并不仅仅关注UI的可用性,还关注用户在使用前、使用中、使用后各个阶段、不同渠道的所有感受。用户体验设计既包括了有形的产品、系统的设计,又包括了无形的服务设计。

一个产品对用户有没有用,即能否满足用户的需求,决定了这个产品是否具备用户价值。解决用户价值的问题,等于解决产品有用性的问题。让产品具备有用性,是用户体验设计的基础。除此之外,用户体验设计还需要解决产品的可用性和吸引力的问题。

在商业环境中,一个有价值的产品,除了能够帮助用户解决问题,还需要能够帮助企业实现商业目标,即同时具备用户价值和商业价值。用户体验设计师针对用户与产品、系统或者服务的每一个接触点进行细致的调研、分析,然后结合商业目标设计有用的、可用的、有吸引力的产品,最终实现有价值的产品。在这个过程中,产品经理与设计师有时候需要在用户和商业之间作出平衡。毕竟,追求更好的用户体验也意味着需要更高的成本。

当我们在UI上不断提升可用性,优化用户使用中的体验的时候,也需要关注用户使用前、使用后的体验,尽可能全方位地覆盖用户的每一个关键接触点,去了解他们的需求、行为和想法。对于用户体验设计的目标而言,有用性是基础,可用性是要求,吸引力是期望。

你可以说使用12306.cn 的体验不好,即UI的可用性差。但是这个领域的特殊性决定了这个产品特别的有用性和吸引力,因此它仍是一个有价值的产品。与这个例子同样的还有51job.com ,UI的可用性可算是差到一塌糊涂,导致在使用中的体验很不好。但是,它的有用性毋庸置疑,时至今日仍有千万网民在使用它来进行求职和招聘,它的股票表现[JOBS ]也表明了它的产品价值。

不过也别忘了,糟糕的用户体验给竞争对手留下了机会,激烈撕杀的创业环境中,每一个机会都非常宝贵。你不会小瞧这一点的。

回到文章开头的讨论,我认为“一个产品没用,体验再好用户也不会去用”、“一个产品做到60%才需要用户体验”这样的结论是错误的,但若描述为“一个产品没用,可用性再好用户也不会去用”这样结论是正确的。用户体验从决定做这个产品的时候就需要考虑,绝不是锦上添花。

第三个反思:用户体验与产品部门、设计部门

随着用户体验设计工作的不断深入,你会发现有很多问题都会回归到用户和需求上面来。只有对用户体验的各个阶段、渠道和接触点进行全面的研究与分析,去了解目标用户的需求、行为和想法,才能提供最适合的解决方案。用户体验设计的质量很大程度上取决于我们对目标用户的了解程度有多深,而不是界面的交互或视觉设计形式有多赞。

“产品设计(PD)+用户体验设计(UXD)”这样的角色分工是错误的,因为用户体验设计工作本身就已经包含了产品、系统与服务的设计。将“产品设计”和“用户体验设计”分开,用户体验设计工作无法从策略层发力,所谓的用户体验设计往往也就只能局限于解决可用性问题和解决如何更符合目标用户的审美这些问题而已。同时,“产品设计+体验设计”这种角色分工导致职能重叠非常严重,结果是工作效率低下,人浮于事的现象也常常发生。这个我特别有感触,产品设计师/产品策划专员与用户体验设计人员这样的搭配真的糟透了:两个角色挖空心思聚集解决方案,却从不对目的(做这件事情的原因和意义)、目标(期望达到什么程度,如何衡量)多花些时间去思考清楚,功能做了一堆,却徒劳无功。

更合适的是“产品管理(PM)+用户体验设计(UXD)”这样的角色分工,并且他们最好同属于一个部门,不需要单独设立用户体验部。两个角色为同一个产品服务,让这个产品成功是他们共同的目标。

这种分工对于两者的职责定义非常清晰、明确。产品经理,即产品的管理者主要负责评估产品机会和定义要开发的产品。具体包括制定产品策略和产品目标,确定产品需求,规划产品的发展路线和监督需求的实现,并时刻跟进市场反馈作出及时的调整。除了商业、技术与用户体验,项目管理能力也是对产品经理的重点要求。用户体验设计师则主要负责研究和分析用户,提供解决方案。具体包括和产品经理、用户研究人员一起了解目标用户,提炼用户需求和用户体验目标,然后结合业务需求设计信息架构、使用流程以及用户界面等等。

对于初创企业来说,视情况设定产品管理角色。但大多数时候,产品管理的工作由创始人担任。无论如何,角色分工是手段不是目的。当然,专人专责的好处也非常明显,每个人都没有借口。

产品经理与用户体验设计师如何高效协作是我非常感兴趣的话题之一。在2013年的IxDC中国交互设计体验周上,我曾就此话题举办了一个工作坊专门研讨。

【图:一种从目的目标再到解决方案的工作思路】

如今细细想来,我仍然认为很多问题都是组织架构导致,比如产品部门与用户体验设计部门各自独立存在,设计工作没有与业务绑在一起,以及团队对于目的目标的理解不一致。目的目标不一致这点非常的致命,它导致团队的方向和方法错误,无法帮助产品成功。

20 Dec 02:02

多研究些问题,少谈些主义

by CDCer
Lei Ma

前端设计的拟物化 vs 扁平化

  着手写这篇文章时,正是七月伊始。想起九十五年前的七月,胡适先生发表了那篇在接下来的一个世纪都将遭受批判的文章——《多研究些问题,少谈些主义》。其时的中国,正被各种社会问题所困扰,也引发了学界对于各种“主义”的主张。针对这些主义,胡适阐明了自己的态度——  现在舆论界大危险,就是偏向纸上的学说,不去实地考察中国今日的社会需要究竟是什么东西……某种社会,到了某时代,受了某种的影响,呈现某种不满意的现状。于是有一些有心人,以这种现象,想出某种救济的法子。这是”主义’的原起。主义初起时,大都是一种救时的具体主张。后来这种主张传播出去,传播的人要图简便,使用一两个字来代表这种具体的主张,所以叫他做‘“某某主义”。主张成了主义,便由具体的计划,变成一个抽象的名词。……“主义”的大危险,就是能使人心满意足,自以为寻着包医百病的“根本解决”,从此用不着费心力去研究这个那个具体问题的解决法了。
 
 2
  
  这里搬出这些文字,是想抛玉引砖,借真知来粉饰拙见,谈一谈眼下产品和设计业界里的“问题”与“主义”。

 

 拟物主义 VS 扁平主义? 

 

  众所周知,自微软创造出Metro伊始,关于“skeuomorphic(拟物化)”和“flat(扁平化)”的的争议就未曾间歇过。这一公案,在6月11日苹果发布iOS7后,更是被推上一个新的高潮。至于这段公案的详情这里就不再赘述,看官可随意Google之。
 
3
 
  这段公案,其核心便在于大众和业界人士眼中所谓“Skeuomorphic(拟物化)”和“Flat(扁平化)”的对立。“拟物主义”和“扁平主义”各执一端,相持不下,征伐不已。而波及到现实工作中,也经常可以看到很多产品经理或设计师动辄便将“拟物化”和“扁平化”放在嘴边——“这个太平了,没什么质感,不上流”、“这是潮流,现在都追求扁平化”。孔子曰过:“攻乎异端,斯害也已”,对于到底是该继续坚持拟物主义,还是该追随扁平主义?下文就来妄谈一下,供看官一笑。
  首先,请评判一下,下图中哪款设计是Skeuomorphic拟物设计?哪款又是Flat扁平设计?
 4
 
  答案看似是不言而喻的——左图是Skeuomorphic拟物设计,右图是Flat扁平设计。但是,真的是这样吗?这个问题其实是个陷阱,而前面的答案则是不准确的。因为,两款设计都是Skeuomorphic拟物设计,而只有右图是Flat扁平设计。为什么这么说呢?首先我们来看Skeuomorphic拟物设计的概念。Dictionary.com上对Skeuomorph的定义为——Skeuomorph :an ornament or design on an object copied from a form of the object when made from another material or by other techniques, as an imitation metal rivet mark found on handles of prehistoric pottery.试译之——Skeuomorph是一种装饰手段或设计手法,用于在某个对象上复制来自其他材料或方法所制成对象的形式。例如,在陶器把手上添加模仿金属铆钉造型的装饰,使得原材料为黏土的器皿看起来像是用金属制成。这一过程可由下图表示:
 5
  其中,F不仅仅单指狭义的外观样式,更多的是指布局、方式、体裁等。回头再看上面的例子,就会发现,两图都是对现实中的钟表所做的模仿,并没有跳出现实的框架而设计出某种全新的计时形式。不同的是,右图没有使用渐变、高光等额外的特效处理,左图则仅在真实感的模拟上比右图更近了一步。可见,通常情况下,人们对Skeuomorphic拟物主义和Flat扁平主义的争论焦点并未跳出表象,而更多是简单地纠结于视觉层面的特效处理孰优孰劣上。这种争论,往往将两者简单粗暴地置于对立面,却忽视了Skeuomorphic和Flat问题的重点——视觉是服务于产品的,到底该使用Skeuomorphic还是Flat,这个问题应该站在产品层面来考虑。我把这种选择比喻为渔网和钓线的选择,用渔网的人指责钓线的简单单一,用钓线的人指责渔网的复杂粗放,却都忽视了两者的目的、使用场景和使用者的差异所在。
6  
  因此,在做设计之前,要先明确好产品的定位,做有针对性的设计,用设计去解决切实的问题,而非仅仅停留在表象去争论风格的好坏、主义的优劣。那么,什么才是有针对性的设计?
 
 

为解决问题而设计

 
  探讨上文的问题之前,先来看个例子——
7
  给出的替代方案,是以机器人代替工人完成重物的远距离搬送。
 
8
  固然这个人形机器人看起来很酷,够科技,也有人情味,但这是一个好的设计吗?将设计作品等同于对现实的模拟,其实是一项肤浅而又耗费资源的工作。如果站在实际角度去解决切实的问题,可以得到一个更加扁平高效的方案如下。
9
那么是否就是说,这种扁平化的机器人设计解决方案就是正确的呢?再看下图。
17
  显然,每一种设计风格都是有局限性的。当目的不同时,适用的设计解决方案是不同的,也无法认定一种风格是优于另一种风格的。在有针对性的设计中,设计要解决的问题是最重要的,至于采用哪种视觉语言,应当首先取决于产品要达到的目的,而非时下流行的设计风格。以iOS6和iOS7的“返回”为例——
10
  iOS6的返回在视觉上更像一个“按”钮,通过使用更接近真实物理世界观的阴影、高光和渐变对返回操作区域进行阐释,给予人一种可以点触的视觉观感。这一设计所带来的好处是,通过具有强烈操作暗示(局部范围的点触感)和方向暗示(箭头造型和被箭头包裹的文字)的拟物手法,降低使用者的学习成本,并提升使用者对操作结果预判的准确度。这种设计手段在iPhone尚未沦为街机的那些年头是非常有价值的,能够以友好的姿态,使具备任何认知程度的使用者都能快速上手,有利于发展iOS的用户群体。iOS7的返回,则通过扁平化的处理,在视觉上摆脱了“按”这一动作隐喻,并主要强调一种与整个屏幕更加一体化的方向感。这种改变并非仅仅为了服从整体设计风格的变化,而更多可以解读为一种适应产品现状的进化——
  1、从普通屏到retina屏的升级,使原先拟物化的设计需要占用更多的系统资源。屏幕的增大意味着切图尺寸的增加,切图尺寸的增加势必带来占用系统空间的增长。而在特定尺寸下,需要大量视觉细节的拟物化设计必然会使用到更多的颜色,从而使切图的数据量成倍增加。这一点在屏幕尺寸分化中所带来的影响是极为严重的。而由于扁平化的设计对细节元素的使用更为克制,能够较好地解决在不同分辨率下的适配问题,而不需要耗费太多的资源(包括系统资源和人力投入资源)。如下图所模拟的结果,iOS6按钮切图的数据量在三种尺寸下成倍增加,而iOS7按钮切图的数据量增加并不多。
11
  2、从3.5英寸屏幕到4英寸屏幕的升级,使得手指完成屏幕左上角点触操作所需的路径增长。同时,在iOS6的返回按钮设计上,实际的点触响应区域要大于视觉限定的区域,手指即使未能精确点触到视觉上的按钮区域,也会触发返回的动作。
 
12
  结合这两点考虑,显然在大屏幕上,有明确触控范围的点触样式不再是一个理想的视觉展现形式,过于强调点触区域的精确度会在一定程度上增加用户心理上的疲劳感。反之,iOS7的返回则规避了这一问题,对点触区域的模糊化处理在一定程度上释放了用户的操作压力。
 

13

  3、iOS7对手势操作和头部感应操作的支持,可以让返回操作不再像iOS6一样只能依赖于点触动作。这一点使得强调点触行为的按钮样式失去了存在的价值,取而代之的是在表现方向感上更加纯粹的扁平化设计。

14

  可见,iOS7的“返回”并非因为要抛弃拟物主义才成为现在的样子,而是使用这种更扁平的设计手法切实解决了产品的实际问题。这一点可以用Jonathan Ive曾说过的一段话加以印证——

  If we’re thinking about a lunchbox, we’d be really careful about not having the word box already, to give you a bunch of ideas that could be quite narrow. Because you think of a box as being square and like a cube. So we’re quite careful with the words that you use, because those can be narrow and can determine the path that you go down.

  大意是:如果要设计一个lunchbox,最好先把“box”这个字眼抛开,因为”box”这个字眼会决定你接下来的思路,将你的想象力限定在某种立方体造型上。(注: a box is a square or rectangular container with hard or stiff sides.)

15
  因此,在做设计的时候,要先放空自己对事物的既有认知,再从根本上去考虑最适合的设计形式。这便是一种从设计的原本目的出发,抛弃一切外在影响,针对产品本身给出解决方案的设计方法。
16

  现在再看前文的问题,什么是有针对性的设计?有针对性的设计就是——抛开不论是拟物主义还是扁平主义或是XX主义的干扰,为产品中遇到的问题提供最合适的设计解决方案。那些为了贯彻拟物主义理念或追随扁平主义潮流,强行在视觉上将产品拟物化或扁平化,甚至以不惜牺牲产品体验为代价的肤浅做法,可以休矣。

 

四个衡量维度

  空谈误国,即使有道理的话说滥了也便成了空洞的XX主义。证完“拟物主义VS扁平主义”是一个伪命题后,还得回到实际问题上——在为产品而设计时,如何判断这个产品是适用更接近真实的拟物化的设计,还是适用更加扁平化的设计?通常我会采用基于存在环境、自身价值、用户关系及进化趋势等四个衡量维度来对产品进行简单的判断,初步确定所适用的设计风格。
  适应性:你的产品是否需要在多个平台具备一致性展现?
  呈现性:你的产品是否以大块的信息内容展现为主?
  易用性:你的产品是否具有便于理解的操作隐喻(包括对层级结构和交互行为的暗示)?
  趋势性:你的产品是否依赖于流行文化的认同?针对以上四个维度的答案如果为“是”,则请倾向选择更加扁平化的设计方案。然而,任何衡量方法都是死板的,在进行具体设计工作时,建立在大量经验基础上的直觉和判断力更值得信赖。
  总之——多研究产品存在的现实问题,针对产品的现实问题找到最佳的视觉解决方案;而不要受某某设计主义的干扰,为迎合所谓潮流趋势而影响了产品的体验——这才是吾辈产品设计者们对产品的真正价值

(本文出自腾讯CDC博客: http://cdc.tencent.com/?p=7821)

20 Dec 01:49

可以从CSS框架中借鉴到什么

by 杯面小王子
Lei Ma

css 结构

现在很多人会使用 CSS 框架进行快速建站。
那 CSS 框架是什么呢,它通常是一些 CSS 文件的集合,这些文件包括基本布局、表单样式、网格、简单组件、以及样式重置。使用 CSS 框架大大降低工作成本进行快速建站。
当然对于一些大型的项目,可能会很难照搬某些框架直接使用的,因为直接使用会带来一些限制或者冗余的问题。
但在 CSS 框架已经日趋成熟的今天,在我们设计项目架构、规范的时候,现时市面上一些优秀的框架也可以给我们提供很多可借鉴的地方。

本文主要从几个方面讨论 CSS 框架可以对我们项目的借鉴点:
1. 目录组织
2. CSS 规范
3. 图形
4. 应用方式
5. 小建议

1. 目录组织

在目录组织的分析上我们参考了 Bootstrap , Blueprint , Yui , Yaml 四个框架的组织方式

1

当使用一个框架时,我们一般会把所需框架本身的样式链到页面中,然后在它的基础上进行修改。所以框架本身所带的样式可以理解为基础样式。即我们平时所说的全局样式+组件样式。

2

可以看到,在目录架构上4个框架基本都是遵循基本样式+用户定义扩展样式的常规方式进行组织。

然而,如果按 Bootstrap 做法的话,可能会出现把不常用组件样式也包含在全局样式中一并引入,如果把组件也写在全局 CSS 中,最好确保该组件出现频率较高才引入,避免不必要的带宽浪费。

关于 hack:
对于针对低版本浏览器所写的 hack,对它的处理方式,Blueprint 和 Yaml 都是使用单独引入 hack 文件的形式进行处理,笔者也尝试过这样的做法。
个人觉得这种方式的好处是可以避免给高级浏览器带来冗余代码,而且通过条件判断引入 CSS 也不会给高级浏览器带来额外的请求。

这种方式比较适用于,高低级浏览器本来就刻意设计成有较大差别的情况下,即 hack 比较多的时候才使用。不然就为了十来行 hack 而多引入一个文件的话似乎也不太可取。

2. CSS 规范

a. 前缀

框架中公用模块都有前缀,分别有以下3个思想:
1. Yaml , Yui :无论如何都是统一的标识开头,再加上改模块名称。
2. Bootstrap:直接模块名称,这方式需要定义关键字。公用模块是 button 都以 btn – 开头, image 则以 img- 开头。
3. Nec :单字母开头来标识组件。

3

一般来说应用一个框架,我们先引入框架的样式,再在之上覆盖上自己的样式,所以可以把框架看作是我们的基础CSS。

我们可以借鉴框架的前缀规范来规划我们的基础 CSS 前缀,根据自己的项目实际情况采取不同的方案。

b. 类的划分

类的划分方式在框架中主要有2种标准,分别为:以【组件为粒度】,和以【属性为粒度】。

1. 组件为粒度:把组件的所有样式封装在一个类名中,调用类名即可使用该组件。
2. 属性为粒度:需要属性的时候,调用对应类名拼装。

4

在我们日常项目中,以属性对类名进行划分比较少见,因为一直遵循的都是“结构、样式、行为”分离的原则,力求降低三者的耦合度。

然而以这种方式划分在一些特定情况下也不是完全不可取。

例如对于一些元素的隐藏,如果没提供相关的类名的话,在js开发阶段开发就会直接内联 style 在对应的元素上(这将会触发 repaint/reflow),所以更好的方式是和js开发约定一个类名触发显示/隐藏的动作,在这种情况下,给 display: none 划分一个特定的类名,供给开发调用就会显得很实用了。

所以,更重要的是我们对所在的实际情况进行分析,并给出最佳的解决方案。

c. 组件类名组合方式

组件的样式,基本都是 基础类名+扩展类名 的套路来进行组合的变化。

但在选择符方面可以有3种方式, 目前最多框架使用的是:多类选择,通过修改 html 的类名组合,实现还原。

以按钮样式的实现为例:
5

这里采用常规的组合方式,不再赘述。

d. 高级 CSS 选择器

在对 Bootstrap 进行分析的过程中,发现 Bootstrap 定义了一系列的icon,这些 icon 的类名全部都是以 icon- 为前缀。

而在 CSS 中,Bootstrap 用到了子串匹配属性选择器。

[class^="icon-"]

使用这个的好处是,对于 icon 类的标签,我们再也不需要对其加一个对于 icon 的公用类名,只需要类名是以 icon- 开头就可以匹配所有 icon ,省了一个类名。

使用这种方式可以降低一定的成本,但是只在 IE7+ 浏览器才适用,如果要使用该类选择器的话请考虑是否需要兼容 IE6。
虽然 IE6 不支持,但是高级 CSS 选择器的确十分吸引,并且可用于移动端,所以特此提一下。

3. 图形

在参考的 CSS 框架中,它们会提供一些简单的图形元素, 但是实现的方式也有彼此不同之处。

但是共同点是,现今较新的框架,对于一些简单的效果,都会使用 CSS3 实现一些简单的渐变,对低版本 IE 进行优雅降级。

6

4. 应用方式

在参考实例是怎样使用这些框架的方式上,基本和我们平时项目使用方式一致。

在应用方式上,一般有两种方式。

1. 对于以组件为粒度的样式:
按照 组件的 html 结构 来拼合自己的页面模块,再辅助添加 自定义的类名 来控制其个性化定义。

2. 对于以属性为粒度的样式:
按所需要的样式对应类名进行拼接。

下面可以看几个简单的例子:

1. 以组件为粒度:
对于组件的覆盖,采取常规的自定义类名覆盖样式,此处不再赘述。

2. 以属性为粒度:
7

可以看到,若需要样式是属性以粒度,即把对应类名调入即可,但是在实际项目中,这种方式由于灵活度不够,并且没有做到结构与样式分离,实际项目中比较少见这种用法。

而对于功能性的动作,例如显示/隐藏元素,可以灵活使用这种方式,把所需样式写到一个特定类名中供给js调用,避免直接写入 style 导致 reflow/repaint。

5. 小建议

对于目录组织:

目录组织——

可以考虑结合 Bootstrap 与 Yaml/Blueprint 的思想。

a .把常用的基础样式压缩合成一个文件。
b. 把不必现组件样式抽离成单独 CSS,按需加载。

【优化点】
减少了单个 global_min 文件的大小。

【权衡点】
需要考虑由此可能导致的请求数过多问题。

hack——

根据实际情况,可考虑把针对 IE6 的 hack 文件单独分出来。

【优化点】
便于对低级浏览器的大型差异化处理,并且减少对于高级浏览器的冗余代码。

对于 CSS 规范:

CSS 前缀——

可考虑尝试 Nec 的方式,约定 “单字母_xxx”为公用样式的标识,取消单一的公用前缀,通过以不同字母作为顶级前缀,对公用模块进行划分。

【优化点】
减免了“公用前缀_组件前缀_组件名”的多级前缀,通过以类名格式作为标识,代替了原来公用前缀的作用。

【权衡点】
仍需按项目实际情况考虑。

类的划分——

可考虑约定统一几个功能性的类名(以属性为粒度的类名),例如元素隐藏的类名,供给js调用。

【优化点】
减免让开发直接写 style 内联 CSS,造成页面的 reflow/repaint。

高级 CSS 选择器——

在对移动端页面进行重构时可以考虑使用更高级的 CSS 选择器。
例: [class^=”icon”],:first-child,:nth-child(n)….

【优化点】
相比于传统的方法,节省类名。

对于图形:

考虑与设计师约定,视觉效果在可接受范围内,部分效果使用 CSS3 实现,对低级浏览器实现优雅降级。

【优化点】
大量减少图片的使用,节省带宽以及请求数。

最后

随着新技术的不断涌现,越来越多优秀的 CSS 框架出现在我们的眼前,这里分析覆盖面有限,未能一一进行对比并深入探索,如有不足之处,敬请大家多多指正交流。

17 Dec 13:34

网页上如何实现丰富的图片阅览?——等高响应布局实现!

by TQ
Lei Ma

等高响应式布局

「等高响应式布局」是什么?介绍它之前,我们先回忆一下它的近亲「等宽响应式瀑布流」。

回忆一下,Pinterest、Google+、花瓣网、美丽说等是否让你沉浸于不断往下拉体验丰富的图片阅览?

那种感觉就像逛街,让所有商品呈现在网页上,只需要往下拉鼠标就能逐个浏览,不断加载,他们简洁同时整齐,原因是他们的宽度相等,但是高度不一

这就是所谓的「等宽响应式瀑布流」,它的特点如下:

1.响应式,适应PC端以及移动端各设备呈现不同的宽度和单列数量;

2.等宽,这样的布局十分适合瀑布流,有不断向下的阅读感;

3.没有脚的小鸟,因为内容是不断向下加载,因此页脚基本是看不到了;

这样的布局引起了一个风潮,然而把图片适应到等宽,高度等比例变化,对不考虑容器高度的浏览来说实现并不难,因此业界也大多采用了这样的布局,而且可以响应式,在不同屏幕宽度可以变化不同卡片宽度。

然而,回归正题,今天要说的和这个不同,但是相近,它就是「等高响应式布局」。

 

先看看效果图:

photoLayout_preview

如图,并不像等宽一样简单,要在不改变图片分辨率(宽高比)同时保持等高且占满行宽度,如何实现?不妨带着问题跟我走。

1 等高响应式布局是什么?

①行内高度相等;
②行间总宽度相等;
③自适应宽度布局;
④图片分辨率(宽高比)不变;

2 难在那里?

①行内高度一致,行间高度不一致,但是相差不能太多;
②并不知道一行需要多少个图片才能占满宽度,由于高度不确定,图片的宽度也不能等比变化;
③如何做到自适应?
④布局用于用户的个人相册,数据量是有限且未知的,如何保证图片数量满行显示?

由上可知,这种布局涉及太多变量,而且最难的是做到图片分辨率不改变,不影响图片质量效果。

该如下下手?我的思路是:确定一个变量,其他变量根据这个变量做适应性调整。

3 解决方法(具体下面会有图示)

①确定一个变量。由于当前的浏览器宽度是固定的,因此可以根据浏览器宽度范围制定一个标准高度,类似CSS的媒体查询(media query);

②初次变换。所有图片宽度根据这个标准高度作宽度的等比例缩放;

③创造容器。每行建立一个div,并装入尽可能多的图片,直到容器装不下;

④第一步调整。每行根据自己与目标宽度(当前浏览器宽度)的差值,再等比例变化宽、高。

公式如下:当前行总宽度/目标宽度=每个图片当前高度/变化后高度;
⑤第二步调整。根据变化后高度再等比变化各图片宽度;

4 操作图示

 

step123

step45

大工告成!然而深入考虑和分析,还总结出一些别的问题,我用了以下不同的处理方法把这些问题解决。

5 其他问题

①高度调整公式会产生百分比,浏览器是会直接取整,因此可能会产生-2到2px的误差;

解决方法:调整后记录每行误差值gap,然后循环把gap的值分给同行每一张图片,这样前2张图片可能会有±1px的图片宽度变化,但是用户基本觉察不了图片的轻微拉伸变化。

②用户图片数可能过少,会有图片只有1-3张占不满一行的情况,该怎样显示布局;

解决方法:判断只有1行图片的时候不作布局调整,少于1行则默认显示等高变化后的图片即可(即只调整一次,不需要为剩余值再自适应)。

③ 每行调整前的剩余宽度过大,导致调整后宽高很大;

解决方法:若调整后宽高是原始宽高的150%左右则该行舍弃,这里考虑到整体图片质量,确保不影响图片墙效果。

④ 用户上传的照片太小,例如16×16的小图标,如果一样的方式调整会与400×800这些图片并列放大,造成很大缩放比。

解决方法:考虑到是图片墙的效果,一般不会有用户传一些其他的图片,例如表情素材等等,同时在图片处理时可以加一个排序,获取了图片宽高后把小于一定值的图片排在最后再一起显示;

6 其他

目前有2个网站已经初步实现这种效果,如百度图片和flickr,如下图:

baidu_layout

flick_layout

然而,我们的布局有如下优势:

(1) flickr并没有兼容到ie6-7,可是由于我们的项目一般用户量比较大同时要考虑到所有用户,因此有必要做到兼容ie6以上所有浏览器包括各种现代浏览器;

(2) 百度其实并没有做到完美的满宽,如图右边,每行右边会出现不对齐,而我们的解决方案可以避免这样的误差(其他问题①);

7 总结

这个布局的优势显而易见:整齐又多变,规则又繁杂,用最纯粹的方式展现图片的魅力。

就如一个「网站版的摄影展」。

实现如此的方案,需要细心分析,仔细考虑,繁杂的效果只会降低图片的展现力,所以需要先做加法,丰富功能,再做减法,去其糟粕。

demo效果请点击这里。

这个布局将会用在QQ空间V8版本新摄影控版式,敬请期待。

本文由 腾讯ISUX 版权所有,转载时请注明出处

  本文链接:http://www.yixieshi.com/ucd/15216.html

  ===============关于互联网的一些事===============

  互联网的一些事http://www.yixieshi.com )  ——  专注于互联网产品设计的媒体平台,报道互联网前沿资讯,分享产品设计经验、用户体验心得。为产品策划和产品运营人士提供专业的产品资讯文档,以及产品设计、策划、运营、交互设计、用户体验、电子商务信息、互联网创业信息、移动互联网等专业信息服务。

  官方微博: @互联网的一些事

  官方微信: 互联网的一些事(ID:imyixieshi)

  如果您对互联网产品有独特的想法和见解,欢迎给我们投稿。投稿信箱:tougao#yixieshi.com (自行将“#”修改为“@”)

17 Dec 13:34

网页上如何实现丰富的图片阅览?——等高响应布局实现!

by TQ

「等高响应式布局」是什么?介绍它之前,我们先回忆一下它的近亲「等宽响应式瀑布流」。

回忆一下,Pinterest、Google+、花瓣网、美丽说等是否让你沉浸于不断往下拉体验丰富的图片阅览?

那种感觉就像逛街,让所有商品呈现在网页上,只需要往下拉鼠标就能逐个浏览,不断加载,他们简洁同时整齐,原因是他们的宽度相等,但是高度不一

这就是所谓的「等宽响应式瀑布流」,它的特点如下:

1.响应式,适应PC端以及移动端各设备呈现不同的宽度和单列数量;

2.等宽,这样的布局十分适合瀑布流,有不断向下的阅读感;

3.没有脚的小鸟,因为内容是不断向下加载,因此页脚基本是看不到了;

这样的布局引起了一个风潮,然而把图片适应到等宽,高度等比例变化,对不考虑容器高度的浏览来说实现并不难,因此业界也大多采用了这样的布局,而且可以响应式,在不同屏幕宽度可以变化不同卡片宽度。

然而,回归正题,今天要说的和这个不同,但是相近,它就是「等高响应式布局」。

 

先看看效果图:

photoLayout_preview

如图,并不像等宽一样简单,要在不改变图片分辨率(宽高比)同时保持等高且占满行宽度,如何实现?不妨带着问题跟我走。

1 等高响应式布局是什么?

①行内高度相等;
②行间总宽度相等;
③自适应宽度布局;
④图片分辨率(宽高比)不变;

2 难在那里?

①行内高度一致,行间高度不一致,但是相差不能太多;
②并不知道一行需要多少个图片才能占满宽度,由于高度不确定,图片的宽度也不能等比变化;
③如何做到自适应?
④布局用于用户的个人相册,数据量是有限且未知的,如何保证图片数量满行显示?

由上可知,这种布局涉及太多变量,而且最难的是做到图片分辨率不改变,不影响图片质量效果。

该如下下手?我的思路是:确定一个变量,其他变量根据这个变量做适应性调整。

3 解决方法(具体下面会有图示)

①确定一个变量。由于当前的浏览器宽度是固定的,因此可以根据浏览器宽度范围制定一个标准高度,类似CSS的媒体查询(media query);

②初次变换。所有图片宽度根据这个标准高度作宽度的等比例缩放;

③创造容器。每行建立一个div,并装入尽可能多的图片,直到容器装不下;

④第一步调整。每行根据自己与目标宽度(当前浏览器宽度)的差值,再等比例变化宽、高。

公式如下:当前行总宽度/目标宽度=每个图片当前高度/变化后高度;
⑤第二步调整。根据变化后高度再等比变化各图片宽度;

4 操作图示

 

step123

step45

大工告成!然而深入考虑和分析,还总结出一些别的问题,我用了以下不同的处理方法把这些问题解决。

5 其他问题

①高度调整公式会产生百分比,浏览器是会直接取整,因此可能会产生-2到2px的误差;

解决方法:调整后记录每行误差值gap,然后循环把gap的值分给同行每一张图片,这样前2张图片可能会有±1px的图片宽度变化,但是用户基本觉察不了图片的轻微拉伸变化。

②用户图片数可能过少,会有图片只有1-3张占不满一行的情况,该怎样显示布局;

解决方法:判断只有1行图片的时候不作布局调整,少于1行则默认显示等高变化后的图片即可(即只调整一次,不需要为剩余值再自适应)。

③ 每行调整前的剩余宽度过大,导致调整后宽高很大;

解决方法:若调整后宽高是原始宽高的150%左右则该行舍弃,这里考虑到整体图片质量,确保不影响图片墙效果。

④ 用户上传的照片太小,例如16×16的小图标,如果一样的方式调整会与400×800这些图片并列放大,造成很大缩放比。

解决方法:考虑到是图片墙的效果,一般不会有用户传一些其他的图片,例如表情素材等等,同时在图片处理时可以加一个排序,获取了图片宽高后把小于一定值的图片排在最后再一起显示;

6 其他

目前有2个网站已经初步实现这种效果,如百度图片和flickr,如下图:

baidu_layout

flick_layout

然而,我们的布局有如下优势:

(1) flickr并没有兼容到ie6-7,可是由于我们的项目一般用户量比较大同时要考虑到所有用户,因此有必要做到兼容ie6以上所有浏览器包括各种现代浏览器;

(2) 百度其实并没有做到完美的满宽,如图右边,每行右边会出现不对齐,而我们的解决方案可以避免这样的误差(其他问题①);

7 总结

这个布局的优势显而易见:整齐又多变,规则又繁杂,用最纯粹的方式展现图片的魅力。

就如一个「网站版的摄影展」。

实现如此的方案,需要细心分析,仔细考虑,繁杂的效果只会降低图片的展现力,所以需要先做加法,丰富功能,再做减法,去其糟粕。

demo效果请点击这里。

这个布局将会用在QQ空间V8版本新摄影控版式,敬请期待。

本文由 腾讯ISUX 版权所有,转载时请注明出处

  本文链接:http://www.yixieshi.com/ucd/15216.html

  ===============关于互联网的一些事===============

  互联网的一些事http://www.yixieshi.com )  ——  专注于互联网产品设计的媒体平台,报道互联网前沿资讯,分享产品设计经验、用户体验心得。为产品策划和产品运营人士提供专业的产品资讯文档,以及产品设计、策划、运营、交互设计、用户体验、电子商务信息、互联网创业信息、移动互联网等专业信息服务。

  官方微博: @互联网的一些事

  官方微信: 互联网的一些事(ID:imyixieshi)

  如果您对互联网产品有独特的想法和见解,欢迎给我们投稿。投稿信箱:tougao#yixieshi.com (自行将“#”修改为“@”)

17 Dec 13:19

《断舍离》笔记:通向自由的26个丢弃

by warfalcon
Lei Ma

断舍离

      这本书最早是博客思听里听到的有声书,今年出简体版了,作者山下英子,是个杂物管理咨询师。她在书中提到目前为止大部分的整理术,特别是收纳术,都是在物品数量不减少的基础上,花费大量的时间、空间、劳力、精力来整理。而“断舍离”是从根本上反思自己与物品的关系,对物品进行简化、取舍,为人们省出整理的时间、空间、劳力和精力。山下英子将瑜伽中的行法哲学“断行、舍行、离行”——这种放弃心中执念的理念提炼成“断舍离”,运用到日常生活整理整顿、人际关系、思考等各个方面。

这本书中的特点在于:断舍离的主角并不是物品,而是自己,而时间轴永远都是现在。选择物品的窍门,不是“能不能用”,而是“我要不要用”,这一点必须铭刻在心。

从加法生活转向减法生活很重要,并不是心灵改变了行动,而是行动带来了心灵的变化。可以说,断舍离就是一种动禅。

看到有人已经分享过笔记了,直接转载一下。

转载:http://www.marieclairechina.com/life/health/health/20130822-pic-45666.shtml

“断舍离”是指:

      断 = 不买、不收取不需要的东西

      舍 = 处理掉堆放在家里没用的东西

      离 = 舍弃对物质的迷恋,让自己处于宽敞舒适,自由自在的空间。

     到底应该怎样抛弃执念,让人生变得从此清爽呢?也许以下这份清单可以帮助到你!

通向自由的26个丢弃

 

阶段1

物质和金钱

        1丢掉视线里的“噪音”。Simple and Creative Life不要允许微小的视线阻挡物存在。

        2丢掉现在不用的东西。Beauty of Nothing与物品告别,也是同过去的自己告别。

        3丢掉“储存”的概念。Going Minimum以利用“外部仓库”的方式思考。

     4丢掉舍不得拿出来的习惯。Pay Forward把东西让给更加需要的人。

        5丢掉零线包A Little Makes a Big Loss比起下定决心的大额消费,不知不觉中的小额消费更可怕

        6丢掉冲动购物。Listen to Your Soul只买从心底喜欢的东西。

        7丢掉说“随便”的坏习惯You are What You Buy不是要节约,而是要选择。

        8丢掉附属品。Natural Beauty比起去选择,不如惯用标准装备。

        9丢掉“提高生活水平”的想法。Minimum Life Cost从金钱中解放感性的自由。

        10丢掉服装的选项。Find Your Best Fit定好自己的“基本装扮”。

阶段2

工作方式

        11丢掉不擅长的工作。Make Your Creative Time在擅长工作中寻找创造力。

        12丢掉多重任务的思考方式。Focus On正如点茶一样,要专注于眼前的事情。

        13丢掉过度的自信。Look at Yourself高估自己的人里面没有成功者。

        14丢掉To Do。Inner Quest那些“要做的事”真的是“自己应该做的事”吗?

        15丢掉对多数意见的服从。Sing for One认为可行就坚决支持。

        16丢掉定时。Your Own Pace不要去迎合周围的安排。

        17丢掉指南。No Change, No Future束缚自己的并不是别人,而是自己。

        18丢掉老地图。Trust Your Instinct坚信自己的感觉。

        19丢掉拖延的想法。Now is the Chance消沉和恐惧是理所当然的事情。

        20丢掉平衡感。Be a Specialist不要期望成为一个全能的人。

阶段3

自身保养

        21丢掉熬夜。Rise and Shine一日之计在于晨。

        22丢掉“低质量睡眠”。Be Hungry and Rest创造完美的睡眠环境。

         23丢掉饱腹。A Hungry Dog Hunts Bests没有人能应付得了“吃多了”。

        24丢掉别人的意见。Be Yourself一个人走出森林。

        25丢掉污秽的语言。You are What You Say丢掉语言,一直走到精疲力竭。

        26丢掉“为了学习而学习”。Studying is Just a Tool使人心情沉重的学习毫无意义。

        无独有偶,与山下英子有着相似理念的金子由纪子,主张通过“拥有少量的有用的、有品位的东西,过简洁而快乐的生活”。在她的著作《不持有的生活》里,提供了另外一些能够有效帮助你高效、简洁生活的见解。

       不持有的生活会有7种生活习惯:

       1.不拿。免费得到的东西,很少被人珍惜,因此往往囤积不用。“不持有”的第一步就是“不拿”,不拿免费塑料袋,以自备购物袋来代替;免费发送又用不到的赠品,也要坚持完全不拿的态度。

     2.不买。冲动购物感觉痛快,但买完东西感到后悔的状况也不少,因此只要是“没买也无所谓”的东西,就坚持不买,让物品登堂入室的门槛变高,这样家中就只会出现真正喜欢、真正必要的东西。

        3.不储存。不囤积保鲜膜和卫生纸这类消耗品,也许大减价时买了一堆,像占了便宜,却容易造成使用上的浪费。一旦停止囤积,使用时就会更谨慎,并且想出各种生活小妙招,例如以密闭容器代替保鲜膜、纱布代替卫生纸,自然能降低消耗品的使用率,换来神清气爽的好生活。

       4.丢弃。养成丢弃的习惯,杂志或小册子超过一定数量,就丢掉;没在使用的漂亮糕饼盒子、过期的食物和调味料,也丢掉。并且确实执行丢弃前的准备工作,例如用美观的袋子,作为垃圾分类的容器,让丢弃这件事,变得轻松愉快。

       5.替代。添购一样物品前,先想想家里是否有其他东西可替代?例如一年可能只用到一次的漏斗,就用现有的塑料板卷成漏斗状来代替,如此就能避免多持有一个东西;活用现有物品,不是为了弥补贫困,而是为了创造丰足。

       6.借用。不常用的东西,可以借用或租用,和其他人一起使用更多物品,每个家庭或许就会减少囤积少用物品的情况,避免压迫居住空间,减少无谓的浪费。

       7.没有也无所谓。购物前,务必自问:这个真的是必要的吗?也许能得到“没有也无所谓”的答案;生活中这种东西,应该很多。

       •带购物袋出门,拒绝塑胶袋

       •回家马上确认信箱,不要的文件即归为资源垃圾

       •减少购买需拆封或只需要微波烹调的食物

       •比起买“因为便宜大量购买”,选择“虽然贵但很喜欢”的物品,并慎重的使用

       •不拿免费的物品

       •购物时带着事先列好的清单同行

       •即使没有变化,也只穿之子喜欢的衣服

       •用家里现有,自己喜欢的餐具吃饭

       •早三十分钟起床

       •早上一起床就打开窗户,呼吸新鲜空气

•尽量要吃早餐

•尽量在早上洗衣服

•丢弃垃圾袋之前将其缩小,减小体积

•四楼以下,尽量爬楼梯

•说谢谢的时候,看着对方双眼并微笑

•注意保持良好姿势

•自觉急躁,焦虑的话,做深呼吸

•每天一定看天空一次

•减少吃便利商店的便当和超市里现有的熟食

•不要边吃饭边看什么或读书

•回到家,鞋子脱掉后放好

•回到家,包包和外衣放在固定的地方

•衣服暂放的时候,一定要折好

•要暂放东西时,一定要整理好

•晚餐尽量自己做

•一天五分钟(一分钟亦可),闭目静坐

•尽量在一天之内整理完晒开的义务

•只在预订的时间看电视

•只在预订的时间上网

•垃圾在夜里整理完毕

•睡觉前,确认手机和数码相机是否已充电

•睡觉前,将报纸放到柜子里

•睡觉前,餐桌要收拾干净

•睡觉前,地板要收拾干净

•睡觉前,水槽里待洗的碗盘要清理干净

•睡觉前,事先做好明日外出的准备

•每天一定写日记,一行也可以

•每天用吸尘器打扫家里

•每三天擦一次地板和家具

•自己选择并整理毛巾和肥皂

•疲劳的夜晚,点燃蜡烛

•疲劳的夜晚,点燃焚香

•疲劳不堪时,看悲伤的电影痛哭一场

•洗发精和面纸,换成自己选择的配方

•两个月办一次家庭聚会

•欣赏美术馆或者饭店休息室等美轮美奂的地方

•家里的物品,尽可能选统一的颜色

•家里的物品,尽可能选择没有花色或者花样的

•家里的物品尽可能选择能叠放,能大小套在一起及可多次使用的

•买物品时,以要使用10年以上为前提

•尽可能不申请会员卡