首页 > 其他分享 >前端css阴影画图

前端css阴影画图

时间:2024-03-06 17:23:17浏览次数:28  
标签:box loading 前端 50px 画图 getElementById shadow document css

在线演示地址:css阴影画图

一,在css中有一个box-shadow属性,可以设置元素的阴影。

.item{
    width: 50px;
    height: 50px;
    background: #009688;
    box-shadow: 50px 0 red, 100px 0px #000;
}

效果:

二,box-shadow可以添加多个。

.item{
    width: 50px;
    height: 50px;
    background: #009688;
    box-shadow: 50px 0 red, 100px 0px #000;/*增加了一个*/
}

变成了:

当box-shadow添加的越来越多的时候,就形成了一个个像素点,用不同的颜色根据位置进行拼接,那么就可以拼接成一张图片。

三,效果图。

三,代码封装。

利用这一特性,再将它封装一下,就可以实现上传图片生成css阴影图。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <label style='margin-top:20px;background:#009688;color:#fff;text-align:center;padding:10px;display: block;cursor: pointer;'>
        上传图片 <span id="loading" style="color:rgb(214, 202, 202)"></span> <input style="display:none;left:-9999px;position:absolute;" type="file" id="file-input">
      </label>
    <br>

   <p style="background:#FAFAFA;border-left: 5px solid #e05637;text-align: left;padding:20px;font-size:18px;"> <a href="https://www.zhangpingguo.com/" style='text-decoration: none;color:#000' target="_blank">张苹果博客:www.zhangpingguo.com</a></p>
   <p style="background:#FAFAFA;border-left: 5px solid #1E9FFF;text-align: left;padding:20px;font-size:18px;">标签样式:</p>
    
    <p id="myInput" style="
    width: 100%;
    height: 300px;
    overflow: auto;
"></p>
    
    <p style="background:#FAFAFA;border-left: 5px solid #1E9FFF;text-align: left;padding:20px;font-size:18px;">效果图:</p>
    <div id="pixelated-image" style="height: 100vh;"></div>

</body>
<script>
    // 获取文件输入框和像素化图片元素
    const fileInput = document.getElementById('file-input');
    const pixelatedImage = document.getElementById('pixelated-image');

    // 定义一个将 RGB 颜色值转换成十六进制颜色值的函数
    function rgbToHex(r, g, b) {
        var hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
        return hex;
    }

    // 给文件输入框添加 change 事件监听器
    fileInput.addEventListener('change', function () {
        // 获取用户选择的文件
        const file = fileInput.files[0];
        // 创建一个 FileReader 对象
        const reader = new FileReader();
        // 定义一个变量用于显示加载状态
        let loading = "";
        // 给 FileReader 对象添加 load 事件监听器
        reader.addEventListener('load', function () {
            // 创建一个 Image 对象
            const image = new Image();
            // 将 FileReader 对象读取的文件内容赋值给 Image 对象的 src 属性
            image.src = reader.result;
            // 显示加载状态
            loading = "正在生成中(图片越大就越慢,也可能会出问题.)...";
            document.getElementById("loading").innerText = loading;
            // 给 Image 对象添加 load 事件监听器
            image.addEventListener('load', function () {
               try {
                 // 创建一个 Canvas 对象
                 const canvas = document.createElement('canvas');
                // 设置 Canvas 对象的宽度和高度
                canvas.width = image.width;
                canvas.height = image.height;
                // 获取 Canvas 对象的 2D 上下文
                const context = canvas.getContext('2d');
                // 在 Canvas 对象上绘制图像
                context.drawImage(image, 0, 0);
                // 获取 Canvas 对象上的像素数据
                const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
                const pixels = imageData.data;
                let html = '';
                let i = 0;
                let boxShadow = '';
                // 遍历像素数据
                while (i < pixels.length) {
                    const r = pixels[i];
                    const g = pixels[i + 1];
                    const b = pixels[i + 2];
                    const a = pixels[i + 3];
                    // 如果像素的 alpha 值大于 0,则将该像素的颜色转换成十六进制颜色值,并将其添加到 boxShadow 变量中
                    if (a > 0) {
                        const x = (i / 4) % canvas.width;
                        const y = Math.floor(i / 4 / canvas.width);
                        boxShadow += `${x}px ${y}px ${rgbToHex(r,g,b)},`;
                    }
                    i += 4;
                }
                // 隐藏加载状态
                loading = "已完成";
                document.getElementById("loading").innerText = loading;
                // 将像素化后的图片添加到页面中
                html =
                    `<div style="box-shadow: ${boxShadow.slice(0, boxShadow.length - 1)};width:1px;height:1px;"></div>`;
                document.getElementById("myInput").innerText = html;
                pixelatedImage.innerHTML = html;
               } catch (error) {
                   loading = "出错了";
                document.getElementById("loading").innerText = loading;
               }
            });
        });
        // 读取用户选择的文件
        reader.readAsDataURL(file);
    });
</script>
</html>

可能有人要问了,这有什么用?我只能说:你说的对。

更多信息请访问:张苹果博客

标签:box,loading,前端,50px,画图,getElementById,shadow,document,css
From: https://www.cnblogs.com/zhangapple/p/18057060

相关文章

  • Nuxt3-tailwindcss使用
    Nuxt3使用 tailwindcss文档:https://www.tailwindcss.cn/docs/installation安装文档:https://tailwindcss.nuxtjs.org/getting-started/installation1、安装 @nuxtjs/tailwindcssyarnadd-D@nuxtjs/tailwindcss2、nuxt.config.ts中配置exportdefaultdefineNuxtConfig......
  • 前端工程化 项目工程环境自动打包上传服务器
    1.创建deploy.js放在package.json同一层级/***结合scp2和ssh2将build打包传到服务器*npminstallscp2--save-dev*npminstallssh2--save-dev**package.json中*scripts:{*"deploy":"npmrunbuild&&nodedeploy"*}*npmrundepl......
  • 前端学习-vue视频学习006-watch监视、watchEffect
    尚硅谷视频链接watch监视的5种情况情况1监视【ref】定义的【基本类型】数据<template><divclass="person"><h1>情况1:监视【ref】定义的【基本类型】数据</h1><h2>求和:{{sum}}</h2><button@click="changeSum">sum+1<......
  • 前端基础学习2 | JavaScript
    1、什么是JavaScript相关链接:https://baike.baidu.com/item/JavaScript/321142JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言,是用来控制网页行为的,它使得网页可交互。关于JavaScript有必要知道的事:1)JavaScript和Java是完全不同的语言,不论是概念还是设计,但是基础......
  • css div 三张背景图片
    cssdiv宽度1300高度46,同时给它设置三张背景图片堆叠同时显示,其一图片宽度1300高度46,铺满整个div且距离最左侧偏移22px,其二图片宽度44,高度43,在div的最左端,其三图片宽度83,高度43,在div的最右端,他们同时垂直居中在div中  .container{width:1300px;height:4......
  • 前端性能优化
    1、尽量不要使用第三方库,考虑是否可以通过代码实现,比如时间格式化,可以自己写代码实现指定格式的转换,不要使用第三方库来实现,这样可以减少打包代码的体积2、去除大的base64体积3、首屏数据尽量并行,让一些小的接口合并到其他接口,请求接口的时间包括三次握手的时间,这也是时间,合并到......
  • 前端基础学习1 | Web、Html、CSS
    前端基础学习1|Web、Html、CSS1、Web基础知识Web(wwwWorldWideWeb),全球广域网,也称万维网,能够通过浏览器访问的网站Web网站的工作流程Web标准,也称为网页标准,由一些列的标准组成,大部分由W3C(WorldWideWebConsortium,万维网联盟)负责制定。Web标准由三个部分组成:HTML:......
  • 前端 vite 的原理
    很多前端框VUEReact都是使用webpack打包为何使用vitewebpack打包很慢,热更不友好一个模块的变化导致整个项目的重新编译vite真正的按需加载:利用浏览器ESM支持,实现真正的按需加载原理由于ES6的在浏览器的支持ESM可以只实现在浏览器直接使用import发送http请求......
  • javaweb03-前端工程
    Ajax异步的Javascript和XML数据交换异步交互:在不重载页面的情况下,与服务器交换数据并更新部分网页Axios入门前后端分离开发需求分析->接口定义->前后端并行开发->测试->前后端联调开发YAPI接口管理平台前端工程化规范化、标准化前端开发环境准备vue-cli脚手架Vu......
  • 在vue项目中使用scss预处理器
    从Node.js12版本开始,`node-sass`被标记为不再维护,并且从npm上已经被移除。现在,推荐使用`sass`包替代`node-sass`。`sass`包是Sass的JavaScript实现,它比`node-sass`更快速、更现代化,并且与最新版本的DartSass兼容。在Vue项目中使用Sass,你应该安装sass包......