定位,画布,BFC的使用
来源:互联网 发布:数据的分散和集中程度 编辑:程序博客网 时间:2024/06/08 14:32
- 地图
- 画布
- BFC用法
地图
1)判断浏览器是否支持地理定位navigator.geolocation,Geolocation是window.navigator下面的一个对象, 该对象提供了实现地理位置定位的接口。
if (navigator.geolocation)
{
alert('ok')
}else{
alert('no')
}
2)getCurrentPosition(success,error,options)该方法是 实现地理定位的核心方法,该方法能够对获取到的 信息作出处理以及设置。
A.success(position) 获取信息成功的回调函数
B.error(errorcode)获取信息失败的回调函数
C.options获取信息前可以按照你的需求来设置一些参数
success(position) 获取信息成功的回调函数
当成功获得信息的时候,会自动调用success函数,而 这个函数会自动生成一个包含返回地理信息的position 对象,如下:
A.coords.latitude(纬度)
B.coords.longitude(经度)
<p id="p1"></p> <button onclick="getLocation()">click</button> <script type="text/javascript"> var p1=document.getElementById("p1") var localtion=navigator.geolocation; function getLocation() { if (localtion) { //支持 localtion.getCurrentPosition(showPostion) }else{ p1.innerHTML="你的浏览器不支持地理定位"; } } function showPostion(postion){ p1.innerText=postion.coords.latitude+" "+postion.coords.longitude; } </script>
错误演示
<script type="text/javascript"> var p1=document.getElementById("p1") var localtion=navigator.geolocation; function getLocation() { if (localtion) { //支持 localtion.getCurrentPosition(showPostion,showError) //1:success 2:error }else{ p1.innerHTML="你的浏览器不支持地理定位"; } } function showPostion(postion){ p1.innerText=postion.coords.latitude+" "+postion.coords.longitude; } function showError(error){ switch(error.code) { case error.PERMISSION_DENIED: p1.innerHTML="用户选择了不容许" break; case error.POSITION_UNAVAILABLE: p1.innerHTML="连不上GPS卫星或者网络中断." break; case error.TIMEOUT: p1.innerHTML="超时了 " break; case error.UNKNOWN_ERROR: p1.innerHTML="未知错误" break; } } </script>
画布
1)判断浏览器兼容问题
<canvas id="first"width="250" height="250" style="background-color:red;">
你的浏览器不支持 Canvas 标签
</canvas>
判断语句(也可这样进行判断浏览器的兼容问题)
var canvas = document.getElementById('first'); if (canvas.getContext){ alert("支持 <canvas> 标签"); } else { alert("不支持 <canvas> 标签"); }
2)首先获取 canvas 对象,然后调用 canvas 对象的 getContext 方法,这个方法目前只能传入参数 "2d"
var canvas = document.getElementById('first');
var ctx = canvas.getContext('2d');
3) canvas元素绘制图像的时候有两种方法,分别是
context.fill()//填充
context.stroke()//绘制边框
style:在进行图形绘制前,要设置好绘图的样式
context.fillStyle//填充的样式
context.strokeStyle//边框样式
利用画布绘制矩形
var canvas1=document.getElementById("first");
var cxt=canvas1.getContext("2d")
cxt.fillStyle="red"
cxt.fillRect(0,0,100,100)
4)画一个圆
context.arc(x, y, radius, startAngle, endAngle, anticlockwise);
这一共有 6 个参数. x 是圆心的横坐标, y 是圆心的纵坐标, radius 是半径, startAngle 是开始画圆的角度, endAngle 是结束画圆的角度, anticlockwise 是画圆方向。
如:100,100,30,0,Math.PI*2,true
圆弧中心的坐标x和坐标y、圆弧半径、起始角度、终止角度、是否逆时针。
弧长 Math.PI是半圆
Math.PI * 2是整个圆 0.5为四分之一
例1
var canvas = document.getElementById('first'); var ctx=canvas.getContext("2d") ctx.fillStyle="red" // ctx.beginPath(); ctx.arc(100,100,30,Math.PI * -1 / 4, Math.PI * 3 / 4,true); // ctx.closePath(); ctx.fill();
例2
var canvas1=document.getElementById("first"); var cxt=canvas1.getContext("2d") cxt.fillStyle="#FF0000"; cxt.beginPath(); cxt.arc(100,100,30,0,Math.PI*2,true); cxt.closePath(); cxt.fill();
5)关于闭合路径的实验
var canvas = document.getElementById('myCanvas'); var ctx=canvas.getContext("2d") ctx.beginPath(); ctx.arc(100,100, 50, 0, Math.PI ,1); ctx.closePath() ctx.strokeStyle="red" ctx.stroke();
6)关于扇形 var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); var startPoint=0; ctx.fillStyle = "red"; ctx.beginPath(); ctx.moveTo(200,150); ctx.arc(200,150,150,0,Math.PI/180*30,false); ctx.closePath() ctx.fill();
如:画一个折线
var canvas1=document.getElementById("first"); var cxt=canvas1.getContext("2d") cxt.strokeStyle="red"; cxt.beginPath(); cxt.moveTo(10,10); cxt.lineTo(150,150) cxt.stroke() cxt.closePath() cxt.beginPath(); cxt.moveTo(10,10); cxt.lineTo(150,250) cxt.stroke() cxt.closePath()
7)线性渐变
context.createLinearGradient(x0,y0,x1,y1)
介于 0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置。
其中 .createLinearGradient(0,0,170,0)
x0 渐变开始点的 x 坐标
y0 渐变开始点的 y 坐标
x1 渐变结束点的 x 坐标
y1 渐变结束点的 y 坐标
gradient.addColorStop("0","magenta");
stop--介于 0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置。
例1: 定义一个渐变(从上到下)作为矩形的填充样式:
var c=document.getElementById("first"); var ctx=c.getContext("2d"); var my_gradient=ctx.createLinearGradient(0,0,0,170); my_gradient.addColorStop(0,"black"); my_gradient.addColorStop(1,"white"); ctx.fillStyle=my_gradient; ctx.fillRect(0,0,150,100);
例2:定义一个从黑到红再到白的渐变,作为矩形的填充样式:
var c=document.getElementById("first"); var ctx=c.getContext("2d"); var my_gradient=ctx.createLinearGradient(0,0,170,0); my_gradient.addColorStop(0,"black"); my_gradient.addColorStop(0.5,"red"); my_gradient.addColorStop(1,"white"); ctx.fillStyle=my_gradient; ctx.fillRect(20,20,150,100);
例3:通过多个 addColorStop() 方法来定义渐变:
var c=document.getElementById("first"); var ctx=c.getContext("2d"); var grd=ctx.createLinearGradient(0,0,170,0); grd.addColorStop(0,"black"); grd.addColorStop("0.3","magenta"); grd.addColorStop("0.5","blue"); grd.addColorStop("0.6","green"); grd.addColorStop("0.8","yellow"); grd.addColorStop(1,"red"); ctx.fillStyle=grd; ctx.fillRect(20,20,150,100);
例4:
var c=document.getElementById("first"); var ctx=c.getContext("2d"); ctx.font="30px Verdana"; // 创建渐变 var gradient=ctx.createLinearGradient(0,0,c.width,0); gradient.addColorStop("0","magenta"); gradient.addColorStop("0.5","blue"); gradient.addColorStop("1.0","red"); // 用渐变进行填充 ctx.strokeStyle=gradient; ctx.strokeText("hello world!",10,50);
8)scale()缩放
var c=document.getElementById("first"); var ctx=c.getContext("2d"); ctx.strokeRect(5,5,25,15); ctx.scale(2,2); ctx.strokeRect(5,5,25,15); ctx.scale(2,2); ctx.strokeRect(5,5,25,15); ctx.scale(2,2); ctx.strokeRect(5,5,25,15);
9)rotate——旋转
语法:
context.rotate(angle);
ngle
旋转角度,以弧度计。
如需将角度转换为弧度,请使用 degrees*Math.PI/180 公式进行计算。
举例:
如需旋转 5 度,可规定下面的公式:5*Math.PI/180。
度数----弧度
Math.PI=180
Math.PI/180 ===1弧度
5*Math.PI/180===5弧度
如 将矩形旋转 20 度://将矩形中心点旋转20度
var c=document.getElementById("first"); var ctx=c.getContext("2d"); ctx.rotate(20*Math.PI/180); ctx.fillRect(50,20,100,50);
10)translate()平移
context.translate(x,y)
x-添加到水平x上的值
y-添加到水平y上的值
var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.fillRect(10,10,100,50); ctx.translate(70,70); ctx.fillRect(10,10,100,50);
**注意** :save()的意思是保存之前的状态,restore()之后就回到你save的那个时候的状态
var canvas1=document.getElementsByTagName("canvas")[0]; var ctx=canvas1.getContext("2d") ctx.save(); ctx.beginPath(); ctx.rotate(30*Math.PI/180); ctx.fillRect(50,20,100,50); ctx.closePath(); ctx.beginPath(); ctx.restore(); ctx.fillRect(60,70,100,50); ctx.closePath();
11)transform替换绘图的当前转换矩阵
通过 transform() 添加一个新的变换矩阵,再次绘制矩形;添加一个新的变换矩阵,然后再次绘制矩形。请注意,每当您调用 transform() 时,它都会在前一个变换矩阵上构建:
ctx.transform(1,0.5,-0.5,1,30,10);
a 水平缩放绘图
b 水平倾斜绘图
c 垂直倾斜绘图
d 垂直缩放绘图
e 水平移动绘图
f 垂直移动绘图
例:
var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.fillStyle="yellow"; ctx.fillRect(0,0,250,100) ctx.transform(1,0.5,-0.5,1,30,10); ctx.fillStyle="red"; ctx.fillRect(0,0,250,100); ctx.transform(1,0.5,-0.5,1,30,10); ctx.fillStyle="blue"; ctx.fillRect(0,0,250,100);
12) 渐变色创建文字
var canvas1=document.getElementById("first"); var ctx=canvas1.getContext("2d") ctx.font="30px Verdana"; var gradient=ctx.createLinearGradient(0,0,180,0); gradient.addColorStop("0","magenta"); gradient.addColorStop("0.5","blue"); gradient.addColorStop("1.0","red"); ctx.fillStyle=gradient; ctx.fillText("w3school.com.cn",10,90);
13)关于图像
var img = new Image(); // Create new Image object
img.src = 'myImage.png'; // Set source path
当脚本执行后,图片开始装载。若调用 drawImage 时,图片没装载完,脚本会等待直至装载完毕。如果不希望这样,可以使用 onload 事件: var ctx = document.getElementById('myCanvas').getContext('2d'); var img = new Image(); img.src = 'oneeye.jpg'; img.onload = function() { ctx.drawImage(img,0,0); ctx.beginPath(); } }
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
ctx.drawImage(img,0,0,200,200);
width 可选。要使用的图像的宽度。(伸展或缩小图像)
height 可选。要使用的图像的高度。(伸展或缩小图像)
var myImage=document.getElementById("myCanvas"); var cxt=myImage.getContext("2d"); var img=new Image(); img.src="ji.png"; img.onload = function() { cxt.drawImage(img,0,0,50,50); cxt.drawImage(img,30,30,50,50); cxt.drawImage(img,60,60,50,50); }
14)图像的剪贴
img 规定要使用的图像、画布或视频。
sx 可选。开始剪切的 x 坐标位置。
sy 可选。开始剪切的 y 坐标位置。
swidth 可选。被剪切图像的宽度。
sheight 可选。被剪切图像的高度。
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
width 可选。要使用的图像的宽度。(伸展或缩小图像)
height 可选。要使用的图像的高度。(伸展或缩小图像)
例:
var canvas1=document.getElementById("myCanvas") var ctx=canvas1.getContext("2d"); var img=new Image(); img.src='wode.gif' img.onload=function(){ ctx.drawImage(img,10,10,30,30,50,50,100,100); }
BFC
BFC 定义
BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
BFC布局规则:
1、内部的Box会在垂直方向,一个接一个地放置。
2、Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
3、每个元素的margin box的左边, 与包含块border box的左边相接触(对于从 左往右的格式化,否则相反)。即使存在浮动也是如此。
4、BFC的区域不会与float box重叠。
5、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元 素。反之也如此。
6、计算BFC的高度时,浮动元素也参与计算
哪些元素会生成BFC?
根元素
float属性不为none
position为absolute或fixed
display为inline-block, table-cell, table-caption, flex, inline-flex
overflow不为visible
例1 :做一个侧边栏目但是被包含了
<div class="aside"></div> <div class="main"></div> .aside { width: 100px; height: 150px; float: left; background: #f66; } .main { height: 200px; background: #fcc; } ---------------------------------- 是不是出问题了呢? --触发BFC .main { height: 200px; background: #fcc; overflow: hidden; }
例2:上边距重叠问题
.main{ background-color: darkgrey; width: 700px; } .first{ margin-top: 100px; width: 50px; height: 50px; background-color: #000000; } .second{ width: 50px; height: 50px; background-color: blue; } <div class="main"> <div class="first"></div> <div class="second"></div> </div>
margin-top: 100px;---这句话如果加上和没加有什么区别呢 ------------BFC的区域不会与float box重叠 用main触发BFC
例3:影响别的元素
.main{ background-color: darkgrey; width: 700px; } .first{ width: 50px; height: 50px; background-color: #000000; } .second{ width: 50px; height: 50px; background-color: blue; margin-left: 800px; }
当我们给main里边的元素设置了过多的值800px的时候,势必会印象外边的东西
当我们设置了BFC的时候,就不会发生这种情况-------------------BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素
例4:文字围绕问题
.box {width:210px;border: 1px solid #000;float: left;} .img {width: 100px;height: 100px;background: #696;float: left;} .info {background: #ccc;color: #fff;} <div class="box"> <div class="img">image</div> <p class="info">hello world</p> </div> 当文字变多的时候会发生什么事情呢? 我们发现,文字环绕了---这很忧伤 这时候我们可以单独为P出发我们的BFC .info {background: #ccc;color: #fff;overflow: hidden}
例5:float之后的元素没有撑开我们的盒子
<div class="par"> <div class="child"></div> <div class="child"></div> </div> .par { border: 5px solid #fcc; width: 300px; } .child { border: 5px solid #f66; width:100px; height: 100px; float: left; } 发生了什么?float之后的元素没有撑开我们的盒子,而我们的原则,计算BFC的高度时,浮动元素也参与计算 .par { border: 5px solid #fcc; width: 300px; overflow: hidden; }
触发BFC
例6:元素margin重叠 p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align:center; margin: 100px; } <p>Haha</p> <p>Hehe</p> 出问题了,BFC里边元素margin重叠了 <p>Haha</p> <div class="wrap"> <p>Hehe</p> </div> .wrap { overflow: hidden; }
0 0
- 定位,画布,BFC的使用
- Canvas(画布)的使用
- canvas画布的使用
- 一种基于画布的绝对定位方法
- 水墨画布(InkCanvas)的使用
- H5的canvas画布使用
- 浮动、定位以及bfc、ifc
- CSS定位规则之BFC
- 17个使用Html5画布的实验
- HTML5-Canvas画布的使用
- Canvas(画布)类的使用
- canvas scale()画布缩放的使用
- CSS定位规则之BFC 你竟然一直不知道的东西!!!!!
- 浮动与定位、bfc和ifc
- BFC的原理
- bfc的一些应用
- 关于BFC的总结
- 理解css的BFC
- 这件事如何引发李连杰、高晓松、吴莫愁共同参与?
- spring4mvc+hibernate4整合
- JavaScript高级程序设计之引用类型之单体内置对象之Global对象第5.7.1讲笔记
- next_permutation
- HDU 5479 Scaena Felix
- 定位,画布,BFC的使用
- 杭电OJ -- 2084 数塔(动态规划)
- 如何查找openCV函数源代码
- 操作系统基础
- linux下aio异步读写详解与实例
- proto如何做到节省空间。
- Surrounded Regions
- v4l2—media framework媒体框架
- iOS中两种管理状态栏