CSS背景与边框 -程序员宅基地


title: 背景与边框
date: 2016-10-16
tags: CSS Secrets


0x00 半透明边框


背景知识 RGBA/HSLA 颜色

在CSS3里我们可以使用RGBA和HSLA两种色彩模式,二者均可以用来在设置颜色的同时指定其它透明度。RGBA指的是“红色、绿色、蓝色和Alpha透明度”,而HSLA则代表“色调、饱和度、亮度和Alpha透明度”。

在RGBA模式里,前三个参数分别是红色、绿色和蓝色的强度值,取值从 0~255 或 0%~100% (最常见的是 0~255, 而非百分数形式)。而在HSLA模式里,前三个参数则分别代表色调( 0~360 )、饱和度( 0%-100% )和亮度( 0%~100% )。RGBA和HSLA第四个参数都是透明度,取值从0(完全透明)到1(完全不透明)。

CSS3仍有opacity属性,但它的作用是使整个元素都半透明,包括前景内容,而不仅是背景。


解决方案

需要知道的是,在默认情况下,背景会延伸到边框所在区域的下层。所以即使我们给边框设置了半透明的效果,那么从视觉上也是无法分辨的。所以,如果我们不希望背景侵入边框所在的范围,就需要使用到 CSS3 的 background-clip 背景切割属性,将它的值设置为 padding-box

border: 10px solid hsla(0%, 0%,100%,.5);
background:white;
background-clip:padding-box;

0x01 多重边框


box-shadow

不为人知的是,box-shadow 还可以接受第四个参数(称为"扩展半径"),通过指定正值或者负值,可以让投影面积加大或者减小。

一个正值的扩展半径加上两个为零的偏移量以及为零的模糊值,得到的投影其实就像是一道实线边框了,在加上 box-shadow 的最大好处,可以支持逗号分隔发法,那么我们便可以为其创建任意数量的投影了。

div{
    height: 200px;
    width: 200px;
    background: yellowgreen;
    box-shadow: 0 0 0 10px #655,0 0 0 15px deeppink, 0 2px 5px 15px rgba(0,0,0, 0.6);
}

多重边框+投影


outline

有时当我们只需要两层边框的时候,便可以使用 outline 属性来产生外层的边框,这种方案会变得非常灵活,而不同于 box-shadow 只能模拟实现边框。

div{
            height: 200px;
            width: 200px;
            border: 20px solid #655;
            border-radius: 10px;
            outline:  5px dashed deeppink;        
}

outline

描边的另一属性 outline-offset 还可以控制它更元素边缘之间的间距,这个属性可以接受负值。

div{
            height: 200px;
            width: 200px;
            border: 20px solid #655;
            border-radius: 10px;
            outline:  5px dashed deeppink;            
            outline-offset: -25px;
        }

outline-offset

但是,IE8 以下的并不支持 outline-offset 属性。

去掉 input 标签 focus 时的亮色边框 input {outline:none}


0x02 背景定位


背景定位

有时,我们希望背景图片与容器的边角之间留出一定的空隙(类似内边距的效果),在 CSS2 的时代要实现这一点是很麻烦的。但是在 CSS3 的时代 background-position 属性已经得到了很好的扩展,并且当结合 background-origin 属性使用时,将发挥出更大的创造力。

在 CSS3 中,background-position 允许我们指定背景图片距离任意角的偏移量,只需我们在偏移量前指定关键字就好了。

需要知道的是,background-position 在默认情况下是以 padding-box 为基准的,不过,我们可以使用 CSS3 中一个新的属性 background-origin 来改变这种默认行为。background-origin 默认值同样为 padding-box,其它可以接受的值是,content-box 和 border-box。

#box{
        width:500px;
    height:500px;
    border:20px solid rgba(0,0,0,0.5);            
    background: url(img/adver2.jpg) no-repeat ;
    /*background-clip:content-box;    */    
    background-position: right 20px bottom 10px;
    background-origin: content-box;
    padding:40px;
}

如此,我们在 background-position 中使用的边角关键字将会以内容区的边缘作为基准。


0x03 边框内圆角

一个灵活的方法是使用两个嵌套的 div 来实现边框内圆角的效果。

#box{
  background:#655;
  padding:0.8em;
}

#subBox {
    background: tan;
    padding:0.8em;
    border-radius:0.8em;
}

边框内圆角


0x04 条纹背景


背景知识 CSS3 渐变中的百分比

在 CSS 渐变属性中使用百分比的作用是指某个颜色距离起点的起始位置。默认的渐变样式为从上往下,所以当某个颜色值设置了百分比后,便会从距离顶端相关的距离(百分比计算)开始填充实色。而渐变是也有空间占比的,渐变过渡区的占比为总的空间(高度或宽度)减去上下两个着色块空间占比剩下的空间。

红色30% 橙色70%的渐变过渡占比为

但若是前面有比当前的颜色值百分比大的,会自动将当前颜色值的百分比设置为前面颜色中的最大百分比值。

此外,默认情况下,还会根据颜色的个数来为每个颜色设置百分比,最后一个颜色的百分比值就是100%,而起始的值就是0%,中间如果再有多个颜色值,则根据100/(个数-1)平均下去。

如此,便可以做出一个简单的多重颜色线条的背景来:

#box{
            width:400px;
            height:200px;    
            background:linear-gradient(
                red 0,
                red 14.3%,
                orange 0,
                orange 28.6%,
                yellow 0,
                yellow 42.9%,
                green 0,
                green 57.2%,
                blue 0,
                blue 71.5%,
                indigo 0,
                indigo 85.8%,
                purple 0, 
                purple 100%);        
        }

颜色要设置两次,是因为每个颜色需要一个起始着色点,然后还需要将两个颜色之间的渐变过渡区域覆盖为实色,消除过度效果。


水平条纹

渐变是一种由代码生成的图像,我们能想对待其他任何背景图像那般来对待他,比如对其使用 background-size 来调整其大小。

div{
            width:200px;
            height: 200px;            
            background:linear-gradient(                
                #fb3 50%,
                #58a 0
                );
            background-clip:padding-box;
            background-size: 20px 100%;
}


 垂直条纹
div{
    width:200px;
    height: 200px;            
    background:linear-gradient(
            to right,/*or 90deg*/
            #fb3 50%,
            #58a 0
    );
    background-clip:padding-box;
    background-size: 100% 20px;
}


0x05 斜向条纹

div{
    width:200px;
    height: 200px;            
    background:linear-gradient(
        45deg,
        #fb3 0,
        #fb2 25%,
        #58a 0,
        #58a 50%,
        #fb3 0,
        #fb3 75%,
        #58a 0,
        #58a 100%
        );
    background-clip:padding-box;
    background-size: 20px 20px;
}

如果我们需要为背景添加斜向条纹,那么便需要为贴片( 20px,20px)设置完整的色标。不幸的是,这种方法并不完美,当我们尝试改变渐变的角度时,看起来会很糟糕。幸运的是,还有更好的方法来创建斜向条纹,即 repeating-linear-gradientrepeating-radial-gradient,循环式的重复渐变。

如此,便再也无须担心如何去创建无缝拼接的贴片。并且,我们会直接在渐变的色标中指定长度,而不是原来的 bakcground-size ,这里的长度是直接在渐变轴上进行度量的,它直接代表了条纹自身的宽度,对渐变来说就是以整个元素的范围进行填充。

div{
    width:200px;
    height: 200px;            
    background:repeating-linear-gradient(
    45deg,
    #fb3 0,
    #fb2 15px,
    #58a 0,
    #58a 30px            
    );            
}

需注意的是在这个方法中,如果我们想要创建双色条纹,那么便需要使用四个色标才行。


0x06 同色系条纹

div{
    width:200px;
    height: 200px;            
    background: deeppink;
    background-image: repeating-linear-gradient(
        30deg,
        hsla(0,0%,100%,0.3),
        hsla(0,0%,100%,0.3) 15px,
        transparent 0,
        transparent 30px
    );
        }

我们首先为其指定了一个主色系的背景颜色,然后把半透明白色的条纹叠加在主色系背景之上得到浅色条纹。

桌布图(方格图)

div{
    width:200px;
    height: 200px;            
    background: white;
    background-image: 
       linear-gradient( rgba(200,0,0,0.5) 50%,transparent 0),
       linear-gradient(90deg,rgba(200,0,0,0.5) 50%,transparent 0);
    background-size: 30px 30px;
}


0x07 伪随机条纹

自然界中的事物都不是以无限平铺的方式存在的。大自然更不会以 "无缝" 的贴片重复自己。所以重现大自然的随机性也许展现更多的真实性。

background: hsl(20,40%,90%);
background-image: 
    linear-gradient( 90deg,#fb3 11px,transparent 0),
    linear-gradient(90deg,#ab4 23px,transparent 0),
    linear-gradient(90deg,#655 41px,transparent 0);
background-size: 41px 100%,61px 100%,81px 100%;
//41,61,81 都是质素

为了增加随机性的真实性,我们将贴片尺寸进行了最大化。为了让最小公倍数最大化,即要达成相对质素,那么最好的方法便是使用质数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33973600/article/details/89169332

智能推荐

计算带余除法(四种方法)_带余除法怎么写编程-程序员宅基地

文章浏览阅读387次,点赞12次,收藏4次。给定两个整数a和b (0 < a,b < 10,000),计算a除以b的整数商和余数。一行,包括两个整数a和b,依次为被除数和除数(不为零),中间用空格隔开。一行,包含两个整数,依次为整数商和余数,中间用一个空格隔开。示例:输入:15 2,输出:7 1_带余除法怎么写编程

【Maven教程】(九):使用 Maven 进行测试——动态指定要运行的测试用例、包含与排除测试用例、测试报告、运行TestNG测试、重用测试代码 ~_maven和testng怎么用-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏3次。本文的主题是Maven与测试的集成,不过在讲述具体的测试技巧之前先实现了背景案例的account-captcha模块,这一模块的测试代码也成了本章其他内容良好的素材。maven-surefire-plugin是Maven背后真正执行测试的插件,它有一组默认的文件名模式来匹配并自动运行测试类。用户还可以使用该插件来跳过测试、动态执行测试类、包含或排除测试等。maven-surefire-plugin能生成基本的测试报告,除此之外还能使用cobertura-maven-plugin生成测试覆盖率报告。_maven和testng怎么用

DataGridView列头checkbox-程序员宅基地

文章浏览阅读4.6k次。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Dat_datagridview列头

Python3 错误和异常_assertionerror怎么解决python-程序员宅基地

文章浏览阅读927次,点赞2次,收藏2次。Python3 错误和异常_assertionerror怎么解决python

Sharding-JDBC 1.5.0.M1 正式发布,全新的 SQL 解析引擎-程序员宅基地

文章浏览阅读109次。经过了长达几个月的紧张开发,Sharding-JDBC 1.5.0.M1终于正式发布。Sharding-JDBC 1.5.0.M1版本是一次里程碑式升级,工作量巨大,Sharding-JDBC截止到1.4.2之前所有的提交次数为385次,而1.5.0.M1一个版本的提交次数为517次。Sharding-JDBC从这个版本开始明确定位为“水平扩展以及in..._sharding-jdbc 1.5 解析器

golang检测网页编码_go 识别网页编码-程序员宅基地

文章浏览阅读876次。很简单直接上代码package mainimport ( "fmt" "io/ioutil" "net/http" "unicode/utf8")func main() { resp, _ := http.Get(`https://www.baidu.com/`) data, _ := ioutil.ReadAll(resp.Body) defer resp.Body.Close() fmt.Println(utf8.Valid(data)) // ture代表即utf8,否则你_go 识别网页编码

随便推点

统信UOS linux下opencv应用编译时的头文件和库文件路径查找设置方法_编译时找不到opencv头文件-程序员宅基地

文章浏览阅读1.3k次,点赞25次,收藏15次。本文介绍了在统信UOS 的linux Debian系环境下,通过设置环境变量、编译指令参数指定路径、pkg-config配置等方法设置opencv库的头文件和库文件路径的方法,通过这些方法可以是的gcc或g++编译器能顺利找到opencv的头文件和库文件。_编译时找不到opencv头文件

【论文翻译】HCGN:面向集体分类的异构图卷积网络深度学习模型_hgcn-程序员宅基地

文章浏览阅读1.8k次。HCGN:面向集体分类的异构图卷积网络深度学习模型摘要集合分类是研究网络数据的一项重要技术,旨在利用一组具有复杂依赖关系的互联实体的标签自相关性。随着各种异构信息网络的出现,集合分类目前正面临着来自异构信息网络的严峻挑战,如复杂的关系层次、潜在的不相容语义和节点上下文关系语义。为了应对这些挑战,本文提出了一种新的基于异构图卷积网络的深度学习模型,称之为HGCN,用于对HINs中的实体进行集体分类。我们的工作包括三个主要贡献:1)HGCN不仅通过多层异构卷积从关系复杂的HINs中学习潜在的关系,而且用适当_hgcn

java的重写_java 类的重写-程序员宅基地

文章浏览阅读211次。java的重写重写的一般用法方法重写的具体要求文章内容选自尚硅谷重写的一般用法java的重写是为了子类在继承父类方法的时候,需要用到父类的方法,但是方法体又和父类不完全一样,因此得在子类中创建一个和父类同名同参数的方法,实现方法的重写。方法的重写(override或overwrite)必须和父类同名,参数列表也相同重写后当子类调用父类的方法的时候,调用的是子类中重写的方法,而不是父类的方法。代码如下,创建一个Person类package com.atguigui.java;public_java 类的重写

Oracle学习笔记 1 ---Oracle概述和安装配置_oracle笔记1 1. oracle概述-程序员宅基地

文章浏览阅读793次。一、Oracle概述_oracle笔记1 1. oracle概述

基于matlab的一元线性回归原理_基于matlab栅格数据一元线性回归-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏27次。一元线性回归分析是在排除其他影响因素,分析某一个因素(自变量:X)是如何影响另外一个事物(因变量:Y)的过程,所进行的分析是比较理想化的。对于一元线性回归来说,可以看成Y的值是随着X的值变化,每一个实际的X都会有一个实际的Y值,我们叫Y实际,那么我们就是要求出一条直线,每一个实际的X都会有一个直线预测的Y值,我们叫做Y预测,回归线使得每个Y的实际值与预测值之差得平方和最小。_基于matlab栅格数据一元线性回归

vue 百度地图/天地图设置铺满屏幕100%,解决空隙问题_vue百度地图 100vw宽度不生效-程序员宅基地

文章浏览阅读491次。vue 百度地图/天地图设置铺满屏幕100%,解决空隙问题_vue百度地图 100vw宽度不生效

推荐文章

热门文章

相关标签