转载css的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:
1 |
<div class="part1"><!-- 显示图0上半部分 --></div> |
于是我写了段简单的CSS,如下:
CSS:
1 |
div { |
很显然我可以得到预期,效果如 图1
:
这就是最典型的 CSS Sprites
使用场景。当然,你可以在线查看这个例子 Demo1
最简单的 background-position 应用。
默认值
由于 background-position
的默认值是 0% 0%
,那么上述的CSS代码其实可以优化成:
1 |
.part2 { |
因为 .part1
指定的值是 0 0
,和默认值相同,所以可以省略。你会发现,对一个属性了解得更多,就更能帮助你写出简洁的代码。
百分比
我并不能确定大家是否使用过 background-position
的百分比,这里就权当大家对此并不甚了解。
试着使用百分比去实现上个例子
我相信肯定有童鞋会这样写:
1 |
.part2 { |
按照一般的思维,上述两行代码应该是等价的,不是么?在开篇的时候我们就说了背景图 图0
的高度是 200px
,那么 -50%
正好是 -100px
。
不用着急,我们会用实际的例子来验证这个结果,来看 Demo2
检验 background-position 的百分比值。
结果让人有点忧伤,这和我们的设想有点出入,这是为什么呢?
追本溯源
我们都知道一个百分比值,必然会需要有一个参照尺寸。举个例子来讲,假设我定义一个元素的宽度是 50%
,那么这个元素的具体宽度就是:包含块宽度 * 50%
。
所以,如果你需要使用百分比作为 background-position
的值,必须清楚它的参照尺寸是什么。
w3c
是这样描述 background-position
比分比值的:
原文:refer to size of background positioning area minus size of background image.
翻译:参照指定背景区域的尺寸减去背景图片的尺寸
这是什么意思呢?白话一点说:background-position
的百分比值参照的是设置背景的区域减去背景图的尺寸。
再出发
按照这个思路,我们将:
1 |
.part2 { |
换算一下将会得到:
1 |
.part2 { |
换算过程为:(设置背景的区域高度 - 背景图的高度) * -50%,即:(100 - 200) * -50% = 50px
这就解释了 Demo2
为什么会得到 图2
的效果。但这显然并不是我们想要的,我们预期的效果是图1
。
根据上述的公式,我们可以逆推预期效果的百分比值是多少:
1 |
-100 / (100 - 200) = 100% |
所以如果你要使用百分比,那么定义应该是这样的:
1 |
.part2 { |
其结果如 Demo3
正确使用 background-position 百分比
这会终于得到我们的预期效果了,请看 图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
作为背景图,来做一个演示。
1 |
.demo { |
这会终于得到我们的预期效果了,请看 图4
效果可以查看 Demo4
background-position 边界偏移。实际上,有了多值之后,我们可以让背景图在任意方位上偏移,你可能会发现,这甚至可以让你的结构写得更简单,嵌套变浅。
http://bonsaiden.github.io/JavaScript-Garden/zh/
转载css的background-position的更多相关文章
- 对CSS中的Position、Float属性的一些深入探讨
对CSS中的Position.Float属性的一些深入探讨 对于Position.Float我们在平时使用上可以说是使用频率非常高的两个CSS属性,对于这两个属性的使用上面可能大多数人存在一些模糊与不 ...
- Css中的Position属性
Css中的Position属性 Css属性在线查询地址: http://www.css88.com/book/css/properties/index.htm CSS 中的 position 属性 在 ...
- 对CSS中的Position属性的一些深入探讨
转:http://www.cnblogs.com/coffeedeveloper/p/3145790.html Position属性 Position的属性值共有四个static.relative.a ...
- 装载:对CSS中的Position、Float属性的一些深入探讨
对CSS中的Position.Float属性的一些深入探讨 对CSS中的Position.Float属性的一些深入探讨 对于Position.Float我们在平时使用上可以说是使用频率非常高的两个 ...
- CSS中background的用法
CSS中 background 是一个很基本的而且比较常用的样式 background : background-color || background-image || background-re ...
- css 迷惑的position
迷惑的position 小加发现实际开发中position使用频率很高,但很多人却对position不是很了解,导致开发中出现各种问题,现在让我门一起来看看这个迷惑的position吧~ static ...
- CSS背景background、background-position使用详解
背景(background)是css中一个重要的的部分,也是需要知道的css的基础知识之一.这篇文章将会涉及css背景(background)的基本用法,包括诸如 background-attachm ...
- CSS背景background详解,background-position详解
背景(background)是css中一个重要的的部分,也是需要知道的css的基础知识之一.这篇文章将会涉及css背景(background)的基本用法,包括诸如 background-attachm ...
- css中background背景属性概
css中background背景属性概 background:url(背景图片路径) no-repeat;/*不重复默认在左上方*/background:url(背景图片路径) no-repeat ...
- css 使用background背景实现border边框效果
css中,我们一般使用border给html元素设置边框,但也可以使用background背景来模拟css边框效果,本文章向大家介绍css 使用background背景实现border边框效果,需要的 ...
随机推荐
- Linux多线程与同步
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 典型的UNIX系统都支持一个进程创建多个线程(thread).在Linux进程基础 ...
- localhost访问错误Forbidden You don't have permission to access / on this server.解决办法(亲测)
在httpd.conf文件下找到这段: <Directory /> Options FollowSymLinks AllowOverride None Order deny,allow D ...
- linux编程中接收主函数返回值以及错误码提示
程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include < ...
- golang 管道
2.管道简介Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性.本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具 ...
- 绿色 或者 免安装 软件 PortableApps
Refer to http://portableapps.com/apps for detail. Below is just a list at Jan-01-2017 for quick show ...
- android 画虚线、实线,画圆角矩形,一半圆角
1.画虚线,实线: 建立dotted_line_gray.xml文件放在drawable文件夹下面. android:shape="line" 可以修改你想要的形状 <?xm ...
- windows字符串
CString在win32环境下最大的有效长度应该是INT_MAX-1 一般小于这个长度的文件,处理字符串都没问题. TCHAR字符串数组没有处理子串的相关函数,strchr(_tcschr)只是处理 ...
- java/Android 接口调用的几种写法
虽然Handler用的地方比较普遍,但是接口也有他的独特之处,比较直观,然后降低了耦合性 如有一接口,需要将数据传给使用的activity中,接口如下 public interface PushVal ...
- Oracle ORA-12154: TNS: 无法解析指定的连接标识符”错误
主要原因: 1.监听服务没有起起来.windows平台个一如下操作:开始---程序---管理工具---服务,打开服务面板,启动oraclehome92TNSlistener服务. 2.database ...
- MySQL学习记录--生成时间日期数据
时间数据格式组件: 组件 定义 范围 YYYY 年份,包括世纪 1000~9999 MM 月份 01(January)~12(December) DD 日 01~31 HH 小时 00~23 HHH ...