margin系列之内秀篇(二)
本系列摘自 飘零雾雨的博客
可挖掘性
之前已经写过一篇关于 margin 应用场景的文章:margin系列之内秀篇,当然,它的应用场景会远大于文中所述,无法一一列举。
所以本篇权当是对此的补遗好了,各位客官如有比较Cool的想法都可以留言给我,我会视情况补丁进来。
1像素圆角
这有什么好聊的吗?border-radius 瞬间可将之秒杀。恩,有的时候你不得不承认CSS3真是一把大杀器。不过当年我们是怎么做的?(会暴露年龄么?)
先看看我们要做什么,图一:
(图一)
如上图一,我们会这样写:
HTML
<div id="demo"> <a href="?"><span>1px圆角</span></a> <a href="?"><span>确定</span></a> <a href="?"><span>取消</span></a> </div>
CSS
#demo a,#demo span{ display:inline-block; vertical-align:top; } #demo span{ margin:1px -1px; /* 关键规则 */ }
一条CSS规则我们就可以实现1px圆角,你信吗?来看DEMO1:margin实现1px圆角
看到DEMO1的结果后,你会发现我们确实做到了1px圆角,很简单,有木有?在没有 border-radius 的年代,我们也很欢乐。
看到Code后,我想应该不用太解释为什么可以实现?
BTW,多像素圆角也可以参考这种方式来实现,如果你实在不想用图片的话。
已知宽高元素水平垂直居中
必须说,这是一个非常典型的 margin 应用,虽然如今看起来貌似使用场景不是太大,但还是好多人喜欢在面试时对人问起,我偶尔也会,但不多。
假设一个宽300px,高300px的盒子要在整个页面中水平垂直居中,我们可以这样做:
HTML
<div id="demo">这是一个水平垂直居中的容器</div>
CSS
#demo{ position:absolute; top:50%; left:50%; width:300px; height:300px; margin-top:-150px; margin-left:-150px; }
恩,是的,借助绝对定位。我们先来看看 DEMO2:margin实现已知宽高元素水平垂直居中
先通过 top/left 将 #demo 的绝对定位流起始位置设置为当前屏的中心点,此时 #demo 的左上角这个点其实已经是相对于页面水平垂直居中了,由于它的宽度和高度都是300px,所以从起始位置向右下各延伸300px后才是整个 #demo 的真正位置。此时整个 #demo 其实并不是水平垂直居中的,除非我们将 #demo 的中心点放在当前屏的中心点上。怎么做?
这时我们就需要使用 margin 了,在 margin系列之与相对偏移的异同 这篇文章里,我们就说过 margin 是以自身作为参照物进行位置偏移的。所以我们只需要将 #demo 相对自身向上偏移150px,向左偏移150px,就能够实现将自身的中心点放在当前屏的中心点上,也就实现了自身在当前屏的水平垂直居中。
为什么代码里是 -150px ?好吧,如果用 margin-top 来实现向上偏移,必须是负值,不是么?如果是正值的话,就是向下偏移了,其实也相当于是 margin-bottom 的正值, margin-left 亦然,我们在 margin系列之与相对偏移的异同 文章最后同样说过这个。基础知识很重要,有木有?
tabstrip底边线重合
先上个需求,如 图二:
(图二)
看到 图二 ,我想大家可能知道可能知道要做什么了。
对,我们要做的就是 tab 项与底边线重合,这应该是我们常见的场景了,margin 仍然是最佳选择。先来看代码:
HTML
<div id="demo"> <a href="?">分类一</a> <a href="?" class="on">分类二</a> <a href="?">分类三</a> <a href="?">分类四</a> </div>
CSS
#demo{ border-bottom:1px solid #aaa; } #demo a{ display:inline-block; margin-bottom:-1px; border:1px solid #aaa; } #demo .on{ border-bottom-color:#fff; }
要实现 tab 中各项与包含块的底边线重合,重点在于将包含块的底边线向上偏移1px,这样就与 tab 各项的底部重合在一起。
怎样可以做到让包含块底边线向上偏移1px?恩,margin 是那么的顺其自然。我们只需要将 tab 各项的 margin-bottom 设置为 -1px 即可,其本身高度不变,但包含块底部会向上1px。
来看看具体实现的例子 DEMO3:tabstrip底边线重合
双重边线
实际场景可能比这会稍复杂一些,我们看个大概即可,主要是拓宽一下思路,来看 图三:
(图三)
从图三中,我们可以看到每行都会有一个双色的边线,这就是我们要做的,HTML代码大约是这样:
HTML
<div id="demo"> <ul> <li>这是一个双重边线的示例</li> <li>这是一个双重边线的示例</li> <li>这是一个双重边线的示例</li> <li>这是一个双重边线的示例</li> </ul> </div>
怎么做?恩,我们可以用常规的方式来解决,比如完全使用 border :
CSS Case1
#demo li{ border-top:1px solid #fff; border-bottom:1px solid #ccc; }
结果出来后,我们会发现最顶部多出了一条线,同时最底部又少了一条线。当然,这都可以被解决,我们可以让 ul 来辅助完成,例如让其 负margin-top + border-bottom,不过如果 ul 或者其父元素有垂直方向 padding 的话,处理起来可能会稍显蛋疼。
还有其他解?当然,会有的,来看:
CSS Case2
#demo ul{ overflow:hidden; background:#fff; } #demo li{ margin-bottom:1px; border-bottom:1px solid #ccc; background:#eee; }
是的,选择 margin 作为实现手段。以 ul 的底色配合 margin 模拟出线条的外观,这其实也挺讨人喜欢的,不是么?看具体实现 DEMO4:双重边线
margin 模拟边线还可以做什么?比如做个表格神马的,看看 DEMO5:margin模拟表格边线
margin系列之内秀篇(二)的更多相关文章
- margin系列之内秀篇
本系列摘自 飘零雾雨的博客 最Cool的利器 一样东西在不同的场景,不同的人手里,所能做的事会有很大不同.我深切的以为 margin 绝对是 CSS 中最有能力的利器之一,不知大家以为然否? 前面几 ...
- SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)
前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块 ...
- SQL Server 调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)
前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块 ...
- [C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义
游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没 ...
- margin负值-内秀篇
zccst整理 margin系列之布局篇 margin系列之bug巡演(三) margin系列之bug巡演(二) margin系列之内秀篇(二) margin系列之bug巡演 margin系列之内秀篇 ...
- SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)
前言 本篇继续玩转模块的内容,关于索引在SQL Server的位置无须多言,本篇将分析如何利用Hint引导语句充分利用索引进行运行,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲 ...
- 源码学习系列之SpringBoot自动配置(篇二)
源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...
- SpringBoot系列之集成logback实现日志打印(篇二)
SpringBoot系列之集成logback实现日志打印(篇二) 基于上篇博客SpringBoot系列之集成logback实现日志打印(篇一)之后,再写一篇博客进行补充 logback是一款开源的日志 ...
- SpringBoot系列之profles配置多环境(篇二)
SpringBoot系列之profles配置多环境(篇二) 继续上篇博客SpringBoot系列之profles配置多环境(篇一)之后,继续写一篇博客进行补充 写Spring项目时,在测试环境是一套数 ...
随机推荐
- sql有几种删除表数据的方式
有几种删除表数据的方式? truncate.delete和drop都可以删除数据. TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHE ...
- android 数据库的升级与降级解决方案
在我们写的程序中不避免的需要升级.或者说需要改变业务逻辑,那这个时候就需要修改数据库的字段,来适应不同的表结构 我们一般写数据库都是操作一个继承至 SQLiteOpenHelper 的类 然后我们需要 ...
- Android解析Json速度最快的库:json-smart
场景描写叙述: 本文仅验证了在安卓环境下使用Json的Key作为反序列化条件的解析速度.结论是解析速度最快的不是阿里的fastjson,也不是Google的Gson,而是json-smart. And ...
- Android实时监听网络状态(2)
在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒.一般可以通过ConnectivityManager来完成该工作. ConnectivityMana ...
- [Unity] How to stop camera rendering?
http://answers.unity3d.com/questions/147988/how-to-pause-the-main-camera-.html I would simply pause ...
- android学习资料
在线查看android源码 1. https://github.com/android 2. http://grepcode.com/project/repository.grepcode.com ...
- 【转】补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
有个兄弟发了一个站内的私信给我,内容如下: 时间:2014-03-05 09:08:19 大哥,debian 的BBB版本没有图形界面吧 我安装后只有文本界面 我突然意识到,我前面有没有说清楚的地方, ...
- 利用C语言强行点击置灰的按钮
通常很多情况下,会有这样的事情,就是: 我们在运行某些程序的时候,发现按钮置灰了,比如购买版权或者输入序列号才能够获得访问权限.某个按钮才允许点击. 其实所有的这些东西都是 别的人或者公司利用一些编程 ...
- javascript进击(八)JSON
JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Ob ...
- Redhat YUM U盘源配置
Redhat YUM U盘源配置 1)在U盘创建目录 #mkdir /yum/Server 并从光盘Server.Packages 目录的所有文件拷贝到/yum/Server 2)安装 creater ...