从知乎首页用户操作入口学习到的CSS技巧 - 合理利用伪元素实现一些装饰样式
最近在模仿做一个静态的PC版知乎,在模仿的过程中,从知乎工程师的方法中学到了不少知识,比如CSS方面的,以下介绍一个今天学到的伪元素的技巧。
示例

DOM结构为:
<div class="home-entry-box relative clearfix">
<span class="home-entry-box-arrow"></span>
<ul class="pull-left">
<li class="home-entry-item inline-block relative">
<a>
<i class="sprite-home-icon-question-off"></i>
<span>提问</span>
</a>
</li>
<li class="home-entry-item inline-block relative">
<a>
<i class="sprite-home-icon-answer-off"></i>
<span>回答</span>
</a>
</li>
<li class="home-entry-item inline-block relative">
<a>
<i class="sprite-home-icon-post-off"></i>
<span>写文章</span>
</a>
</li>
</ul>
<a class="pull-right"><span class="draft">草稿</span></a>
</div>
在这个示例中,标注了两处,第一处是一个装饰之类的东西,这个装饰让整个用户操作导航条好看了不少;第二处是项与项之间的分隔装饰。(为了命名方便,后文中第一处叫做对话修饰,第二处叫做分隔修饰)
实现
分隔修饰: 由于分隔修饰比对话修饰更简单一些,所以先说下分隔修饰的实现。一般情况下,我会想到用border-right去实现这个效果,但这有个问题,效果中这个修饰的高度既不是每一项的高度,也不是每一项的内容的高度,因此用border是不太好处理的,并且也不太方便定位的控制。在这里,可以使用伪元素,将每一项(li.home-entry-item)设置为position: relative,之后每一项加一个伪元素,决定定位来实现分隔修饰的效果,代码为:
.home-entry-item:after {
content: '';
position: absolute;
width: 1px;
height: 20px;
left: 0;
top: 50%;
margin-top: -10px;
background: #f0f0f0;
}
这样,既实现了高度的控制,又实现了定位的控制。
对话修饰: 这是一个直角三角形,刚开始看到的时候,我以为是一个图片做的小图标,后来审查了一下,发现是巧妙地利用了伪元素做出来的。学习了CSS的同学应该都接触过一个经典例子吧,就是画三角形,思路是将一个元素宽高都设置为0,之后控制三个方向的border为透明,再控制最后一个方向的border即可。另外还可以通过控制不同方向border的宽度来实现不同形状的三角形。
这里我们就可以利用伪元素来画这个三角形,不过仔细看的话,会发现示例中的三角形还是一个有边框的三角形,这也是我一开始以为是图片做的图标的原因。后来看了一下知乎的工程师的处理方式,发现自己CSS的使用和创造力还有很多要学习的地方。解决办法是:每个元素正好有两个伪元素,只要再利用一个伪元素画一个三角形,再把两个伪元素画的三角形叠加起来就可以了。其中一个三角形要比另一个小1px的宽高。
示例中的完成方案是通过伪元素画两个等边三角形,其中一个比另一个的border-width小1px,并且垂直距离多偏移1px,水平距离多偏移2px(这样才能让大的三角形包住小的三角形,形成类似边框的效果),之后设置span.home-entry-box-arrow为overflow: hidden; 截去三角形多余的部分,形成直角三角形,这样比直接画直角三角形更省事。代码如下:
.home-entry-box-arrow {
position: absolute;
top: 10px;
left: -10px;
width: 10px;
height: 10px;
overflow: hidden;
}
.home-entry-box-arrow:before,
.home-entry-box-arrow:after {
content: '';
position: absolute;
width: 0;
height: 0;
border: solid transparent;
}
.home-entry-box-arrow:before {
border-top-color: #f0f0f0;
border-width: 14px;
top: 0;
left: 0;
}
.home-entry-box-arrow:after {
border-top-color: #fafafa;
border-width: 13px;
top: 1px;
left: 2px;
}
总结
利用伪元素,可以实现很多装饰效果,善于利用可以写出更好的CSS以及免去不必要的表现型的HTML
从知乎首页用户操作入口学习到的CSS技巧 - 合理利用伪元素实现一些装饰样式的更多相关文章
- [转] 学习使用:before和:after伪元素
http://www.w3cplus.com/css3/learning-to-use-the-before-and-after-pseudo-elements-in-css.html 如果你一直密切 ...
- 【转】学习使用:before和:after伪元素
如果你一直密切关注着各种网页设计的博客,你可能已经注意到了:before和:after伪元素已经在前端开发中获得了相当多的关注.特别是在Nicolas Gallagher的博客中,后期运用了很多伪类元 ...
- 学习使用:before和:after伪元素
http://www.w3cplus.com/css3/learning-to-use-the-before-and-after-pseudo-elements-in-css.html
- 前端学习笔记之CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解
派生选择器用的很多,派生选择器具体包括为后代选择器.子元素选择器.相邻兄弟选择器,我们来理解一下他们之间的具体用法与区别. 1.css后代选择器语法:h1 em {color:red;} 表示的是从h ...
- 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表
第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...
- 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...
- HBase实践案例:知乎 AI 用户模型服务性能优化实践
用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...
- delphi操作xml学习笔记 之一 入门必读
Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...
随机推荐
- 如何在vs2015中编译并配置tesseract4.0
1)安装相关软件: 下载ccpan,把路径放到path(右击电脑,选择“属性”,选择左边的“高级系统设置”,选择“环境变量”,找到“系统变量”里面的“path”,点击“编辑”,选择右边的“新建”,输入 ...
- SpringCloud系列十:SpringCloudConfig 高级配置(密钥加密处理(JCE)、KeyStore 加密处理、SpringCloudConfig 高可用机制、SpringCloudBus 服务总线)
1.概念:SpringCloudConfig 高级配置 2.具体内容 在 SpringCloudConfig 之中考虑到所有配置文件都暴露在远程仓库之中的安全性问题,所以提供有安全访问的处理机制,这样 ...
- mybatis映射文件#与$的使用,及参数传入规则
mybaits映射文件中使用#与$场景: <select id="getProviders" resultType="com.lazy.bill.pojo.Prov ...
- CentOS更换镜像源
使用说明 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...
- Django请求生命周期
生命周期: 指浏览器访问开始,经过Django都发生了什么 ? 1 首先客服端发送http请求,把请求体(请求头和请求内容)生成 2 服务器接收请求后,根据路由映射表一个一个匹配.匹配成功后,后面不匹 ...
- nohup 写法
nohup 空格 php程序路径 空格 php脚本路径 >> .out日志路径 2>&1 &
- python之路:数据类型初识
python开发之路:数据类型初识 数据类型非常重要.不过我这么说吧,他不重要我还讲个屁? 好,既然有人对数据类型不了解,我就讲一讲吧.反正这东西不需要什么python代码. 数据类型我讲的很死板.. ...
- Java解法-两数相加(Add Two Numbers)
问题 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. ...
- std::remove_reference
[std::remove_reference] 用于移除类型的引用,返回原始类型. 1.可能的实现. 2.例子. #include <iostream> // std::cout #inc ...
- 关于处理java.lang.IllegalArgumentException at java.sql.Date.getHours异常
https://segmentfault.com/a/1190000016937108