文章列表

你真的认识margin么

先给出例子,看HTML


<div class="box">
<div class="box-1">
box-1
</div>

<div class="box-2">
box-2
</div>

<div class="box-4">
box-4
</div>
</div>

写出CSS


.box-1{
	float:left;
	width:300px;
	height:100px;
	background:#f00;
}
.box-2{
	float:left;
	width:300px;
	margin-right:-300px;
	background:#369;
}
.box-4{
	float:left;
	width:300px;
	background:#ddd
}

查看测试页面一

没错,是那margin-right:-300px惹的祸,它把它对下一元素的参考线为-300px,所以.box-4才会覆盖在box-2上面。我们看看margin的基本特性

margin 属性包括 margin-top, margin-right, margin-bottom, margin-left, margin,可以用来设置 box 的 margin area。属性 margin 可以用来同时设置 box 的四边外边距,而其他的 margin 属性只能设置其自各的外边距。

margin 属性可以应用于几乎所有的元素,除了表格显示类型(不包括 table-caption, table and inline-table)的元素,而且垂直外边距对非置换内联元素(non-replaced inline element)不起作用。

或许有朋友对非置换元素(non-replaced element)有点疑惑,稍微帮助大家理解一下。非置换元素,W3C 中没有给出明确的定义,但我们从字面可以理解到,非置换元素对应着置换元素(replaced element),也就是说我们搞懂了置换元素的含义,就懂了非置换元素。置换元素,W3C中给出了定义:

“An element that is outside the scope of the CSS formatter, such as an image, embedded document, or applet”

从定义中我们可以理解到,置换元素(replaced element)主要是指 img, input, textarea, select, object 等这类默认就有 CSS 格式化外表范围的元素。进而可知,非置换元素(non-replaced element)就是除了 img, input, textarea, select, object 等置换元素以外的元素。

margin 始终是透明的。

仔细看下面的图,就很好理解了。

让我们醍醐灌顶

增加一个box-3,使用margin-left:300px把margin-right:-300px抵消掉


.box-3{
	float:left;
	width:0px;
	white-space:nowrap;
	margin:0 0 0 300px;
	overflow:hidden;
	background:#fe8;
}

在box-2下增加box-3


<div class="box-3">
box-3
</div>

查看测试页面二

并不推荐这么做,很显然我的结构有问题。现只是作为例子。

(注:本文图片,定义直接copy译飞由浅入深漫谈margin属性

ie下的relative

今天遇到,记录一下。谢谢怿飞,同时我也看到他对待问题的态度(学习的地方)。

我们首先看看W3C的规定

relative: The box"s position is calculated according to the normal flow (this is called the position in normal flow). Then the box is offset relative to its normal position. When a box B is relatively positioned, the position of the following box is calculated as though B were not offset. The effect of "position:relative" on table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell, and table-caption elements is undefined.

元素在正常文档流(position in normal flow),并没有被移出。在ie中,relative会把元素移出文档流,但占物理位置。父容器overflow:hidden将不能隐藏。我们先看例子。

body{
	color:#fff;
}
.box-0{
	width:500px;
	height:100px;
	padding:20px 0 0 20px;
	overflow:hidden;
	background:#f60;
}
.box-1{
	width:500%;
	height:100px;
	position:relative;/*  */
	line-height:100px;
	text-indent:100px;
	background:#000;
}
<div class="box-0">
	this is box-0
	<div class="box-1">
    	this is box-1
   </div>
</div>

查看测试

解决办法就是避免这样的使用。

让我们的HTML Element更加语义

我们都知道,当前的HTML元素不多,并不能像XML那样能自由的定义元素。而我们常用的也就那么几个(<h>,<p>,<strong>,<em>等)。要知道,这些元素远远不能满足我们的语义的需求。那我们如何用这些远远不能满足我们的元素更加准确的去描述我们的需求(页面)?

问题一:为什么要语义,我全是div或者table也能完整的跨浏览器的去描述我的页面。

是,但我们先确定我们的站点的服务是什么,最终还是不是服务或者信息提供给用户?那如何更好,更全面的去传递呢?OK,我们实践。我今天要做一个为用户提供分享、推荐商品的网站(如果有,可能会火的,想想现在的b2c)。我们从table开始,我高高兴兴的按需求用table把页面制作好了,并跨浏览器。很好,我们需要搞一个活动,需要修改原先页面(你会疯掉的,你在修改一个全是table的页面)。发现这不是办法,于是我把页面改成div结构的,我技术很好,完美兼容各个浏览器。这时老板跑过来说,我们流量怎么老上不去,我们的pv呢,为什么google百度不收录我们网站?怎么办?我只能改。我决定HTML标记换成更加语义的,是标题的,我换成<h>,是段落的,我换成<p>...希望能让搜索引擎更加容易的来识别我的页面。可是我发现这些元素远远不能满足我的页面。

问题二:怎样让我的HTML更加语义?

  • 给元素增加属性(<a>加上rel,title等)
  • 使用className来描述语义(<a href="http://www.planabc.net" class="nickname" rel="friend">亦菲</a>)
  • 使用Microformats(其实它就是一个命名方式)

"麦鸡,浙江温岭人,一个WEB前端开发者。" 需求,让这段话更加有语义?

<p class="vcard">

    <a href="http://www.macji.com" class="fn url">
        <span class="nickname">麦鸡</span>
    </a>,
    <span class="adr">浙江温岭</span>人,一个
    <span class="work">WEB前端开发</span>者。
</p>

这样,我很好的向机器表达了我的信息,机器很容易的处理我的信息来发送给用户。对用户来说,这些className毫无影响他浏览。对于搜索引擎来说,获取数据,岂不是更简单?

问题三:语义了之后呢?

显而易见!

dl,dt,dd的用法

dl,dt,dd

先看下他们的定义。

<dl>标记定义了一个定义列表,定义列表中的条目是通过使用<dt>标记(definition title)和<dd>标记(definition description)创建的。<dt>给出了术语名,<dd>标记给出了术语的定义。

既然是这样,那么下面的代码是就是错误的了。

<dl>

    <dt>麦鸡</dt>
    <dd>麦鸡的哥哥</dd>
</dl>


<dl>
    <dt>
        <img src="...." />
    </dt>
    <dd>.....</dd>
    <dd>.....</dd>
    <dd>.....</dd>
    <dd>.....</dd>
</dl>

上面两种是最常见的。为什么错误,就看上面的定义,顾名思义了。下面给出正确用法。

<dl>
    <dt>麦鸡</dt>
    <dd>一个比较帅的。</dd>
</dl>

是不是很无语?对,我很无聊。但以后这样的文章我会陆续出现( -。-).

D2总结

D2是什么?很多人以为是阿里内部的一个活动。完全错误的。

D2(Designer & Developer Frontend Technology Forum)是中国所有前端开发者的节日,包括前端设计师,前端开发工程师,和所有对前端技术感兴趣的人。D2最初由淘宝网发起,目的是推动国内前端技术的发展,为国内前端从业者提供一个自由交流,学习探讨技术的平台,促进国内行业标准跟国际的融合,发掘前端技术可以创造的更大价值。

淘宝为什么要发起D2?答案是分享,交流这个精神。淘宝UED是一个很乐于分享的的团队。他们很开放,很奉献。

小马总结时说道:分享,视野,本质,沟通。看过第二届D2的人会以为是YUI的介绍会。我们需要的是去了解D2本质,今年是Yahoo主办,那他们肯定是讲他们自己的东西咯,不至于去讲jquery吧。更多前端开发者在这里能把自己的想法分享出来,能和更多的同行进行沟通陈贤安的常常在他的博客发表很新奇的东西,他在工作之余,关注了更多的东西。这就是视野吧。

D2最值得关注的是每个演讲完毕,最后的提问环节。很多人问了一些常见的问题,他们只是想知道专家们是怎么去做的。态度很重要。

希望下届百度或者腾讯能承办下去。

给出一张很“帅”的照片。

在北京吃到鸭子,看到国旗在天安门飘扬。首都人民很热情很**。