专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  北京大学出的第二份 DeepSeek ... ·  昨天  
OSC开源社区  ·  RAG市场的2024:随需而变,从狂热到理性 ·  2 天前  
程序猿  ·  41岁DeepMind天才科学家去世:长期受 ... ·  2 天前  
程序员小灰  ·  清华大学《DeepSeek学习手册》(全5册) ·  3 天前  
OSC开源社区  ·  宇树王兴兴早年创业分享引围观 ·  5 天前  
51好读  ›  专栏  ›  SegmentFault思否

你不知道的 CSS

SegmentFault思否  · 公众号  · 程序员  · 2017-09-25 08:00

正文

本文首发于我的博客:https://smohan.net/blog/6gr77h

CSS的世界是神奇的。

随着各浏览器WEB标准的日趋统一,CSS在WEB世界中扮演的角色也愈发的重要。甚至于在GitHub上出现了You-Dont-Need-JavaScript这样Star近万的优秀开源项目,抛开该项目的实用性不说,项目中的众多的DEMO就已经证明了CSS的强大。

当然,这篇文章不是为了介绍这个项目,而是整理了一些实用的CSS技巧,来解决我们在实际项目开发中遇到的的问题。文章也会长期更新,总结更多的技巧。每个技巧将结合demo或者图示来说明(如果demo无法打开,请自备梯子,原因你懂得🙀)。也许你此刻正在发愁的一个bug可以在这里找到答案😆。

~ / + 兄弟选择器来美化表单元素

css(3)中选择器众多,具体可参考CSS 选择器参考手册。不知什么原因,在很多项目中,实现诸如单选,复选等(类似)功能(包括如图标签选择器)时,为了美化其样式,往往使用JS去实现,实际上,利用 label 标签和css的兄弟选择器完全可以实现类似效果。其兼容性也并不差,至少兼容 IE8 及其以上浏览器了。

选择器解释

  1. ~ 选择器:查找某一个元素的后面的所有兄弟元素

  2. + 选择器:查找某一个元素的后面紧邻的兄弟元素

实现类某东标签选择器效果

查看demo

  1. .tags-select {

  2.  font-size: 0;

  3.  >.tag-select {

  4.    display: inline-block;

  5.    font-size: 14px;

  6.    margin: 5px;

  7.    position: relative;

  8.    font-weight: normal;

  9.    .name {

  10.      display: block;

  11.      line-height: 20px;

  12.      padding: 8px 10px;

  13.      border: 1px solid #ccc;

  14.      cursor: pointer;

  15.    }

  16.    //设置radio不可见

  17.    input[type="radio"] {

  18.      position: absolute;

  19.      opacity: 0;

  20.      z-index: -1;

  21.      //选中

  22.      &:checked+.name {

  23.        border-color: #e3393c;

  24.      }

  25.      //禁用

  26.      &:disabled+.name {

  27.        background: #eee;

  28.        color: #999;

  29.        cursor: not-allowed;

  30.      }

  31.    }

  32.  }

  33. }

  1.   type="radio" name= "bye-type" value="1">

  2.   class="name">官方标配  

  3.   type="radio" name="bye-type" value="2" checked>

  4.   class="name">移动优惠购  

  5.   type="radio" name="bye-type" value="3" disabled>

  6.   class="name">联通优惠购  


利用 label 和选择器实现form元素的美化,展开来就可以写一篇博客了,因此,实现 input[type="radio"] , input[type="checkbox"] 的美化以及switch开关控件,就不贴代码了,具体代码见我的项目 mo-css

switch开关

查看demo

radio美化

查看demo

checkbox美化

查看demo

font-size:0 来清除间距

inline-block 的元素之间会受空白区域的影响,也就是元素之间差不多会有一个字符的间隙。如果在同一行内有4个25%相同宽度的元素,会导致最后一个元素掉下来(如图)。你可以利用元素浮动 float ,或者压缩html,清除元素间的空格来解决。但最简单有效的方法还是设置父元素的 font-size 属性为 0

  1. *{

  2.  box-sizing: border-box;

  3. }

  4. .items {

  5.  font-size: 0;

  6.  > .item {

  7.    display: inline-block;

  8.    width: 25%;

  9.    height: 50px;

  10.    border: 1px solid #ccc;

  11.    text-align: center;

  12.    line-height: 50px;

  13.    background-color: #eee;

  14.    font-size: 16px; //不要忘了给子元素设置字号

  15.  }

  16. }

  1. class="items">
  2.  

    class="item">1

  3.  

    class="item">2

  4.  

    class="item">3

  5.  

    class="item">4

overflow 來清除浮动

除了著名的 clearfix 清除浮动类,利用 overflow 属性也可以清除浮动。 overflow 除了定义溢出元素内容区的内容会如何处理外,还可以做一些有用的事,如:

  • 创建块格式化上下文

  • 清除浮动

假如你的案例中没有对溢出的操作(如下拉菜单),推荐使用 overflow:hidden 来清除浮动。

  1. .clearfix {

  2.   overflow: hidden;

  3. }

  1. class="clearfix">
  2.  

    class="left">left

  3.  

    class="right">right

  4.  

border 来绘制三角形

原理

为了更清晰的展示 border ,将盒子的四边设为不同的颜色。

  1. .border-arrow {

  2.  width: 256px;

  3.  height: 256px;

  4.  border: 48px solid ;

  5.  border-top-color: red;

  6.  border-right-color : blue;

  7.  border-bottom-color: green;

  8.  border-left-color: orange;

  9. }

可以看到是每个边并不是矩形,而是呈现为等腰梯形(脑洞开一下,同样我们可以使用该方法绘制梯形),这时候,如果将盒子的宽度和高度设为0,盒子将展现为如下由四个三角形组成的矩形形式:

  1. .border-arrow {

  2.  width: 0;

  3.  height: 0;

  4.  border-width: 96px;

  5. }


现在,思路已经很清晰了,只需要将其他三个边的颜色设为透明 ( transparent 或者 rgba(0,0,0,0) ) ,就会只保留一个三角形了。

  1. .border-arrow {

  2. width: 0;

  3. height: 0;

  4. border: 72px solid ;

  5. border-color : transparent transparent transparent orange ;

  6. }


延伸来绘制一个梯形

就着上面的思路,我们保留盒子宽高值,而是将其他三个边设为透明,则盒子会呈现为一个梯形:

  1. .border-arrow {

  2.  width: 256px;

  3.  height: 256px;

  4.  border: 64px solid ;

  5.  border-color : red transparent transparent transparent ;







请到「今天看啥」查看全文