Почему между моими фигурами SVG есть промежутки - PullRequest
1 голос
/ 26 августа 2011

Для каждого из четырех столбцов на странице есть два круга. Внутренний круг - это маска для видимой области прожектора при переключении. Внешний круг - это маска для черного наложения, пока мы все еще отслеживаем мышь.

Проблема в том, что они не стоят на одном уровне, между ними есть крошечное пространство, и это сводит меня с ума. Есть идеи, как избавиться от этого пробела? Я играл в округление значений с плавающей точкой, чтобы все значения позиционирования и размеров были целочисленными, но я пока не нашел правильную комбинацию.

Вот ссылка на страницу: введите описание ссылки здесь Я использую плагин jQuery SVG, но вот код в любом случае:

// Create an SVG for each .svg_mask
    $('.svg_mask').each(function (key) {
        $(this).css({
            'min-height' :cr*4.5,
            'min-width' : cr*4.5
        }).css({
            marginLeft: -$(this).width()/2,
            marginTop: -$(this).height()/2
        });

        $(this).svg();            
        var tw = $(this).outerWidth();
        var th = $(this).outerHeight();

    // circle mask
        var cm = Math.round(cr*3.14*1.25); // obsolete?
        var rx = tw/2-cm/2; // position from left rect edge
        var cx = tw/2; // position from left center 
        var cri = cr*1.2; //inner circle mask radius
        var cro = tw/2; // out circle mask radius

        var px = $(this).offset().left; // position for page
        var py = $(this).offset().top; // position for page
        this.pcx = px + cx; // relative pos center
        this.pcy = py + cx; // relative pos center

        $('svg', this).attr('viewBox', '0 0 '+tw+' '+th);
        var svg = $(this).svg('get');
        var defs = svg.defs();
        var filter = svg.filter(defs, 'blur'+key, 0, 0, tw, th, 
            {filterUnits: 'userSpaceOnUse'}); 
        svg.filters.gaussianBlur(filter, 'blur'+key, 
            'SourceAlpha', 10); 

    // Our spotlight & rect
        var circle_mask = svg.mask(defs, 'circle_mask'+key, 0, 0, tw, th, 
            {maskUnits: 'userSpaceOnUse'});

        svg.circle(circle_mask, cx, cx, cro,
            {strokeWidth: 0, fill:'white', fillOpacity: 0.8, strokeWidth: 0});

        this.circle = svg.circle(circle_mask, 0, 0, cri,
            {strokeWidth: 0, fill: 'black', fillOpacity: 1, filter: 'url(#blur'+key+')'});

    // Draw this rect
        svg.circle(cx, cx, cro,
            {strokeWidth: 0, mask: 'url(#circle_mask'+key+')', opacity: 1.0});

    // mask this region off to background svg
        svg.circle(window.mask, this.pcx, this.pcy, cro, 
            {strokeWidth: 0, fill: 'black'});
    });

Любая помощь приветствуется.

Обновление

Я не нашел решения, позволяющего плавно замаскировать круг и составить другой круг, чтобы он поместился в пространстве, но дизайн изменился, и мне больше не нужно решение для этого конкретного проекта. Хотя было бы неплохо понять, как добиться эффекта. Ссылка теперь отражает новый дизайн с новой проблемой ...

Ответы [ 3 ]

0 голосов
/ 26 августа 2011

Я думаю, что Chasbeen правильно.Посмотрите параметры для svg.circle (я получил это из jquery svg docs):

svg.circle(70, 220, 50, {fill: "red", stroke: "blue", strokeWidth: 5}); 

В ваших кругах установите значение strokeWidth равным 0.

РЕДАКТИРОВАТЬ: после просмотра вашего кода я могуне вижу причин для этого разрыва.Вот лучший чит, который я смог придумать (он точно не идеален).

// mask this region off to background svg
    svg.circle(window.mask, this.pcx, this.pcy, cro, 
       {stroke: '#E3E3E3', strokeWidth: 2, fill: 'black'});
});
0 голосов
/ 18 ноября 2016

Это, вероятно, из-за пробелов между отображаемыми элементами.

Об этом идет обсуждение на Как убрать пробел между элементами inline-block?

Для простой демонстрации и решения см. http://codepen.io/elliz/pen/dOOrxO ... код, скопированный ниже:

.defs-only {
  display:block; position: absolute; 
  height:0; width:0; margin: 0; padding: 0; 
  border: none; overflow: hidden;
}

.margins svg {
  margin-right: -4px;
}

.floats {
  overflow: auto; /*clearfix*/  
}

.floats svg {
  float: left;
}
<svg class="defs-only" xmlns="http://www.w3.org/2000/svg">
  <symbol id="square">
    <rect x="0" y="0" width="100" height="100" fill="currentColor" />
  </symbol>
</svg>


<h1>SVG gap issue demonstration</h1>
<p>This pen demonstrates the gap that can appear between inline svg elements</p>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: blue" /></svg>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: red" /></svg>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: green" /></svg>

<h2>Attempt 1: remove whitespace between elements</h2>
<p>On a hunch lets try to remove the space between the elements...</p>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: blue" /></svg><svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: red" /></svg><svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: green" /></svg><p>Ah ... so it is the same issue that used to plague &lt;li&gt; tags when you tried to create seamless horizontal menu items<p>
  
<h2>Attempt to remove whitespace using css</h2>

<h3>Using negative margins</h3>
<div class="margins">
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: blue" /></svg>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: red" /></svg>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: green" /></svg>
</div>

<p>Exact size of negative margin will depend on font size</p>

<h3>Using floats</h3>
<div class="floats">
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: blue" /></svg>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: red" /></svg>
<svg width="36" height="36" viewBox="0 0 36 36"><use xlink:href="#square" style="color: green" /></svg>
</div>

<p>If you want to avoid a hairline gap between elements when viewed in retina, you may need to combine the two techniques above: e.g. floats with 1px negative margin.</p>

<h2>Further Reading</h2>
<ul>
  <li><a href="https://css-tricks.com/fighting-the-space-between-inline-block-elements/">CSS Tricks article on space between li elements</a></li>
  <li><a href="/7543093/kak-ubrat-probel-mezhdu-elementami-inline-block">Stack Overflow question discussing issue</a></li>
</ul>
0 голосов
/ 26 августа 2011

Возможно ли, что ваш код позиционирования не учитывает ширину штриха где-нибудь? Может быть по кругу? Укажите ширину штриха: 0? Упростите то, что вы пытаетесь сделать. Иногда слишком много спешки, намного меньше темпа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...