最终效果是这样的,下面我们一步步实现它
编写dom结构
我们需要的dom结构很少,只要一个container和一个content就可以了
1 2 3 4 5
| <div class="container"> <div class="content"> Genius only means hard-working all one's life. </div> </div>
|
初始化样式
这里主要是一些无关样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| body, h1{ margin: 0; padding: 0; } html, body { font-size: 19px; font-family: serif; color: rgba(0,0,0,0.8); } .container { width: 100%; height: 100%; position: relative; background-image: url("./resource/images/bg.bmp"); background-repeat: no-repeat; background-position: center top; background-size: cover; display: flex; justify-content: center; align-items: center; } .content { width: 800px; height: 400px; position: relative; border-radius: 8px; box-shadow: 0 10px 20px rgba(0,0,0,0.5); padding: 50px; box-sizing: border-box; background: transparent; } .content h1 { text-align: center; margin-bottom: 20px; } .content p { text-indent: 2em; line-height: 1.7; }
|
在应用了这些样式后,我们的页面成了这个样子
container占满整个屏幕,content在container里水平居中,因为content设置了背景透明,所以可以直接透过content看到container的内容(背景)
编写核心css样式
我们要做的事情很简单,设置content的一个伪元素,让它的层叠等级低于content,这样伪元素就可以在content的下面作为背景,然后设置伪元素的背景,背景设置除了background-attachment一定要设置成fixed,让背景相对视口定位,其他的都直接照抄,这样伪元素的背景就会和container的背景重合,但是伪元素和content大小一样,而元素的背景的范围又不能超过元素本身,所以只显示content大小的模糊化背景
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| .content::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-image: url("./resource/images/bg.bmp"); background-position: center top; background-size: cover; background-attachment: fixed; filter: blur(20px); z-index: -1; } .content { overflow: hidden; z-index: 1; }
|
现在的样子是这样的
收尾工作
看起来一切顺利,但是如果你放大页面,效果就显得不是那么完美
没错,边缘部分的模糊化看起来效果不大好,不过解决也很简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| .content { overflow: hidden; z-index: 1; } .content::before {
content: ''; position: absolute; top: -30px; left: -30px; right: -30px; bottom: -30px; background-image: url("./resource/images/bg.bmp"); background-position: center top; background-size: cover; background-attachment: fixed; filter: blur(20px); z-index: -1; }
|
我们只要设置top, left, right, bottom都为-30px就好了,这样模糊不全的部分其实就是移除content的部分,但那部分被裁剪掉了,只剩下内部模糊效果较好的部分