关于margin-top的百分比值

周末朋友发出江湖救急的消息,说他有个莫名其妙的bug搞不定了,于是我让他把bug的代码发过来看看。

他的需求是绝对居中,代码是这样的

  1. width:100px;
  2. height:100px;
  3. position:relative;
  4. margin-top:50%;
  5. margin-left:50%;
  6. top:-50px;
  7. left:-50px;

如果你已经看出问题了,那么这篇文章就可以不用看了。如果你觉得这段代码没问题,那么可以继续探讨。

大多数时候我们做一个块的居中,写法都是这样的

  1. width:100px;
  2. height:100px;
  3. position:relative;
  4. top:50%;
  5. left:50%;
  6. margin-top:-50px;
  7. margin-left:-50px;

看出区别了吧,区别就在于,margin是负的具体像素,定位是百分比。而出bug的写法刚好相反。乍一看这是没啥区别的,甚至我也曾经想当然的认为这两种写法是一样的。

这就是典型的知其然不知其所以然。

我们看一下W3.org上关于margin-top的说明:

  1. 'margin-top', 'margin-bottom'
  2. Value: <margin-width> | inherit
  3. Initial: 0
  4. Applies to: all elements except elements with table display types other than table-caption, table and inline-table
  5. Inherited: no
  6. Percentages: refer to width of containing block
  7. Media: visual
  8. Computed value: the percentage as specified or the absolute length
  9. These properties have no effect on non-replaced inline elements.

关键就是这里

  1. Percentages: refer to width of containing block

也就是说,只要margin的值是百分比,那么,他的基数就只会是父容器的宽度,比如父容器宽100PX,那么margin-top:50% 就是50px,无论父容器高是多少,都跟’margin-top’, ‘margin-bottom’的百分比值无关。

来个demo,这个是有问题的写法

<!doctype html>

<html>

<head>

<meta charset="utf-8">

<title>无标题文档</title>

<style type="text/css">

.wrap{

width:300px;

height:1000px;

margin:20px auto;

border:#f1f1f1 1px solid;

}

.box{

width:100px;

height:100px;

background:#ff6600;

position:relative;

top:-50px;

left:-50px;

margin-top:50%;

margin-left:50%;

}

</style>

</head>

<body>

<div class="wrap">

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

</div>

</body>

</html>

提示:你可以先修改部分代码再运行。

然后来个正确的写法

<!doctype html>

<html>

<head>

<meta charset="utf-8">

<title>无标题文档</title>

<style type="text/css">

.wrap{

width:300px;

height:1000px;

margin:20px auto;

border:#f1f1f1 1px solid;

}

.box{

width:100px;

height:100px;

background:#ff6600;

position:relative;

top:50%;

left:50%;

margin-top:-50px;

margin-left:-50px;

}

</style>

</head>

<body>

<div class="wrap">

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

</div>

</body>

</html>

提示:你可以先修改部分代码再运行。

需要注意的是,绝对定位的元素margin-top的百分比值低版本webkit下和其他浏览器表现不一,这个可以自己写几个demo试试看吧……..

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

39510
来自专栏杨龙飞前端

scrollto 到指定位置

2994
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4224
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

4289
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.5K7
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2902
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2797
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2956
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8918
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

3070

扫码关注云+社区