CSS魔法堂:重拾Border之——图片作边框

前言

 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-top-left/right-radius的水平半径之和大于元素宽度时,实际值会按比例分配元素宽度时,不禁会问"我真的懂border吗?"。本系列将稍微深入探讨一下那个貌似没什么好玩的border!
《CSS魔法堂:重拾Border之——解构Border》
《CSS魔法堂:重拾Border之——图片作边框》
《CSS魔法堂:重拾Border之——不仅仅是圆角》
《CSS魔法堂:重拾Border之——更广阔的遐想》

解构border-image

347002-20160430231727800-188898816.png

<style type="text/css">
div {border: double orange 1em;border-image: url("border.png") 27 round stretch;
}
</style>
<div>........</div>

 起初浏览一遍border-image的用法时,总以为就是border变粗了,然后以图片作为Line Pattern,接着是各种平铺方式就完事了。后来细读W3C Spec,发现我还是2 young 2 simply了,简称太2了。
 要理解好border-image,那么先要理解它由那几类对象组成,对象间的关系和组合规则。

3个和尚有水喝

  1. 目标元素本身(即上面的div元素)
  2. 用作边框素材的图片(即上面的border.png)
  3. 贴图区(Border Image Area)

引入图层概念

 用过PS或Flash的同学应该都清楚图层的概念吧,反正我是现在才理解图层的:(
目标元素和贴图区分别位于两个图层,并且贴图区所在的图层位于目标元素所在的图层之上,而素材图片经切割后将在贴图区图层上作后期处理,最后作图层合成处理。
 重申3点

  1. 目标元素和素材的图片分别在各自独立的图层上绘制;
  2. 图片会经过切割后,按规则在所属图层上的贴图区内作定位和平铺处理;
  3. 图片所属图层在目标元素所在图层之上。

透过属性看本质

 在理解border-image的组成和整体处理流程后,我们先通过属性来认识与图片和贴图区密切相关的知识——图片切割/切片贴图区切割/切片

图片切割/切片

  1. 属性border-image-source
    作用:引入用作边框素材的图片资源
    语法:border-image-source:url("image url")
    url入参为图片路径,可以是HTTP或HTTPS Scheme URI下的绝对或相对路径,或采用Data Scheme URI。
  2. 属性border-image-slice
    作用:对通过border-image-source引入的图片资源,以九宫格的形式作切片
    语法:border-image-slice: [<percentage> | <number>]{1,4} fill?
    属性值的顺序和简写时语法扩展的规则与属性border-width一致(top,right,bottom,left),而其含义为距离图片各边(top/right/bottom/left)多远的位置上,画一条与对应边相互平衡的切割线。注意:切割线必须位于图片所在面积内
    <percentage>:以图片的尺寸(宽、高)作为参考系,设置距离各边的距离。默认值为100%
    <number>:设置距离各边的绝对距离,单位固定为px
    fill:设置是否将九宫格里正中间的切片,应用到贴图区中。默认值为禁用,即默认情况下九宫格中仅有8块切片会应用到贴图区中。

注意
 当水平方向(left/right)的切片重叠时,会导致top、middle和bottom切片的尺寸为0;
 当垂直方向(top/bottom)的切片重叠时,会导致left、middle和right切片的尺寸为0;
 因此默认情况下border-image-slice: 100%,所以top/right/bottom/left/middle的切片尺寸均为0,而4个角top-left/right和bottom-left/right切片的尺寸为整张图片,因此最后结果仅看到边框4个角有图片,而4边却没有显示。

示意图:
347002-20160430231743035-1692501773.png
4条灰色线表示切割线,它们和图片的4条边框一起把图片划分为九宫格,得到以下9幅切片。
347002-20160430231758097-73935276.png

贴图区(Border Image Area)切割/切片

 相对目标元素和素材图片而言,贴图区由于无法直接观察,导致比较难理解。

  1. 默认情况下贴图区与目标元素完全重叠;
  2. 贴图区同样被划分成9块区域,分别对应素材图片的9块切片。默认情况下贴图区中除middle区域外,其他区域的尺寸与目标元素的border box一致。
    347002-20160430231820222-1424710628.png
  3. 通过border-image-width可修改各区域的尺寸;
  4. 通过border-image-outset可修改贴图区的尺寸。
    347002-20160430231842253-1625524352.png

    border-image-outset: 12px;
  5. 属性border-image-width
    作用:以九宫格的形式对贴图区进行切片
    语法:border-image-width: [<length> | <percentage> | <number> | auto]{1,4}
    属性值的顺序和简写时语法扩展的规则与属性border-image-slice一致(top,right,bottom,left),而其含义为距离贴图区各边(top/right/bottom/left)多远的位置上,画一条与对应边相互平衡的切割线。注意:切割线必须位于贴图区所在面积内
    <length>:设置距离各边的绝对距离,负数无效。
    <percentage>:以贴图区的尺寸(宽、高)为参考系,设置距离各边的距离
    <number>:以对应的border-width为参考系,设置距离各边的距离。默认值为1
    auto:设置为与素材图片中对应的切片一致
    注意:若贴图区水平方向(left/right)或垂直方向(top/bottom)的区域发生重叠,则会对其进行缩放直到不发生重叠为止。计算缩放因子的公式f = min(width/(left + right), height/(top + bottom)),然后left/right/top/bottom4个区域则按缩放因子进行缩放操作。
  6. 属性border-image-outset
    作用:扩大贴图区所占的面积。
    语法:border-image-ouset: [<length> | <number>]{1,4}
    属性值的顺序和简写时语法扩展的规则与属性border-image-width一致(top,right,bottom,left),而其含义为将贴图区各边(top/right/bottom/left)向外扩展多大距离。
    <length>:设置距离各边的绝对距离,负数无效。
    <number>:以对应的border-width为参考系,设置距离各边的距离。默认值为0

注意
 通过border-image-outset扩大贴图区的面积时,若border-image-width采用作属性值,则同时扩大除middle区域外其他区域的尺寸;当border-image-width采用其他作属性值时,只会看到图片边框向外移动而已。

合成的法则

 经过上述两步"图片切片"和"贴图区切片"后,是时候将两者糅合在一起了。具体逻辑如下:

  1. 初次调整图片切片尺寸
    1.1. 将素材图片各切片移至贴图区中对应的区域;
    1.2. top/bottom图片切片的高度缩放至于对应的贴图区域的高度一致,并以相同的缩放比来调整图片切片的宽度;
    1.3. left/right图片切片的宽度缩放至于对应的贴图区域的宽度一致,并以相同的缩放比来调整图片切片的高度;
    1.4. top-left/right和bottom-left/right图片切片的宽度和高度则各自缩放至于对应的贴图区域一致即可
  2. 深度调整图片切片尺寸
    2.1. 根据border-image-repeat属性值对切片尺寸进行调整。
  3. 定位切片
    3.1. 当border-image-repeat属性值为repeat时,切片位于对应贴图区域的中央位置,否则则紧贴对应贴图区域的左边框。
  4. 3秒の合体:),即根据border-image-repeat属性值对切片进行复制、拉伸等平铺操作,然后将贴图区与目标元素所在的图层进行合成即可!

 合成过程中有两点是至关重要的:

  1. "初次调整图片切片尺寸"是基础,而且要注意的是,是以相同的缩放比来调整图片,而不是直接让图片切片的尺寸与对应的贴图区域尺寸一致;
  2. "深度调整图片切片尺寸"、"定位切片"和平铺方式均与border-image-repeat相关。

border-image-repeat

 语法:border-image-repeat: [stretch | repeat | round | space]{1,2}
 第一个属性值为水平方向的平铺方式,第二个属性值为垂直方向的平铺方式。
stretch:拉伸图片切片,默认值。
repeat:复制平铺图片切片(不保证每幅图片切片副本恰好能完整显示)。
round:根据贴图区域尺寸调整图片切片尺寸,然后复制平铺图片切片,从而保证每幅图片切片副本恰好能完整显示。
space:复制平铺图片切片,并通过调整图片切片副本间的空白,从而保证每幅图片切片副本恰好能完整显示。(效果和flexbox中content-align设置为space-round差不多)

素材图片原尺寸:
347002-20160430231906863-648888788.png
最终效果:
347002-20160430231727800-188898816.png
大家可以看到最终效果里面4个角落的切片均缩小了,而left和right则是拉伸,top和bottom则是复制平铺。

一铺搞定&一铺清袋

 粤语的"一铺搞定"其实就是一次完成全部工作的意思,上面关于border-image的属性,要是每次都逐个设置那要敲多少次键盘啊。。。其实我们可以通过border-image属性一次搞定。
 语法:border-image: <‘border-image-source’> || <‘border-image-slice’> [ / <‘border-image-width’> | / <‘border-image-width’>? / <‘border-image-outset’> ]? || <‘border-image-repeat’>

 粤语的"一铺清袋"其实就是把之前的成果一次性归零。当我们辛辛苦苦设置好border-image后,一个不小心又设置了border属性,那么之前关于border-image的设置将全部失效。因此先设置border属性,然后再设置border-image最为稳妥。

兼容性

347002-20160430231943503-1927743582.png

总结

 总算折腾出来了,累啊!!!起初以为花2个晚上就能理解好并记录下来,谁知道理解就花了2晚,然后各种试验。。。看来还是太高估了自己了:(不过不管如何,弄明白后还是觉得很爽的哦!
 尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/5449717.html^_^肥仔John

感谢

CSS Backgrounds and Borders Module Level 3 4. Borders
《图解CSS3核心技术与案例实战》——第3章 CSS3边框

转载于:https://www.cnblogs.com/fsjohnhuang/p/5449717.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

共享内存简介和mmap 函数

一、共享内存简介 共享内存区是最快的IPC形式&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区&#xff0c;当这块区域都映射到相同的真正的物理地址空…

【pyqt5学习】——QToolTip,QLabel控件,伙伴关系

目录 0、学习资源 1、给控件设置提示信息——QToolTip 2、QLabel控件&#xff08;显示图像、设置超链接、信号绑定&#xff09; 3、QLabel伙伴关系 1&#xff09;代码 2&#xff09;效果 3&#xff09;知识点addWidget 0、学习资源 PyQt5教程&#xff0c;来自网易云课堂…

Hello IT

从高中的计算机课开始学习如何按下开机键&#xff0c;如何上网&#xff0c;如何背诵五笔字根&#xff0c;再到大学中如何使用office,利用C编码做算法&#xff0c;到现在IT中的伪一员&#xff0c;时间算起来也不短&#xff0c;然正在入门是在2010年8月杭州参加嵌入式培训&#x…

ARM指令集2

ARM指令集2 ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据&#xff0c;加载指令用于将存储器中的数据传送到寄存器&#xff0c;存储指令则完成相反的操作。 LDR指令&#xff08;与MOV有区别&#xff0c;MOV只能操作通用寄存器&#xff09; LDR指令格式为&…

SylixOS中select原理及使用分析

2019独角兽企业重金招聘Python工程师标准>>> 1. select接口简介 1.1 select接口使用用例 select是操作系统多路I/O复用技术实现的方式之一。 多路I/O复用技术大致使用场景为&#xff1a;构造一张感兴趣的文件描述符列表&#xff0c;然后调用多路复用的IO接口&#x…

【pyqt5学习】——QLineEdit学习(回显模式)

目录 1、回显模式 2、成果显示 3、知识点 1&#xff09;FormLayout布局添加addRow方法 2&#xff09;在输入框显示灰色提示字体&#xff0c;输入内容时消失setPlaceholderText 3&#xff09;设置回显模式setEchoMode 4、完整代码 1、回显模式 QLineEdit控件的主要功能是输…

有关机械手臂控制中的两个重要输入参数

1.在机械手臂中有两个重要参数。一个是编码器的值&#xff0c;另外一个是马达的电流值。根据这两个可以获得机械手臂的运动学&#xff0c;动力学的一些数据。第一重要特征参数 是DH参数&#xff0c;另外一个就是每个轴的质心参数。

MySQL的权限分配

MySQL 赋予用户权限命令的简单格式可概括为&#xff1a;grant 权限 on 数据库对象 to 用户&#xff0c;如 GRANT PRIVILEGES ON datebase.* to user% IDENTIFIED by passwd;一、给表数据赋权 grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。…

用HttpURLConnection发送http请求

//发送http请求try {//1.使用网址构造一个URL对象 URL url new URL(path);//2.获取连接对象 HttpURLConnection conn (HttpURLConnection) url.openConnection();//3.设置一些属性 //设置请求方式&#xff0c;注意大写conn.setRequestMethod("GET");//设置请求超时…

【pyqt5学习】——QLineEdit控件输入校验器Validator、掩码setInputMask限制输入、textChanged信号

目录 1、输入校验器——限制输入框输入的内容 1&#xff09;校验器类型——整数、浮点数、数字字母结合&#xff08;正则&#xff09; 2&#xff09;步骤 3&#xff09;结果 ​编辑 ​编辑 4&#xff09;完整代码 2、利用掩码进行输入的限制 0&#xff09;掩码对照表 1…

Call requires API level 3 (current min is 1)

结果出现“Call requires API level 3 (current min is 1): 解决方法&#xff1a; 在工程上点击右键 -> Android Tools -> Clear Lint Markers&#xff0c;即可。转载于:https://www.cnblogs.com/qianyukun/p/5458331.html

Product文本格式说明

使用txt进行产品信息的说明。 Product文本格式说明 //**************************************************** //产品信息 //固定标识符全部大写&#xff0c;全部在等号&#xff08;&#xff09;前面 //****************************************************** PRODUCTTest //…

PyOpenCL图像处理:Box模糊

为什么80%的码农都做不了架构师&#xff1f;>>> # -*- coding: utf-8 -*-from __future__ import absolute_import, print_function import numpy as np import pyopencl as cl import cv2 from PIL import Imagedef RoundUp(groupSize, globalSize): r globalSi…

【python bug修复】——Script file ‘D:\softwares_install\Anaconda3\envs\PartTimes\Scripts\pip-scrip

目录 1、问题描述 2、问题解决 1&#xff09;下载pip安装脚本 2&#xff09; 运行安装pip脚本 3&#xff09; 下载库 1、问题描述 利用pip命令进行库的安装时&#xff0c;突然出现这个问题&#xff0c;之前使用还好好的 Script file D:\softwares_install\Anaconda3\envs\P…

项目中的那些事---下载pdf文件

最近做了一个下载pdf文档的需求&#xff0c;本以为使用HTML5中<a>标签的属性download就能简单搞定&#xff0c;不料IE竟然不支持这一简单粗暴的H5新特性&#xff0c;而是直接在网页中打开&#xff0c; 于是各种搜索之后得出以下结论&#xff1a;IE中下载文档时&#xff0…

MySQL日志分类及性能分析你应该知道的知识

为什么80%的码农都做不了架构师&#xff1f;>>> MySQL日志记录了MySQL数据库日常操作和错误信息&#xff0c;MySQL总共有四种类型的日志&#xff0c;通过分析这些日志可以查询到MySQL的运行情况、用户操作、错误信息等&#xff0c;可以为MySQL的管理和优化提供必要…

利用三个点(trsf)来实现各种规则图形的实现

在Val3,是使用trsf(x,y,z,rx,ry,rz)来实现三维空间点的位置与方向。 其中第一点和第二点位置很重要&#xff0c;第三点是用来确定方向。根据这三个点先确定一个用户坐标系。 在这个坐标系中&#xff0c;实现圆&#xff0c;三角形&#xff0c;矩形&#xff0c;腰圆&#xff0c;正…

android基础组件----Button的使用

按钮由文本或图标&#xff08;或文本和一个图标&#xff09;组成&#xff0c;当用户触摸到它时&#xff0c;会发生一些动作。今天我们开始Button的学习。少年的爱情永远不够用&#xff0c;一杯酒足以了却一件心事。 Button的简要说明 根据你是否想要一个带有文本的按钮&#xf…

@Repository、@Service、@Controller 和 @Component

Repository 、Service 、 Controller 、Component 这四个Spring注解 ,用于把加了注解的 类 加入到Spring 容器中管理&#xff0c;节省了xml 的繁重的配置&#xff0c;尽管如此xml 同样可以实现&#xff08;一般建议先搞懂xml&#xff09;。 Repository Repository注解便属于最先…

【pyqt5学习】——QTextEdit控件学习:获取文本、添加文本

目录 1、QTextEdit控件介绍 2、QTextEdit控件添加文本、添加HTML格式 3、QTextEdit控件获取文本、获取HTML格式文本 4、案例 1&#xff09;完整代码 2&#xff09;效果 1、QTextEdit控件介绍 QTextEdit控件是一个支持多行输入的输入框&#xff0c;支持HTML进行格式的设置 2…