# CSS的box-shadow创建边框

# 最常见的用法:

box-shadow : x轴偏移 y轴偏移 颜色

# 如果提供第三个和第四个可选值

box-shadow : x轴偏移 y轴偏移 模糊半径 扩散半径 颜色

# 内阴影:inset(可选值)

因为box-shadow本来用于展现阴影,因此可以有外阴影和内阴影

box-shadow : x轴偏移 y轴偏移 模糊半径 扩散半径 颜色 inset

# 栗子一:

下面这个输入框非常常见:

    <form action="">
        <input type="text" placeholder="有什么话要说?">
    </form>
<style>
    input {
    	width: 100px;
        border: none;/*去掉输入框本来就有的黑边框*/
        outline: none;/*去掉输入框本来的点击聚焦之后的外边线样式 */
        border-bottom: 1px solid #3797a4;
        padding-bottom: 10px;
    }
</style>

在这里插入图片描述

我们打算需要输入内容的时候显示边框以提醒用户:

input {
    width: 100px;
    border: none;
    outline: none;
    border-bottom: 1px solid #3797a4;
    padding-bottom: 10px;
}
input:focus {
    border: none;
    padding-bottom: 0;
    box-shadow: 5px 5px #fcf876;
}

此时点击文本框聚焦输入时只显示外下阴影和外右阴影:

在这里插入图片描述

这时候我们需要继续添加box-shadow属性,把它的分号改成逗号就可以添加多个属性了:

input {
    width: 100px;
    border: none;
    outline: none;
    border-bottom: 1px solid #3797a4;
    padding-bottom: 10px;
}
input:focus {
    border: none;
    padding-bottom: 0;
    box-shadow: 5px 5px #fcf876,
			   -5px 5px #fcf876,
			   5px -5px #fcf876,
			   -5px -5px #fcf876;
}

我们给这个文本框的focus伪类加上右下左下右上左上的外阴影效果才能实现完全的边框效果:

在这里插入图片描述

如果只添加右下左上是不能实现的,效果如下:

input:focus {
    border: none;
    padding-bottom: 0;
    box-shadow: 5px 5px #fcf876,
			   -5px -5px #fcf876;
}

在这里插入图片描述

# 现在有效果了,但是这个方法太笨了,需要改造一下,我们可以利用前期说到的第四个数值(也就是对外扩散属性),但是 要记住还是需要填写第三个数值(模糊半径)来占位。
input:focus {
			border: none;
			padding-bottom: 0;
			box-shadow: 0 0 0 5px #fcf876;		
		}

此时实现的效果和上述的一样:

在这里插入图片描述

看到上面这个input输入框中的outline属性,我就又去了解了一下CSSoutlineborder的区别

# CSSoutlineborder的区别:

1.border占用空间,outline不占用空间,不会影响元素的尺寸和位置。

<input type="text" placeholder="有什么话要说?">
<style>
    input {
        width: 100px;
        border: 10px solid black;
        outline: 10px solid #3797a4;
    }
</style>

看出效果差别了吗?

border是占了文档流空间的,但是outlineborder外层,有点类似于

在这里插入图片描述

2.border 可应用于几乎所有有形的html元素,而 outline是针对链接、表单控件和ImageMap等元素设计。从而另一个区别也可以推理出,那就是: **outline 的效果将随元素的 focus 而自动出现,相应的由blur 而自动消失。**这些都是浏览器的默认行为,无需JavaScript配合CSS来控制。

利用这些特性,我们常用outline设置悬停的动态效果。之前一直困扰我的问题:hover加边框会导致元素定位和大小的改变,同事也会影响其他元素位置的改变,现在终于解决了。

# 栗子二:

我们需要给图片上面加一个内阴影覆盖上去的效果:

<div>
    <img src="img/771ddded2e738bd4f6befafead8b87d6257ff988.jpg"/>
</div>
<style>
    div{
        width: 960px;
        height: 540px;
        box-shadow: 0 0 0 50px rgba(123,104,255,0.2) inset;
    }
    img{
        width: 960px;
        height: 540px;
    }
</style>

此时并没有任何内阴影效果:

在这里插入图片描述

因为图片<img>现在是置于<div>的上层,把阴影效果遮住了,我们需要改一下代码:

div{
    width: 960px;
    height: 540px;
    box-shadow: 0 0 0 50px rgba(123,104,255,0.2) inset;
}
img{
    position: relative;
    z-index: -1;
    width: 960px;
    height: 540px;
}

在这里插入图片描述

这就用内阴影实现了图片美化的效果。

# 栗子三:

除了内阴影,另一种常用的就是双层边框了:

<img src="img/771ddded2e738bd4f6befafead8b87d6257ff988.jpg"/>
<style>
    img{
        width: 960px;
        height: 540px;
        box-shadow: 0 0 0 10px #ff9595,
            	    0 0 0 30px white,
				   40px 40px #32e0c4,
				   -40px -40px #32e0c4;
    }
</style>

box-shadow属性里面有多个阴影属性,按照css代码顺序越在前面的,越置于上层

此时就有了照相相框的效果:

在这里插入图片描述

Last Updated: 7/15/2020, 10:34:45 PM