css中那些令人迷惑的东西

CSS很简单也很常用,但是经常有一些相似的属性让人傻傻分不清楚,今天列举一下自己经常分不清楚的一些属性。(使用简单的例子对他们进行区分说明)

  • 关于nth-child与nth-of-type。
    例子:
//html 部分
<div>
    <h4>我是H4</h4>
    <p>我是第一个段落</p>
    <p>我是第二个段落</p>
</div>

//css部分
p:nth-child(2) {
    color: red;
}

p:nth-of-type(2) {
    color: greenyellow;
}

结果:
结果

通过结果我们可以知道,它们是有区别的。区别如下:
p:nth-child(2)的条件是:父元素的第二个子元素且该元素是p元素。如果第二个子元素不是p元素,则样式无效。
p:nth-of-type(2)的条件是:父元素下的第二个p元素。

  • 关于不透明度
    我们使用opacity来设置元素的不透明度,0表示完全透明,1表示完全不透明。对于IE8及其以下的浏览器来说,我们需要使用滤镜来实现透明的效果。
    代码如下:
  opacity: 0.5;     //值为0-1之间
  filter:Alpha(opacity=50);  //值为0-100之间
  • 关于渐变
    渐变主要分为线性渐变和径向渐变。
    1. 线性渐变
      语法:linear-gradient(direction, color-stop1, color-stop2, ...);
      direction:表示渐变方向,可以为top,left,right,bottom关键字或者一个角度。
      color-stop:表示渐变的颜色和位置,值可以是颜色值或者带着位置的颜色值,如red 10%
      示例:
    /*从左到右的渐变*/
    background: -webkit-linear-gradient(left, red , blue); 
    background: -o-linear-gradient(left, red, blue); 
    background: -moz-linear-gradient(left, red, blue);
    background: linear-gradient(to right, red , blue); 
    /*从左到右的渐变, 部分浏览器90deg将创建一个从下到上的渐变*/
    background: -webkit-linear-gradient(90deg, red , blue); 
    background: -o-linear-gradient(90deg, red, blue); 
    background: -moz-linear-gradient(90deg, red, blue);
    background: linear-gradient(90deg, red , blue); 
    
    1. 径向渐变
      语法:background: radial-gradient(position, shape size, color-stop1, color-stop2, ...);
      position:表示径向渐变的中心位置,可以为top,left,right,bottom,center关键字或者百分比;
      shape:表示渐变的形状, circle 表示圆形,ellipse 表示椭圆形;
      size:表示渐变的大小, closest-side:最近边; farthest-side:最远边; closest-corner:最近角; farthest-corner:最远角;
      color-stop:表示渐变的颜色和位置;
      示例:
    background: -webkit-radial-gradient(circle, red, yellow, green); 
    background: -o-radial-gradient(circle, red, yellow, green); 
    background: -moz-radial-gradient(circle, red, yellow, green); 
    background: radial-gradient(circle, red, yellow, green); 
    
太阳

可以利用渐变做出很多炫酷的效果,大家多多实践啦。

  • 搞不清楚的文本属性
    • letter-spacing: 设置字符间距。
    • word-spacing:设置单词间距。
    • white-space:规定如何处理元素中的空白。
    • word-break: 规定非中日韩文本的换行规则。
    • word-wrap:允许对长的不可分割的单词进行分割并换行到下一行。
  • 单行文本溢出省略
    .text-overflow {
          width: 200px;
          overflow: hidden;
          text-overflow: ellipsis;
          white-space: nowrap;
      }
    
  • 多行文本溢出
    1. 利用webkit-line-clamp属性(控制块出现的文本行数),适用于WebKit浏览器及移动端
      p {
          display: -webkit-box;
          -webkit-box-orient: vertical;
          -webkit-line-clamp: 3;    //第几行出现省略号
          overflow: hidden;
          width: 100px;
      }
    
    1. 使用js插件来实现。
  • 清除浮动
    为什么要清除浮动,因为浮动会造成浮动元素的父元素高度塌陷。
    1. 为浮动元素的父元素添加高度。
    2. 为浮动元素的父元素添加over-flow:hidden||auto
    3. 为浮动元素的父元素添加display: flex
    4. 为浮动元素的父元素添加伪类(最常用)
    5. 添加空标签进行清除
       .clearfloat::after {
           content: '';
           clear: both;
           display: block;
           height: 0;
       }
    
  • margin
    margin代表元素的外边距,接受任何长度单位、百分数值甚至负值。
    当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。只有普通文档流中块框的垂直外边距才会发生外边距合并。
  • 多列等高
    • 第一种方法:flex布局
      .container {
          display: flex;
      }
      .item {
          padding: 5px;
          margin: 0 5px;
          float: left;
          width: 100px;
          border: 1px solid #666
      }
    
      <div class="container">
          <div class="item">我是第一个</div>
          <div class="item">我是第二个,我比第一个高很多,我很帅,我有车有房</div>
      </div>
    
    • 第二种方法:padding补值法
     * {
         margin: 0;
         padding: 0;
     }
    
     .container {
         overflow: hidden;
         position: relative;
     }
    
     .item {
         padding: 5px;
         margin: 0 5px;
         float: left;
         width: 100px;
         border: 1px solid #666;
         padding-bottom: 1000px;
         margin-bottom: -1000px;
     }
    
     .item-border {
         position: absolute;
         bottom: 0;
         height: 1px;
         width: 112px;
         background: #666;
     }
    
     .item-border1 {
         left: 5px;
     }
    
     .item-border2 {
         left: 127px;
     }
    
     <div class="container">
         <div class="item">我是第一个</div>
         <div class="item-border item-border1"></div>
         <div class="item">我是第二个,我比第一个高很多,我很帅,我有车有房</div>
         <div class="item-border item-border2"></div>
     </div>
    

给等高元素设置巨大的padding-bottom和负的margin-bottom,然后父元素设置overflow: hidden;就可以实现等高。缺点是底部边框会消失不见,我们需要使用背景图片或空的标签以绝对定位的形式模拟底部边框。


效果
  • 禁用鼠标事件
    .disabled {
        pointer-events: none;
    }
  • calc() 的使用
    calc()用于动态计算长度值,使用标准的数学运算优先级规则,支持 "+", "-", "*", "/" 运算。可以混合使用百分比、em、px、rem等单位进行计算
    注意:运算符前后都需要保留一个空格。 如:calc(100% - 10px)
  • 百分比的参照
    • 参照父元素宽度的属性:width,padding,margin,left,right
    • 参照父元素高度的属性:height,top,bottom
  • css相对单位
    • em与rem
      html {
          font-size: 12px;
      }
      .parent {
          font-size: 1.2em;   //1.2*12=14.4px
          font-size: 1.2rem;   //1.2*12=14.4px
      }
      .child {
          font-size: 1.5em;    //14.4*1.5=21.6px
          font-size: 1.5rem;    //12*1.5=18px
      }
      <div class="parent">
          <span>parent</span>
          <div class="child">
              child
          </div>
      </div>
    
    通过上述例子我们可以看到em与rem的区别。1em 等于当前的字体尺寸,1rem等于根元素的字体尺寸。
    • vw与vh
      vw等于viewport宽度的1/100,vh等于viewport高度的1/100。
  • 等比例缩放的盒子
    思路:将元素的 height 设成 0,使得元素的高度等于 padding-bottom;合理设置 padding-bottom 的值,使之与宽度成一定比例。
      * {
          margin: 0;
          padding: 0;
          box-sizing: border-box;
      }
    
      ul {
          width: 40%;
      }
    
      li {
          float: left;
          width: 25%;
          height: 0;
          padding-bottom: 50%;
          border: 1px solid red;
      }
    
      <ul>
          <li>1</li>
          <li>2</li>
          <li>3</li>
          <li>4</li>
      </ul>
    
    上述例子会在窗口大小改变时,li元素始终保持高/宽=2的比例进行扩大与缩小。
  • src与href的区别
    • src是指向外部资源的位置,会将其指向的资源下载并应用到文档内。
    • href是指向网络资源所在位置,建立网络资源和当前元素或当前文档之间的链接,用于超链接。
  • box-sizing
    设置CSS盒模型为标准模型或IE模型,可以为三个值之一:
    • content-box,默认值,只计算内容的宽度,border和padding不计算入width之内。
    • padding-box,padding计算入宽度内。
    • border-box,border和padding计算入宽度之内。
  • flex布局
    Flex 是 "弹性布局",任何一个元素都可以指定为 Flex 布局。
    • 基本概念
      采用 Flex 布局的元素,称为 Flex 容器,它的所有子元素自动成为容器成员,称为 Flex 项目。
      容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴顺时针旋转90度就是交叉轴。
    • Flex 容器属性(6个)
      1. justify-content属性,定义了项目在主轴上的对齐方式。
      2. align-items属性,定义项目在交叉轴上如何对齐。
      3. flex-direction属性,决定主轴的方向。
      4. flex-wrap属性,决定项目是否换行排列。
      5. flex-flow属性,是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
      6. align-content属性,定义了多行项目在交叉轴的对齐方式。
    • Flex 项目属性(6个)
      1. flex-grow属性,定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
      2. flex-shrink属性,定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
      3. flex-basis属性,定义了在分配多余空间之前,项目占据的主轴空间。它的默认值为auto,即项目的本来大小。
      4. flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
      5. order属性,定义项目的排列顺序。数值越小,排列越靠前,默认为0。
      6. align-self属性,定义项目在交叉轴上如何对齐。可覆盖align-items属性。
  • grid布局
    • 基本概念
      应用 display: grid的元素就是网格容器,网格容器的子元素就是网格项,构成网格结构的分界线就是网格线。
    • 网格容器属性
      grid-template-columns:用来定义网格的列;
      grid-template-rows:用来定义网格的行;
      grid-template-areas:定义网格模板,一个点号(.)代表一个空的网格单元;
      grid-template:用于定义 grid-template-rowsgrid-template-columnsgrid-template-areas缩写属性。
      grid-column-gap:指定列网格线的大小;
      grid-row-gap:指定行网格线的大小;
      grid-gapgrid-row-gapgrid-column-gap的缩写属性;
      justify-items:沿着行轴线对齐网格项内的内容;
      align-items:沿着列轴线对齐网格项内的内容;
    • 网格项属性
      grid-column-start:网格项目开始的列网格线;
      grid-column-end:网格项目结束的列网格线;
      grid-row-startgrid-row-end同上,是行网格线;
      grid-area:为网格项提供一个名称,以便可以 被使用网格容器 grid-template-areas属性创建的模板进行引用;
      justify-self:沿着行轴线对齐网格项内的内容;
      align-self:沿着列轴线对齐网格项内的内容;
  • 左列定宽,右列自适应
    1. float + margin
      <div id="left">左列定宽</div>
      <div id="right">右列自适应</div>
    
      #left {
          background-color: red;
          float: left;
          width: 100px;
          height: 500px;
      }
    
      #right {
          background-color: blue;
          height: 500px;
          margin-left: 100px;
      }
    
    1. float + overflow
      <div id="left">左列定宽</div>
      <div id="right">右列自适应</div>
    
      #left {
          background-color: red;
          float: left;
          width: 100px;
          height: 500px;
      }
    
      #right {
          background-color: blue;
          height: 500px;
          overflow: hidden;
      }
    
    1. flex
      <div id="parent">
          <div id="left">左列定宽</div>
          <div id="right">右列自适应</div>
      </div>
    
      #parent {
          height: 500px;
          display: flex;
      }
    
      #left {
          width: 100px;
          background-color: red;
      }
    
      #right {
          flex: 1;
          background-color: blue;
      }
    
    1. Grid
     <div id="parent">
         <div id="left">左列定宽</div>
         <div id="right">右列自适应</div>
     </div>
    
     #parent {
         display: grid;
         grid-template-columns: 100px auto;
     }
    
     #left {
         background-color: red;
     }
    
     #right {
         background-color: blue;
     }
    
    1. 绝对定位
      <div id="parent">
          <div id="left">左列定宽</div>
          <div id="right">右列自适应</div>
      </div>
    
      #parent {
          position: relative;
      }
    
      #left {
          position: absolute;
          top: 0;
          left: 0;
          background-color: red;
          width: 100px;
      }
    
      #right {
          position: absolute;
          top: 0;
          left: 100px;
          right: 0;
          background-color: blue;
      }
    
    1. table
      <div id="parent">
          <div id="left">左列定宽</div>
          <div id="right">右列自适应</div>
      </div>
    
      #parent {
          width: 100%;
          display: table;
      }
    
      #left {
          width: 100px;
          background-color: red;
      }
    
      #right {
          background-color: blue;
      }
    
      #left,
      #right {
          display: table-cell;
      }
    
  • 两侧定宽,中间自适应
    1. float + margin(推荐)
      <div id="left">左列定宽</div>
      <div id="right">右列定宽</div>
      <div id="center">中间自适应</div>
    
      #left {
          width: 100px;
          float: left;
          background: red
      }
    
      #center {
          margin-left: 100px;
          margin-right: 200px;
          background: blue
      }
    
      #right {
          width: 200px;
          float: right;
          background: greenyellow
      }
    
    1. 双飞翼布局
      <div id="parent">
          <div id="center">
              <div id="center_inbox">中间自适应</div>
          </div>
          <div id="left">左列定宽</div>
          <div id="right">右列定宽</div>
      </div>
    
      #left {
          float: left;
          width: 100px;
          margin-left: -100%;
          background-color: #f00;
      }
    
      #center {
          float: left;
          width: 100%;
          background-color: #eeff2b;
      }
    
      #center_inbox {
          margin: 0 200px 0 100px;
      }
    
      #right {
          float: left;
          width: 200px;
          margin-left: -200px;
          background-color: #0f0;
      }
    
    
    1. 圣杯布局
      <div id="parent">
          <div id="center">中间自适应</div>
          <div id="left">左列定宽</div>
          <div id="right">右列定宽</div>
      </div>
    
      #parent {
          padding: 0 200px 0 100px;
      }
    
      #left {
          margin-left: -100%;
          position: relative;
          left: -100px;
          float: left;
          width: 100px;
          background-color: #f00;
      }
    
      #center {
          float: left;
          width: 100%;
          background-color: #eeff2b;
      }
    
      #right {
          position: relative;
          left: 200px;
          width: 200px;
          margin-left: -200px;
          float: left;
          background-color: #0f0;
      }
    
    1. flex
      <div id="parent">
          <div id="left">左列定宽</div>
          <div id="center">中间自适应</div>
          <div id="right">右列定宽</div>
      </div>
    
      #parent {
          display: flex;
      }
    
      #left {
          width: 100px;
          background-color: red;
      }
    
      #center {
          flex: 1;
          background-color: blue;
      }
    
      #right {
          width: 200px;
          background-color: greenyellow;
      }
    
    1. grid
      <div id="parent">
          <div id="left">左列定宽</div>
          <div id="center">中间自适应</div>
          <div id="right">右列定宽</div>
      </div>
    
      #parent {
          height: 500px;
          display: grid;
          grid-template-columns: 100px auto 200px;
      }
    
      #left {
          background-color: red;
      }
    
      #center {
          background-color: blue;
      }
    
      #right {
          background-color: greenyellow;
      }
    
    1. 绝对定位
      <div id="parent">
          <div id="left">左列定宽</div>
          <div id="center">中间自适应</div>
          <div id="right">右列定宽</div>
      </div>
    
      #parent {
          position: relative;
      }
    
      #left {
          position: absolute;
          top: 0;
          left: 0;
          width: 100px;
    
          background-color: red;
      }
    
      #center {
          margin-left: 100px;
          margin-right: 200px;
          background-color: blue;
      }
    
      #right {
          position: absolute;
          top: 0;
          right: 0;
          width: 200px;
          background-color: greenyellow;
      }
    
    1. table
      <div id="parent">
          <div id="left">左列定宽</div>
          <div id="center">中间自适应</div>
          <div id="right">右列定宽</div>
      </div>
    
      #parent {
          width: 100%;
          display: table;
      }
    
      #left {
          display: table-cell;
          width: 100px;
          background-color: #f00;
      }
    
      #center {
          display: table-cell;
          background-color: #eeff2b;
      }
    
      #right {
          display: table-cell;
          width: 200px;
          background-color: #0f0;
      }
    
    
  • css3新特性
    动画,过渡,变形,多列,媒体查询等。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容