zoukankan      html  css  js  c++  java
  • 《css揭秘》之背景与边框

    这本书是魔法哥的译著,也是买了有很长时间了,现在开始慢慢阅读,确实比较新颖,包含了很多css方面的小tips。来一点点的做个总结。

    半透明边框的实现:

    关于半透明我们可能会想到使用rgba,opacity等等,对于背景提供回退方案还是比较好做的,要么利用一张单像素半透明图片,要么回退到实色。但是对于其他属性,比如边框我们就只能回退到实色了。甚至到ie都要利用滤镜了。好了言归正传。

    我们写了如下代码:

            <div class="container">
                <div class="test1">wretyui</div>
            </div>
    .container{background: lightblue;}
    .test1{
      width: 200px;height: 150px;
      border: 10px solid hsla(0,0%,100%,.5);
      background: white;
    }

    来打开浏览器一看,白茫茫的一片,说好的半透明的白色边框去哪了。

    这里就要知到背景的渲染机制了,在默认情况下,背景颜色也会蔓延到边框上。来段代码证明一下。

    <div class="test" style=" 200px;height: 150px;background: red;border: 10px dotted blue;"></div>

    看见了没,background蔓延到了border上,所以当我们上面那段代码实质就是,白色的背景蔓延到了半透明的border上,导致border也变成了白色。我们为了不让background背景色蔓延出去,我们就要利用background-clip这个属性:增加如下代码。

    background-clip: padding-box;

     background-clip:https://www.w3.org/TR/css3-background/#background-clip

    书本配套所有demo:http://play.csssecrets.io/

    多重边框的实现

     以往我们实现多重边框,可能会通过div的嵌套来实现,这样做很容易但是问题就是DOM浪费,而且还有令人厌恶的居中问题,这里又提供了其他的实现方案。

    box-shadow方案:

    关于box-shadow我们已经不陌生了。但是用它来做边框可能还很少见。

               .test2{ /*这种的好处就是可以一直叠加,但是投影并不占据真正的空间,不会影响布局,不会受到box-sizing的影响*/
                    width: 200px;height: 150px;
                    background: yellowgreen;
                    box-shadow: 0 0 0 10px deeppink inset,
                                0 0 0 20px blue ;
                }

    我们可以看到实现很容易,但是我们要知道通过box-shadow产生的“边框”并不占据真正的空间,不影响布局,所以我们如果需要占据空间,那么就需要通过内边距或者外边距模拟出需要占据的空间。

    再来看一下这几个框的结构层次图

              .test2{ /*这种的好处就是可以一直叠加,但是投影并不占据真正的空间,不会影响布局,不会受到box-sizing的影响*/
                    width: 200px;height: 150px;
                    margin: auto;
                    background: yellowgreen;
                    box-shadow: 0 0 0 10px deeppink inset,
                           0 0 0 20px blue ;
                    padding: 50px;
                    border: 20px solid;
                }
                

    outline方案:

    有时候可能只需要两层边框,那么我们可以利用outline描边来做,而且利用outline可以实现虚线边框效果,而像上面的box-shadow则不能办到。

               .test3{ 
                    width: 200px;height: 150px;
                    background: yellowgreen;
                    border: 3px solid red;
                    outline: dotted 5px blue;
                }

    outline产生的“边框”也是不会占据空间的。正常情况下outline产生的“边框”是在真正的边框外面的。

    当我们增加圆角时

    border-radius: 20px;

     我们发现outline产生的“边框”并不会变成圆角。那么通过box-shadow产生的边框呢,是可以的。但是只有设置为outset的box-shadow会,设置为inset则不会产生圆角。

    另外我们可以通过outline-offset来控制outline跟元素边缘之间的位置。那么我们就很容意实现缝边效果。

    outline参考资料:http://tympanus.net/codrops/css_reference/outline/

     当然多重边框的实现还有其他方式:

    https://www.impressivewebs.com/multiple-borders-css/

    http://nicolasgallagher.com/multiple-backgrounds-and-borders-with-css2/

    边框内圆角

    直接看代码吧

               <div class="demo"></div>
               .demo{
                    width: 200px;
                    height: 100px;
                    background: lightcoral;
                    border-radius: 20px;
                    outline: 10px solid lightblue;
                    box-shadow: 0 0 0 8px lightblue;
                }

    原理就是利用上面的outline产生的边框是不随border-radius而产生圆角的,而且由outline和box-shadow产生的边框是不会占据空间的。所以这里是不能用border来代替box-shadow,因为border会占据空间,outline会随border扩张。

  • 相关阅读:
    dubbo 在不同协议下携带上下文区别
    innodb使用大字段text,blob的一些优化建议(转)
    Redis的过期策略和内存淘汰策略(转)
    在 Docker 里跑 Java,你必须知道的那些事儿!(转)
    如何在宿主机上执行容器里的jmap,jtack,jstat 命令获取信息(原创)
    操作系统实现线程的几种模式 和 java创建线程的3个方式
    MySQL数据库事务各隔离级别加锁情况--read committed && MVCC
    kafka性能调优(转)
    游戏数值系统
    lua函数回调技巧
  • 原文地址:https://www.cnblogs.com/djlxs/p/6038988.html
Copyright © 2011-2022 走看看