【问题标题】:Hide divs under blackness and reveal items below with a gradient circle when hover将 div 隐藏在黑色下,并在悬停时用渐变圆圈显示下面的项目
【发布时间】:2016-08-27 21:03:59
【问题描述】:

我有这个想法,您只能在网站上看到黑色,但是当您将鼠标悬停在该网站上时,它会显示一个径向渐变白色圆圈,显示其下方的菜单项,例如“联系人”、“信息”和“产品”。当你点击“产品”时,页面上的所有项目都会出现,但它们仍然隐藏在黑色之下,只有当你将鼠标悬停在它上面时才会显示。如果您点击任何产品,您可以通过a标签链接进入产品页面。

所以我得到了这两个部分 - 1)用渐变圆圈显示东西,2)点击“产品”后显示的产品 - 工作,但是当产品出现时,带有渐变的画布部分卡住了。这可能是因为我试图通过分离这两个交互来以一种 hacky 的方式做到这一点,如下所示:

<!DOCTYPE HTML>
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="./assets/stylesheet/normalize.css">
    <link rel="stylesheet" type="text/css" href="./assets/stylesheet/style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
  </head>
  <body>
    <div id="menu">
      <div class="menu-item" id="products"><a>Products</a></div>
      <div class="menu-item" id="contact"><a href="./contact.html">News</a></div>
    </div>
    <script>
      // create a full screen canvas
      var canvas = document.createElement("canvas");
      canvas.style.position = "absolute";
      canvas.style.left     = "0px";
      canvas.style.top      = "0px";
      canvas.style.zIndex   = 10;
      canvas.width          = window.innerWidth;
      canvas.height         = window.innerHeight;
      document.body.appendChild(canvas);
      // var to hold context
      var ctx;

      // load an image
      var image = new Image();
      image.src = "./assets/images/white.jpg";

      // add resize event
      var resize = function(){
          canvas.width   = window.innerWidth;
          canvas.height  = window.innerHeight;
          ctx            = canvas.getContext("2d");
      }
      // add mouse event. Because it is full screen no need to bother with offsets
      var mouse = function(event){
          posX = event.clientX;
          posY = event.clientY;
      }
      // incase the canvas size is changed
      window.addEventListener("resize",resize);

      // listen to the mouse move
      canvas.addEventListener("mousemove",mouse);

      // Call resize as that gets our context
      resize();

      // define the gradient
      var cirRadius = 300;

      var posX = 100; // this will be set by the mouse
      var posY = 100;
      var RGB = [11,11,11] ; // black any values from 0 to 255
      // var alphas = [0,0,0.2,0.5,0.9,0.95,1]; // zero is transparent one is not
      var alphas = [0,0,0.1,0.5,1];

      // the update function
      var update = function(){
          if(ctx){  // make sure all is in order..
              if(image.complete){ // draw the image when it is ready
                  ctx.drawImage(image,0,0,canvas.width,canvas.height)
              }else{ // while waiting for image clear the canvas
                  ctx.clearRect(0,0,canvas.width,canvas.height);
              }
              // create gradient
              var grad = ctx.createRadialGradient(posX,posY,0,posX,posY,cirRadius);
              // add colour stops
              var len = alphas.length-1;
              alphas.forEach((a,i) => {
                   grad.addColorStop(i/len,`rgba(${RGB[0]},${RGB[1]},${RGB[2]},${a})`);
              });
              // set fill style to gradient
              ctx.fillStyle = grad;
              // render that gradient
              ctx.fillRect(0,0,canvas.width,canvas.height);
          }
          requestAnimationFrame(update); // keep doing it till cows come home.

      }

      // start it all happening;
      requestAnimationFrame(update);

    </script>

    <script>
      $("#products").click(function(){

        $("#products").remove();

        var diagram = document.createElement("div");
        diagram.style.position = "absolute";
        diagram.style.left = "0px";
        diagram.style.top = "0px"
        diagram.style.zIndex  = 100;
        diagram.style.width = window.innerWidth + "px";
        diagram.style.height = window.innerHeight + "px";
        document.body.appendChild(diagram);

        var products = [{
                      titleShort: "Black",
                      mainImage: "N/A",
                      link: "./black.html"
                    }, {
                      titleShort: "White",
                      mainImage: "N/A",
                      link: "./white.html"
                    }, {
                      titleShort: "Red",
                      mainImage: "N/A",
                      link: "./red.html"
                    }, {
                      titleShort: "Blue",
                      mainImage: "N/A",
                      link: "./blue.html"
                    }]

        for (var i = 0; i < products.length; i++) {
          var product = document.createElement("div");
          diagram.appendChild(product);
          productstyle.position = "absolute";
          product.style.width = "120px";
          product.style.height = "50px";
          product.style.top = i * 100 + "px";
          product.style.left = i * 100 + "px";
          product.style.textAlign = "center";
          var circle = document.createElement("a");
          circle.style.width = "15px";
          circle.style.height = "15px";
          circle.style.borderRadius = "50%";
          circle.style.backgroundColor = "black";
          circle.style.marginLeft = "auto";
          circle.style.marginRight = "auto";
          circle.href = products[i].link;
          product.appendChild(circle);
        }

      });

    </script>

  </body>
</html>

注意:为方便起见,所有产品仅用圆点/圆圈表示。

最好将两个部分合并到一个画布中。例如,现在我们将那个白色图像作为画布的背景,如果在某些方面我们可以用产品更新图像?但我对画布很陌生,因此不知道该怎么做。也欢迎任何其他建议。

【问题讨论】:

  • 为什么要为此使用画布?我会使用 CSS 的 border-radius,以及简单地更改显示,例如 .someClassName{display: none;}.someClassName:hover{display:block;}
  • @PHPglue 感谢您的输入,但我不确定您是否理解我要做什么...我希望所有项目都出现,尽管它们隐藏在黑暗中。当您悬停时,您“看穿”黑暗以看到物品。在您的方法中,渐变圆如何显示黑色?
  • @markE 请去掉重复标记;这不是同一个问题的重复。在您提供的另一个问题中,用户根本不与背景中的图像进行交互,并且图像始终保持不变;在我的问题中,用户实际上可以点击背景图片的不同部分来访问不同的页面。
  • @practicemakesperfect。恕我直言,dup question 似乎回答了您的问题标题(渐变圆显示),而您的其余问题是询问有关如何点击链接到您的产品页面的设计建议——但我们不提供设计建议堆栈溢出!无论如何,与我的意见相反...删除了 dup 标志。 :-)
  • @markE 谢谢!是的,很难把它总结成一个标题。但我不认为这是一个设计问题。目前,如果你实现我所拥有的,渐变会在产品出现时卡住,因为产品出现在画布的顶部。我想知道如何将产品隐藏在画布下,但仍然可以点击。

标签: javascript svg canvas html5-canvas dom-events


【解决方案1】:

您可以使用不显示、边框半径为 50%、边框(实心、黑色)的高值、固定位置和高 z-index 的 div (a)。然后使用第二个 div (b),宽度为 100%,高度为 100%,背景为黑色,位置固定且 z-index 较高。

您的“热点”上有一个 mouseon 处理程序,您可以在该处理程序上将“a”的位置设置为热点的位置,将其设置为显示块并将“b”设置为不显示。

mouseout 事件会向后执行所有操作。

现在大多数人会不喜欢巨大边框的想法,但是嘿:它并不比任何其他边框都需要更多的流量,它应该比使用画布和更少的代码具有更高的性能。

P.s.:抱歉,我无法提供任何代码示例,因为我在移动设备上。这也解释了错别字。如果您喜欢我(或 cmets 中的某个人)的想法,可以给您写一个快速的小提琴。此外,如果您使用的是 js 库(例如 jQuery),我们可以在 sn-ps 中考虑这一点。

编辑 1:抱歉,我没有注意到您的代码已经包含 jQuery 包含。这应该使 js 部分只有几行...... 此外,通过一些额外的代码,您可以拥有过渡、渐变......任何你喜欢的花哨

【讨论】:

  • 那太好了。我很想尝试一下。我仍在尝试修复我的旧代码,但浏览器可能无法处理太多。
猜你喜欢
  • 2012-06-22
  • 2014-03-18
  • 1970-01-01
  • 2016-02-19
  • 2011-07-25
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多