深入理解CSS元素可见性visibility
前面的话
visibility属性常见于与display属性的比较中。但实际上,该属性有自己的一些有趣的用途。本文就visibility属性做详细整理和说明
定义
visibility
值: visible | hidden | collapse | inherit
初始值: visible
应用于: 所有元素
继承性: 有
属性
visible:元素可见
hidden:元素不可见,但元素还是会影响文档的布局
[注意]可以将一个hidden元素的后代元素置为visible,这会使该后代元素正常出现
collapse:在表格中<col>或<colgroup>中使用,表示该列或列组的所有单元格不显示。如果用于非表格元素,collapse与hidden含义相同
[注意]webkit内核浏览器不支持给<col>或<colgroup>元素使用collapse属性
display
visibility:hidden与display:none作为隐藏元素的两种方式,常常被人们拿来比较。其实区别很简单,前者不脱离文档流,保留隐藏之前元素占据的物理区域;而后者则脱离文档流,如果重新显示则需要页面的重新绘制。还有一点区别却很少人提到,如果父级设置display:none;子级设置display:block也不会显示;而如果父级设置visibility:hidden;子级设置visibility:visible时子级会显示出来
JS
当元素通过设置visibiliy:hidden之后,虽然还占据物理区域,但已经不可以接受js效果
//js效果:当鼠标移入元素时,父级的背景颜色变成黑色;移出时背景颜色恢复初始值
transition
其实visibility是离散步骤,在0到1数字范围之内,0表示隐藏,1表示显示。visibility:hidden可以看成visibility:0;visibility:visible可以看成visibility:1。于是,visibility应用transition等同于0~1之间的过渡效果。实际上,只要visibility的值大于0就是显示的。由于这个现象,我们可以利用transition实现元素的延时显示隐藏
#oShow{
visibility: visible;
transition: visibility 0.2s 0.5s;
}
#oShow:hover{
visibility: hidden;
}
visibility配合opacity和transtion可以实现真正的元素淡入淡出。如果只用opacity时,即使最后元素opacity变为0,但实现上该图片还是可以覆盖其他元素以及可以接受js效果。所以使用visibility可以实现元素真正的隐藏
#oShow{
visibility: visible;
opacity:;
transition: 1s;
}
#oShow:hover{
visibility: hidden;
opacity:;
}
API
当前浏览器大部分都是多tab页(多标签页)的模式,但这些页面性能却参差不齐。对于某些性能很差的页面,当用户从其他tab页切换回来时,有可能出现由于页面性能差出现页面错乱、页面卡死甚至浏览器卡死的情况
HTML5新增了页面可见性API。该API有两个属性,一个事件
[注意]IE9-和safari浏览器不支持。所以可以通过document.hidden !== 'undefined'来做浏览器的识别
document.hidden: 表示当前页面是否可见
当前tab页处于激活态时,document.hidden的属性值是false,否则是true
document.visibilityState: 返回当前页面的可见状态
hidden: 当浏览器最小化、切换tab、电脑锁屏时
visible: 用户正在查看当前页面时
prerender: 文档加载离屏或者不可见
unloaded: 当文档将要被unload时
[注意]prerender和undloaded不是所有浏览器都支持,用的也不多
visibilitychange事件: 当document.visibilityState状态变化时触发该事件
应用场景
[1]当页面属性是hidden时,停止页面中选项卡的定时器或页面中的动画等,减少内存占用
[2]当通过页面状态的切换,来控制音乐或视频的播放或停止
[3]...
DEMO
【1】页面为非激活页时,暂停页面中的动画;重新激活时,继续动画效果
.box{
width: 500px;
background-color: lightgreen;
border: 1px solid black;
}
@keyframes loop{
0%{
width: 100px;
}
100%{
width: 500px;
}
}
#div{
width: 100px;
height: 100px;
background-color: pink;
animation: loop 200s alternate infinite linear;
}
<div class="box">
<div id="div"></div>
</div>
function getCSS(obj,style){
if(window.getComputedStyle){
return getComputedStyle(obj)[style];
}
return obj.currentStyle[style];
};
var oTimer = setInterval(function(){
document.title=div.innerHTML = parseInt(getCSS(div,'width'));
},100);
document.addEventListener('visibilitychange',function(){
if(document.hidden){
div.style.animationPlayState = 'paused';
}else{
div.style.animationPlayState = 'running';
}
},false);
【2】页面切换来控制音乐的播放和暂停
<audio id="audio" src="http://7xpdkf.com1.z0.glb.clouddn.com/myocean.mp3" controls ></audio>
var mark;
document.addEventListener('visibilitychange',function(){
if(document.hidden){
//如果用户在切换页面前,自己点了暂停
if(audio.paused){
mark = false;
}else{
audio.pause();
mark = true;
}
}else{
//当暂停是因为页面切换造成的,则返回当前页面时,继续播放
if(mark){
audio.play();
}
}
},false);
深入理解CSS元素可见性visibility的更多相关文章
- CSS隐藏元素 display visibility opacity的区别
{ display: none; /* 不占据空间,无法点击 */ } { visibility: hidden; /* 占据空间,无法点击 */ } { position: absolute; ...
- CSS元素隐藏的display和visibility
一.CSS元素隐藏 在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击. { display: none; /* 不占据空间, ...
- 您可能不知道的CSS元素隐藏“失效”以其妙用
您可能不知道的CSS元素隐藏“失效”以其妙用 by zhangxinxu from http://www.zhangxinxu.com地址:http://www.zhangxinxu.com/word ...
- 您可能不知道的CSS元素隐藏“失效”以其妙用——张鑫旭
一.CSS元素隐藏 在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击.后宫选秀——一个一个看. { display: non ...
- CSS元素的显示与隐藏
CSS元素的显示与隐藏 我们访问某些网站的时候,经常可以看到一些广告弹出来,点击关闭就不见了,但是重新刷新页面后,广告又会重新弹出来.这就是元素的显示和隐藏的一个应用. 1. display属性 di ...
- 理解CSS
写在前面的话:对于web开发,html完成网页的structure,css完成网页的presentation,js完成网页的behavior,今天就来说一说css,通过理解一些css的基础概念,能够更 ...
- 深入理解css BFC 模型
如果要深入理解css布局的各种原理,要在重构页面做得心应手的话,那么你就必须先理解这玩意 "BFC" , BlockFormatting Context(块级格式化上下文): 这里 ...
- 深入理解CSS中的层叠上下文和层叠顺序(转)
by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=5115 零.世间的道 ...
- 深入理解css中的margin属性
深入理解css中的margin属性 之前我一直认为margin属性是一个非常简单的属性,但是最近做项目时遇到了一些问题,才发现margin属性还是有一些“坑”的,下面我会介绍margin的基本知识以及 ...
随机推荐
- LaTex随笔
最近简单接触了LaTex排版,留下一些笔记供日后参考. 1.基本格式 \documentclass{article}\title{……}\begin{document}\maketitle\secti ...
- 【ios面试总结】
一 C语言方法的知识 1: const static voilite 修辞变量各代表什么意思? const 修辞的变量为常量,常量是不容许修改. static 修辞的变量为静态变量,在内存中 ...
- 搜索栏css代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MySql如何编写高效的SQL
最近应团队要求,研究整理了下,mysql相关的优化,有些是根据实际java项目中碰到的情况经验之谈.欢迎讨论~ SQL 语言是一种强大而且灵活的语言,在使用 SQL 语言来执行某个关系查询的时候,用户 ...
- js操作Dom的一些方法简化
众所周知JQ的选择符很强大,一些看起来很难实现的功能只要在$符号中传入简单的字符串就可以获取到各种层级关系的DOM,而却不用考虑浏览器的兼容性.但有时候在做小项目的时候并不需要引入JQ,而又不想频繁繁 ...
- comet在asp.net中的实现
网上有关“服务器推送”的介绍非常多,其中一种实现方式就是采用comet技术,在浏览器与服务端之间建立一个http协议的“长连接”,所谓“长连接”,就是指浏览器到服务端的http请求不会马上得到服务端的 ...
- guava之Joiner 和 Splitter
最近在给客户准备一个Guava的分享,所以会陆续的更新关于Guava更多的细节分享.本文将记录Guava中得字符串处理Joiner(连接)和Splitter(分割)处理. Joiner 首先我们来看看 ...
- java提高篇(十二)-----代码块
在编程过程中我们可能会遇到如下这种形式的程序: public class Test { { //// } } 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起, ...
- Golang下的Log处理
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 后端系统中的Log是相当重要的,做过高并发服务的同学都会认同这一点.相对而言,调试已经用处不大了,对于这样的项目, ...
- js 倒计时实现
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...