2024-08-27



// 创建一个新的WebSocket实例
var ws = new WebSocket('ws://www.example.com/socketserver');
 
// 当WebSocket的readyState变为OPEN时,表示连接已建立,可以发送信息
ws.onopen = function(event) {
    console.log('WebSocket 连接已打开');
    // 发送一个初始化消息给服务器
    ws.send('初始化连接');
};
 
// 当服务器发送信息过来时,会触发onmessage事件
ws.onmessage = function(event) {
    console.log('收到消息: ' + event.data);
};
 
// 当WebSocket的连接关闭时,会触发onclose事件
ws.onclose = function(event) {
    console.log('WebSocket 连接已关闭');
};
 
// 当WebSocket通信发生错误时,会触发onerror事件
ws.onerror = function(event) {
    console.error('WebSocket 通信发生错误');
};
 
// 当你需要关闭WebSocket连接时,可以调用close方法
// ws.close();

这段代码演示了如何创建一个WebSocket连接,并为连接、接收消息、关闭连接以及通信错误定义了处理函数。这是实现WebSocket实时通信的基本用法。

2024-08-27

在HTML5中,可以使用<canvas>元素来绘制图形。以下是使用JavaScript在<canvas>元素中绘制一个简单花卉图案的示例代码:




<!DOCTYPE html>
<html>
<body>
<canvas id="myCanvas" width="250" height="250" style="border:1px solid #000000;"></canvas>
 
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
 
// 绘制花卉
function drawFlower(centerX, centerY, radius, petals, color) {
    ctx.beginPath();
    ctx.moveTo(centerX, centerY);
    for (var i = 0; i < petals; i++) {
        var radians = (i / petals) * 2 * Math.PI;
        var newX = centerX + Math.cos(radians) * radius;
        var newY = centerY + Math.sin(radians) * radius;
        ctx.lineTo(newX, newY);
    }
    ctx.closePath();
    ctx.fillStyle = color;
    ctx.fill();
}
 
// 调用函数绘制花卉
drawFlower(125, 125, 50, 5, 'pink');
</script>
 
</body>
</html>

这段代码定义了一个drawFlower函数,它接受中心点坐标centerX, centerY,花瓣半径radius,花瓣数量petals,以及颜色color作为参数,并绘制出一个五角星形的花卉。你可以根据需要调整参数来绘制不同大小和形状的花卉。

2024-08-27

CSS可以通过设置容器的宽度或高度,并保持图片的宽高比来实现图片等比缩放。使用 max-widthmax-height 属性可以防止图片被拉伸变形。

以下是实现图片等比缩放的CSS代码示例:




.img-container {
  display: block;
  max-width: 100%; /* 限制图片最大宽度不超过其容器的宽度 */
  max-height: 100%; /* 限制图片最大高度不超过其容器的高度 */
  width: auto; /* 宽度自动,保持图片原始宽高比 */
  height: auto; /* 高度自动,保持图片原始宽高比 */
}

HTML中使用该样式:




<div class="img-container">
  <img src="path/to/your/image.jpg" alt="描述文字">
</div>

在这个例子中,.img-container 是一个包裹图片的容器,它将限制图片的最大宽度和高度,不超过自身的尺寸,并且保持图片原始的宽高比。当你调整 .img-container 的大小时,图片会自动调整大小以保持其等比例。

2024-08-26

在Canvas中,要实现图像的原地旋转,你需要使用translate方法将坐标系原点移到图像的中心,然后使用rotate方法进行旋转,最后使用translate方法将坐标系恢复到原来的位置,并绘制图像。

以下是一个简单的JavaScript示例,展示了如何在Canvas上实现图像的原地旋转:




const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const image = new Image();
 
image.onload = function() {
  // 保存当前状态
  ctx.save();
 
  // 将坐标系原点移到图像中心
  ctx.translate(canvas.width / 2, canvas.height / 2);
 
  // 旋转图像
  ctx.rotate(Math.PI / 4); // 旋转45度
 
  // 将坐标系恢复到旋转前的位置
  ctx.translate(-canvas.width / 2, -canvas.height / 2);
 
  // 绘制旋转后的图像
  ctx.drawImage(image, canvas.width / 2 - image.width / 2, canvas.height / 2 - image.height / 2);
 
  // 恢复之前保存的状态
  ctx.restore();
};
 
image.src = 'path_to_your_image.jpg'; // 替换为你的图片路径

在这个例子中,图像会以其自身的中心点为旋转中心进行原地旋转。首先,我们保存了Canvas的状态,然后移动坐标系,进行旋转,再将坐标系恢复,最后绘制图像。这样图像就会原地旋转,而不会移动。

2024-08-26

在Android中,你可以通过WebView的addJavascriptInterface方法将一个Java对象绑定到WebView的JavaScript环境中。然后在H5页面中调用这个对象的方法,从而触发相机或相册的Intent。

以下是实现这一功能的示例代码:

Java对象绑定到WebView的代码:




public class WebAppInterface {
    Context mContext;
 
    WebAppInterface(Context c) {
        mContext = c;
    }
 
    @JavascriptInterface
    public void openCamera() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(mContext.getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
 
    @JavascriptInterface
    public void openGallery() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST_IMAGE_PICK);
    }
}
 
webView.addJavascriptInterface(new WebAppInterface(this), "Android");

在H5页面中调用:




function openCamera() {
    Android.openCamera();
}
 
function openGallery() {
    Android.openGallery();
}

确保在AndroidManifest.xml中添加了相应的权限:




<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

以上代码中REQUEST_IMAGE_CAPTUREREQUEST_IMAGE_PICK是你用于识别Activity结果的回调代码,需要在Activity中重写onActivityResult方法来处理拍照或者从相册中选择图片后的回传。

2024-08-26



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Masking Effect</title>
    <style>
        body {
            margin: 0;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            background: #2e2e2e;
        }
        .container {
            position: relative;
            width: 800px;
            height: 600px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        .container img {
            position: absolute;
            width: 100%;
            height: 100%;
            mask-image: linear-gradient(45deg, #000 60%, transparent 60%), linear-gradient(135deg, #000 60%, transparent 60%);
            mask-size: 200%, 200%;
            mask-repeat: no-repeat;
            mask-position: -100px -100px, 100px 100px;
        }
        .container .masked {
            position: absolute;
            width: 100%;
            height: 100%;
            mix-blend-mode: multiply;
        }
    </style>
</head>
<body>
    <div class="container">
        <img src="image.jpg" alt="Original Image">
        <img src="mask.png" alt="Mask" class="masked">
    </div>
</body>
</html>

这个代码实例展示了如何使用CSS的mask属性和mix-blend-mode属性创建一个简单的图片遮罩效果。.container是一个相对定位的容器,其中包含了两个img元素。第一个img元素是原始图片,使用CSS的mask属性进行遮罩处理。第二个img元素是遮罩图片,通过class="masked"与原始图片一起进行遮罩。

2024-08-26

Fabric.js是一个用于HTML5 canvas元素的javascript库,它可以让你创建、控制和操作canvas对象。Fabric.js提供了一些基本对象,如矩形、圆形、文本等,还可以添加自定义的对象。

以下是一些Fabric.js的常用示例:

  1. 创建一个矩形:



var canvas = new fabric.Canvas('c');
var rect = new fabric.Rect({
  left: 100,
  top: 100,
  fill: 'red',
  width: 20,
  height: 20
});
canvas.add(rect);
  1. 创建一个圆形:



var canvas = new fabric.Canvas('c');
var circle = new fabric.Circle({
  radius: 20,
  fill: 'green',
  left: 100,
  top: 100
});
canvas.add(circle);
  1. 添加文本:



var canvas = new fabric.Canvas('c');
var text = new fabric.Text('Hello World', {
  left: 100,
  top: 100,
  fontSize: 20
});
canvas.add(text);
  1. 添加图片:



var canvas = new fabric.Canvas('c');
fabric.Image.fromURL('my_image.png', function(img) {
  img.set({ left: 100, top: 100, width: 200, height: 200 });
  canvas.add(img);
});
  1. 设置对象的交互性:



var canvas = new fabric.Canvas('c');
var circle = new fabric.Circle({
  radius: 20,
  fill: 'green',
  left: 100,
  top: 100
});
circle.hasControls = true;
circle.hasBorders = true;
canvas.add(circle);
  1. 设置对象的选择边框:



var canvas = new fabric.Canvas('c');
var circle = new fabric.Circle({
  radius: 20,
  fill: 'green',
  left: 100,
  top: 100
});
circle.hasControls = true;
circle.hasBorders = true;
canvas.add(circle);
canvas.setActiveObject(circle);
  1. 移动对象:



var canvas = new fabric.Canvas('c');
var circle = new fabric.Circle({
  radius: 20,
  fill: 'green',
  left: 100,
  top: 100
});
canvas.add(circle);
circle.set({ left: 200, top: 200 });
canvas.renderAll();
  1. 缩放对象:



var canvas = new fabric.Canvas('c');
var circle = new fabric.Circle({
  radius: 20,
  fill: 'green',
  left: 100,
  top: 100
});
canvas.add(circle);
circle.set({ scaleX: 2, scaleY: 2 });
canvas.renderAll();
  1. 旋转对象:



var canvas = new fabric.Canvas('c');
var circle = new fabric.Circle({
  radius: 20,
  fill: 'green',
  left: 100,
  top: 100
});
canvas.add(circle);
circle.set({ angle: 45 });
canvas.renderAll();
  1. 删除对象:



var canvas = new fabric.Canvas('c');
var circle = new fabric.Circle({
  radius: 20,
  fill: 'green',
  left: 100,
  top: 1
2024-08-26



<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>高德地图API位置定位示例</title>
    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=您的高德API_KEY"></script>
    <script type="text/javascript">
        var map, geolocation;
        //加载地图,调用浏览器定位服务
        map = new AMap.Map('container', {
            resizeEnable: true
        });
        map.plugin('AMap.Geolocation', function() {
            geolocation = new AMap.Geolocation({
                enableHighAccuracy: true, //是否使用高精度定位,默认:true
                timeout: 10000           //超过10秒后停止定位,默认:5s
            });
            geolocation.getCurrentPosition();
            AMap.event.addListener(geolocation, 'complete', onComplete); //返回定位信息
            AMap.event.addListener(geolocation, 'error', onError);      //返回定位出错信息
        });
        //解析定位结果
        function onComplete(data) {
            var str = ['定位成功'];
            str.push('经度:' + data.position.getLng());
            str.push('纬度:' + data.position.getLat());
            if (data.accuracy) {
                str.push('精度:' + data.accuracy + ' 米');
            }
            //如为IP定位结果则无经纬度
            if (data.position.getLng() && data.position.getLat()) {
                map.setCenter(data.position); //设定地图中心点
            } else {
                str.push('IP定位成功');
            }
        }
        //返回定位出错信息
        function onError(data) {
            document.getElementById('tip').innerHTML = '定位失败';
        }
    </script>
</head>
<body>
<div id="container" style="height:500px;width:500px;"></div>
<div id="tip"></div>
</body>
</html>

在这段代码中,我们首先引入了高德地图API,并在head标签内包含了地图初始化和定位的JavaScript代码。在body标签内,我们有一个id为container的div,这是地图将要渲染的容器。onError函数用于在定位失败时显示错误信息,而onComplete函数则用于解析定位数据,并在定位成功时将地图中心设置为定位所得的位置。这个示例展示了如何在网页中集成高德地图API并实现定位功能。

2024-08-26

Server-Sent Events(SSE)允许网页获得来自服务器的更新。与传统的HTTP请求-响应会话不同,SSE是单向的,只允许服务器向客户端发送数据。SSE使用Content-Type为"text/event-stream"的HTTP协议。

以下是一个简单的HTML和JavaScript示例,展示了如何使用SSE:




<!DOCTYPE html>
<html>
<head>
    <title>Server-Sent Events Example</title>
</head>
<body>
    <div id="message"></div>
    <script>
        if(typeof(EventSource) !== "undefined") {
            var source = new EventSource("sse.php");
            source.onmessage = function(event) {
                document.getElementById("message").innerHTML += event.data + "<br>";
            };
        } else {
            document.getElementById("message").innerHTML = "Sorry, your browser does not support server-sent events...";
        }
    </script>
</body>
</html>

以下是服务器端的PHP示例代码,假设服务器端支持SSE:




<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
 
$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();

在这个例子中,浏览器打开一个到服务器的SSE连接,然后服务器源源不断地发送时间更新。这个过程是持久的,直到连接关闭。这种方式可以用来实现实时更新的应用,比如实时新闻,实时股票价格等。

2024-08-25

VSCode自带格式化功能,可以通过快捷键或者在设置中配置自动保存来实现。

  1. 快捷键格式化:

    • 在Windows/Linux上,使用 Shift + Alt + F 或者在设置中搜索 format 找到 editor.formatOnType 并启用。
    • 在macOS上,使用 Cmd + Shift + F 或者在设置中搜索 format 找到 editor.formatOnType 并启用。
  2. 开启自动保存:

    • 打开设置(File > Preferences > SettingsCode > Preferences > Settings)。
    • 在搜索框中输入 auto save
    • 选择 editor.formatOnSave 并启用。

如果你想要在保存文件时自动格式化CSS,可以在VSCode的设置中添加以下配置:




{
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.fixAll": true
  }
}

这样,每次保存文件时,VSCode都会自动应用格式化和代码修复。如果你使用的是CSS预处理器如SCSS或LESS,确保你安装了相应的扩展,如SassLESS,这样VSCode才能识别文件格式并进行格式化。