Непоследовательное состояние наведения для круга SVG при использовании разных позиций

Прежде всего, я новичок в кодировании внешнего интерфейса, поэтому извините за очевидное (если проблема в этом).

Я провел последние пару дней, пытаясь работать с кругами SVG, и это было ужасное время. Намерение состояло в том, чтобы выровнять 3 круга SVG (маленький в центре страницы и два больших по бокам). Я НАКОНЕЦ-ТО добился этого сегодня, НО поведение состояния наведения теперь ведет себя странно (клянусь, это никогда не закончится).

Вот соответствующий код:

     <div id = "nodes">

     <!--         <object id = "about_nodes">
        <embed id = "left_about_svg" src = "resources/node-images/left-about-subnode.svg" type = "image/svg-iml"></embed>
        <embed id = "about_svg" src = "resources/node-images/about-node.svg" type = "image/svg-iml"></embed>
        <embed id = "right_about_svg" src = "resources/node-images/right-about-subnode.svg" type = "image/svg-iml"></embed>
     </object>-->

     <div id = "about_node">
         <object>
             <embed id = "about_svg" src = "resources/node-images/about-node.svg" type = "image/svg-iml"></embed>
         </object>
     </div>

     <div id = "left_about_subnode">
         <object>
             <embed id = "left_about_svg" src = "resources/node-images/left-about-subnode.svg" type = "image/svg-iml"></embed>
         </object>
     </div>

     <div id = right_about_subnode>
         <object>
             <embed id = "right_about_svg" src = "resources/node-images/right-about-subnode.svg" type = "image/svg-iml"></embed>
         </object>
     </div>

Как видите, есть закомментированный HTML. Я экспериментировал с контейнерами разных уровней, чтобы понять, не в этом ли проблема. Это не так.

CSS:

#about_svg{
display: inline;
position: absolute;
width: 10%;
height: 10%;
left: 50%;
margin-top: 2%;
-moz-transform: translateX(-50%);
-webkit-border-radius: 100%;
-moz-border-radius: 100%;
border-radius: 100%;
text-align: center;
}

#left_about_svg{
display: inline;
position: absolute;
width: 65%;
height: 65%;
left: 25%;
top: 3%;
-moz-transform: translateX(-50%);
-webkit-border-radius: 100%;
-moz-border-radius: 100%;
border-radius: 100%;
text-align: center;
}

#right_about_svg{
display: inline;
position: absolute;
width: 65%;
height: 65%;
left: 75%;
top: 3%;
-moz-transform: translateX(-50%);
-webkit-border-radius: 100%;
-moz-border-radius: 100%;
border-radius: 100%;
text-align: center;
}

И SVG:

<svg version="1.1" id="about_node" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 viewBox="-0.531 -0.583 25.063 25.114" preserveAspectRatio="xMidYMid meet"
 style="enable-background:new -0.531 -0.583 25.063 25.114;" xml:space="preserve">

<defs>
    <style type="text/css">

    .circle{
        fill:white;
        stroke:#000000;
        stroke-miterlimit:10;}

    #about_node:hover .circle{
        fill: red;
        transition: 1s;
        stroke: red;
    }
    </style>
</defs>
<circle class = "circle" cx="12" cy="12" r="12"/>

At the moment all 3 circles have essentially the same SVG (left and right circles don't have a hover state) so I'll just post this one.

По сути, я понял, что абсолютное позиционирование приводит к тому, что мой встроенный объект имеет большую прямоугольную рамку вокруг него (наблюдается, когда я использовал элемент проверки) вокруг моих кругов (около 3 диаметров в длину). Большие слева и справа от маленького в центре скрывают состояние зависания центрального.

Состояние наведения работает, если я:

1) уменьшить окно наполовину, смешав все мои круги вместе (еще одна проблема, которую мне нужно исправить), я могу просто коснуться кончика маленького круга и изменить его цвет.

2) удалите два больших круга слева и справа от центрального. Однако это помещает состояние наведения на большой прямоугольник встраиваемого объекта, а НЕ на сам круг.

3) измените все на относительное позиционирование, все перепуталось, но состояние наведения круга работает правильно, а поле встроенного объекта становится квадратным.

Кажется, это сводится к абсолютному позиционированию. Однако я не могу использовать относительное, потому что теряю масштабируемость и невозможно позиционировать элементы (по крайней мере, для меня).

Кто-нибудь знает, что я делаю неправильно? Боже, я просто хочу 3 круга в ряд с возможностью наведения! Почему это так сложно!?


person GHOST-34    schedule 26.03.2016    source источник
comment
Немного сложно понять, чего вы пытаетесь достичь, без рабочего примера или даже изображения. Ваша ширина выглядит странно. 65%+10%+65% › 100%. И почему вы даете своим SVG граничный радиус? Кроме того, есть ли причина, по которой ваши SVG являются внешними?   -  person Paul LeBeau    schedule 26.03.2016
comment
Извините, но разве эти значения высоты и ширины не являются процентом от элемента контейнера? Таким образом, ширина 50% будет занимать половину контейнера по горизонтали, а высота 50% будет занимать 50% контейнера по вертикали. Я думаю, потому что это круг, мне нужен только один, но я не думаю, что он должен составлять 100%. И не все браузеры поддерживают встроенный svg, следовательно, внешний.   -  person GHOST-34    schedule 26.03.2016


Ответы (1)


Это то, чего вы добивались?

демонстрация плунжера

HTML

<object class="svg-left"
        type="image/svg+xml" data="circle.svg"></object>
<object class="svg-middle"
        type="image/svg+xml" data="circle.svg"></object>
<object class="svg-right"
        type="image/svg+xml" data="circle.svg"></object>

CSS

.svg-left {
  position: absolute;
  width: 200px;
  height: 200px;
  left: 0px;
  top: 100px;
}

.svg-middle {
  position: absolute;
  width: 100px;
  height: 200px;
  left: 200px;
  top: 100px;
}

.svg-right {
  position: absolute;
  width: 200px;
  height: 200px;
  left: 300px;
  top: 100px;
}

SVG

<svg version="1.1" id="about_node" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 viewBox="-0.531 -0.583 25.063 25.114" preserveAspectRatio="xMidYMid meet">

<defs>
    <style type="text/css">

    .circle{
        fill:white;
        stroke:#000000;
        stroke-miterlimit:10;}

    .circle:hover{
        fill: red;
        transition: 1s;
        stroke: red;
    }
    </style>
</defs>
<circle class = "circle" cx="12" cy="12" r="12"/>
</svg>
person Paul LeBeau    schedule 26.03.2016
comment
Извините, что не загрузил картинку, но вы правильно поняли эту демонстрацию. Вы помогли мне обнаружить ошибку тоже. Причина, по которой у меня был радиус границы, заключалась в том, что изначально состояние наведения реагировало на окно просмотра about_node (#about_node: hover .circle{...}). Радиус границы исправил это, хотя я вижу, что сейчас в этом нет необходимости. Кроме того, я не предпочитаю использовать пиксели, потому что они не масштабируются. - person GHOST-34; 26.03.2016
comment
Лучшее представление о том, как я этого хочу: plnkr.co/edit/8BfhejxyTPQRK3LFtFnn?p=preview Обратите внимание, однако, что чем больше вы сжимаете раздел, тем более неправильными становятся элементы. Может быть, это ожидаемо, и я просто не знаю, но как мне сохранить масштабируемость, не теряя встроенного расположения кругов? - person GHOST-34; 26.03.2016
comment
Игнорируйте эту ссылку. Вам НЕОБХОДИМО указать как высоту, так и ширину, если это круг: plnkr.co/edit/8BfhejxyTPQRK3LFtFnn? р=предварительный просмотр - person GHOST-34; 26.03.2016
comment
Вы ограничены своей настойчивостью в абсолютном позиционировании каждого круга. Вы не можете легко сохранить SVG в одном и том же положении относительно друг друга, когда каждый из них имеет размер и положение, привязанное к чему-то другому (странице). Если вам нужно, чтобы они оставались в одном и том же положении относительно друг друга, самый простой способ — поместить все круги в один и тот же SVG. - person Paul LeBeau; 26.03.2016
comment
Возможно, вы правы. Кажется, имеет больше смысла содержать их в одном элементе SVG, а затем центрировать этот объект оттуда. Я пробовал это до того, как опубликовал вопрос на самом деле и снова только сейчас, но я просто не могу добиться того, чего хочу. Возможно, я сейчас слишком занят с SVG. Вернемся к обычным фигурам CSS. - person GHOST-34; 26.03.2016