css3提供了一大批内建光标(cursor)
其中某些光标很突出,由于只须要花费极少的代码,就能够迅速地提高大量网页应用的可用性。
好比禁用(not-allowed),好比,公共触摸屏中隐藏光标,能够直接使用cursor:none
搞定,而不须要额外的透明图片。css
将点击区域(热区)向外扩张能够提高可用性。css3
cursor: pointer; border: 20px solid transparent; /*使用透明边框增大热区面积,但box-shadow和outline并不能*/ background-clip: padding-box; /*阻止背景扩大到边框下面*/ box-shadow: 0 0 0 1px rgba(0,0,0,.5) inset; /*模拟原有边框*/
思路:使用与复选框绑定的label的伪元素模拟一个勾选框,能够自定义其样式,将原来的复选框隐藏。这种方式被称为“复选框hack”。函数
<input type="checkbox" id="awesome" disabled="true" checked="true"> <label for="awesome">Awesome</label> #awesome + label::before{ content: '\a0'; /*不换行空格*/ display: inline-block; vertical-align: .2em; width: .8em; height: .8em; margin-right: .2em; border-radius: .2em; background: silver; /*text-indent: .15em;*/ line-height: .65; }
添加选中的样式:spa
#awesome:checked + label::before{ content: '\2713'; /*不换行空格*/ background: yellowgreen; }
隐藏原来的复选框:指针
#awesome{ position: absolute; clip: rect(0,0,0,0); /*clip只应用在已定位的元素上*/ }
还能够添加聚焦的样式:code
#awesome:focus + label::before{ box-shadow: 0 0 .1em .1em #58a; }
禁用样式:事件
#awesome:disabled + label::before{ background: gray; box-shadow: none; color: #333; }
各类须要保持状态的UI组件,好比模态对话框、下拉菜单、标签页、跑马灯等,均可以使用上面的“复选框hack”的思路模拟,只不过开关式按钮不须要伪元素,直接把label设置为按钮的样式就能够了。图片
#switch{ position: absolute; clip: rect(0,0,0,0); } #switch + label { font-size: 1.5em; display: inline-block; padding: .3em .5em; background: #ccc; background-image: linear-gradient(#ddd, #bbb); border: 1px solid rgba(0,0,0,.2); border-radius: .2em; box-shadow: 0 1px white inset; text-align: center; text-shadow: 0 1px 1px white; } #switch:checked + label{ box-shadow: .05em .1em .2em rgba(0,0,0, .6) inset; border-color: rgba(0,0,0,.3); background: #bbb; }
增长一层半透明遮罩把后面的一切总体调暗,来凸显某个特定的UI元素。ip
方案一:
增长一个额外的HTML元素用于遮挡背景:get
.overlay{ position:fixed; top: 0; bottom: 0; right: 0; left:0; background: rgba(0,0,0,.8); } .lightbox{ position: absolute; z-index: 1; }
这个方法稳定可靠,但须要增长一个额外的元素。
方案二:
使用伪元素。
body.dimmed::before{ position:fixed; top: 0; bottom: 0; right: 0; left:0; background: rgba(0,0,0,.8); }
这个方法移植性很差,<body>的伪元素可能被其余须要占用了。
或者,能够把遮罩交给要凸显的元素的伪元素来实现,伪元素设置z-index:-1;
。
可是,这样不能保证遮罩出如今这个元素后面,仍是这个元素的父元素或祖先元素后面。
另外,伪元素没法绑定独立的JavaScript事件处理函数。
方案三:
使用box-shadow
模拟遮罩。
box-shadow: 0 0 0 50vmax rgba(0,0,0,.8);
这里的扩张半径用了vmax
这个单位。首先,一个固定值没法知足不一样屏幕大小的状况。而后只能用视口单位来解决。1vmax至关于1vw和1vh二者中的较大值。100vw等于整个视口的宽度,100vh至关于视口的高度。
这个方案有两个严重的问题:
遮罩层的尺寸和视口有关,当咱们滚动页面时,遮罩层就露出来了,除非给它加上position:absolute;
。因此要么页面不须要滚动,要么加固定定位。
box-shadow不能捕获指针事件,并且也不能阻止鼠标和其余组件交互,只能在视觉上引导注意力。
方案四:
使用<dialog>
元素及其::backdrop
伪元素
dialog::backdrop{ background: rgba(0,0,0,.8); }
可是目前这个元素支持度不高。。
为了达到“景深效果”,也就是当咱们的实现聚焦在较近的物体上时,远处的背景就是虚的,咱们能够用以前的毛玻璃效果,可是要模糊掉除了凸显元素以外的其余全部元素,不能将虚化滤镜放在<body>元素上,由于,这样,要凸显的元素也被模糊掉了。这时,咱们须要一个<mian>元素包裹住页面上除了弹出框以外的全部内容元素。当弹出一个对话框时,就给这个元素加一个类,来应用模糊滤镜。
main{ transition: filter 1s; } main.de-emphasized{ filter: blur(5px) contrast(.8) brightness(.8); } dialog{ box-shadow: 0 0 0 50vmax rgba(0,0,0, .2);/*回退方案*/ }
要实现滚动元素时,容器上下有淡淡的阴影提示,如:
ul{ overflow: auto; width: 10em; height: 8em; padding: .3em .5em; border: 1px solid silver; margin-right: -15px; background: linear-gradient(white 30%, rgba(255,255,255,0)), /*上面遮罩层*/ radial-gradient(at top, rgba(0,0,0, .3), transparent 70%),/*上面阴影层*/ linear-gradient(rgba(255,255,255,0) 30%, white),/*下面遮罩层*/ radial-gradient(at bottom, rgba(0,0,0, .3), transparent 70%);/*下面阴影层*/ background-attachment: local, scroll, local, scroll; /*遮罩层设为local,阴影层默认值*/ background-size: 100% 50px, 100% 15px,100% 50px, 100% 15px; background-repeat: no-repeat; background-position: top, top, bottom, bottom; }
background-attachment的一个新属性local,会随内容滚动,当滑到最顶端时,上面的遮罩层遮住阴影层,滑到最底端时,下面的遮罩层遮住阴影层;在中间时,两个阴影层不会被遮住。