你不知道的事儿一(CSS)

CSS的世界是神奇的。
随着各浏览器WEB标准的日趋统一,CSS在WEB世界中扮演的角色也愈发的重要。甚至于在GitHub上出现了You-Dont-Need-JavaScript这样Star近万的优秀开源项目,抛开该项目的实用性不说,项目中的众多的DEMO就已经证明了CSS的强大。
当然,这篇文章不是为了介绍这个项目,而是整理了一些实用的CSS技巧,来解决我们在实际项目开发中遇到的的问题。文章也会长期更新,总结更多的技巧。每个技巧将结合demo或者图示来说明(如果demo无法打开,请自备梯子,原因你懂得)。也许你此刻正在发愁的一个bug可以在这里找到答案。

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

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

某东标签选择器

选择器解释

  • ~选择器:查找某一个元素的后面的所有兄弟元素
  • +选择器:查找某一个元素的后面紧邻的兄弟元素

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

Run demo

查看demo

.tags-select {
  font-size: 0;
  >.tag-select {
    display: inline-block;
    font-size: 14px;
    margin: 5px;
    position: relative;
    font-weight: normal;
    .name {
      display: block;
      line-height: 20px;
      padding: 8px 10px;
      border: 1px solid #ccc;
      cursor: pointer;
    }
    //设置radio不可见
    input[type="radio"] {
      position: absolute;
      opacity: 0;
      z-index: -1;
      //选中
      &:checked+.name {
        border-color: #e3393c;
      }
      //禁用
      &:disabled+.name {
        background: #eee;
        color: #999;
        cursor: not-allowed;
      }
    }
  }
}
<label class="tag-select">
  <input type="radio" name="bye-type" value="1">
  <span class="name">官方标配</span>
</label>
<label class="tag-select">
  <input type="radio" name="bye-type" value="2" checked>
  <span class="name">移动优惠购</span>
</label>
<label class="tag-select">
  <input type="radio" name="bye-type" value="3" disabled>
  <span class="name">联通优惠购</span>
</label>

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

switch开关

查看demo

css实现switch

radio美化

查看demo

css美化radio

checkbox美化

查看demo

css美化checkbox

FONT-SIZE:0来清除间距

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

font-size:0消除空白间隙

*{
  box-sizing: border-box;
}
.items {
  font-size: 0;
  > .item {
    display: inline-block;
    width: 25%;
    height: 50px;
    border: 1px solid #ccc;
    text-align: center;
    line-height: 50px;
    background-color: #eee;
    font-size: 16px; //不要忘了给子元素设置字号
  }
}
<div class="items">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
</div>

用 OVERFLOW 來清除浮动

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

  • 创建块格式化上下文
  • 清除浮动

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

.clearfix {
   overflow: hidden;
}
<div class="clearfix">
  <div class="left">left</div>
  <div class="right">right</div>
</div>

BORDER来绘制三角形

原理

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

.border-arrow {
  width: 256px;
  height: 256px;
  border: 48px solid ;
  border-top-color: red;
  border-right-color : blue;
  border-bottom-color: green;
  border-left-color: orange;
}

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

.border-arrow {
  width: 0;
  height: 0;
  border-width: 96px;
}

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

.border-arrow {
 width: 0;
 height: 0;
 border: 72px solid ;
 border-color : transparent transparent transparent orange ;
}

css实现三角形

延伸来绘制一个梯形

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

.border-arrow {
  width: 256px;
  height: 256px;
  border: 64px solid ;
  border-color : red transparent transparent transparent ;
}

border绘制梯形

用垂直方向的PADDING来实现等比缩放的盒子

固定图片百分比是一个针对响应式布局很有效的方案,尤其是在移动端,可以说是一个刚性需求。简单来说,就是根据容器的宽度,按照宽高比例自动计算出容器的大小,并且让容器内的如img等子元素自适应宽高。

需求

移动端的商品列表展示,每行显示两个商品,使用懒加载技术来加载商品的缩略图,需求规定了商品必须有序整齐的排列,并且加载时要使用默认图片来占位缩略图,在加载过程中,页面的高度不能有抖动。当然,缩略图是大小是UI固定了比例的,假设比例是4:3;此时,你可能的做法是给图片容器固定高度(图片可能会变形),或者使用JS,利用屏幕的宽度和图片比例计算出图片的高度(要用到JS,要考虑屏幕旋转后宽度的变化)。

解决方案

不妨考虑考虑如下方案,本博客实验室列表页使用了该方案。

图片父容器宽度100%,父容器的高度百分比为:100*3 / 4 = 75% ; 图片absolute并且完全铺满父容器。

.image-aspect-ratio {
  width: 100%;
  position: relative;
  padding-top: 75%;
   > img {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
  }
}
 <figure class="image-aspect-ratio">
    <img src="http://via.placeholder.com/640x384">
 </figure>

OK,UI只需要做一张4:3的占位图,然后利用图片懒加载技术来在页面滚动过程中加载商品图片,加载过程中页面完全不会抖动,屏幕旋转后,图片高度也随之变化,没有使用JS,一切完美解决。

如下demo image-aspect-ratio ,可缩放浏览器查看自适应效果。

Run demo

POINTER-EVENT来禁用事件

pointer-event属性更像是一个JavaScript事件,利用该属性,可以做如下的事情:

  • 阻止任何点击动作的执行
  • 使链接显示为默认光标(cursor:default)
  • 阻止触发hoveractive状态
  • 阻止JavaScript点击事件的触发
//使用该类,任何点击事件将无效
.disabled { pointer-events: none; }

MAX-WIDTH来防止图片撑破容器

针对内容性的文案,图片大小都是未知的,为了防止图片过大而撑破容器,可以通过设置图片的max-width:100%来处理;

img {
  display:inline-block;
  max-width: 100%;
}

用伪类来显示打印时A标签的链接

@media print {
  a[href]:after {
    content: " (" attr(href) ") ";
  }
}

打印时显示链接地址

待补充条目

还有许多知识点待补充,受文章长度限制,以下或者更多内容将在新文章中补充。

  • counter来模拟/装饰有序清单
  • 未知高度容器的多种垂直居中方法

参考文档

同步分享

帮忙点个喜欢/收藏,支持下

时间: 2024-11-29 03:06:58

你不知道的事儿一(CSS)的相关文章

你不知道的事儿二(CSS)

在上文<你不知道的CSS(一)>中,介绍了兄弟选择器美化表单,font-size:0消除间隙,overflow清除浮动,border绘制三角形等7个实用技巧.由于文章长度限制,还遗留了一些技巧没有介绍,考虑到日后可能会有更多的技巧需要补充进来,便将上文改名为你不知道的CSS(一),名字其实有点浮夸,希望能完善为一个系列,也希望该系列中介绍的技巧能够帮助到更多人解决实际开发中遇到的问题.在这里感谢SegmentFault的小编在微博上的推荐.本文将重点介绍CSS中未知高度容器的垂直居中技巧.同样

宁财神揭秘武林那些事儿电影版或成绝唱(图)

姬无力本名为"昆汀・塔伦蒂诺" 宁财神解密武林那些事儿 大嘴和无双因为档期原因缺席最后一场 片中的"黑衣人"也是因买不起房才做 新浪娱乐讯 电影版<武林外传>上映十天以来好评如潮,票房轻松突破1亿,并全力冲击两亿大关.影院里的观众齐齐为闫妮痛骂房地产商叫好,编剧宁财神一边发着烧但仍然开心的在围脖欢呼:"耶,过亿啦!"对于"武林"台前幕后那些你不知道的事儿,宁财神通过这篇文章进行了360度全方位解密.他同时也感叹五年

盘点现象级应用三点要素

?也许你的朋友圈里还有几个人在发"足记"APP制作出来的电影截图,不过相信我,很快就没有了.而且,即使还在用"足记"的人,目前看来也是一群有点后知后觉的用户而已.如果你还不知道"足记"是什么,很快你就会没有机会知道它.还有很多钟爱过它两三天的用户也会忘记,这是一款可以把用户自己的照片加上黑边和胶片滤镜,再配上一条中英文字幕,伪装成电影截图的软件. 当然,你错过的这些东西并没什么可惜的.互联网每天都在产生大量的信息,一天产生的信息量,比人类几百万年

崔永元录制节目回本行,最想和柴静合作

<东方眼>是一档将于1月1日起在东方卫视周间日播的节目,30分钟时长分为热点短评.热点讨论.互动问答三个环节."愤青是什么意思我不知道,我是个比较坚持原则的人".如何将其与传统新闻节目做出区分,"坚持原则"的崔永元将其命名为"新闻解释"类栏目,"不用长篇大论,一切以观众能听懂为标准".此外他还想"较较真","过去有定式知道有些事情这么说就行了,我现在就是想用最愚蠢的办法把一些事情搞明白

从苹果与央视之争 看网络隐私究竟如何界定

文/黄浩央视又跟苹果干上了,不过和上一次有所不同的是,这一次它并没有获得像上次 曝光售后问题后的清一色讨伐,因为舆论旗帜鲜明地形成了两大不同声音.许多的苹果手机 普通用户得知苹果可以在GPS未开启的情形下记录地址,并且依照报道按图索骥的找到了这些地址信息之后,表现出了异常的惊奇.质疑甚至还有愤怒--这种质疑和愤怒多数来自于为什么我不知道它在记录这些东西的知情权缺失感.而另一众果粉则是旗帜鲜明的力挺苹果,同时对于苹果不会拿这些记录另作它用表示了充分的信任.而苹果的反应速度也是远超上一次的315维修

Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)

上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中显示的主体内容才是页面,一个HTML容器中可以存放1个或者多个页面,每个页面放置于section中.而一个页面(section)中必有主体内容(content),也有可能包含头部内容.底部内容,甚至一些侧滑菜单等. 所以,以我们通常看到的一个移动应用的界面中包含了顶部Title和主体内容的页面代码如

精通css(6)-图像背景那些事儿

1.背景图像 先说一下background的用法. 通常使用简写形式:background:背景色 背景图 重复方式 定位方式  图像位置,比如background: #00FF00 url(bgimage.gif) no-repeat fixed top; background-position有center属性,可以让背景居中. 如果使用像素对背景定位,如background-position:20px 20px:位置是从父元素左上角到图像左上角算的.如果使用百分比,如background-

精通css(3)-优先级那些事儿

同一个元素可能会有多个样式,这些样式很可能会冲突,css通过层叠的过程来处理这种冲突,简单的说就是给每个规则分配一个重要度. 1.层叠 层叠重要度从高到低排列顺序: 1.标有!important的用户样式: 2.标有!important的作者样式: 3.作者样式: 4.用户样式: 5.浏览器/用户代理默认样式: 2.优先级的计算 一般而言,选择器越特殊,它的优先级越高.也就是选择器指向的越准确,它的优先级就越高.通常我们用1表示标签名选择器的优先级,用10表示类选择器的优先级,用100标示ID选

css中负Margin你不知道的秘密

现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在.个人认为负margin技术是学习css路上必不可缺少的课题之一,许多高级应用及疑难杂症修复都可以使用负margin技术进行实现. 负margin理论: 在说明什么是负margin之前,你得清楚margin是个啥么玩意,如果还不清楚可以先阅读本人的前一篇文章<不要告诉我你懂margin>,预补下知识,回头再读这篇文章,相信俩篇文章都能给你带来不少的收获. 为了形象.易懂的解释负margin,我们将引入W3C