php - 是否可以在一个 svg 区域中进行两种不同的悬停操作?

标签 php html css svg

我正在学习 SVG 并使用 css 悬停效果来制作一个外观极简的图形,其中的细节会在鼠标悬停时显示。我遇到了一个明显的限制,因为一旦我的 svg 元素中的特定“房地产”部分分配了悬停效果,我就无法想出一种方法来在同一位置使用不同的悬停来放置另一个重叠元素效果。

这是我的图表的图片:

first picture , second picturethird picture .

第一张图片是没有悬停的极简图表。第二张图片是当一个人将鼠标悬停在其中一个条形图上时——如您所见,每周显示公里数。在第三张图片中,当此人悬停在我的透明矩形(占据图表底部三分之二的整个区域)的任意位置时,会出现 x 轴对周的描述。

我遇到的问题是此设置中的用户可以看到 x 轴或公里值。他们两个都看不见。我想让我的 x 轴出现在鼠标悬停在整个矩形的任何地方。目前,除酒吧区外,它在任何地方都适用。我不希望从鼠标悬停效果中“排除”条形区域!

这是我的简化代码。一周没有骑行公里数时出现“鹅蛋”;为简单起见,我省略了该代码。

    <?php
            //The invisible rectangle and x-axis
            echo "<g class = \"axis\"><rect style = \"fill: pink; opacity: 0;\" width = \"590\" height = \"240\"";
            echo "x =\"0\"";
            echo "y = \"100\"></rect>";
            echo "<text y = \"357\" x = \"";
            echo "20";
            echo "\" dy = \".35em\">";
            echo "<tspan x = \"22\">Week 0</tspan><tspan x = \"92\">Week 1</tspan><tspan x = \"162\">Week 2</tspan><tspan x = \"232\">Week 3</tspan><tspan x = \"302\">Week 4</tspan><tspan x = \"372\">Week 5</tspan><tspan x = \"442\">Week 6</tspan><tspan  x = \"512\">Week 7</tspan>";
            echo "</text>";
            echo "</g>";

               //displays bars with kilometers and km value mouseover
               for ($i = 0; $i < 8; $i++) {
                ?>
                <g class="bar">
                <rect width="60" height="<?php echo round($sums_for_tabletest[$i]); ?>" x="<?php echo (20 + ($i * 70)); ?>"
                      y="<?php echo(340 - round($sums_for_tabletest[$i])); ?>"></rect>
                <?php

                echo "<text y=\"";
                echo(330 - round($sums_for_tabletest[$i]));
                echo "\" x = \"";
                if (round($sums_for_tabletest[$i]) < 100) {
                    echo(40 + ($i * 70));
                } elseif (round($sums_for_tabletest[$i]) < 10) {
                    echo(38 + ($i * 70));
                } else {
                    echo(39 + ($i * 70));
                }
                 echo "\" dy=\".35em\">";
                echo round($sums_for_tabletest[$i]);
                echo "</text>";
                echo "</g>";
                }

还有 CSS:

.axis {
  fill: pink;
}
.axis text {
   fill:  #ab1d98;
    font-size: .9em;
    font-weight: 600;
    letter-spacing: 1px;
    opacity: 0;
}

.axis:hover text,
.axis:focus text {
   opacity: 1;
    fill:  #ab1d98;
    font-weight: 600;
    letter-spacing: 1px;
}

.bar {
    fill: #600a58;
    height: 41px;
    transition: fill .3s ease;
    cursor: pointer;
    }

.bar text {
    font-size: .9em;
    font-weight: 800;
    opacity: 0;
}

.bar:hover,
.bar:focus {
    fill: #ffff99;
}

.bar:hover text,
.bar:focus text {
    fill: black;
    opacity: 1;
}

所以总而言之,我正在寻找一种方法,当鼠标悬停在整个透明“轴”类矩形区域的任何地方时,而不仅仅是在不属于的矩形区域“酒吧”类。我主要在寻找仅 svg/css 的解决方案。如果只能通过 javascript 实现,那么了解它也很有帮助,我可以在几周内真正开始学习 javascript 时实现它;我是新手,想在将 javascript 添加到我的代码之前了解 svg 基础知识。

谢谢!

最佳答案

从您的解释来看,这些元素似乎彼此无关。适用于 SVG 的规则与适用于常规 HTML 的规则相同:悬停效果将向上传播 CSS 对象模型,但很难且不建议通过 HTML 将 SVG 的任意部分连接在一起。

一个建议是当您将鼠标悬停在图表的任何部分上时显示轴。在这种情况下,假设所有内容都包含在 .chart 中,内容可能类似于

<g class="chart">
    <g class="bar">
    <g class="bar">
    <g class="bar">
    <g class="bar">
    <g class="axis">
</g>

那么你的效果可能是这样的

.chart
.chart:hover .axis { opacity: 1; }

关于php - 是否可以在一个 svg 区域中进行两种不同的悬停操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38263753/

相关文章:

html - CSS 固定了表格中的左列

html - Xhtml 过渡弹出窗口

sql - 查看 HTML5 Web SQL 数据库的工具?

html - 使用 Bootstrap 的 nav-tabs 导致子 div 溢出

php - 玩 php 的网站

php - $_SERVER ['DOCUMENT_ROOT' ] 路径不工作

jquery - 如何在悬停在 div 上时显示叠加文本并在 html 和 css 中隐藏 div 上的当前文本

html - float 输入保持宽度

php - 如何使 echo 成为 PHP 数组

javascript - 使用 Ajax 验证表单时未定义