Наложение прозрачного круга на предварительный просмотр веб-камеры в браузере

#javascript #html #css #reactjs #svg

#javascript #HTML #css — код #reactjs #svg #css

Вопрос:

Я пытаюсь разместить наложение на веб-камеру в браузере с круглым прозрачным отверстием внутри него. Что-то вроде этого:- https://i.stack.imgur.com/HnDLY.png

Я попробовал следующие решения:-

  • Создал значок svg с использованием маски svg, однако я не могу добиться отзывчивости с помощью этого решения для разных размеров браузера. Связанная ссылка на codepen.
 **JS**
    const svgIcon = () => (
    <svg className="svg" viewbox="0 0 100 100" width="100%" height="100%">
        <defs>
           <mask id="mask" x="0" y="0" width="3000" height="3000">
              <rect x="0" y="0" width="3000" height="3000" fill="#fff"/>
              <circle cx="250" cy="200" r="110" />
           </mask>
        </defs>
        <rect x="0" y="0" width="3000" height="3000" mask="url(#mask)" fill-opacity="0.9"/>  
        </svg>
    );
        
    const App = () => (
    <div className="app">
       <Webcam id="webcam" audio={false}/>
       {svgIcon()}
    </div>
    );
        
   ReactDOM.render(
       <App />,
       document.getElementById('root')
   );

**CSS**

.app {
  position: relative;
  float: left;
}

.svg {
  position: absolute;
  left: 0px
}

#webcam {
  width:500px;
  height:400px;
}

#mask {
  position: absolute;
}

**HTML**

<div id="root"></div>

  
  • Пробовал использовать как теневой, так и радиально-градиентный подход, но, похоже, он плохо работает с веб-камерой. Связанная ссылка на codepen
 
**JS**
const Overlay = () => (
  <div className="circle"/>
);

const App = () => (
  <div className="popup">
    <Webcam audio={false}/>
    <Overlay />
  </div>
);

ReactDOM.render(
  <App />,
  document.getElementById('root')
);

**CSS**

* {box-sizing: border-box;}

body {
  min-height: 100vh;
  padding: 10px;
  margin: 0;
}

.popup {
  justify-content: center;
  align-items: center;
  position: relative;
  overflow: hidden;
  display: flex;
}

.circle {
  position: absolute;
  background: radial-gradient(circle at center, transparent 25%, black 25.5%);
  background-size: 100% 100%;
  background-position: 50% 50%;
  border-radius: 100%;
  height: 800px;
  width: 800px;
}

**HTML**

<div id="root"></div>

  

Может кто-нибудь, пожалуйста, помочь мне найти решение?

Спасибо

Ответ №1:

Я, наконец, смог решить эту проблему, используя значок svg, который я поместил внутри div, чтобы контролировать отзывчивость значка svg.

 Related codepen link https://codepen.io/amanadi007/pen/QWEyNbb
  

JS

 const svgIcon = () => (
  <svg
        width="100%"
        height="100%"
        className="svg"
        viewBox="0 0 260 200"
        version="1.1"
        xmlns="http://www.w3.org/2000/svg"
        xmlnsXlink="http://www.w3.org/1999/xlink">
        <defs>
            <mask id="overlay-mask" x="0" y="0" width="100%" height="100%">
                <rect x="0" y="0" width="100%" height="100%" fill="#fff"/>
                <circle cx="50%" cy="50%" r="70" />
            </mask>
        </defs>
        <rect x="0" y="0" width="100%" height="100%" mask="url(#overlay-mask)" fillOpacity="0.7"/>
    </svg>
);

const App = () => (
  <div className="webcam-container">
    <Webcam id="webcam" audio={false}/>
    <div className="overlay-container">
      {svgIcon()}
      </div>
  </div>
);

ReactDOM.render(
  <App />,
  document.getElementById('root')
);
  

CSS

 .webcam-container {
    position: relative;
}

.overlay-container {
    position: absolute ;
  width: 34%;
    top: 0 ;
    right: 0 ;
    bottom: 0 ;
    left: 0;
}
  

HTML

 <div id="root"></div>
  

Комментарии:

1. Пожалуйста, разместите свой код здесь. Вы можете включить ссылку на внешний сайт, но смысл StackOverflow в том, чтобы показывать полные ответы, которые не содержат ссылок на внешние сайты, которые могут быть изменены или удалены.