background之你不知道的background-position
这是一个有趣的话题
其实我并不确切的平时大家是怎么去应用或者玩转一个属性,一个值。我能肯定的是这些东西都有不少的可玩性。
我今天要聊的 background-position 应该已经被大家玩得色彩斑斓了。尤其是 CSS Sprites流行的这些年,background-position 基本上是被应用最多的属性之一。
重拾旧趣
我们知道 background-position 是用来指定背景图像的偏移值的,能让一张图从特定的位置开始展现。而 CSS Sprites 就是通过将多个小图拼接成一张大图,然后利用 background-position 来指定需要显示的区域,以此达到合并HTTP请求的预期。
一个足够简单的应用
为了回顾 background-position 的应用,接下来我将会用一个最简单的例子来代入,这里有一张由2个 300*100px 垂直拼接而成的图片作为背景图,如 图0:
我现在需要 图0 在2个并排的div中分别显示不同的部分:
HTML:
<div class="part1"><!-- 显示图0上半部分 --></div> |
于是我写了段简单的CSS,如下:
CSS:
div { |
很显然我可以得到预期,效果如 图1:
这就是最典型的 CSS Sprites 使用场景。
默认值
由于 background-position 的默认值是 0% 0%,那么上述的CSS代码其实可以优化成:
.part2 { |
因为 .part1 指定的值是 0 0,和默认值相同,所以可以省略。你会发现,对一个属性了解得更多,就更能帮助你写出简洁的代码。
百分比
我并不能确定大家是否使用过 background-position 的百分比,这里就权当大家对此并不甚了解。
试着使用百分比去实现上个例子
我相信肯定有童鞋会这样写:
.part2 { |
按照一般的思维,上述两行代码应该是等价的,不是么?在开篇的时候我们就说了背景图 图0 的高度是 200px,那么 -50% 正好是 -100px。
不用着急,我们会用实际的例子来验证这个结果
结果让人有点忧伤,这和我们的设想有点出入,这是为什么呢?
追本溯源
我们都知道一个百分比值,必然会需要有一个参照尺寸。举个例子来讲,假设我定义一个元素的宽度是 50%,那么这个元素的具体宽度就是:包含块宽度 * 50%。
所以,如果你需要使用百分比作为 background-position 的值,必须清楚它的参照尺寸是什么。
w3c 是这样描述 background-position 比分比值的:
原文:refer to size of background positioning area minus size of background image.
翻译:参照指定背景区域的尺寸减去背景图片的尺寸
这是什么意思呢?白话一点说:background-position 的百分比值参照的是设置背景的区域减去背景图的尺寸。
再出发
按照这个思路,我们将:
.part2 { |
换算一下将会得到:
.part2 { |
换算过程为:(设置背景的区域高度 - 背景图的高度) * -50%,即:(100 - 200) * -50% = 50px
这就解释了 Demo2 为什么会得到 图2 的效果。但这显然并不是我们想要的,我们预期的效果是图1。
根据上述的公式,我们可以逆推预期效果的百分比值是多少:
-100 / (100 - 200) = 100% |
所以如果你要使用百分比,那么定义应该是这样的:
.part2 { |
这会终于得到我们的预期效果了,请看 图3
了解了百分比的这个特性后,会帮助我们大大简化某些定义,比如我在 Yo 里面对 yo-score 的处理,非常巧妙,有兴趣的童鞋可以自己研究一下,这里不细讲。
另外:需要注意的是百分比值会受 background-size 影响,因为 background-size 可以改变背景图像的大小。
多值
在 CSS3 中,对 background-position 属性进行了扩展,允许接受3到4个参数,用于指定背景图的起始方向和具体位置。
原文:If three or four values are given, then each <percentage> or <length> represents an offset and must be preceded by a keyword, which specifies from which edge the offset is given.
翻译:如果指定了三个或四个值,那么每个 <percentage> 或 <length> 之前必须有一个关键字,用于指定该方向的偏移量。
当指定3到4个参数时,不接受 center 关键字作为偏移量作为边界,只能使用 top, right, bottom, left 这4个关键字。
多值的意义
在此前,我们使用 background-position 只能让背景图从 top, right, bottom, left, center 这5个边界开始显示,但无法指定任意一个边界的偏移量。
举个例子:我想让一个背景图从右下角偏移 20px
你会发现如果没有多值扩展,你很难轻易做到这件事,除非你能确定容器的宽高永远都是显式定义好的,就算如此,其灵活性也一文不值。
多值的应用
如果利用多值特性,这将变得非常轻松,我们仍使用 图0 作为背景图,来做一个演示。
.demo { |
这会终于得到我们的预期效果了,请看 图4
实际上,有了多值之后,我们可以让背景图在任意方位上偏移,你可能会发现,这甚至可以让你的结构写得更简单,嵌套变浅。
写在最后
当你深入了解了每个属性的每个定义,你的CSS世界又会变得和以前不一样。enjoy it.
background之你不知道的background-position的更多相关文章
- 例子:Background Audio Streamer Sample
The Background Audio Streamer sample demonstrates how to create an app that uses a MediaStreamSource ...
- #8.12.16总结#background transition、animation、transform
background-origin 设置元素背景图片的原始起始位置.必须保证背景是background-repeat为no-repeat此属性才会生效. background-origin :bord ...
- css2和CSS3的background属性简写
1.css2:background:background-color || url("") || no-repeat || scroll || 0 0; css3: backg ...
- 20190328-CSS样式一:字体样式font-、文本样式text-、背景图样式background-
目录 CSS参考手册:http://css.doyoe.com/ 1.字体简写:font:font-style || font-variant || font-weight || font-size ...
- 苏宁易购微信端 全页通过background单图
w单图,绕开了显示的兼容性. http://res.m.suning.com/project/JoinGo/intro.html http://res.m.suning.com/project/Joi ...
- css background 背景知识详解
background 背景属性 我们知道元素有前景色color,与之对应的还有背景色,通过background我们可以为元素添加实色(background-color)和任意多个背景图片(backgr ...
- background 设置文本框背景图
background 属性的作用是给元素设置背景,它是一个复合属性,常用的子属性如下: background-color 指定元素的背景颜色. background-image 指定元素的背景图像. ...
- background & background-image & border-image
background & background-image & border-image https://developer.mozilla.org/en-US/docs/Web/CS ...
- 妙用 background 实现花式文字效果
本文将讲解如何利用 background 系列属性,巧妙的实现一些花式的文字效果.通过本文,你将可以学到: 通过 background-size 与 background-position 实现酷炫的 ...
随机推荐
- redis终于有比较大的进展了,redis3.0.1 稳定版本发布,支持集群。
原文地址:https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES Redis 3.0 release notes --[ ...
- Josephina and RPG
Josephina and RPG Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- http协议Authorization认证方式在Android开发中的使用
我们都知道,http协议是一种无状态协议,在Web开发中,由于Session和Cookie的使用,使得服务端可以知道客户端的连接状态,即用户只需要在浏览器上登录一次,只要浏览器没有关闭,后续所有的请求 ...
- CSS 实现行内和上下自适应的几种方法
在写一个移动端网页,发现网页的头部搜索框两边各有固定宽度的按钮,搜索框可以根据宽度的变化来改变自己的宽度,达到填充的目的,也就是一种自适应吧,下面写写自己尝试的几种方法 一 利用css3 的width ...
- JS的replace方法【转】
replace() 方法的参数 replacement 可以是函数而不是字符串.在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用.该函数的第一个参数是匹配模式的字符串.接下来的参数 ...
- python(4) - 装饰器
由于函数也是一个对象,既然是对象就可以将它赋给变量,通过变量来调用该函数 def now(): print('2016-01-01') f = now #注意,这里不能带(),函数带上()表示执行函数 ...
- MSP430常见问题之LCD 显示驱动类
Q1:晶体一般都是接32768,然后使用液晶很正常.我打算将晶体接6M的替换32768,那么液晶还能正常显示吗A1:看你所用的LCM 模块时序极限是多少HZ,然后看6M情况下,MSP430去驱动LCM ...
- 【Stirling Number】
两类Stirling Number的简介与区别(参考自ACdreamer的CSDN) Stirling Number I --- s(n,k):将n个物体排成k个非空循环排列(环)的方法数. 递推式: ...
- CMS垃圾回收与G1垃圾回收
CMS垃圾回收与G1垃圾回收的比较请参见:http://colobu.com/2015/04/14/G1-Getting-Started/
- jQuery选择器容易忽视的小知识大问题
1 关于检查某个元素在网页上的存在 很多人会惯性的写成 } 其实应该根据获取到元素的长度来判断 if($("#tt").length>0){ //do something博 ...