当前位置: 首页 > Web前端 > HTML

纯css实现手机通讯录

时间:2023-04-03 01:06:27 HTML

我们经常在手机上看到通讯录列表。这种布局通常有两个显着的效果。两个列表

A
a1
a2
B
b1
b2
...
AB
然后添加一些样式html,body{margin:0;高度:100%;填充:0;}dl,dd{边距:0;}.con{位置:相对;高度:100%;overflow-x:hidden;}.index{position:absolute;右:0;顶部:0;底部:0;显示:弹性;弹性方向:列;证明内容:居中;}.indexa{显示:块;宽度:30px;高度:30px;文本对齐:居中;行高:30px;半径:50%;kgground:cornflowerblue;文字修饰:无;颜色:#fff;大纲:0;边距:5px;}.contacts{高度:100%;背景:#fff;溢出:自动;line-height:2em;}.contactsdt{背景:bisque;字体大小:1.5rem;颜色:矢车菊蓝;高度:2em;行高:2em;填充:010px;}.contactsdd{填充:010px;显示:块;游标:指针;}这样就可以看到布局了https://codepen.io/xboxyan/pe...实现天花板效果天花板效果其实很简单,只要在css中使用新属性position:sticky即可,你可以粘性定位元素(stickypositionedelement)是经过计算position属性为sticky的元素兼容性还不错,至少在移动端可以放心使用addposition:sticky.contactsdtto.contactsdt{/*添加如下属性*/position:sticky;top:0;}这个实现了对每个分类的吸顶效果https://codepen.io/xboxyan/pe...实现快速定位效果如果不用js,可以使用href锚点实现定位.具体做法是……
如果整个页面都是可滚动的,直接点a,那么页面就会快速跳转到id=A的元素现在为我们添加一些herf和id到页面A
a1
a2
B
b1
b2
...ABhttps://codepen.io/xboxyan/pe...点击右边的导航按钮,页面可以快速located等,貌似还是有些问题,跳回去的时候,却发现没有完全展开。比如回调A的时候,A标签虽然出来了,但是A下面的列表没有出来。问题是什么?经过多次研究,发现position:sticky负责!向上定位时,我我们使用href定位过去,定位的依据是到达元素第一次可见的位置。虽然此时元素被空气压缩了,但是后面的元素并没有显示出来,所以才会出现这样的问题。如果发现问题,则必须解决。问题快速定位效果修复其实我们要定位的可以是A下的第一个列表元素,但不能是这个元素,因为如果是第一代元素,跳转掩盖时会被上面的A标示所以我们在两者之间插入另一个标签进行定位如下,添加
A
a1
a2
B
b1
b2
...如果直接放在这里,肯定会占用空间,所以我们将其移位up,然后将其设置为不可见,使元素正好覆盖原始标签的位置,如下所示。联系人.stikcy-fix{位置:静态;可见性:隐藏;margin-top:-2em;}https://codepen.io/xboxyan/pe...现在看看,是不是完美跳转了?其他细节通常我们选择右边的索引时,页面中间会出现一个大写字母。这个用css实现起来比较简单。使用伪元素的content:attr()就足够了。在上一篇文章(使用纯css实现星星效果)中也提到了具体实现如下。索引a:active:after{content:attr(data-type);位置:固定;左:50%;顶部:50%;宽度:100px;高度:100px;边界半径:5px;文本对齐:居中;行高:100px;字体大小:50px;吃了(-50%,-50%);background:rgba(0,0,0,.5);}content:attr(data-type)这里用到了,所以AB其次,在实际项目中,我们需要使用js来生成这些列表。假设我们需要的数据如下vardata=[{'type':'A','user':[{name:'a1'},{name:'a2'},{name:'a3'},{name:'a1'},{name:'a2'},{name:'a3'},{name:'a3'},{name:'a1'},{name:'a2'},{name:'a3'},]},{'type':'B','user':[{name:'b1'},{name:'b2'},{name:'b3'},{name:'b1'},{name:'b2'},{name:'b3'},{name:'b3'},{name:'b1'},{name:'b2'},{name:'b3'},]},{'type':'C','user':[{name:'c1'},{name:'c2'},{name:'c3'},{name:'c1'},{name:'c2'},{name:'c3'},{name:'c3'},{name:'c1'},{name:'c2'},{name:'c3'},]},{'type':'D','user':[{name:'d1'},{name:'d2'},{name:'d3'},{名称:'d1'},{名称:'d2'},{名称:'d3'},{name:'d3'},{name:'d1'},{name:'d2'},{name:'d3'},]},{'type':'E','user':[{name:'e1'},{name:'e2'},{name:'e3'},{name:'e1'},{name:'e2'},{name:'e3'},{名称:'e3'},{名称:'e1'},{名称:'e2'},{名称:'e3'},]}]这种格式的数据可以由后端返回,也可以由前端直接修改然后循环遍历数据varindexes=document.getElementById('index');varcontacts=document.getElementById('contacts');varindex_html='';varcontacts_html='';data.forEach(el=>{contacts_html+='
'+el.type+'
';index_html+=''+el.type+'';el.user.forEach(d=>{contacts_html+='
'+d.name+'
';})contacts_html+='
'})索引。innerHTML=index_html;contacts.innerHTML=contacts_html;https://codepen.io/xboxyan/pe...这部分js只是生成布局,没有任何功能逻辑。虽然可以通过锚点快速定位到列表,但是这时候浏览器的地址栏会加一个#A这样的符号,不太好看,二是使用浏览器默认的return时,它会经过所有这些标志,这很不方便。还有一个问题,滚动列表时,右侧索引的当前类别无法高亮显示,右侧索引不支持滑动快速定位。这些细节只能通过js来修复。不过如果是简单的小项目,没有那么多要求,纯css还是可以很好应用的,性能绝对比通过js监控滚动要强很多倍,而且很容易参考,只要数据生成,可以直接使用^^