Внешнее выравнивание SVG полупрозрачного хода [дубликат]

Конфигурация PHP

2 записи в php.ini диктуют вывод ошибок:

  1. display_errors
  2. error_reporting

В процессе производства display_errors обычно устанавливается на Off (что хорошо, потому что отображение ошибок на производственных площадках обычно нежелательно!).

Однако в разработке он должен быть установлен на On, чтобы отображались ошибки. Check!

error_reporting (начиная с PHP 5.3) устанавливается по умолчанию на E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (что означает, что все отображается за исключением уведомлений, строгих стандартов и уведомлений об отказе). Если вы сомневаетесь, установите его на E_ALL, чтобы отобразить все ошибки. Проверьте!

Whoa whoa! Нет проверки! Я не могу изменить свой php.ini!

Это позор. Обычно общие хосты не позволяют изменять файл php.ini, и поэтому этот параметр, к сожалению, недоступен. Но не бойся! У нас есть другие возможности!

Конфигурация времени выполнения

В желаемом скрипте мы можем изменить записи php.ini во время выполнения! Значит, он будет запускаться при запуске скрипта! Sweet!

error_reporting(E_ALL);
ini_set("display_errors", "On");

Эти две строки будут делать тот же эффект, что и изменение записей php.ini, как указано выше!

Я все еще получаю чистую ошибку страницы / 500!

Это означает, что сценарий даже не запускался! Это обычно происходит, когда у вас есть синтаксическая ошибка!

С синтаксическими ошибками скрипт даже не доходит до времени выполнения. Он не работает во время компиляции, то есть он будет использовать значения в php.ini, которые, если вы не изменились, могут не разрешать отображение ошибок.

Журналы ошибок

Кроме того, PHP по умолчанию регистрирует ошибки. На общем хостинге это может быть в выделенной папке или в той же папке, что и скрипт-нарушитель.

Если у вас есть доступ к php.ini, вы можете найти его под error_log .

158
задан Zearin 28 October 2013 в 20:34
поделиться

9 ответов

Ниже приведена работа для внутренней границы rect с использованием symbol и use.

Пример: https://jsbin.com/yopemiwame/edit?html,output

SVG:

<svg>
  <symbol id="inner-border-rect">
    <rect class="inner-border" width="100%" height="100%" style="fill:rgb(0,255,255);stroke-width:10;stroke:rgb(0,0,0)">
  </symbol>
  ...
  <use xlink:href="#inner-border-rect" x="?" y="?" width="?" height="?">
</svg>

Примечание: Обязательно замените ? в use на реальные значения.

Фон: Причина этого заключается в том, что символ устанавливает новый видовой экран, заменяя symbol на svg и создавая элемент в DOM тени. Этот svg теневой DOM затем привязан к вашему текущему элементу SVG. Обратите внимание, что svg s может быть вложенным, и каждый svg создает новый видовой экран, который скопирует все, что перекрывается, включая перекрывающуюся границу. Для более подробного обзора того, что происходит, прочитайте эту фантастическую статью Сарой Сауидан.

2
ответ дан F Lekschas 20 August 2018 в 20:48
поделиться

Я нашел простой способ, который имеет несколько ограничений, но работал для меня:

  • определить форму в defs
  • определить путь клипа, ссылающийся на форму
  • использовать его и удвоить ход, поскольку наружу обрезается

Здесь приведен рабочий пример:

<defs>
    <path id="ld" d="M256,0 L0,512 L384,512 L128,1024 L1024,384 L640,384 L896,0 L256,0 Z"/>
    <clipPath id="clip">
        <use xlink:href="#ld"/>
    </clipPath>
</defs>
<g>
    <use xlink:href="#ld" stroke="#0081C6" stroke-width="160" fill="#00D2B8" clip-path="url(#clip)"/>
</g>
22
ответ дан Jorg Janke 20 August 2018 в 20:48
поделиться
  • 1
    Лучший ответ, который я нашел – Ed Kolosovsky 11 January 2017 в 15:16
  • 2
    Умное решение. благодаря – Vince Yuan 4 April 2017 в 09:32
  • 3
    Это должно быть принято как ответ. Использование & lt; defs & gt; и & lt; use & gt; является самым элегантным решением в настоящее время. – Nyerguds 24 January 2018 в 12:39
  • 4
    Хорошее решение. Как бы вы отменили его, чтобы сделать внешний удар? – Lucent 30 March 2018 в 19:42
  • 5
    Это работает очень хорошо! Благодарю. – Kholofelo 14 April 2018 в 11:12

Возможное решение A (грязное) - с помощью шаблонов,

- пример с треугольником с внутренним гладкостью:

https://jsfiddle.net/qr3p7php / 5 /

<style>
#triangle1{
  fill: #0F0;
  fill-opacity: 0.3;
  stroke: #000;
  stroke-opacity: 0.5;
  stroke-width: 20;
}
#triangle2{
  stroke: #f00;
  stroke-opacity: 1;
  stroke-width: 1;
}    
</style>

<svg height="210" width="400" >
    <pattern id="fagl" patternUnits="objectBoundingBox" width="2" height="1" x="-50%">
        <path id="triangle1" d="M150 0 L75 200 L225 200 Z">
    </pattern>    
    <path id="triangle2" d="M150 0 L75 200 L225 200 Z" fill="url(#fagl)"/>
</svg>
0
ответ дан maxx-t 20 August 2018 в 20:48
поделиться

UPDATE: атрибут stroke-alignment был 1 апреля перенесен в совершенно новую спецификацию, называемую SVG Strokes .

Начиная с проекта редактора SVG 2.0 от 26 февраля 2015 года (и, возможно, с 13 февраля ), свойство stroke-alignment присутствует со значениями inner, center (по умолчанию) и outer.

Кажется, что он работает так же, как свойство stroke-location, предложенное @Phrogz и последним stroke-position предложением . Это свойство было запланировано, по крайней мере, с 2011 года, но кроме аннотации, что

SVG 2 должен включать способ указания положения хода

, это никогда не был детализирован в спецификации, как это было отложен - до сих пор, кажется.

Ни один браузер не поддерживает это свойство или, насколько мне известно, любой из новых Возможности SVG 2, однако, но, надеюсь, скоро они появятся по мере появления спецификации. Это было свойство, которое я лично хотел получить, и я очень рад, что он наконец появился в спецификации.

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

46
ответ дан mnsth 20 August 2018 в 20:48
поделиться
  • 1
    stroke-alignment указан в SVG Strokes, рабочем проекте W3C. Между тем в проекте редактора SVG 2 W3C говорится, что свойство позиционирования удара должно быть в спецификации SVG в svgwg.org/svg2-draft/painting.html#SpecifyingStrokePaint , но эта спецификация уже достигла кандидата W3C Статус рекомендации и никакое такое свойство не указано в спецификации, кроме ссылки на предложение stroke-position, поэтому похоже, что этого не произойдет. – Patrick Dark 19 February 2017 в 19:36

Нет, вы не можете указать, выполняется ли штрих внутри или вне элемента. Я сделал предложение рабочей группе SVG для этой функции в 2003 году, но не получил поддержки (или обсуждения).

SVG proposed stroke-location example, from phrogz.net/SVG/stroke-location.svg [/g4]

Как я заметил в предложении

  • , вы можете достичь того же визуального результата, что и «внутри», удвоив ширину вашего штриха, а затем используя обтравочный контур, чтобы обрезать объект сам по себе, и
  • вы можете достичь того же визуального результата, что и «снаружи», удвоив ширину штриха, а затем наложив на него нерабочую копию объекта.

Изменить: этот ответ может быть неправильным в будущем. Достичь этих результатов можно с помощью SVG Vector Effects , объединив veStrokePath с veIntersect (для «внутри») или с veExclude (для «снаружи»). Тем не менее, векторные эффекты по-прежнему являются рабочим модулем проекта, в котором нет никаких реализаций, которые я еще могу найти.

Редактирование 2: черновик спецификации SVG 2 включает свойство stroke-alignment (с центром | внутри | вне возможных значений). Это свойство может превратить его в UA в конечном счете.

Редактировать 3: забавно и разочаровывающе, рабочая группа SVG удалила stroke-alignment из SVG 2. Вы можете увидеть некоторые из проблем, описанных после прозы здесь .

293
ответ дан Phrogz 20 August 2018 в 20:48
поделиться
  • 1
    Думал, что это может быть так. Чтобы решить эту проблему, я написал функцию-оболочку для getBBox (), называемую getStrokedBBox (). Эта оболочка возвращает BBox в соответствии с тем, как браузер применяет штрихи к вставке и смещению формы. Это не идеально (нужно следить за последними версиями браузера), но на данный момент он точно обеспечивает внешнюю ширину фигур. – Steve 2 September 2011 в 11:02
  • 2
    @Phrogz, может быть, мы это увидим до 10 лет. svgwg.org/svg2-draft/painting.html#SpecifyingStrokePaint аннотация – frenchone 5 December 2012 в 17:17
  • 3
    Наконец-то здесь! Я, например, действительно призываю к тому, чтобы это свойство прибыло. – mnsth 1 March 2015 в 17:39
  • 4
    Мне просто нравится наблюдать за бюрократией на работе. – Cory Mawhorter 22 May 2015 в 01:20
  • 5
    Есть ли какая-нибудь страница, на которой я могу продвигать предложение? Благодарю. Кажется смешным это не поддерживается. – mahish 23 April 2018 в 11:36

Я не знаю, насколько это полезно, но в моем случае я просто создал еще один круг с рамкой и поместил его «внутри» другой фигуры.

0
ответ дан Seb 20 August 2018 в 20:48
поделиться

Вот функция, которая рассчитает, сколько пикселей вам нужно добавить - используя данный штрих - вверху, справа, внизу и влево, все на основе браузера:

var getStrokeOffsets = function(stroke){

        var strokeFloor =       Math.floor(stroke / 2),                                                                 // max offset
            strokeCeil =        Math.ceil(stroke / 2);                                                                  // min offset

        if($.browser.mozilla){                                                                                          // Mozilla offsets

            return {
                bottom:     strokeFloor,
                left:       strokeFloor,
                top:        strokeCeil,
                right:      strokeCeil
            };

        }else if($.browser.webkit){                                                                                     // WebKit offsets

            return {
                bottom:     strokeCeil,
                left:       strokeFloor,
                top:        strokeFloor,
                right:      strokeCeil
            };

        }else{                                                                                                          // default offsets

            return {
                bottom:     strokeCeil,
                left:       strokeCeil,
                top:        strokeCeil,
                right:      strokeCeil
            };

        }

    };
7
ответ дан Steve 20 August 2018 в 20:48
поделиться

Как отмечали выше люди, вам придется либо пересчитать смещение в координаты пути удара, либо удвоить его ширину, а затем замаскировать одну или другую сторону, потому что SVG не только поддерживает выравнивание инсультатора Illustrator, но PostScript doesn Это тоже.

Спецификация штрихов в редакции Adobe PostScript Manual 2nd edition гласит: «4.5.1 Stroking: оператор хода рисует линию некоторой толщины вдоль текущего пути. Для каждого прямого или изогнутого сегмента на пути, штрих рисует линию, которая центрирована на сегменте со сторонами , параллельными сегменту. " (выделение их)

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

Поскольку собственный формат Inkscape является спецификацией SVG, он не может предложить функцию, которой не хватает.

5
ответ дан user1574945 20 August 2018 в 20:48
поделиться

Вы можете использовать CSS для создания порядка инсульта и заполнения. То есть, сначала ударьте, а затем заполните второй и получите желаемый эффект.

MDN на paint-order: https://developer.mozilla.org/en-US/docs/Web/ SVG / Attribute / paint-order

Код CSS:

paint-order: stroke;
0
ответ дан Xavier Ho 20 August 2018 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: