8.1.12. border

本章知识:

  • 了解border-width属性;
  • 深入了解各种border-style类型;
  • border在某些背景定位需求下的妙用;
  • border与三角等图形构建;
  • border与透明边框;
  • 如何借助border使用有限标签完成我们的布局。

8.1.12.1. border-width 不支持百分比

为何不支持? 语义和使用场景决定的

拿手机和显示器边框来对比下,他们的内容边框,不会随着设备变大就按比例变大的。

所以不支持百分比单位;类似的还有outline,box-shadow,text-shadow...

白支持关键字:(ie7除外)

  • thin : 薄薄的 1px
  • medium :薄厚均匀 3px(默认值)
  • thick : 厚厚的 5px

为什么medium是默认值而不是常用的1px呢? 因为 border-style:double至少3px才有效果

8.1.12.2. 深入了解各种border-style类型

  • solid : 实线;很熟
  • dashed : 虚线;

    在ie和其他浏览器下兼容性有问题,边框宽高2:1和3:1

  • dotted : 点线,不熟但有故事

    在ie和其他浏览器下兼容性有问题,小圆和小方(点的形状) 在ie7和ie8下可以利用小圆点来实现实线的圆(利用overflow:hiden指显示其中一个角的圆)

  • double: 双线,非常不熟

    双线:两根线+中间间隔区域。他们的计算规则是:双线宽度永远相等,中间间隔正负1;

      1px:0+1+0
      2px:1+0+1
      3px:1+1+1
      4px:1+2+1
      5px:2+1+2
    

    这就能看出来了,至少是3px才能看到两条线; 兼容性非常好,可以利用它来绘制图形

           绘制图形
       <div class="item1">
         <div class="figure">
         </div>
       </div>
    
      .item1{
        .figure{
          width 120px
          height 20px
          border-bottom 20px solid
          border-top 60px double red
        }
      }
    

    利用了双线的计算规则,60px平均为分成3份,然后实现了等高一个图形

  • inset : 内凹,大眼瞪小眼(基本不使用)

  • outset :外凹,大眼瞪小眼
  • groove : 沟槽,大眼瞪小眼
  • ridge : 山脊,大眼瞪小眼

    后4个毫无价值,风格过时,各种浏览器间差异大,不兼容,

8.1.12.3. border-color与color

border-color默认颜色就是color

     <div class="item2">
       我的颜色是
     </div>
  .item2{
    border 10px solid
    color red
  }

不单独指定border的颜色,那么就使用color的 类似的还有box-shadow,text-shadow等

这个特性有啥用呢? 下面是利用border实现(仅1处)

    <div class="item3">
      <div class="add">
        +
      </div>
    </div>
  .item3 {
    .add {
      text-align center
      margin 0 auto
      width 60px
      font-size 60px
      border 1px solid
      color #ccc
      /*transition color 250ms*/  // 过度效果的话也很好加
      &:hover{
        color #06c
      }
    }
  }

8.1.12.4. border与background定位

background定位的局限:只能相对左上角,不能想对右下(css2.1)

    <div class="item4">
      <div class="box"></div>
    </div>
  .item4 {
    border 1px solid
    .box {
      height 260px
      background url('~@/assets/demo-java.jpg') no-repeat
      background-position 50px 40px // 水平位置50px,垂直位置40px
    }
  }

上面示例中,背景距离左边边缘50px,就算容器大小改变左边边缘都是5opx,但是距离右边缘..

那怎么办呢?方法很多,借助border

  .item4 {
    border 1px solid
    .box {
      border 50px solid transparent  // 添加50px的边框,颜色设置为透明色
      height 260px
      background url('~@/assets/demo-java.jpg') no-repeat
      background-position 100% 40px // 水平位置100%
    }
  }

这里利用边框宽度撑开box容器与父容器的间距为50px。颜色透明,且水平100%也就是紧贴着右侧。视觉上就是背景靠右且有间距;

只不过我觉得应用场景会很小。这个限制发挥

8.1.12.5. border与三角等图片构建

  • border-style:dotted : 实现ie7/8 圆角
  • double : 实现三道杠图标
  • solid : 三角和梯形

三角形

    <div class="item6">
      <span class="box"></span>
    </div>
  .item6 {
    .box {
      font-size 0px
      border-style solid
      border-width 12px 20px  // 上下12px,左右20px
      border-color grey red transparent transparent
    }
  }

这里是使用border的宽度,且把font-size设置为0,让这个span中没有内容,然后边框加上颜色组成上下左右的拼成的一个长方形或则正方形。这里只设置了上右的颜色,下和左边的颜色透明了,在视觉上就组成了一个右上的角标效果。这里故意设置成不同的颜色,方便看清除边框的组成,是对角线分开组成的。

这里三角形不是等边的,全靠边框宽度控制;原理如下图展示。中间空白区域就是元素的宽高

看了上面的图形之后,再来画梯形

    <div class="item7">
      <!--span是行内元素没法指定宽高-->
      <div class="box"></div>
    </div>
  .item7 {
    .box {
      font-size 0px
      width 30px
      border-style solid
      border-width 20px 20px
      border-color transparent transparent red transparent
    }
  }

其实就是把其他边框颜色都透明,指留下指定方向的一边就ok了。 突然脑洞开了一下,这样就可以做一个loading效果了,用js循环设置边框的背景色为有色的。

8.1.12.5.1. 实际应用场景

更高级的应用,模拟圆角 不是使用css3实现的,是用边框模拟的 代码如下:

    <div class="item8">
      <div class="box1"></div>
      <div class="info">
        border梯形组合而成
      </div>
      <div class="box2"></div>
    </div>
    <hr/>
.item8{
    text-align center
    .info{
      background-color red
      width 200px
      margin 0 auto
    }
    .box1 {
      width 196px
      margin 0 auto
      border-style solid
      border-width 2px 2px
      border-color transparent transparent red transparent
    }
    .box2 {
      width 196px
      margin 0 auto
      border-style solid
      border-width 2px 2px
      border-color red transparent transparent transparent
    }
  }

用处感觉不大,因为实现起来太麻烦了。要对齐三行元素。我感觉有点麻烦的样子

8.1.12.6. border与透明边框

border的边框透明度使用非常广。 因为,始于ie7,足够兼容 除了前面讲到过的案例,下面还有

这个例子测试过无效,不知道是不是 html代码没有写对,教程的评论区也有好多人说无效。

8.1.12.6.1. 增加可视渲染区域

    <div class="item10">
      <img src="~@/assets/logo.png">
    </div>
  .item10{
    img{
      width 50px
      height  50px
      filter drop-shadow(50px 0 #ff8040)
    }
  }

这个效果貌似也没有什么效果哇,图片中的细节全部没有了。只有一个轮廓。

原理上说可以使用css把原始原始图片使用overflow hidden隐藏掉,然后显示投影出来的,但是我写不出来啊。还说在谷歌浏览器中不可视的元素连投影也不能显示,那么利用边框透明增加可视区域,投影到透明边框上。

8.1.12.7. border在布局中的应用

如:有限标签下的标题栏;不常用

8.1.12.7.1. border与等高布局

    <div class="item11">
      <nav class="left">
        <h3>导航1</h3>
        <h3>导航1</h3>
        <h3>导航1</h3>
        <h3>导航3</h3>
      </nav>
      <section>
        <div class="module">模块1</div>
      </section>
    </div>
 .item11 {
    background grey
    border-left 300px solid #222
    // 必须清除浮动,否则元素高度塌陷,无效果
    &:after {
      content: '';
      display: block;
      height: 0;
      overflow: hidden;
      clear: both
    }
    .left {
      float left
      width 300px
      // 负值定位到父元素的边框上
      margin-left -300px
      color #fff
    }
  }

上面的示例其实是使用了,子元素能撑开父元素的特性,让高度始终是一致的特性。然后把浮动元素负值定位到父元素的边框上去。 但是不支持百分比宽度(边框不支持百分比宽度)

© All Rights Reserved            updated 2017-07-30 18:20:24

results matching ""

    No results matching ""