返回顶部
首页 > 资讯 > 精选 >JS如何实现一个可以当镜子照的Button
  • 865
分享到

JS如何实现一个可以当镜子照的Button

2023-07-05 09:07:05 865人浏览 薄情痞子
摘要

本篇内容介绍了“js如何实现一个可以当镜子照的Button”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mediaDevices 的介绍在

本篇内容介绍了“js如何实现一个可以当镜子照的Button”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    mediaDevices 的介绍

    在 MDN 中可以看到 mediaDevices 的介绍:

    JS如何实现一个可以当镜子照的Button

    可以用来获取摄像头、麦克风、屏幕等。

    它有这些 api

    JS如何实现一个可以当镜子照的Button

    getDisplayMedia 可以用来录制屏幕,截图。

    getUserMedia 可以获取摄像头、麦克风的输入。

    JS如何实现一个可以当镜子照的Button

    我们这里用到getUserMedia 的 api

    它要指定音频和视频的参数,开启、关闭、分辨率、前后摄像头啥的:

    JS如何实现一个可以当镜子照的Button

    这里我们把 video 开启,把 audio 关闭。

    也就是这样:

    navigator.mediaDevices.getUserMedia({    video: true,    audio: false,}).then((stream) => {    //...}).catch(e => {    console.log(e)})

    把获取到的 stream 用一个 video 来展示

    navigator.mediaDevices.getUserMedia({    video: true,    audio: false,}).then((stream) => {  const video = document.getElementById('video');  video.srcObject = stream;  video.onloadedmetadata = () => {    video.play();  };}).catch((e) => console.log(e));

    通过 CSS 的 filter 来加点感觉:

    比如加点 blur:

    video {  filter: blur(10px);}

    加点饱和度:

    video {  filter: saturate(5)}

    或者加点亮度:

    video: {  filter: brightness(3);}

    filter 可以组合,调整调整达到这样的效果就可以了:

    video {  filter: blur(2px) saturate(0.6) brightness(1.1);}

    然后调整下大小:

    video {  width: 300px;  height: 100px;  filter: blur(2px) saturate(0.6) brightness(1.1);}

    你会发现视频的画面没有达到设置的宽高。

    这时候通过 object-fit 的样式来设置:

    video {  width: 300px;  height: 100px;  object-fit: cover;  filter: blur(2px) saturate(0.6) brightness(1.1);}

    cover 是充满容器,但画面显示的位置不大对,看不到脸。我想显示往下一点的画面怎么办呢?

    可以通过 object-position 来设置:

    video {  width: 300px;  height: 100px;  object-fit: cover;  filter: blur(2px) saturate(0.6) brightness(1.1);  object-position: 0 -100px;}

    y 向下移动 100 px ,画面显示的位置就对了。

    其实现在还有一个特别隐蔽的问题,不知道大家发现没,就是方向是错的。照镜子的时候应该左右翻转才对。

    所以加一个 scaleX(-1),这样就可以绕 x 周反转了。

    video {  width: 300px;  height: 100px;  object-fit: cover;  filter: blur(2px) saturate(0.6) brightness(1.1);  object-position: 0 -100px;  transfORM: scaleX(-1);}

    这样就是镜面反射的感觉了。

    然后再就是 button 部分,这个我们倒是经常写:

    function Button({ children }) {  const [buttonPressed, setButtonPressed] = useState(false);  return (    <div      className={`button-wrap ${buttonPressed ? "pressed" : null}`}    >      <div        className={`button ${buttonPressed ? "pressed" : null}`}        onPointerDown={() => setButtonPressed(true)}        onPointerUp={() => setButtonPressed(false)}      >         <video/>      </div>      <div className="text">{children}</div>    </div>  );}

    这里我用 jsx 写的,点击的时候修改 pressed 状态,设置不同的 class。

    样式部分

    :root {  --transition: 0.1s;  --border-radius: 56px;}.button-wrap {  width: 300px;  height: 100px;  position: relative;  transition: transform var(--transition), box-shadow var(--transition);}.button-wrap.pressed {  transform: translateZ(0) scale(0.95);}.button {  width: 100%;  height: 100%;  border: 1px solid #fff;  overflow: hidden;  border-radius: var(--border-radius);  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.25), 0px 8px 16px rgba(0, 0, 0, 0.15),    0px 16px 32px rgba(0, 0, 0, 0.125);  transform: translateZ(0);  cursor: pointer;}.button.pressed {  box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.5), 0px 1px 1px rgba(0, 0, 0, 0.5);}.text {  position: absolute;  left: 50%;  top: 50%;  transform: translate(-50%, -50%);  pointer-events: none;  color: rgba(0, 0, 0, 0.7);  font-size: 48px;  font-weight: 500;  text-shadow:0px -1px 0px rgba(255, 255, 255, 0.5),0px 1px 0px rgba(255, 255, 255, 0.5);}

    这种 button 大家写的很多了,也就不用过多解释。

    要注意的是 text 和 video 都是绝对定位来做的居中。

    阴影的设置

    阴影的 4 个值是 x、y、扩散半径、颜色。

    我设置了个多重阴影:

    JS如何实现一个可以当镜子照的Button

    然后再改成不同透明度的黑就可以了:

    JS如何实现一个可以当镜子照的Button

    再就是按下时的阴影,设置了上下位置的 1px 黑色阴影:

    .button.pressed {  box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.5), 0px 1px 1px rgba(0, 0, 0, 0.5);}

    同时,按下时还有个 scale 的设置

    再就是文字的阴影,也是上下都设置了 1px 阴影,达到环绕的效果:

    text-shadow:0px -1px 0px rgba(255, 255, 255, 0.5),0px 1px 0px rgba(255, 255, 255, 0.5);

    最后,把这个 video 嵌进去就行了。

    完整代码

    import React, { useState, useEffect, useRef } from "react";import "./button.css";function Button({ children }) {  const reflectionRef = useRef(null);  const [buttonPressed, setButtonPressed] = useState(false);  useEffect(() => {    if (!reflectionRef.current) return;    navigator.mediaDevices.getUserMedia({        video: true,        audio: false,    })    .then((stream) => {        const video = reflectionRef.current;        video.srcObject = stream;        video.onloadedmetadata = () => {        video.play();        };    })    .catch((e) => console.log(e));  }, [reflectionRef]);  return (    <div      className={`button-wrap ${buttonPressed ? "pressed" : null}`}    >      <div        className={`button ${buttonPressed ? "pressed" : null}`}        onPointerDown={() => setButtonPressed(true)}        onPointerUp={() => setButtonPressed(false)}      >        <video          className="button-reflection"          ref={reflectionRef}        />      </div>      <div className="text">{children}</div>    </div>  );}export default Button;
    body {  padding: 200px;}:root {  --transition: 0.1s;  --border-radius: 56px;}.button-wrap {  width: 300px;  height: 100px;  position: relative;  transition: transform var(--transition), box-shadow var(--transition);}.button-wrap.pressed {  transform: translateZ(0) scale(0.95);}.button {  width: 100%;  height: 100%;  border: 1px solid #fff;  overflow: hidden;  border-radius: var(--border-radius);  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.25), 0px 8px 16px rgba(0, 0, 0, 0.15),    0px 16px 32px rgba(0, 0, 0, 0.125);  transform: translateZ(0);  cursor: pointer;}.button.pressed {  box-shadow: 0px -1px 1px rgba(0, 0, 0, 0.5), 0px 1px 1px rgba(0, 0, 0, 0.5);}.text {  position: absolute;  left: 50%;  top: 50%;  transform: translate(-50%, -50%);  pointer-events: none;  color: rgba(0, 0, 0, 0.7);  font-size: 48px;  font-weight: 500;  text-shadow:0px -1px 0px rgba(255, 255, 255, 0.5),0px 1px 0px rgba(255, 255, 255, 0.5);}.text::selection {  background-color: transparent;}.button .button-reflection {  width: 100%;  height: 100%;  transform: scaleX(-1);  object-fit: cover;  opacity: 0.7;  filter: blur(2px) saturate(0.6) brightness(1.1);  object-position: 0 -100px;}

    “JS如何实现一个可以当镜子照的Button”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: JS如何实现一个可以当镜子照的Button

    本文链接: https://lsjlt.com/news/350768.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • JS实现一个可以当镜子照的 Button
      目录正文mediaDevices 的介绍我们这里用到getUserMedia 的 api把获取到的 stream 用一个 video 来展示样式部分阴影的设置完整代码总结正文 最近...
      99+
      2023-03-06
      JS镜子Button JS Button
    • JS如何实现一个可以当镜子照的Button
      本篇内容介绍了“JS如何实现一个可以当镜子照的Button”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mediaDevices 的介绍在 ...
      99+
      2023-07-05
    • js如何实现一个戴眼镜的笑脸
      这篇文章主要介绍了js如何实现一个戴眼镜的笑脸,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先我给大家一个图片示例:大家可以根据这个图来编...
      99+
      2024-04-02
    • 利用Vue3实现一个可以用js调用的组件
      目录前言一、常规Vue组件1. 组件主要代码:2. 使用方式3. 实现效果二、改为js调用组件1. 实现步骤:2. 具体实现代码:3. 实现效果展示总结前言 项目开发中基本都会用到...
      99+
      2024-04-02
    • js如何实现一个isNaN函数
      这篇文章主要介绍了js如何实现一个isNaN函数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。自己实现一个 isNaN 函数这里利用了 NaN 值的一个特性,即 NaN 是整...
      99+
      2023-06-27
    • php 如何一次实现多个照片上传
      这篇文章主要介绍了php 如何一次实现多个照片上传,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php一次实现多个照片上传的方法:1、创建index.html文件;2、创建连...
      99+
      2023-06-22
    • JS如何实现一个单文件组件
      目录概述单文件组件基本概念简单的loader解析组件内容注册组件获取脚本内容DataURI和ObjectURI动态导入实现行为层兼容性问题及其他概述 前端开发人员只要了解过vue.j...
      99+
      2024-04-02
    • 如何用js实现一个拖拽效果
      这篇文章主要介绍“如何用js实现一个拖拽效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用js实现一个拖拽效果”文章能帮助大家解决问题。.markdown-body{word-break:br...
      99+
      2023-07-05
    • Python如何实现可可爱爱的小粽子
      建立两个精灵并搭建背景元素粽子和爱心先是建立一个粽子对象,也就是一个精灵,类里面需要继承pygame.sprite.Sprite类,这是碰撞模块的重要部分。update函数是控制粽子方向,并防止粽子跑出边界,当粽子触碰到边界时出发...
      99+
      2023-05-14
      Python
    • python如何实现一个摇骰子小游戏
      这篇文章将为大家详细讲解有关python如何实现一个摇骰子小游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、程序实现分析问题:骰子比大小是我们经常玩的一个小游戏也十分的简单,就是不同玩家骰子点数比较...
      99+
      2023-06-28
    • js如何实现一个Canvas统计图插件
      小编给大家分享一下js如何实现一个Canvas统计图插件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先说下实现的功能吧:  1...
      99+
      2024-04-02
    • js如何实现一条语句多个变量
      这篇文章将为大家详细讲解有关js如何实现一条语句多个变量,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一条语句,多个变量您可以在一条语句中声明许多变量。以 var 作为语...
      99+
      2024-04-02
    • 如何实现一个可以显示c盘-z盘的批处理bat文件
      小编给大家分享一下如何实现一个可以显示c盘-z盘的批处理bat文件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!@echo off set disk=cdefghijklmnopqrstuvw...
      99+
      2023-06-09
    • Vue如何实现一个可复用组件
      本篇内容主要讲解“Vue如何实现一个可复用组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue如何实现一个可复用组件”吧!构成组件组件,是一个具有一定功能,且不同组件间功能相对独立的模块。组...
      99+
      2023-07-04
    • 使用QT如何实现一个五子棋游戏
      今天就跟大家聊聊有关使用QT如何实现一个五子棋游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。FIR.pro QT    &nbs...
      99+
      2023-06-15
    • 如何设计一个可维护的MySQL表结构来实现电子商务功能?
      如何设计一个可维护的MySQL表结构来实现电子商务功能?电子商务在现代社会中得到了广泛的应用和发展。而一个成功的电子商务平台离不开一个合理、可维护的数据库表结构来支撑其功能和业务流程。在本文中,将详细介绍如何设计一个可维护的MySQL表结构...
      99+
      2023-10-31
      可维护性 电子商务功能 MySQL表结构设计
    • js中如何实现一个获取页面ip的正则
      这篇文章将为大家详细讲解有关js中如何实现一个获取页面ip的正则,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。示例如下Javascrīpt:var arr=do...
      99+
      2024-04-02
    • Golang如何实现一个不可复制类型
      这篇文章主要讲解了“Golang如何实现一个不可复制类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang如何实现一个不可复制类型”吧!如何复制一个对象不考虑IDE提供的代码分析和g...
      99+
      2023-07-05
    • css如何实现以一个点为定点旋转
      本文小编为大家详细介绍“css如何实现以一个点为定点旋转”,内容详细,步骤清晰,细节处理妥当,希望这篇“css如何实现以一个点为定点旋转”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。css以一个点为定点旋转的方法...
      99+
      2023-07-05
    • php如何实现点击删除去删除一个帖子
      本篇内容介绍了“php如何实现点击删除去删除一个帖子”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、代码实现前台代码在前台代码中,我们需要...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作